BSN-DDC基础网络DDC SDK详细设计(二)DID

Emacs修行者
• 阅读 679

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数据内容。
  • 输入参数:无
  • 输出参数:
字段名字段类型必传备注
DIDdidString
DID签名值didSignString
主公私钥authKeyInfoKeyPair
备公私钥recyKeyInfoKeyPair
DID文档documentDocumentInfo
KeyPair
私钥信息privateKeyString
公钥信息publicKeyString
加密算法typeString
DocumentInfo
DIDdidString
版本号versionString
创建时间createdString
更新时间updatedString
主公钥authenticationPublicKey
备公钥recoveryPublicKey
签名信息proofProof
PublicKey
公钥信息publicKeyString
加密算法typeString
Proof
签名值signValueString
签名算法typeString
签名者的DIDcreatorString

1.1.3 DID格式

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

did:bsn:3wxYHXwAm57grc9JUr2zrPHt9HC

1.1.3.1 标识符生成规则

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

base58(ripemd160(sha256(<Base DID Document>)))

以下为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. 返回新的密钥。
  • 输入参数
字段名字段类型必传备注
DIDdidString
主公私钥primaryKeyKeyPair
备公私钥recoveryKeyKeyPair
KeyPair
私钥privateKeyString
公钥publicKeyString
加密算法typeString
  • 输出参数:
字段名字段类型必传备注
新公私钥keyInfoKeyPair
KeyPair
私钥privateKeyString
公钥publicKeyString
加密算法typeString

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签名是否正确,并返回验证结果。
  • 输入参数:
字段名字段类型必传备注
DIDdidString
DID签名值didSignString
  • 输出参数:
字段名字段类型必传备注
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. 注册发证方并对基本信息上链。
  • 输入参数:
字段名字段类型必传备注
私钥privateKeyString主私钥
DIDdidString
名称nameString发证方名称
  • 输出参数:
字段名字段类型必传备注
Boolean

1.5 注册凭证模板

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

1.5.1 功能介绍

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

1.5.2 API定义

  • 方法定义:

    CptBaseInfo registerCpt(RegisterCpt registerCpt);

  • 调用者:运营方;
  • 核心逻辑:
  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥与当前公钥进行比对;
  3. 验证DID是否为发证方;
  4. 注册凭证模板并对模板信息上链。
  • 输入参数:
字段名字段类型必传备注
私钥privateKeyString主私钥
DIDdidString
属性信息cptJsonSchemaMap<String,JsonSchema>
标题titleString
描述descriptionString
类型typeStringProof
JsonSchema
字段类型typeString
字段描述descriptionString
是否必填requiredBooleantrue表示必填;false表示选填
  • 输出参数:
字段名字段类型必传备注
IDcptIdLong
版本cptVersionInteger

1.6 签发凭证

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

  • 方法定义:CredentialWrapper createCredential(CreateCredential createCredential) ;
  • 调用者:运营方;
  • 核心逻辑:
  1. 验证DID Document是否在链上存在;
  2. 解析DID Document的主公钥与当前公钥进行比对;
  3. 验证DID是否为发证方;
  4. 验证凭证模板是否在链上存在;
  5. 验证属性格式;
  6. 凭证签发并返回凭证信息。
  • 输入参数:
字段名字段类型必传备注
私钥privateKeyString主私钥
DIDissuerDidString发证方的DID
DIDuserDidString用户的DID
到期日expirationDateString
属性claimMap<String,Object>和凭证模板的格式一致
类型typeStringProof
  • 输出参数:
字段名字段类型必传备注
标准contextString
IDidString凭证ID
类型typeStringProof
IDcptIdLong凭证模板ID
DIDissuerDidString发证方DID
DIDuserDidString用户DID
到期日expirationDateString凭证到期日
生成日期createdString凭证签发日
简要说明shortDescString凭证简述
详细说明longDescString凭证详述
内容claimMap<String,Object>
签名信息proofMap<String,Object>

1.7 验证凭证

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

  • 方法定义:Boolean verifyCredential(Credential credential,PublicKey publickKey);
  • 调用者:平台方、运营方;核心逻辑:
  1. 根据签名信息内的DID,在链上查询对应的Document;
  2. 解析Document内的公钥对凭证验签;
  3. 验证凭证内的到期日期。
  • 输入参数:
  • Credential
字段名字段类型必传备注
标准contextString
IDidString凭证ID
类型typeStringProof
IDcptIdLong凭证模板ID
DIDissuerDidString发证方DID
DIDuserDidString用户DID
到期日expirationDateString凭证到期日
生成日期createdString凭证签发日
简要说明shortDescString凭证简述
详细说明longDescString凭证详述
内容claimMap<String,Object>
签名信息proofMap<String,Object>
  • PublicKey
字段名字段类型必传备注
算法类型typeStringSecp256k1
公钥publicKeyString主公钥
  • 输出参数:
字段名字段类型必传备注
Boolean

1.8吊销凭证

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

1.8.1 功能介绍

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

1.8.2 API定义

  • 方法定义:

    Boolean revokeCredential(RevokeCredential cred) ;

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

RevokeCredential

字段名字段类型必传备注
IDcredIdString凭证ID
模板IDcptIdLong凭证模板ID
DIDdidString发证方DID
私钥privateKeyString发证方私钥
  • 输出参数:
字段名字段类型必传备注
Boolean

1.9 查询吊销凭证

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

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Python从零实现区块链仿真【含源码】
在区块链或数字货币领域,Python并不是主流的开发语言。但是如果你的目的是研究区块链技术的原理,或者需要在自己的笔记本上仿真一个区块链网络并进行一些研究性的实验,比如完成自己的毕业设计项目或科研课题,那么Python就是合适的。在这个教程里,我们将学习如何使用Python从零开发一个多节点的区块链网络,并基于这个仿真区块链网络,开发一个去中心化的数据分享应
Stella981 Stella981
3年前
Hyperledger Explorer官方安装文档中文版
HyperledgerExplorer是一个简单易用的开源工具,可以用于监视区块链网络中的活动。HyperledgerExplorer支持Fabric、Iroha等多种区块链,可以运行在MocOS和Ubuntu下。HyperledgerFabric区块链开发教程:Fabric区块链Node.js开发详解(https://
Stella981 Stella981
3年前
Fabric多通道网络实战
HyperledgerFabric支持在一组相同的机构之间的多通道部署,每个通道都相当于一个单独的区块链。Fabric的多通道特性不仅可以满足机构之间不同的数据共享需求,同时也可以提高整个Fabric网络的吞吐量。本文将演示如何使用HyperledgerFabric1.4.3搭建一个多通道的区块链网络、部署并访问链码。1、HyperledgerF
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
DCF Plus重塑区块链产业联盟链,任重道远
  当前,区块链技术已进入联盟链阶段,而监管成为制约区块链产业健康可持续发展的关键问题,如何有效监管一直是各国最大的课题与挑战。区块链行业如何实现有效安全的监管,监管标准制定显得尤其关键,这是区块链行业向好的一大指标。  DCFPlus重塑区块链产业联盟链,任重道远  2019年年底,在区块链技术大会上,中国工程院院士谈及区块链的监管挑战时,再次为
hashgame776 hashgame776
3年前
哈希竞猜游戏算法原理及特性说明hashgame776
PoH作为一种新的共识算法近期受到了较大的关注,而PooI验证池和PBFT则是联盟链和私链中较为常见的共识算法。1、PoH:即历史时间证明算法,旨在通过将时间本身编码到区块链中来减轻处理块中网络节点的负载。PoH采用创新的分片式时钟,将时间和状态解耦。简单来说就是将全局的时间链和每个区块的时间链分开,状态的更新不再需要全局时间的同步。PoH通过引入一个名叫信