Indy架构与DID流程
1、架构
总架构
HBB-Indy-Sovrin_ARM_v0.27.png在水平方向上,INDY ARM分为4个透视图:
-
项目和发行:
- Hyperledger Indy-SDK:客户端交互接口,支持Java、Python、iOS、NodeJS、.Net、Rust
- Hyperledger Indy-Agent(被Hyperledger Aries取代):包括用于区块链客户端的共享加密钱包(安全存储技术), 以及用于允许这些客户端之间进行账外交互的通信协议 。
- Hyperledger Indy-Crypto:Hyperledger Indy组件的共享加密库。
- DIF Universal-Resolver:标识符解析器,可与任何分散式标识符系统(包括分散式标识符(DID))一起使用。
- Hyper Indy-Node:实现了基于Plenum BFT共识协议的分布式账本,以及节点的功能。主要包括:处理读写请求、定义交易类型以及交易分类存储。
-
生态系统(涉及业务、应用、技术)
-
DID数据模型
-
DID
-
URL scheme identifier (
did
) -
Identifier for the DID method
(DID method 定义标识符的格式和生成规则)
-
DID method-specific identifier
例:
did:sov:8a9F8ZmxuvDqRiqqY29x6dx9oU4qwFTkPbDpWtwGbdUsrCD
-
-
Verinym:创建账本已知的DID,合法法身份或身份所有者的唯一标识符。
-
Pseudonym:第二身份,隐藏真实身份。
-
NYM:用于创建Verinym的交易被称为NYM交易,被用来创建新的 DIDs,设置或者调换验证密钥(verification key),设置和改变角色(roles)。
例:
{ "submitterId": "did:sov:29wksjcn38djfh47ruqrtcd5", "signature": "1qaz2wsx3edc4rfv5tgb6yhn7ujm8iklop==", "reqId": "okn987yhbgFtErDsCXsw", "operation": { "type": "NYM", "did": "did:sov:mnjkl98uipsndg2hdjdjuf7", "document": { "publicKey": [{ "id": "key1" "type": "ED25519SignatureVerification", "publicKeyBase58": "..." }], "authentication": [{ "type": "ED25519SigningAuthentication", "publicKey": "key1" }], "service": [{ "type": "agentService", "serviceEndpoint":"https://www.sovrin.org/agents" }] } } }
-
-
DID文档模型
DID文档是对一个DID实体的JSON-LD序列化,包括:
DID标识符、一组加密材料(公钥)、一组加密协议、一组服务端点、时间戳、JSON-LD签名。
例:
{ "id": "did:sov:mnjkl98uipsndg2hdjdjuf7", "publicKey": [{ "id": "key1" "type": "ED25519SignatureVerification", "publicKeyBase58": "...", "authorizations": ["all"] }], "authentication": [{ "type": "ED25519SigningAuthentication", "publicKey": "key1" }], "service": [{ "type": "agentService", "serviceEndpoint":"https://www.sovrin.org/agents" }] }
从纵向看,Indy主要分为业务层(Business Layer)、应用层(Applications Layer)和技术层(Technology Layer)。
-
业务层:凭证发行(Issue)、凭证存储(Local Store)、数据请求(Request)、凭证披露(Present)、凭证验证(Verify)、凭证撤销(Revocate)用户注册登录等。
-
应用层:提供DID服务、提供凭证服务、提供特定业务服务。( 由Indy-Agent/Aries 和 Indy-SDK 支撑)
-
技术层
-
Cloud Agent
由Indy-Agent项目、Indy-SDK项目和DIF Universal-Resolver项目作支撑,主要功能是提供对Edge Agent的服务,直接与Ledger层进行交互,将请求结果返回到应用层。
Indy-SDK项目调用Ledger层的API,实现直接与区块链进行交互;
Indy-Agent项目调用Indy-SDK的钱包API,提供代理功能组件,并提供凭证注册组件(Credential Registry Node Component)实现凭证的注册;
DIF Universal-Resolver项目提供DID的解析器组件,直接与Ledger层交互,解析出DID。
-
Ledger
由 Indy-Node 和 Indy-Plenum 两个项目实现,主要功能是实现Indy区块链的功能。
在Ledger组件中默认使用RocksDB和LevelDB进行KV存储,且使用Merkle Patricia Trie 存储账本状态。每个节点均维护四个账本:
-
Audit Ledger:主要负责与其他三个Ledger同步,为失败节点恢复数据,并对账本正确性进行审计;
-
Pool Ledger:主要维护池中节点的信息(Membership);
-
Domain Ledger:为主要账本,记录交易;
-
Config Ledger:是Pool节点的配置账本。
详细请参考:https://hyperledger-indy.readthedocs.io/projects/plenum/en/latest/storage.html
-
-
2、实现DID(分布式标识符)流程
Indy-Plenum相关
钱包类主要数据结构如下:
-
name -> str:id名;
-
ids -> Dict[Identifier, IdData]:DID到IdData的映射,一个DID一个IdData;
-
idsToSigners -> Dict[Identifier, Signer]:DID到Signer的映射,一个DID一个Signer;
-
aliasesToIds -> Dict[Alias, Identifier]:Alias到DID的映射,一个DID对应多个Alias。
钱包类主要方法:
-
Encrypt/Decrypt:均使用 libsodium密码库的python封装进行加解密;
-
sign/verify:签名和签名验证方法都是基于libsodium的sign方法进行的,使用signKey签名,使用veryKey+DID进行验证;
-
DID Create:
- 指定或产生Seed,32byte;
- 根据Ed25519算法产生公私钥对 MSK,MPK;
- 再将产生的私钥作为种子Seed,使用Ed25519,生成新的公钥VerkeyRaw,新的签名私钥signKey;
- 将verKeyRaw的前16字节进行base58解码,成为DID,后16字节为verKey。
- signKey、verKey丢失时,将可以使用MSK再次重新生成。
-
Wallet storage:使用 jsonpickle 进行JSON序列化和反序列化,保存在本地。
Indy-node相关
Domain Ledger的交易中的NYM:NYM交易主要实现创建新DID、对已存在的DID用户进行角色变更,DID Document就是对NYM交易进行溯源,即可得到一份完整的DID Document;
- 角色:
-
None (common USER) 普通用户
-
“0” (TRUSTEE)
-
“2” (STEWARD) 管理员
-
“101” (ENDORSER) 背书人
-
“201” (NETWORK_MONITOR) 网络监管者
-
网友评论