Hyperledger Indy 理解

Hyperledger Indy 的优势和不足:
在 Sovrin 架构中,每个 DID 都有一个对应的专用代理程序,该程序具有自己的匿名网络地址,身份所有者可以从该地址通过加密的专用通道与另一个身份所有者交换可验证声明和其他任何数据。默认设置用户数据有选择地公开。Sovrin 的可验证声明使用加密的零知识证明,因此它们可以自动支持数据最小化。
虽然解决了区块链的数据存储量不足、用户隐私保护等问题,在技术上取得了有效的突破与进展,但是无法解决现实世界与数字世界身份对应的问题,项目后续实施推广的难度较大,可能需要与政府权威部门合作并让其充当验证人的角色,后续 Sovrin 项目在企业之间发展联盟链有可能是一个不错的选择。
以上内容来自:去中心化身份

以下内容来自:Hyperledger Indy:一个使用 Libindy 构建 Indy 客户端的开发指南
看得很懵,尝试理一理。
背景就忽略了,简单来说就是学生Alice、Faver大学、银行Thrift想要使用Indy上的身份进行交互。
这个一个Demo环境,我理解为搭建一个私链来进行模拟。步骤如下:

1.初始化环境,也就是下载安装Sovrin区块链,和以太坊一样,通过修改配置文件比如修改网络id搭建一个私链。配置文件里还需要配置Steward角色,中文翻译为管家,他们管理着这个区块链。配置的这些Steward在生成区块链后会写在创世区块中。
2, agent,我理解为一个客户端应用程序,这个应用程序可以跟Sovrin区块链进行交互。每个agent都有自己的配置文件,称为pool configuration。这个pool configraton应该指明这个agent连接的是哪个区块链(也称之为节点池),就行以太坊通过网络id号来连接测试链或者本地私链一样。那么我们这一步要做的就是下载安装一个agent,这个agent是一个管家agent,安装在管家的计算机上,管家通过这个agent来管理这个区块链。修改配置文件,使这个agent根据区块链的名称和配置文件来连接到区块链。如下:

Hyperledger Indy 理解_第1张图片

3.这个agent应该使用钱包来管理它的DID相关信息。因此我们调用sdk需要生成一个钱包。
Hyperledger Indy 理解_第2张图片
4. 这个agent目前还是一个普通的agent,但是它想要成为管家,来行使管家的权限,就要获得他管家的身份,那么管家的相关数据被写在了创世区块中,可以通过之前约定好的seed来获取管家的身份,这个seed在区块链创建之前已经分配给了各个管家企业。以下是通过seed生成管家的DID。那么到这一步,这个区块链的管理者–管家就确定下来了。
在这里插入图片描述
5.现在Alice或者其它组织想要在链上创建账号,也就是DID,那改怎么操作呢?首先得下个agent客户端,然后让链上的用户帮他进行创建。链上的用户被称为Trust Anchor角色,只有Trust Anchor角色才能操作账本,也就是创建DID。现在区块链刚创建,唯一的Trust Anchor就是管家steward了。以下的例子就是faber大学通过Steward来获取一个DID.这个操作也叫onboarding。

6.一个Onboarding操作需要双方也就是Steward和Faber大学各建一个DID,这个DID是一个 Pairwise-Unique Identifiers(DIDs)对(pair)。一个 DID 是由与之连接的一方所有,第二个应该是另一方所有。这个DID是为了建立连接使用的。
首先,Steward创建一个DID,就称为steward_faber_did。
在这里插入图片描述
这个steward_faber_did有什么用呢,可以用来生成连接请求。把连接请求放到了链上。生成连接请求方式如下:
Hyperledger Indy 理解_第3张图片注意要往链上写数据还得使用管家的DID才行。这个连接请求被放在链上,nym_request请求还有一个参数Nonce。这个Nonce是一个大随机数,代表着Steward和Faber之间唯一的连接号。
Steward把请求放到了链上,还得告诉Faber他生成的did和nonce是多少,于是他搞了这么一个connection_request文件发送给Faber.
Hyperledger Indy 理解_第4张图片

7.现在到Faber创建他的连接DID了。前提是他已经安装好了agent。首先他得创建一个钱包才能创建DID。然后跟Steward一样调用did.create_and_store_my_did方法创建一个连接用的DID.
创建钱包:
Hyperledger Indy 理解_第5张图片
创建和Steward连接用DID,称为faber_steward_did:
在这里插入图片描述
Faber还需要使用Steward的steward_faber_did的steward_faber_key。于是向账本请求,也就是从区块链上获取,虽然他没有写的权限,但是读应该可以。获取steward_faber_key:
在这里插入图片描述connection_request[‘did’]应该是Steward发给Faber的connection_request文件中的did。这个did数据之前第6步的时候已经被Steward放到了链上。
这个steward_faber_verkey就是这个did的公钥。这个公钥是拿来加密用的。加密什么东西呢?
Faber还需要创建一个连接反馈,这个连接返回包含自己创建的did和Steward之前生成的Nonce。连接反馈如下:
Hyperledger Indy 理解_第6张图片
使用steward_faber_verkey对这个连接反馈进行加密,发给Steward,因为私钥在Steward手上。
对连接反馈加密:
Hyperledger Indy 理解_第7张图片

Steward解密后验证发过来的nonce值和自己生成的nonce值是否一样:
在这里插入图片描述
如果一样,就证明了Steward手里的Faber的私钥是正确的,同时Faber手里的Steward的私钥也是正确的,因为他是从链上请求得来的。
证明了Faber的私钥是正确的以后,Steward把faber的私钥放在链上,之后他们就可以通过访问区块链拿到对方的公钥来进行加密了!
把Faber创建的公钥和did放在链上:
Hyperledger Indy 理解_第8张图片有了对方的公钥,他们可以放心交流了,这种方法我能想到的好处是没有使用CA来确定公钥!

8.下一步Faber要干嘛呢,他得生成一个Verinym类型的DID,这个DID代表着他的法律身份。
和之前一样生成一个新的DID:
在这里插入图片描述然后把这个DID封装成faber_did_info文件:
Hyperledger Indy 理解_第9张图片
封装好了进行加密:
Hyperledger Indy 理解_第10张图片
这个加密算法使用了Steward的公钥和自己的公钥。
加密好了私下发给Steward,Steward进行解密:
Hyperledger Indy 理解_第11张图片解密后得到了Faber新生成的DID数据,也就是faber_did_info文件,里面是包含了DID和这个DID的公钥。
Steward需要确认的是Faber发过来的DID和这个DID对应的的公钥是不是正确的,也就是说,DID和DID对应的公钥是有联系的,通过DID和计算出它对应的公钥。
首先Steward通过Faber发过来的DID号计算对应的公钥:

在这里插入图片描述
然后跟Faber发过来的公钥对比一下看有没有造假情况:
在这里插入图片描述
确定没问题后Steward向账本发送创造DID交易,虽然是给Faber创造的,但是这个DID的owner还是Faber的,因为这个DID的私钥和公钥都在Faber的手上。现在,Faber终于拥有了自己真正的DID了。
如法炮制,Alice、Thrift银行也可以申请自己的DID。

接下来:

政府部门的操作:
政府(权威部门)生成Credential Schema。包括transcript_schema_id和对应的transcript_schema,也就是证件所包括的数据项的模板文件。
Hyperledger Indy 理解_第12张图片

政府部门把transcript_schema发布到账本上。
在这里插入图片描述-----------------------------------------------------------------------------------------------------------------------------------------------
Faber的操作:
Faber通过transcript_schema_id创建获得transcript_schema的请求,请求发到链上获得transcript_schema。这个时候链上会记录faber_did申请获取了一次transcript_schema。
Hyperledger Indy 理解_第13张图片

Faber通过transcript_schema创建一个Credential Definnition,一个Credential Definnition包括faber_transcript_cred_def_id和对应的faber_transcript_cred_def_json
Hyperledger Indy 理解_第14张图片

把Faber_transcript_cred_def_json存到钱包中。然后还把faber_transcript_cred_def_json发送到账本(区块链)中。
Hyperledger Indy 理解_第15张图片

Faber根据Credential Definnition中的faber_transcript_cred_def_id,创建了一个Credential Offer(transcript_cred_offer_json)。这个json文件里边包括了schema_id和faber_transcript_cred_def_id。存放在自己钱包中。
在这里插入图片描述

faber把Credential Offer发送给Alice


Alice的操作:
Alice以之前和faber建立的通信did,也就是alice_faber_did,和Faber发过来的Credential Offer中的schema_id获取transcript_schema。
Hyperledger Indy 理解_第16张图片
为什么不直接像Faver那样直接通过transcript_schema_id来获取,难道Alice没有transcript_schema_id?那Alice直接给不就完事了吗?为什么要使用alice_faber_did这个did呢
Alice创建一个Master Secret。这么Maste Secret用来证明你拥有了某个Credential。
在这里插入图片描述

Alice从Credential Offer中拿到cred_def_id,根据cred_def_id从账本中获取Faber创建的Credential Definition。还是使用alice_faber_did这个did 从账本上获取。
Hyperledger Indy 理解_第17张图片

好了,Alice现在已经可以集齐七龙珠了,可以生成请求信息,来请求Faber大学生成的成绩单了?Alice的七龙珠是,和Faver沟通用的did,Scheme_id,faber_transcript_cred_def_id,他创建的master_secret。
生成的请求包括:transcript_cred_request_json、transcript_cred_request_metadata_json。有了这两个东西就可以请求凭证了!
Hyperledger Indy 理解_第18张图片

faber给Scheme附上数据,生成transcript_cred_values。然后通过给Alice的Credential Offer和Alice生成的凭证定义请求文件transcript_cred_request_json,加上带有数据的凭证transcript_cred_values生成了一个transcript_cred_json,也就是最后的带有数据的凭证。
Hyperledger Indy 理解_第19张图片

Alice目前拥有了
凭证定义请求文件transcript_cred_request_json,
凭证定义请求元数据transcript_cred_request_metadata_json,
上一步Faber生成后给的凭证数据 transcript_cred_json
Faber之前给的凭证定义文件faber_transcript_cred_def
把这些,放在自己的钱包中。作为真实的凭证。
Hyperledger Indy 理解_第20张图片
截止目前:
1.政府把凭证模板放到了链上
2.faber根据凭证模板制作了Credential Definition,把Credential Definition存到了链上,又根据Credential Definition制作了Credential Offer,把Credential Offer加密交给了Alice.
3.Alice拿到了Credential Offer,根据Credential Offer,他们可以拿到凭证模板(好像没什么用),4.Alice创建一个Master Secret。Alice根据Credential Offer从链上拿到了Credential Definition。
5.Faber大学给凭证模板写上数据。
6.Alice想申请这个凭证数据,它需要向Faber大学提供:Credential Offer、和Faber大学通信的DID,即alice_faber_did,Credential Definition,alice_master_secret。

你可能感兴趣的:(区块链)