英文指南:https://github.com/hyperledger/indy-sdk/blob/master/doc/getting-started/getting-started.md#step-3-getting-the-ownership-for-stewardss-verinym
翻译版:https://blog.csdn.net/li_jiachuan/article/details/82904143
样例代码:https://github.com/hyperledger/indy-sdk/blob/master/samples/python/src/getting_started.py

    logger.info("Getting started -> started")# Steward Agentpool_name = 'pool1'logger.info("Open Pool Ledger: {}".format(pool_name))# 获得 genesis transaction pathpool_genesis_txn_path = get_pool_genesis_txn_path(pool_name)pool_config = json.dumps({"genesis_txn": str(pool_genesis_txn_path)})# Set protocol version 2 to work with Indy Node 1.4await pool.set_protocol_version(PROTOCOL_VERSION)try:# 创建 nodes poolawait pool.create_pool_ledger_config(pool_name, pool_config)except IndyError as ex:if ex.error_code == ErrorCode.PoolLedgerConfigAlreadyExistsError:pass# 打开跟 nodes pool 的连接pool_handle = await pool.open_pool_ledger(pool_name, None)logger.info("==============================")logger.info("=== Getting Trust Anchor credentials for Faber, Acme, Thrift and Government  ==")logger.info("------------------------------")logger.info("\"Sovrin Steward\" -> Create wallet")# Steward Agent# Steward 创建钱包steward_wallet_config = json.dumps({"id": "sovrin_steward_wallet"})steward_wallet_credentials = json.dumps({"key": "steward_wallet_key"})try:await wallet.create_wallet(steward_wallet_config, steward_wallet_credentials)except IndyError as ex:if ex.error_code == ErrorCode.WalletAlreadyExistsError:pass# 打开钱包获得 wallet handlesteward_wallet = await wallet.open_wallet(steward_wallet_config, steward_wallet_credentials)logger.info("\"Sovrin Steward\" -> Create and store in Wallet DID from seed")steward_did_info = {'seed': '000000000000000000000000Steward1'}# 创建新的 DID(steward_did) 和相关的 verification key/公钥(steward_key)(steward_did, steward_key) = await did.create_and_store_my_did(steward_wallet, json.dumps(steward_did_info))# 到此为止,Steward 应该已经准备好来为其他人提供 onboarding 服务了logger.info("==============================")logger.info("== Getting Trust Anchor credentials - Government Onboarding  ==")logger.info("------------------------------")# Government Agentgovernment_wallet_config = json.dumps({"id": "government_wallet"})government_wallet_credentials = json.dumps({"key": "government_wallet_key"})# 以下过程创建的 DID 是 Pseudonym DID(Pairwise-Unique Identifier),仅仅用于两个节点间的连接(connection)# Steward 首先会创建一个跟 Government 的 DID(Steward_Government_DID) 并存储到自己的钱包中# 然后 Steward 将新生成的 DID(Steward_Government_DID) 以及 verkey 发送给账本进行存储# 这个新存储到账本中的 DID 的 owner 是 Steward# 然后 Steward 将新生成的 DID(Steward_Government_DID) 以及 nonce 发送给 Government# 如果 Government 还没有自己的钱包,需要先创建钱包# Government 首先会创建一个跟 Steward 的 DID(Government_Steward_DID)并存储到自己的钱包中# 然后 Government 会请求 Steward_Government_DID 对应的 verkey# 然后 Government 将 connection response 进行匿名加密,使用 Steward_Government_DID 对应的 verkey# Government 将 response 发送给 Steward# Steward 收到 connection response 之后会进行匿名解密,使用 Steward_Government_DID 对应的 verkey# Steward 比较 connection request 和 connection response 中的 nonce# 如果两个 nonce 相同,Steward 会将 Government 生成的 Government_Steward_DID 和对应的 verkey 发送给账本进行存储# 这个新存储到账本中的 DID 的 owner 是 Government,因为使用的 verkey 是来自于 Government 的government_wallet, steward_government_key, government_steward_did, government_steward_key, _ \= await onboarding(pool_handle, "Sovrin Steward", steward_wallet, steward_did, "Government", None,government_wallet_config, government_wallet_credentials)logger.info("==============================")logger.info("== Getting Trust Anchor credentials - Government getting Verinym  ==")logger.info("------------------------------")# 以下过程创建的 DID 是 Verinym DID,代表一个节点对于其他节点的一个法定身份# Government 首先会创建一个自己的 verinym DID(Government_DID)并存储到自己的钱包中# Government 会对新生成的 verinym DID 及 verkey 进行授权加密,使用 Steward_Government_DID 对应的 verkey# Government 将加密后的消息发送给 Steward# Steward 收到消息后会进行授权解密得到 Government 的 verinym DID 和对应的 verkey,使用 Steward_Government_DID 对应的 verkey# Steward 向账本中请求 Government_Steward_DID 对应的 verkey# Steward 比较收到的消息中的 verkey 和从账本中获得的 verkey# 如果两个 verkey 相同,Steward 会将 Government 的 verinym 信息存储到账本上government_did = await get_verinym(pool_handle, "Sovrin Steward", steward_wallet, steward_did,steward_government_key, "Government", government_wallet, government_steward_did,government_steward_key, 'TRUST_ANCHOR')# 到此为止,Government 的 Onboarding 工作完成,它已经是 Trust Anchor 并且它的 verinym DID 已经存储到了账本上

对于两种类型的 DID 的进一步理解:

  • Verinym DID:代表的一个节点的身份,能够用来让其他节点知道 “我是谁”,应该由节点自己创建
    Steward 用下边的代码创建 Verinym DID
(steward_did, steward_key) = await did.create_and_store_my_did(steward_wallet, json.dumps(steward_did_info))

Government 用下边的代码创建 Verinym DID

government_did = await get_verinym(pool_handle, "Sovrin Steward", steward_wallet, steward_did,steward_government_key, "Government", government_wallet, government_steward_did,government_steward_key, 'TRUST_ANCHOR')
async def get_verinym(pool_handle, _from, from_wallet, from_did, from_to_key,to, to_wallet, to_from_did, to_from_key, role):
logger.info("\"{}\" -> Create and store in Wallet \"{}\" new DID".format(to, to))
(to_did, to_key) = await did.create_and_store_my_did(to_wallet, "{}")
  • Pseudonym DID:只用于构建两个节点间的连接(connection),连接的双方都会创建独立的一个 Pseudonym DID:A_B_DID(A 节点创建)和 B_A_DID(B 节点创建),这两个 DID 都是 Pseudonym DID。因为必须是要成对出现的,所以文档中称之为成对出现的唯一标识符 Pairwise-Unique Identifier

If the Pseudonym is used to maintain only one digital relationship we will call it a Pairwise-Unique Identifier. We will use Pairwise-Unique Identifiers to maintain secure connections between actors in this tutorial.

Hyperledger Indy:开发指南样例代码分析 - 节点 Onboarding相关推荐

  1. GoJS-FlowChart样例代码分析

    var $ = go.GraphObject.make; // 别名,方便使用myDiagram =$(go.Diagram, "myDiagramDiv", // 通过id指定画 ...

  2. 求读取CATIA标注的方法或者样例代码 Annotion

    求读取CATIA标注的方法或者样例代码 Annotion 文韬777 2018-01-09 19:34:53  1572  收藏 6 文章来源 : http://bbs.csdn.net/topics ...

  3. amaze样例页面分析(一)

    amaze样例页面分析(一) 一.总结 1.从审查(inspect)中是很清楚的可以弄清楚这些part之间的结构关系的 2.一者在于弄清楚他们之间的结构关系,二者在于知道结构的每一部分是干嘛的 3.i ...

  4. 听歌识曲原理探究以及样例代码

    技术故事 听歌识曲是一个很成熟的技术.现在的主流音乐播放器,几乎都有这个功能. 但是第一个吃螃蟹的是上个世纪末的一个叫**"Shazam Entertainment Limited" ...

  5. 使用ffmpeg实现转码样例(代码实现)

    分类: C/C++ 使用ffmpeg实现转码样例(代码实现) 使用ffmpeg转码主要工作如下: Demux -> Decoding -> Encoding -> Muxing 其中 ...

  6. 推荐TensorFlow2.0的样例代码下载

    TensorFlow推出2.0版本后,TF2.0相比于1.x版本默认使用Keras.Eager Execution.支持跨平台.简化了API等.这次更新使得TF2.0更加的接近PyTorch,一系列烦 ...

  7. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码

    构造方法 构造方法(constructor):与类名同名,没有返回值 其初始化作用:一为属性分配内存空间.二为属性赋值 构造方法不能自己调用,只能通过new实例化对象调用 隐式构造方法:对象实例化时编 ...

  8. JAVA面向对象OOP、类、属性、方法、样例代码

    类由属性和方法组成.jdk类接近八千个 成员变量 一个类中的任何方法,都可以使用同一个属性. 属性可以被类中的所有方法访问,类中的所有方法都可以改变属性值. 为区分,类名默认首字母大写,方法名默认首字 ...

  9. 20189200余超 2018-2019-2 移动平台应用开发实践作项目代码分析

    20189200余超 2018-2019-2 移动平台应用开发实践作项目代码分析 项目名称 小说阅读器 项目功能 注册登录 用户信息.用户密码.用户图像修改 书籍分类 书架 书籍搜索(作者名或书籍名) ...

最新文章

  1. 这样就可以很方便的知道明天的天气了
  2. UDP千兆以太网FPGA_verilog实现(三、代码前期准备-时序要求)
  3. Fiddler 十分钟最全使用介绍
  4. 教你创建自己的CSDN博客专栏
  5. 案例:隐秘而低调的内存泄露(OOM)
  6. 数字能排序字符串不能排序_动图解说堆排序原理,让体育生也能看得明白
  7. 注册表把html设置成桌面,[注册表] 将Windows 10默认应用程序设置页面添加到桌面右键菜单中...
  8. ScalaTour 2.函数
  9. arduino UNO 点亮LED例程
  10. Android 获取当前日期算前一年、前一月、前一天Calendar
  11. 第十一章 软件能力成熟度模型
  12. css完美参考手册 chm,css4.0参考手册
  13. Win10桌面图标箭头去掉的方法总结
  14. 基于Python的人脸识别(68个识别点)和焦点人物检测
  15. Android最火的框架系列(四)Volley
  16. 全球与中国无线门铃对讲设备市场深度研究分析报告
  17. 西门子医疗与全景医学共推基层医疗远程影像诊断全面应用;汤臣倍健捐赠670万元营养品与合作伙伴共同支援西安、珠海抗疫 | 医药健闻...
  18. 用一个开关,控制LEP灯的亮和灭
  19. 【ZZULIOJ】1026: 字符类型判断
  20. MT4/MQL4入门到精通EA教程第六课-MQL语言常用函数(六)-常用订单功能函数

热门文章

  1. C 语言之一维数组(详细版)
  2. 基于JSP+Servlet+MySQL实现实验管理系统
  3. Python编程思想(4):字符串类型
  4. 论文剽窃者“自爆家门”?CVPR 最后一天上演“一出好戏 ”!
  5. RoboMaster能量机关识别的简易实现
  6. 二项式系数的递归算法
  7. 一键关闭windows防火墙_Windows防火墙与网络设备拦截软件数据包案例记录!
  8. 如何通过trn日志文件恢复SQL Server 事务日志 还原 备份
  9. 苹果iwatch手表_智能手表入坑指南,你需要的是Apple Watch,还是小米手环?
  10. Qt中QString转string中文乱码问题