# 是时候在DAO中证明您的价值了——SSI使用MetaMask Snaps  1/3

By [XiaomaLabs](https://paragraph.com/@xiaomalabs) · 2023-07-27

---

_作者:BlockchainLab_

去中心化自治组织（DAOs）（或任何类型的组织）的决策应由具有知识的成员来进行
=======================================

去中心化自治组织（DAOs）正逐渐成为一种新的结构，不具有传统的组织层级。由于DAOs运行在开放透明的区块链网络上，加入和为组织做出贡献（以及获得报酬）的门槛比在传统的现实世界中更低。虽然这种结构提供了许多新的机会和优势，但也带来了一些问题。其中一个问题是所谓的富豪政治问题，由[Serto](https://serto.medium.com/the-dao-plutocracy-problem-a8841546a0f2)和Vitalik Buterin在[这里](https://vitalik.ca/general/2022/01/26/soulbound.html)和[这里](https://vitalik.ca/general/2021/08/16/voting3.html)进行了描述。这个问题影响基于代币（ERC20、ERC721或ERC1155）的DAOs，这目前是DAOs的主导形式。

在富豪政治中，组织/社会中最富有的成员拥有最大的权力和影响力，无论他们在给定主题上的专业知识如何。除此之外，大多数提案由仅控制大部分代币的少数成员决定。

![图1：Snapshot示例](https://storage.googleapis.com/papyrus_images/c2347c299cfbae346f249f349347c8c84224df403a965091b0c65788b12d2906.png)

图1：Snapshot示例

因此，大多数基于代币的DAOs并非去中心化，并使持有者产生一种虚假的安全感，让他们误以为自己在决策过程中拥有重要影响力。问题在于可以购买和转移代表你在DAO中价值的声望。如果声望可以购买，富豪政治问题将永远无法解决。如果我们希望使DAOs更加符合web3的价值观，并追求以能力为基础的领导体系，即成员的权力是根据他们的技能决定的，那么必须实施不同的方式来代表声望。

在DAO中，什么是以能力为基础的领导体系？
=====================

想象一下虚拟世界中的DAO。社区可以做出许多决策：更改智能合约、建立新伙伴关系、设计新世界、为项目创建新的图形内容等等。在智能合约代码的更改上应该由精通Solidity的开发人员决定，而在营销的未来上应该由数字营销专家决定。问题是，如何验证潜在投票者的特定技能？

声望应该难以获得且不可转让
=============

声望应该通过经验、成就和对某个事业（例如DAO）的其他成功贡献获得。这可以是任何事情，例如在Rabbithole上完成任务、向项目提交新代码或在DAO社区中积极参与。然后，可信的第三方应该以证明贡献的形式给予贡献者声望。在数字化、加密验证和防篡改的方式下进行这样的操作是很自然的。而在结构化和可重复使用的方式中，使用DIDs、VCs和VPs是最佳选择，这形成了“自我主权身份”（SSI）这个术语。

自我主权身份（SSI）
===========

数字自主身份有三个主要组成部分：DIDs、VCs和VPs。

[去中心化标识符](https://www.w3.org/TR/did-core/)（Decentralized Identifiers，简称DIDs）是一种新型的唯一且持久标识符（URI），可以实现可验证的去中心化身份。它们完全由标识所有者控制，独立于中央机构。每个个体可以创建任意数量的DIDs，并在不同的上下文中使用每个DID以防止数据关联。

DID文档是DID的根记录，是一组数据，用于描述DID，包括实体可以用来作为DID进行身份验证的机制，例如公钥和伪匿名生物特征。公钥可以被任何人从DID文档中获取，但用于证明和数字签名的私钥会安全地存储在用户的钱包中。DID文档还可以包含描述实体的其他属性或声明，例如服务端点、代表等。这些文档通常使用JSON-LD进行表示。

DIDs是可验证的，它们的数据通常存储在受信任的数据注册表上（通常是区块链），可以被任何人访问。有多种方法用于存储和解析DIDs。例如，方法did:ethr使用以太坊上的智能合约存储DID数据。与区块链地址类似，DIDs是伪匿名的，但它们提供了额外的功能，如密钥轮换、委托和将服务端点（社交媒体帐户等）与身份链接的方法。

DID是一行简单的文本，由三部分组成：

*   `did` URI方案标识符
    
*   DID方法的标识符
    
*   唯一标识符
    

![图2 DID 示例（图片来源）](https://storage.googleapis.com/papyrus_images/898ec8005b1120ee8942337d341ea6a7cf8097d42f1ced7870c4a12a9708dafa.png)

图2 DID 示例（图片来源）

然而，DIDs并不能完整地代表我们的整个身份，它们只是为身份提供了一个"篮子"。这个篮子必须装满各种数据，在现实世界中通常以证书的形式呈现。证书在我们的日常生活中无处不在，它们可以是护照、各种许可证、证书、银行账户的所有权等等。证书的问题在于直到最近，还没有标准的方法在线组织它们。

[可验证证书](https://www.w3.org/TR/vc-data-model/)（VCs）是解决这个问题的数字证书的开放标准。它们经过数字签名，可以通过加密验证，从而保证其防篡改。VCs与数据隐私很好地配合，符合欧盟推动的数据监管（GDPR）和其他一些国家的数据法规。

VCs是互操作的，可以使用[JSON-LD](https://json-ld.org/)，这是一种轻量级的链接数据格式。它是已经成功使用的JSON格式的扩展，提供了一种包含对象和数据类型、JSON-LD关键字别名、通过嵌套或引用创建链接，以及国际化特性（描述如何用不同语言表达数据值）的方式。VC的另一种格式是[JWT](https://datatracker.ietf.org/doc/html/rfc7519)（JSON Web Token），是一种在互联网上流行的数据传输格式，具有数字签名。由于这一点，当前的SSI工具通常更好地支持JWT。

可验证展示（Verifiable Presentation，简称VP）表示一个或多个VC的数据，并打包以使数据的作者身份可以被验证。VP中的数据通常与同一主体有关，可能是由多个发行者签发的。比如说你需要证明自己的大学学位、过去的就业经历和出生日期。每个证书都是由不同实体签发的，所有者可以将它们组合在一起创建一个单一的VP。

关于在展示VC时进一步提高数据隐私的工作还在进行中。这可以通过选择性披露和零知识证明（Zero-Knowledge Proofs，简称ZKP）来实现。选择性披露允许从证书的少数属性中生成证明。使用零知识证明，一个人可以证明属性的必要条件，而不泄露实际值。实际上，这意味着一个人可以证明自己的年龄超过18岁，而无需展示身份证，第三方将立即能够验证该数据。

![图3：ZKP 演示中可验证凭证和派生凭证之间关系的可视化示例（图片来源）](https://storage.googleapis.com/papyrus_images/88581a368253985305a91dcc8cdefbb198ddde0d83b124774483d9ea9a021f59.png)

图3：ZKP 演示中可验证凭证和派生凭证之间关系的可视化示例（图片来源）

现在，我们已经对个人SSI组件有了基本的了解，我们可以看看它们如何相互配合。

VC信任模型 SSI完全改变了在线数据共享的范式，使其更接近于现实世界。VC信任模型中有三个实体：

1.  发行者（Issuer）：发行证书的实体。
    
2.  持有者（Holder）：证书的所有者和主体。
    
3.  验证者（Verifier）：接收并验证证书的实体。
    

![图4：VC 工作流程](https://storage.googleapis.com/papyrus_images/5f9590e9ca591b6d5161b9cfd523e049ad60d9d22dd35949f981077602941126.png)

图4：VC 工作流程

如上图所示，发行者是向持有者发放VC的实体。持有者随后向验证者展示VC，验证者验证VC的有效性并检查是否满足已建立的标准。

例如，政府向Alice发放以VC形式的身份证。Alice是该VC的持有者。Alice想在当地便利店购买酒精饮料。Alice必须证明自己年满18岁，她通过展示由VC生成的VP来实现。便利店然后验证Alices的VC是否有效，并且她确实年满18岁。

便利店如何验证VC的有效性？很简单。当政府发放VC时，它们会附上并使用其公共DID对证书进行签名。相同的公共DID也注册在区块链上。当便利店想要验证VC及其证明的真实性和有效性时，它们可以在区块链上检查DID及其关联的公钥，以查看谁签发了该证书，而无需与签发实体联系。DIDs使得VC可以在任何时间和地点得到验证。

听起来很棒！但是，我们如何使用VCs？
===================

不幸的是，目前还没有简便的方法来使用和管理VCs。更多或更少地，所有现有的解决方案都要求用户安装一个额外的移动应用程序或使用特定的另一个平台。这些解决方案称为SSI钱包和代理，例如Hyperleger Aries、Serto等... 但这对于尚未熟悉最基本的web3应用程序和钱包的大多数用户来说可能是一个负担。问题是，是否有可能将对DIDs和VCs的支持添加到被广泛采用且易于使用的钱包中？

**MetaMask Snaps**
==================

答案是肯定的。最受欢迎的钱包[MetaMask](https://metamask.io/)引入了[Snaps](https://docs.metamask.io/guide/snaps.html)，使得构建附加功能的插件成为可能。MetaMask是一个加密钱包和区块链应用程序门户，为用户提供了与基于EVM的区块链交互、签名和发送交易等的简单界面。Snaps使得许多新应用程序成为可能。它们可以支持之前不支持的链，比如Polkadot、Solana、Bitcoin等等。它们允许dApps修改MetaMask的状态以存储和检索数据，比如VCs。它们还可以访问网络，并可能利用几乎任何API等等。新功能只受到开发人员创造力的限制。这里列出了已经开发的Snaps的[列表](https://github.com/piotr-roslaniec/awesome-metamask-snaps)！

从技术上讲，MetaMask Snaps是一个允许任何人安全地扩展MetaMask功能的系统。它是在MetaMask内部运行的隔离的沙盒环境中的JavaScript程序。除了现有的MetaMask RPC方法，Snaps还可以为网站创建新的RPC方法进行调用。不幸的是，这是与Snaps交互的唯一方法，因为目前不可能修改MetaMask的用户界面。

目前，Snaps仅在[MetaMask Flask](https://metamask.io/flask/)中支持，这是一个独立的桌面浏览器扩展程序供开发者使用。但预计Snap系统将来会集成到主要的MetaMask中。想要了解更多关于Snaps的信息，请查阅它们的[文档](https://docs.metamask.io/guide/snaps.html)。

**SSI Snap 设计**
===============

有各种各样的DID方法，其中最受欢迎的方法之一是did:ethr。该方法使用以太坊地址作为完全自我管理的DID。换句话说，每个以太坊账户都是一个DID（DIDs是以太坊地址前缀为`"did:ethr::"`）。以太坊账户在MetaMask中被每天数百万人使用，本质上就是DID。唯一缺失的是正确利用它们和发挥它们的潜力的功能。

_我们已经实施了SSI Snap。SSI Snap可以处理DID、安全地存储VCs并创建VPs，设计为对区块链不受限制。_

下面是SSI Snap的简单工作流程：VC服务提供者向选择的MetaMask账户签发VC。通过使用SSI Snap RPC方法，将该VC存储在MetaMask钱包中。需要时，VC可以用于生成所需的VP。

我们的演示将使用SSI Snap来存储Solidity课程完成VC，证明控制MetaMask账户的用户已经完成Solidity课程，并有资格对Snapshot治理提案进行投票。对于不熟悉Snapshot的人来说，它在去中心化世界中扮演着重要角色。[Snapshot](https://snapshot.org/#/)是一个去中心化的投票平台，提供灵活性并支持各种投票机制。它也非常用户友好，不需要消耗Gas，因为投票过程是在链下完成的。

SSI Snap是如何工作的？
===============

让我们更加技术地介绍一下。

我们决定在SSI Snap内部使用[Veramo框架](https://veramo.io/)来处理大部分与DID、VC和VP相关的工作。Veramo是一个高性能和模块化的可验证数据和SSI的API。它实际上是一个客户端，允许创建和管理DID、VC和VP，从而使开发人员在处理这些组件时更加轻松。

![图5：SSI Snap 的架构](https://storage.googleapis.com/papyrus_images/8c3fab06ff29ce138395d9aee8f16ecc95f4d931dcf35692ba1c9a2b5d58c4f2.png)

图5：SSI Snap 的架构

如上图所示，Veramo负责几乎所有的事情。它用于生成和存储DID和额外的密钥对。Veramo团队实现了名为DIDManager、KeyManager和PrivateKeyManager的插件来完成这一点。然而，这些插件并没有提供一种在MetaMask状态中存储数据的方式。幸运的是，由于这些插件的可扩展性，我们很容易实现一个自定义的[数据存储插件](https://www.npmjs.com/package/@blockchain-lab-um/veramo-vc-manager)，使得管理者能够将数据存储在MetaMask状态中。

Veramo还用于验证和存储VC，并生成VP。不幸的是，Veramo并没有VCManager插件。幸运的是，他们出色的文档使得插件开发变得简单，这使得我们能够开发VCManager插件，并增加额外的数据存储插件以将VCs保存在MetaMask状态中。

创建额外的数据存储插件的能力对于未来的实现来说也非常有帮助。未来，我们计划实现额外的数据存储方式，从存储在云端的一切（当然加密）开始。这将使得与其他MetaMask钱包进行同步成为可能。具有多种存储数据的方式，并且快速地在它们之间切换，将创建更好的用户体验。

为了尽可能保持安全性，我们决定不公开现有MetaMask账户的私钥，而是创建并使用另一个DID（以太坊账户）专门用于生成VPs。由于核心MetaMask RPC方法没有提供适当的签名VP的方式，因此需要私钥进行数字签名。基本上，这意味着对于希望存储和管理VC的每个MetaMask账户，都会生成一个单独的DID。该DID存在于MetaMask状态中，仅用于生成VPs。

但这使事情稍微复杂了一些。一个DID只能使用自己的VCs（不能使用别人的ID来旅行），并且由于VCs是发给MetaMask账户的DID，新生成的DID无法使用它们。为了解决这个问题，我们需要显式地授权新生成的DID使用VCs。因此，需要将新生成的DID注册为MetaMask账户的DID文档的委派。希望在未来这不再是必需的，因为MetaMask不断更新，紧密的Snaps集成也在即将到来。

你可能会问为什么我们决定在以太坊上构建这个概念验证。有几个原因：

1.  除了比特币，它是最为去中心化的区块链之一。
    
2.  它是最受欢迎且使用最广泛的区块链之一。
    
3.  拥有庞大的开发者社区，有很多已经建立的框架，包括各种SSI和DID框架以及经过实践考验的`did:ethr`方法。
    
4.  DID文档不需要经常更改（或者在某些情况下甚至永远不需要更改），因此Gas费用并不是一个巨大的问题。
    

想要了解更多关于SSI Snap、其架构以及如何使用它，请访问我们的[GitHub仓库](https://github.com/blockchain-lab-um/ssi-snap)。

**Demo**
========

为了展示SSI Snap的工作流程，我们开发了一个演示平台。

在此演示中，用户将安装并批准SSI Snap，并将委派添加到选定的MetaMask账户的DID文档中。在完成简单的课程后，用户将获取并存储VC，并在个人资料页面上显示VC。

不久后，我们将在演示中添加Snapshot投票机制，只允许能够提供有效VP的用户对特定提案进行投票，所以请继续关注！ :)

您可以在[此处](https://blockchain-lab-um.github.io/course-dapp/)尝试演示。您需要使用\*\*[MetaMask Flask](https://metamask.io/flask/)\*\*（版本 >10.9.2）。

要完成此演示，您需要 Rinkeby 测试网上的一些 ETH。您可以从[ChainLink Rinkeby 水龙头](https://faucets.chain.link/rinkeby)获取一些。

**课程平台**
========

要开始使用平台，用户需要使用MetaMask连接到平台。连接建立后，用户会收到提示安装并连接SSI Snap。用户需要授予Snap特定权限才能正常工作。除了标准权限，SSI Snap还需要权限来管理MetaMask状态。当用户成功安装Snap并连接到平台后，他们可以开始Solidity课程。首先，SSI Snap需要为当前账户进行初始化。

![](https://storage.googleapis.com/papyrus_images/022ce656dacab2bb3ae229d7bf8f24fbeddc012925996fbd0699690f8a057b5d.png)

添加委托将花费用户一些 ETH，因为它会修改区块链状态。提醒一下，该演示旨在在 Rinkeby 测试网上运行。

![](https://storage.googleapis.com/papyrus_images/45feb0b1555721f956e5871ac788a47e12c6bdcf1f68c7d2d1d7cc8dbe87f9d1.png)

交易确认后，新的委托人将添加到 DID 文档中。为了确保正确添加新委托，我们可以使用\*\*[通用解析器](https://dev.uniresolver.io/)\*\*解析 DID 文档（如果您想自己尝试此操作，请确保使用`did:ethr:rinkeby:`MetaMask 地址前面的前缀）。可以看到委托人已添加到用户账户的DID文档中。

![](https://storage.googleapis.com/papyrus_images/1deaa93fa1b06e6f8d8f6eb7f800bd4cb546d6e27e2f023d1d45df348a4cdaa1.png)

下一步是填写表格并请求 VC。我们还在平台的后端使用Veramo来生成VC。系统会提示用户将 VC 保存为 MetaMask 状态。目前，这是以非标准化方式完成的，但我们正在研究\*\*[可验证凭证颁发的 OpenID Connect 标准](https://openid.net/specs/openid-connect-4-verifiable-credential-issuance-1_0.html)\*\*。

如果一切顺利，VC 应该会出现在个人资料页面上的“我的 VC”下。当用户在 Snapshot 平台上投票时，该 VC 可用于创建 VP。

![](https://storage.googleapis.com/papyrus_images/5a19a1d6005375a915229b255bb86b6d80f58bbb3e6051ab29dbade3c9a2aef4.png)

要使用 SSI Snap，dApp 只需实现 Connect MetaMask 按钮并调用我们的自定义 RPC 方法。就这么简单！

**下一步**
=======

这是使用 MetaMask Snaps 的 SSI 三部曲的第 1 部分。第 2 部分将展示如何在 Snapshot 治理平台上使用 VC 并使用 VP 对提案进行投票。在第 3 部分中，我们将开源所有组件并展望 SSI Snap 的未来。

敬请关注！

---

*Originally published on [XiaomaLabs](https://paragraph.com/@xiaomalabs/dao-ssi-metamask-snaps-1-3)*
