BSN-DDC基础网络的DID功能设计

id:BSN_2021 公众号:BSN 研习社

2022年1月25日,区块链服务网络发展联盟(简称“BSN联盟”)推出了“BSN-DDC基础网络”(简称DDC网络)。DDC网络的推出,为NFT技术在我国的落地提供基础设施能力支撑,并为其合规发展保驾护航。

DDC(Distributed Digital Certificate)即分布式数字凭证,其属性和功能类似于NFT。NFT是现实或数字世界中某个事物在区块链上的数字化权益证明,尽管目前大多被用于数字艺术品版权领域,然而其本质上是一种区块链分布式数据库技术,并不带有特定的业务属性,它的潜在使用场景是非常广泛的,可应用在数字商品凭证、票证、账户管理、知识产权等各种领域。DDC网络不直接向个人用户提供服务,而是向拥有DDC/NFT业务的平台方提供极其便捷的网络接入服务,以方便这些平台以极低的成本提供DDC/NFT的生成和管理服务。

DDC-SDK 是用于开发者与DDC 合约交互的 API 工具。为了让运营方或各平台方对DDC-SDK整体设计有一个全面详细的了解,同时为项目的开发、测试、验证、交付等环节提供原始依据以及开发指导,BSN研习社推出BSN-DDC基础网络DDC SDK详细设计系列。分别从整体设计,DID功能设计,DDC权限管理、费用管理,官方合约BSN-DDC-721,官方合约 BSN-DDC-1155,交易查询、区块查询、签名事件,数据解析,示例等八个方面,全面详细的介绍DDC-SDK。

本期是系列文章第二期,DID功能设计。

DID

与实体用户相关的数字化身份信息的管理,包含注册DID、更新密钥、验证DID等链方暂时可以不用关注。

1.1注册DID

个人或机构都可通过“注册DID”给自己生成一个数字化身份。每个DID都对应唯一的一份DID Document,且DID Document存储于区块链网络中。

1.1.1功能介绍

注册DID包含两个环节:为用户生成DID数字身份和向区块链网络发布DID Document 。

1.1.2 API定义

  • 方法定义:

    DidDataWrapper createDid();

  • 调用者:平台方、运营方

  • 核心逻辑:

  1. 根据Secp256k1算法生成两组公私钥对;
  2. 生成Base DID Document;
  3. 生成DID标识符(生成规则参照“标识符生成规则”);
  4. 生成DID Document(格式示例参照“DID Document格式”);
  5. 执行DID Document上链处理;
  6. 用主公钥对DID进行签名;
  7. 返回DID,DID签名值,主备公私钥,和 DID Document数据内容。
  • 输入参数:无
  • 输出参数:
字段名 字段 类型 必传 备注
DID did String
DID签名值 didSign String
主公私钥 authKeyInfo KeyPair
备公私钥 recyKeyInfo KeyPair
DID文档 document DocumentInfo
KeyPair
私钥信息 privateKey String
公钥信息 publicKey String
加密算法 type String
DocumentInfo
DID did String
版本号 version String
创建时间 created String
更新时间 updated String
主公钥 authentication PublicKey
备公钥 recovery PublicKey
签名信息 proof Proof
PublicKey
公钥信息 publicKey String
加密算法 type String
Proof
签名值 signValue String
签名算法 type String
签名者的DID creator String

1.1.3 DID格式

DID的内容格式由W3C标准格式前缀、项目名、DID标识符三部分组成,各部分之间以英文符冒号为分隔符。如下示例:

did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC

1.1.3.1 标识符生成规则

DID标识符通过以下算法生成:

base58(ripemd160(sha256()))

以下为Base DID Document的格式示例:

{
"@context": "https://w3id.org/did/v1",
"authentication":
{
"type": "Secp256k1",
"publicKey":"28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
}
"recovery":
{
"type": "Secp256k1",
"publicKey":"9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
}
}

1.1.3.2 DID Document格式

DID Document里面的主要内容有DID和主备公钥信息,格式如下所示:

{
"did": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
"version": 1,
"created": "2021-05-20T16:02:20Z",
"updated": "2021-05-20T16:02:20Z",
"authentication":
{
"type": "Secp256k1",
"publicKey":"28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
}
"recovery":
{
"type": "Secp256k1",
"publicKey":"9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
}
}

1.1.3.3 DID Document完整格式

DID Document数据格式内容比摘要格式内容多了proof信息,proof是使用主私钥对DID Document摘要格式内容进行Secp256k1签名的一些信息,格式如下所示:

{
"did": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
"version": 1,
"created": "2021-05-20T16:02:20Z",
"updated": "2021-05-20T16:02:20Z",
"authentication":
{
"type": "Secp256k1",
"publicKey":"28986472722394106073871327423452879123214061743224210681401278929598807211140001274507530324221923795865447680836742348963337343510229880669968499735858"
}
"recovery":
{
"type": "Secp256k1",
"publicKey":"9251971168042915941551574641987721503984542761641852064853964541181378832746959340151297908312616596971625573967556676367696067937171601766581709843378481"
}
"proof": {
"type": "Secp256k1",
"creator": "did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC",
  "signatureValue":          "zD5nt+P/Ga/CRG2hJU/SMRXy210CLdvATsxQdPxTEy9Mc9Y0OSFpE3Yu5k2+OjQKVOtu5of9VFbgO3Zljw/vQxs="
}
}

1.2更新密钥

用户的主私钥丢失或者泄漏,可以通过“更新密钥”重新生成一对主公私钥。

1.2.1 功能介绍

用户通过备份的公私钥来完成主公私密钥更新。密钥更新后用户的DID Document也将更新,但是DID不会改变。

1.2.2 API定义

  • 方法定义:

    KeyPair resetDidAuth(ResetDidAuth restDidAuth);

  • 调用者:平台方、运营方;

  • 核心逻辑:

  1. 验证请求参数内的备公私钥是否匹配;
  2. 生成新的主公私钥;
  3. 验证请求参数内的备公钥与DID Document内的备公钥是否一致;
  4. 更新DID Document并使用新的主私钥按Secp256k1重新签名;
  5. 返回新的密钥。
  • 输入参数
字段名 字段 类型 必传 备注
DID did String
主公私钥 primaryKey KeyPair
备公私钥 recoveryKey KeyPair
KeyPair
私钥 privateKey String
公钥 publicKey String
加密算法 type String
  • 输出参数:
字段名 字段 类型 必传 备注
新公私钥 keyInfo KeyPair
KeyPair
私钥 privateKey String
公钥 publicKey String
加密算法 type String

1.3   验证DID

用户可以通过“验证DID”对自己的DID身份进行查验,以此来确认DID Document是否已存在于链上;也可以确认第三方对自己DID身份的查验结果能否通过。

1.3.1 功能介绍

用户通过DID Document中的主公钥进行签名验证,验签通过则认可DID身份。

1.3.2 API定义

  • 方法定义:

    Boolean verifyDIdSign(DidSign didSign);

  • 调用者:平台方、运营方;

  • 核心逻辑:

  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥;
  3. 验证DID签名是否正确,并返回验证结果。
  • 输入参数:
字段名 字段 类型 必传 备注
DID did String
DID签名值 didSign String
  • 输出参数:
字段名 字段 类型 必传 备注
Boolean

1.4 注册发证方

用户可以通过“注册发证方”使自己的DID身份拥有可注册凭证模板的权限。1.4.1 功能介绍注册发证方仅是对DID身份进行了标记,不会改变DID和DID Document。发证方的信息在链上存储,是公开透明的。1.4.2 API定义

  • 方法定义:Boolean registerAuthIssuer(RegisterAuthorityIssuer register);
  • 调用者:运营方;
  • 核心逻辑:
  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥与当前公钥进行比对;
  3. 验证DID是否为发证方;
  4. 注册发证方并对基本信息上链。
  • 输入参数:
字段名 字段 类型 必传 备注
私钥 privateKey String 主私钥
DID did String
名称 name String 发证方名称
  • 输出参数:
字段名 字段 类型 必传 备注
Boolean

1.5 注册凭证模板

发证方依据自己所要签发的凭证信息,自定义凭证属性形成一份凭证模板。

1.5.1 功能介绍

一个发证方可以定义多个凭证模板逐个进行注册,基于凭证模板可以签发多个凭证,每个凭证都由发证方的私钥进行签名。

1.5.2 API定义

  • 方法定义:

    CptBaseInfo registerCpt(RegisterCpt registerCpt);

  • 调用者:运营方;

  • 核心逻辑:

  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥与当前公钥进行比对;
  3. 验证DID是否为发证方;
  4. 注册凭证模板并对模板信息上链。
  • 输入参数:
字段名 字段 类型 必传 备注
私钥 privateKey String 主私钥
DID did String
属性信息 cptJsonSchema Map<String,JsonSchema>
标题 title String
描述 description String
类型 type String Proof
JsonSchema
字段类型 type String
字段描述 description String
是否必填 required Boolean true表示必填;false表示选填
  • 输出参数:
字段名 字段 类型 必传 备注
ID cptId Long
版本 cptVersion Integer

1.6 签发凭证

发证方根据用户信息,可通过“签发凭证”为用户生成凭证。1.6.1 功能介绍用户根据凭证模板的属性要求,向发证方提供了对应的属性值后,发证方可基于凭证模板为其生成一份凭证。1.6.2 API定义

  • 方法定义:CredentialWrapper createCredential(CreateCredential createCredential) ;
  • 调用者:运营方;
  • 核心逻辑:
  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥与当前公钥进行比对;
  3. 验证DID是否为发证方;
  4. 验证凭证模板是否在链上存在;
  5. 验证属性格式;
  6. 凭证签发并返回凭证信息。
  • 输入参数:
字段名 字段 类型 必传 备注
私钥 privateKey String 主私钥
DID issuerDid String 发证方的DID
DID userDid String 用户的DID
到期日 expirationDate String
属性 claim Map<String,Object> 和凭证模板的格式一致
类型 type String Proof
  • 输出参数:
字段名 字段 类型 必传 备注
标准 context String
ID id String 凭证ID
类型 type String Proof
ID cptId Long 凭证模板ID
DID issuerDid String 发证方DID
DID userDid String 用户DID
到期日 expirationDate String 凭证到期日
生成日期 created String 凭证签发日
简要说明 shortDesc String 凭证简述
详细说明 longDesc String 凭证详述
内容 claim Map<String,Object>
签名信息 proof Map<String,Object>

1.7 验证凭证

用户可以通过“验证凭证”对凭证的真伪性、有效性进行查验。。1.7.1 功能介绍验证凭证包含两个方面:验证凭证内容和验证凭证是否到期,两个方面都验证通过,则认为凭证有效。1.7.2 API定义

  • 方法定义:Boolean verifyCredential(Credential credential,PublicKey publickKey);
  • 调用者:平台方、运营方;核心逻辑:
  1. 根据签名信息内的DID,在链上查询对应的Document;
  2. 解析Document内的公钥对凭证验签;
  3. 验证凭证内的到期日期。
  • 输入参数:
  • Credential
字段名 字段 类型 必传 备注
标准 context String
ID id String 凭证ID
类型 type String Proof
ID cptId Long 凭证模板ID
DID issuerDid String 发证方DID
DID userDid String 用户DID
到期日 expirationDate String 凭证到期日
生成日期 created String 凭证签发日
简要说明 shortDesc String 凭证简述
详细说明 longDesc String 凭证详述
内容 claim Map<String,Object>
签名信息 proof Map<String,Object>
  • PublicKey
字段名 字段 类型 必传 备注
算法类型 type String Secp256k1
公钥 publicKey String 主公钥
  • 输出参数:
字段名 字段 类型 必传 备注
Boolean

1.8吊销凭证

发证方可通过“吊销凭证”吊销已经签发给用户的凭证。

1.8.1 功能介绍

发证方对已签发的凭证进行作废标记。凭证已签发给用户,发证方是无法直接修改。所以凭证吊销后将吊销的凭证编号存储与区块链网络中。

1.8.2 API定义

  • 方法定义:

    Boolean revokeCredential(RevokeCredential cred) ;

  • 调用者:平台方;

  • 核心逻辑:

  1. 验证请求参数合法性;
  2. 通过DID标识符查询DID Document内的主公钥,验证其是否与请求参数内的私钥是否匹配;
  3. 通过凭证模板编号查询验证发证方与凭证模板的关联关系;
  4. 将凭证编号上链标记为已吊销;
  5. 返回吊销结果。
  • 输入参数:

RevokeCredential

字段名 字段 类型 必传 备注
ID credId String 凭证ID
模板ID cptId Long 凭证模板ID
DID did String 发证方DID
私钥 privateKey String 发证方私钥
  • 输出参数:
字段名 字段 类型 必传 备注
Boolean

1.9 查询吊销凭证

用户可通过“查询吊销凭证”查询发证方已吊销的凭证和吊销时间。1.9.1 功能介绍用户查询某个发证方已经吊销凭证的吊销列表。1.9.2 API定义

  • 方法定义:public Pages getRevokedCredList(QueryCredentialList queryCredentialList) ;
  • 调用者:运营方;
  • 核心逻辑:
  1. 验证请求参数合法性;
  2. 按请求参数查询相应结果;
  3. 返回吊销结果。
  • 输入参数:
字段名 字段 类型 必传 备注
页码 page Integer 当前页码
分页大小 size Integer 分页大小,单次最多可以检索50条
DID did String 发证方的DID
  • 输出参数:
字段名 字段 类型 必传 备注
页码 page Integer 当前页码
分页大小 size Integer
总数 totalNum Integer 总记录数
总页数 totalPage Integer
记录 result List<  BaseCredential> 记录列表
  • BaseCredential
字段名 字段 类型 必传 备注
ID id String 凭证编号
时间 created String 凭证吊销时间

本文资料内容来源于BSN-DDC SDK详细设计-V1.0,GitHub地址为:https://github.com/BSN-DDC/did-sdk。欲浏览更多信息,请您点击登录查看。

猜你喜欢

转载自blog.csdn.net/BSN_yanxishe/article/details/127452145