Indy SDK分布式账本交互详解:NYM交易、Schema与凭证定义全流程
Indy SDK分布式账本交互详解:NYM交易、Schema与凭证定义全流程
【免费下载链接】indy-sdkindy-sdk项目地址: https://gitcode.com/gh_mirrors/in/indy-sdk
Indy SDK是一个功能强大的分布式账本交互工具包,它提供了完整的身份管理和凭证处理能力。通过NYM交易创建身份标识、定义Schema规范数据结构、发布凭证定义实现可验证凭证的发行,构成了 Indy 生态系统中核心的工作流。本文将详细介绍这三个关键环节的实现流程,帮助开发者快速掌握分布式身份交互的核心技术。
一、NYM交易:构建分布式身份的基石
NYM交易是 Indy 账本中最基础的身份记录操作,用于在分布式账本上注册和管理DID(去中心化标识符)。通过NYM交易,我们可以创建新的DID、设置或轮换验证密钥,以及分配用户角色。
1.1 NYM交易的核心要素
一个完整的NYM交易包含三个关键字段:
dest:目标DID,即要创建或更新的身份标识符role:用户角色,如Steward、Trust Anchor等,决定了该身份在账本中的权限verkey:验证密钥,用于验证该DID签署的交易
1.2 创建NYM交易的流程
创建NYM交易通常需要以下步骤:
- 生成DID和验证密钥
- 构建NYM请求
- 签名并提交请求到账本
- 查询NYM记录确认交易结果
在 Indy SDK 中,可以通过以下命令构建NYM请求:
// 构建NYM请求示例代码 let nym_request = ledger::build_nym_request(&steward_did, &trust_anchor_did, Some(&verkey), Some("TRUST_ANCHOR"), None).unwrap();1.3 NYM交易的应用场景
NYM交易广泛应用于以下场景:
- 新身份加入分布式账本
- 身份验证密钥的更新与轮换
- 身份角色的分配与变更
- 身份信息的查询与验证
二、Schema:定义可验证凭证的数据结构
Schema(模式)是描述凭证中包含的属性列表的语义结构,它定义了凭证的"格式"和"内容规范"。在 Indy 生态系统中,Schema由可信机构(如政府、企业)创建并发布到账本,供发行者用于创建具体的凭证。
2.1 Schema的基本组成
一个标准的Schema包含以下元素:
- 名称(name):Schema的唯一标识名称
- 版本(version):Schema的版本号,用于版本控制
- 属性列表(attr_names):凭证中包含的属性名称数组
2.2 创建和发布Schema的步骤
创建并发布Schema到账本的流程如下:
- 使用
issuer_create_schema创建Schema - 构建Schema请求
- 签名并提交请求到账本
- 从账本获取Schema并验证
以下是创建Schema的示例代码:
// Node.js创建Schema示例 const {id: schemaId, schema} = await indy.issuerCreateSchema(issuerDid, 'Transcript', '1.2', ['first_name', 'last_name', 'degree', 'status', 'year', 'average', 'ssn']);2.3 Schema的特点与最佳实践
- 不可变性:一旦发布到账本,Schema不能被修改,只能创建新版本
- 版本控制:通过版本号管理Schema的演进
- 属性限制:属性数量不能超过125个
- 命名规范:名称和版本应具有描述性,便于识别和管理
三、凭证定义:实现可验证凭证的发行
凭证定义(Credential Definition)是发行者基于特定Schema创建的,包含用于签署凭证的公钥和相关元数据。它是连接Schema与实际凭证的关键环节。
3.1 凭证定义的作用
凭证定义主要有以下作用:
- 关联特定的Schema
- 存储用于签署凭证的公钥
- 定义凭证的类型和特性
- 支持凭证的验证过程
3.2 创建凭证定义的流程
创建凭证定义的步骤如下:
- 从账本获取已发布的Schema
- 使用
issuer_create_and_store_credential_def创建凭证定义 - 构建凭证定义请求
- 签名并提交请求到账本
以下是创建凭证定义的示例代码:
# Python创建凭证定义示例 cred_def_id, cred_def_json = await indy.issuer_create_and_store_credential_def(wallet_handle, issuer_did, schema_json, tag, 'CL', json.dumps({"support_revocation": True}))3.3 凭证定义与Schema的关系
凭证定义与Schema是一对多的关系:
- 一个Schema可以有多个凭证定义
- 每个凭证定义由不同的发行者创建
- 凭证定义继承Schema的属性结构
- 凭证定义添加了发行者的签名信息
四、完整工作流:从身份创建到凭证发行
将NYM交易、Schema和凭证定义结合起来,形成一个完整的可验证凭证发行流程:
- 创建身份:通过NYM交易在账本上注册发行者身份
- 定义Schema:创建并发布凭证的属性结构
- 创建凭证定义:基于Schema创建包含签名密钥的凭证定义
- 发行凭证:使用凭证定义创建具体的可验证凭证
- 验证凭证:验证者使用账本上的Schema和凭证定义验证凭证真伪
五、实际应用与代码示例
5.1 注册Trust Anchor身份
// 构建NYM请求添加Trust Anchor println!("7. Build NYM request to add Trust Anchor to the ledger"); let nym_request = ledger::build_nym_request(&steward_did, &trust_anchor_did, Some(&verkey), Some("TRUST_ANCHOR"), None).unwrap(); // 发送NYM请求 println!("8. Sending NYM request to ledger"); let _response = ledger::sign_and_submit_request(pool_handle, wallet_handle, &steward_did, &nym_request).unwrap();5.2 创建并发布Schema
// 创建Schema println!("9. Create Schema and Build the SCHEMA request to add new schema to the ledger as a Steward"); let (schema_id, schema_json) = anoncreds::issuer_create_schema(&trust_anchor_did, "gvt", "1.0", &["name", "age", "sex", "height"]).unwrap(); let schema_request = ledger::build_schema_request(&trust_anchor_did, &serde_json::from_str(&schema_json).unwrap()).unwrap(); // 发送Schema请求 let _response = ledger::sign_and_submit_request(pool_handle, wallet_handle, &trust_anchor_did, &schema_request).unwrap();5.3 创建凭证定义
// 创建凭证定义 println!("11. Creating and storing CREDENTIAL DEFINITION using anoncreds as Trust Anchor, for the given Schema"); let (cred_def_id, cred_def_json) = anoncreds::issuer_create_and_store_credential_def(wallet_handle, &trust_anchor_did, &schema_json, "tag", "CL", Some(r#"{"support_revocation": true}"#)).unwrap();通过以上步骤,我们完成了从身份创建到凭证发行的全流程。Indy SDK提供了丰富的API和工具,使得分布式身份和可验证凭证的实现变得简单而高效。无论是金融、医疗、教育还是供应链等领域,Indy SDK都能为身份管理和数据交换提供安全、可信的技术支持。
要深入了解更多细节,可以参考项目中的官方文档和示例代码:
- 保存Schema和凭证定义
- 发行凭证
- 验证凭证
通过掌握这些核心概念和操作流程,开发者可以快速构建基于分布式账本的身份应用,为用户提供安全、隐私保护的数字身份体验。
【免费下载链接】indy-sdkindy-sdk项目地址: https://gitcode.com/gh_mirrors/in/indy-sdk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
