• 1. 概述

    • 1.1. Sidetree
    • 1.2. DID
  • 2. Sidetree 协议
    • 2.1. 协议概述
    • 2.2. 工作原理
    • 2.3. Sidetree 协议的 DID 操作
      • 2.3.1. DID OP
      • 2.3.2. Batch File 和 Anchor File
    • 2.4. Sidetree REST API
  • 3. Sidetree 协议 的 Node.js 实现
    • 3.1. 整体架构
    • 3.2. 分层设计
    • 3.3. REST API
      • 3.3.1. Blockchain REST API
      • 3.3.2. CAS REST API
  • 4. ION: 基于比特币的、使用 Sidetree 协议的 DID 实现
    • 4.1. 使用 ION(macOS)
  • 5. 参考

博客链接:https://hello2mao.github.io/2019/12/01/sidetree-protocol-overview/

1. 概述

1.1. Sidetree

Sidetree 是一个基于现有区块链的第二层(L2)协议,专门用于去中心化身份(DID)的管理。

目前 DIF 中有两个基于区块链的、使用 Sidetree 协议的 DID 实现:

  • ION:微软开源 的 ION 项目,基于比特币的、使用 Sidetree 协议的 DID 实现。
  • Element:Transmute Industries 与 ConsenSys 合作的项目,基于以太坊的、使用 Sidetree 协议的 DID 实现。

1.2. DID

去中心化身份(Decentralized ID, DID)用来解决目前中心化身份系统的一系列问题,W3C 制定了一套 DID 的标准:W3C DID Spec,而DIF则基于此标准给出了 DID 的实现方案。

简单来说,did 是类似如下的一个字符串,用户使用此字符串来标识自己的身份。

DID 解决方案使用 DID 文档、可验证声明、PKI 体系等来解决去中心化身份管理的五大核心挑战:

  • 表示:用来描述主体身份的可迁移表示
  • 持久化:用来存储、提取主体身份的机制,同时还需要保持其隐私
  • 隐私:在去中心化账本中保护主体身份的模型
  • 断言: 确定主体身份的特定语句
  • 解析:解析、验证特定主体身份的机制

2. Sidetree 协议

2.1. 协议概述

区块链的 TPS 一般都比较低,例如比特币的 TPS 大概为 7~8,所以如果把 DID 相关数据上链,那么会遇到严重的性能问题。所以,出现了 Sidetree 协议,它是一个区块链 L2 层的协议,核心思想是把 DID 的批量操作打包进一个区块链交易中,从而显著的提高 DID Operation 的数目。

2.2. 工作原理

  1. Sidetree 节点互相连接构成一个 L2 层的 P2P 网络,每个 Sidetree 节点都对外暴露 Restful API 来处理 DID 的 CURD 操作。
  2. Sidetree 节点尽可能多的收集 DID 操作,然后把这批操作打包,并创建一个 L1 链上交易并在交易中嵌入该操作批次的哈希。
  3. 批操作的源数据会推送到内容寻址存储(IPFS)上。当其他节点获知嵌入 Sidetree 操作的底层链上交易后,这些节点将向原始节点或其他 IPFS 节点请求该批次数据。
  4. 当一个节点收到某个批次后,它会将元数据固定到本地,然后 Sidetree 核心逻辑模块解压批次数据来 解析并验证其中的每个操作。

需要注意的是:目标链的区块/交易体系是 Sidetree 协议唯一需要的共识机制,不需要额外的 区块链、侧链或咨询权威单元来让网络中的 DID 达成正确的 PKI 状态。

2.3. Sidetree 协议的 DID 操作

2.3.1. DID OP

DID 操作不外乎 CURD。

2.3.2. Batch File 和 Anchor File

如下所示,把批操作的源数据推送到内容寻址存储(IPFS)上时,会存在两种文件:Batch FileAnchor File

Batch File:

{"operations": ["Encoded operation","Encoded operation",...]
}

Anchor File:

{"batchFileHash": "Encoded multihash of the batch file.","didUniqueSuffixes": ["Unique suffix of DID of 1st operation", "Unique suffix of DID of 2nd operation", "..."],"merkleRoot": "Encoded multihash of the root of the Merkle tree constructed from the operations included in the batch file."
}

可以看到,Batch File 是原始数据,Anchor FileBatch File 的元数据,而 L1 链上存储的是 Anchor File 的 hash。

为什么要这样设计呢?
这其实是为了后续实现 Sidetree 轻节点预留的,因为进行 DID 解析(例如 DID URL Dereferrence)的时候,如果只是需要一些元数据,那么只需下载Anchor File即可,而不需要把较大的Batch File下载下来。

2.4. Sidetree REST API

实现 Sidetree 协议的节点需要提供 REST API,且所有的请求都需要使用 JWS 签名。

提供的接口列表如下,详细的可参考:sidetree-rest-api

  • DID and DID Document Creation
  • DID Document resolution
  • Updating a DID Document
  • DID Deletion
  • DID Recovery
  • Fetch the current service versions (optional)

3. Sidetree 协议 的 Node.js 实现

3.1. 整体架构

Sidetree Node.js 实现的整体架构如下图所示,可以认为有三部分组成:

  • Sidetree 节点:实现 Sidetree 协议的节点
  • 区块链及其适配器
  • CAS(Content Address Storage)存储,目前是 IPFS

3.2. 分层设计

为了解决 Sidetree 协议的后向兼容性,采取分层实现。

  • Orchestration Layer (编排层):与协议版本无关的通用模块放在此层中实现。
  • Protocol Version Specific Layer (版本适配层):与协议版本相关的模块放在此层中实现。

3.3. REST API

3.3.1. Blockchain REST API

  • Get latest blockchain time
  • Get blockchain time by hash
  • Fetch Sidetree transactions
  • Get first valid Sidetree transaction
  • Write a Sidetree transaction
  • Fetch normalized transaction fee for proof-of-fee calculation
  • Fetch the current service version

3.3.2. CAS REST API

  • Read content
  • Write content
  • Fetch the current service version

4. ION: 基于比特币的、使用 Sidetree 协议的 DID 实现

4.1. 使用 ION(macOS)

参考官方教程:ION Installation Guide

(1) 启动比特币客户端,并同步测试网

$ cat bitcoin.conf
testnet=1
server=1
rpcuser=hello2mao
rpcpassword=123$ bitcoind -datadir=/xxx/btc

(2) 启动 MongoDB

$ cat /usr/local/etc/mongod.conf
systemLog:destination: filepath: /usr/local/var/log/mongodb/mongo.loglogAppend: true
storage:dbPath: /usr/local/var/mongodb
net:bindIp: 127.0.0.1$ mongod --config /usr/local/etc/mongod.conf

(3) 下载 ION 并 build

git clone https://github.com/decentralized-identity/ion
cd ion
npm run build

(4) 启动 Sidetree 的区块链适配层微服务,ION 是比特币的实现

npm run bitcoin

(5) 启动 Sidetree 的 CAS,ION 是 IFPS 网络的适配层微服务

npm run ipfs

(6)启动 Sidetree 核心服务

npm run core

(7)创建 ION DID
使用 ION 的 js sdk 创建 ION DID,如下:

var didAuth = require("@decentralized-identity/did-auth-jose");
var http = require("http");async function createIONDid() {// gen keyconst kid = "#key-1";const jwkPriv = await didAuth.EcPrivateKey.generatePrivateKey(kid);const jwkPub = jwkPriv.getPublicKey();jwkPub.defaultSignAlgorithm = "ES256K";// load JWK into an EcPrivateKey objectconst privateKey = didAuth.EcPrivateKey.wrapJwk(jwkPriv.kid, jwkPriv);// construct the JWS payloadconst body = {"@context": "https://w3id.org/did/v1",publicKey: [{id: jwkPub.kid,type: "Secp256k1VerificationKey2018",publicKeyJwk: jwkPub}],service: [{id: "IdentityHub",type: "IdentityHub",serviceEndpoint: {"@context": "schema.identity.foundation/hub","@type": "UserServiceEndpoint",instance: ["did:test:hub.id"]}}]};// Construct the JWS headerconst header = {alg: jwkPub.defaultSignAlgorithm,kid: jwkPub.kid,operation: "create",proofOfWork: "{}"};// Sign the JWSconst cryptoFactory = new didAuth.CryptoFactory([new didAuth.Secp256k1CryptoSuite()]);const jwsToken = new didAuth.JwsToken(body, cryptoFactory);const signedBody = await jwsToken.signAsFlattenedJson(privateKey, { header });// Print out the resulting JWS to the console in JSON formatconsole.log("Request: \n" + JSON.stringify(signedBody));console.log("\n");const data = JSON.stringify(signedBody);var options = {host: "127.0.0.1",port: 3000,path: "/",method: "POST",headers: {"Content-Type": "application/json","Content-Length": data.length}};var req = http.request(options, function(res) {// console.log("STATUS: " + res.statusCode);// console.log("HEADERS: " + JSON.stringify(res.headers));res.setEncoding("utf8");res.on("data", function(chunk) {console.log("Response: \n" + chunk);});});req.on("error", function(e) {console.log("problem with request: " + e.message);});// write data to request bodyreq.write(data);req.end;
}createIONDid();

Output:

Request:
{"header": {"alg": "ES256K","kid": "#key-1","operation": "create","proofOfWork": "{}"},"payload": "eyJAY29udGV4dCI6Imh0dHBzOi8vdzNpZC5vcmcvZGlkL3YxIiwicHVibGljS2V5IjpbeyJpZCI6IiNrZXktMSIsInR5cGUiOiJTZWNwMjU2azFWZXJpZmljYXRpb25LZXkyMDE4IiwicHVibGljS2V5SndrIjp7Imt0eSI6IkVDIiwia2lkIjoiI2tleS0xIiwiY3J2IjoiUC0yNTZLIiwieCI6Ikp6UTNiQWZmUzc2Y3R3dEJ4S0NBbnhMcXcyckRlaEd3eU9POGwta1dNclkiLCJ5IjoiSGlLb0xwbWdEVXhHSkhQdHJseHkzd2JPREZhWHA5OHhXUndleGRnTWlFVSIsImRlZmF1bHRFbmNyeXB0aW9uQWxnb3JpdGhtIjoibm9uZSIsImRlZmF1bHRTaWduQWxnb3JpdGhtIjoiRVMyNTZLIn19XSwic2VydmljZSI6W3siaWQiOiJJZGVudGl0eUh1YiIsInR5cGUiOiJJZGVudGl0eUh1YiIsInNlcnZpY2VFbmRwb2ludCI6eyJAY29udGV4dCI6InNjaGVtYS5pZGVudGl0eS5mb3VuZGF0aW9uL2h1YiIsIkB0eXBlIjoiVXNlclNlcnZpY2VFbmRwb2ludCIsImluc3RhbmNlIjpbImRpZDp0ZXN0Omh1Yi5pZCJdfX1dfQ","signature": "MEYCIQDIrTPcCV35zQRojk8KtlMAsbJKsbnMt8uEOD0XUspOUwIhAIbeS1r9dPU6cGvyNnWbChGR36HRG3VILr78M39xeG1H"
}Response:
{"@context": "https://w3id.org/did/v1","publicKey": [{"id": "#key-1","type": "Secp256k1VerificationKey2018","publicKeyJwk": {"kty": "EC","kid": "#key-1","crv": "P-256K","x": "JzQ3bAffS76ctwtBxKCAnxLqw2rDehGwyOO8l-kWMrY","y": "HiKoLpmgDUxGJHPtrlxy3wbODFaXp98xWRwexdgMiEU","defaultEncryptionAlgorithm": "none","defaultSignAlgorithm": "ES256K"}}],"service": [{"id": "IdentityHub","type": "IdentityHub","serviceEndpoint": {"@context": "schema.identity.foundation/hub","@type": "UserServiceEndpoint","instance": ["did:test:hub.id"]}}],"id": "did:ion:test:EiBNbUbOyzSmE66Akhc-6fYoo_A6QPF15VHSRNFLIJgUsw"
}

则新建的 DID 为:did:ion:test:EiBNbUbOyzSmE66Akhc-6fYoo_A6QPF15VHSRNFLIJgUsw

(8)查询 ION DID
使用 ION 的 js sdk 查询 ION DID,如下:

const http = require("http");const options = {hostname: "127.0.0.1",port: 3000,path: "/did:ion:test:EiBNbUbOyzSmE66Akhc-6fYoo_A6QPF15VHSRNFLIJgUsw",method: "GET"
};const req = http.request(options, res => {// console.log("statusCode:", res.statusCode);// console.log("headers:", res.headers);res.on("data", d => {console.log("Response: \n" + d);});
});req.on("error", e => {console.error(e);
});
req.end();

Output:

Response:
{"document": {"@context": "https://w3id.org/did/v1","publicKey": [{"id": "#key-1","type": "Secp256k1VerificationKey2018","publicKeyJwk": {"kty": "EC","kid": "#key-1","crv": "P-256K","x": "JzQ3bAffS76ctwtBxKCAnxLqw2rDehGwyOO8l-kWMrY","y": "HiKoLpmgDUxGJHPtrlxy3wbODFaXp98xWRwexdgMiEU","defaultEncryptionAlgorithm": "none","defaultSignAlgorithm": "ES256K"}}],"service": [{"id": "IdentityHub","type": "IdentityHub","serviceEndpoint": {"@context": "schema.identity.foundation/hub","@type": "UserServiceEndpoint","instance": ["did:test:hub.id"]}}],"id": "did:ion:test:EiBNbUbOyzSmE66Akhc-6fYoo_A6QPF15VHSRNFLIJgUsw"},"resolverMetadata": {"driverId": "did:ion:test","driver": "HttpDriver","retrieved": "2019-10-08T07:54:21.793Z","duration": "49.3152ms"}
}

5. 参考

  • Sidetree Protocol Specification
  • ION
  • Element
  • DIF
  • The Sidetree Protocol: Scalable DPKI for Decentralized Identity
  • Sidetree - 去中心化身份管理协议
  • Azure DID Project
  • 去中心化身份(Decentralized ID, DID)介绍
  • A Primer for Decentralized Identifiers

Sidetree协议相关推荐

  1. 数字身份的一些应用和方案

    当前身份处理的项目: 1.eID eID类似于身份证号,每个人绑定一个eID.比如住酒店,我们只需要向酒店提供这个eID,酒店负责登记信息的应用向连接"公民网络身份识别系统"的服务 ...

  2. 苹果WWDC前瞻之iOS 13更新最受关注;微软发布基于区块链的去中心化身份识别系统;小米成立了新集团质量办公室……...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  3. 西部世界又一发现:ION—存储在IPFS上的去中心化身份服务

    近日,西部世界据IPFS官方周报报道,微软宣布推出ION v1.0去中心化身份服务,并将数据存储在IPFS上.自2019年以来,IPFS一直在与ION展开合作,支持ION使用IPFS存储数据.ION的 ...

  4. 分布式数字身份项目——微软DID

    微软 DID是一套基于 Azure云服务的分布式数字身份技术架构和基础功能,让解决方案实施商可方便的在不同区块链上实现分布式数字身份整体解决方案.微软是 DIF联盟的重要成员,以标准的开源技术.协议和 ...

  5. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  6. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)

    RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. ​ Redis 协议将传输的结构数据 ...

  7. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  8. 【JavaWeb】servlet与http请求协议

    Servlet: 概念: server applet (服务端小程序)运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则. 将我我们自定义一个 ...

  9. synopsys PCIE IP协议解析

    synopsys PCIE IP协议解析 1.Overview Core支持单个Pcie内核的Loopback功能,该功能主要为了做芯片验证,以及在没有远程接收器件的情况下完成自己的回环.同时,Cor ...

最新文章

  1. FTP-工作原理及Vsftpd基础配置
  2. 【CyberSecurityLearning 17】三层交换技术及实验演示、内部网络规划、HSRP
  3. 鸿蒙系统第一次出现,华为鸿蒙系统第三“用户”出现?没想到是它
  4. 列出所有K个元素的子集-----2013年1月26日
  5. UICollectionViewCell的设置间距
  6. 【Clickhouse】Clickhouse MergeTree家族引擎
  7. linux ulimit知识
  8. calamari构架图
  9. 火山安卓简单分组列表框
  10. 卸载office 2003出现pro11.msi
  11. linux线程互踩,IOS 多线程漫漫谈(Process and Thread)
  12. 掌握 3 个搜索技巧,在 GitHub 上快速找到实用软件资源
  13. DirectX11 指定材质
  14. 计算机变量与变量地址,数据缓冲区与变量的地址(更新1)
  15. stm32核心板可以点亮灯吗_不忘初心牢记使命——自动化科协自行设计开发stm32仿真器...
  16. 学习笔记-应用光学 典型光学系统
  17. 产品经理-自然资源行业4大产品线整理
  18. kindle上查看微信读书的书籍
  19. 昨日种种皆成今我,切莫思量切莫哀
  20. Win11共享文件夹打不开怎么办

热门文章

  1. [JAVA安全webshell]冰蝎jsp木马分析
  2. 批量ping指定端口,批量测试IP地址是否通
  3. Qt-quick(qml) Canvas用法及鼠标绘制图形
  4. 【计算机图形学】小白谈计算机图形学(五)
  5. OSPF —— 多区域部署 + ABR + ASBR + 路由重分发
  6. OpenCVSharp 4.5 去离焦模糊
  7. 医咖会免费STATA教程学习笔记——单因素方差分析
  8. QT开发笔记(多媒体实例之视频播放器)
  9. SIW 2021 v11.6.0824 电脑信息综合检测工具技术员单文件版
  10. 该如何在中国手机市场生存