从最宏观的角度来讲,DID 是一种新型的全球唯一标识( Globally Unique Identifier )。但是它跟普通的全球唯一标识有什么区别呢?DID 规范的细节又是什么样的呢?这节一起来聊聊。

DID 的特点

先来看看 DID 的基本特点。

DID 是一种全球唯一的标识,但是跟传统的同类标识是有明显区别的。例如,写过程序的朋友都知道 UUID ,也就是 Universally Unique Identifiers ,全球唯一标识。这类标识符的特点就是,每次生成一个,都能保证是全球唯一的,这样的好处是不需要收集所有的标识然后查重,就可以坚信每一个标识符都是独一无二的。这一点对于去中心化系统是非常有意义的,因为去中心化条件下几乎没有办法去查重。UUID 和 DID 都满足这一点。DID 的独特之处在于,可以用密码学的方式去验证所有人。因为 DID 作为 Web3.0 的身份标识符,应该是一种终身伴随我们的随处可用的身份标识,所以能够验证所有人是必要的功能。

DID 应该在去中心化条件下达成这些功能:永久保存,全球唯一,可以验证所有人身份。而 DID 的确是满足这些条件的,因为它是保存到区块链上的,所以可以保证不依赖任何单一组织而且永不消失,它是一个很长的随机数,类似比特币私钥,虽然没有查重机制,但是概率上保证了重复的概率无限趋近于零。另外,DID 可以通过私钥签名的方式去验证所有人,这个过程也是不依赖中心化组织的。

did:example:12344abc32113

DID 的基本格式如上所示。两个冒号把 DID 分成三个部分,第二项是 DID 方法名,第三项就是随机数了。W3C 的 DID 规范中允许 DID 部署到不同的区块链上,同时不同团队研发的 DID 系统的具体策略有些差异,对应的就是 DID 方法会不一样。但是 DID 的基本格式都是相同的。

DID 方法

DID 中包含的 DID 方法是什么呢?

DID 方法用来指定创建和管理 DID 和 DID 文档的不同的策略。W3C 的规范中规定 DID 和 DID 文档可以部署到任何的区块链上,不同团队的 DID 策略也有所不同。这些差异都可以通过不同的 DID 方法来区别,例如 stack btcr 等等都是 DID 方法。可以到 DID Method Registry 页面上看到都有哪些可用的方法。

DID 方法中会指定的内容包括:

  • 第一,创建。DID 本质上是一串长长的字符串,关键是保证随机生成全球唯一即可。但是不同的方法下,生成的方式是不一样的,例如,有的方法会基于加密密钥对来生成 DID ,其他一些会基于转账地址来生成。
  • 第二,读取。有的方法会让 DID 和 DID 文档直接存放在区块链上,有的则会在区块链上存放一些固定的规则,而在链下去构建符合这个规则的 DID 文档。还有的方法,会把 DID 文档保存到其他地方,链上只保存一个指针。所谓指针一般就是被指向内容的哈希值,指针可以保证虽然内容不在链上,但是也不能篡改。
  • 第三,更新。可以在链上注明一些规则,当满足这些规则了,可以更新 DID 和 DID 文档。当然,区块链是不允许修改已有内容的,所以所谓更新,就是生产一个新的 DID 文档,并用适当的标注,注明老的已经作废。不同的 DID 方法,对应的更新规则不同。
  • 第四,删除。DID 方法中也可以指明,如何让一个 DID 和 DID 文档被”删除“掉。删除必须打引号,因为区块链的特点是只能添加数据,不能删除数据的。

关于 DID 方法,最重要知识的就是上面这些了。

DID 文档

DID 为何能够验证所有者身份呢?这个单独从 DID 本身是看不出来的。必须聊到另外一个概念就是 DID 文档。可以联想咱们之前小节中介绍的身份文档的概念,对理解整个模型非常有帮助。

DID 文档存到链上的时候,并不是单独存的,而是跟 DID 一起保存的。想象保存 DID 的区块链是一个“键-值”数据库,每次存储一个人的 DID 的时候,把 DID 存成键,把 DID 文档存储对应的值。换句话说,就是把这两个数据存成一对,有了 DID ,就能找到对应的 DID 文档。DID 文档的作用是存放公钥,认证方法等关键信息。由于区块链是不可篡改的,这样相当于给每个 DID 绑定了一个公钥,所以 DID 所有人才可以用私钥来证明自己是这个 DID 的所有人。

一个 DID 文档看起来是下面这样的:

{
  "@context": "https://www.w3.org/ns/did/v1",
  "id": "did:example:123456789abcdefghi",
  "authentication": [{

    "id": "did:example:123456789abcdefghi#keys-1",
    "type": "RsaVerificationKey2018",
    "controller": "did:example:123456789abcdefghi",
    "publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----\r\n"
  }]
}

程序员同学们会认出,一个 DID 文档就是一个 JSON 对象。简单而言,一个 JSON 对象,就是一组上面这样的由大括号包裹起来的数据。一个 DID 文档中可能包含这样多个组成部分:

  • DID 本身
  • 密码学内容,例如公钥
  • 一些密码学协议
  • 时间戳
  • 一个签名,用来验证当前 DID 文档的完整性

先粗略了解一下,用到时再详细了解每一项的作用即可。

结论

总结一下。DID 跟普通全球唯一标识的最大区别是可以验证所有人身份。这是因为 DID 和它对应的 DID 文档是配对存放到区块链上的,相当于每个 DID 都绑定了自己的公钥,于是所有人可以用密码学方法去证明自己拥有这个 DID 。DID 规范的细节体现在 DID 方法和 DID 文档中,不同的团队在细节上有所差异。

results matching ""

    No results matching ""