Web3中的数字身份智能合约
#javascript #web3 #区块链 #solidity

数字身份是区块链技术智能合约最令人兴奋的新兴用例之一。

传统的身份系统有许多疼痛点 - 它们可能是不安全的和孤立的,使用户几乎无法控制他们的数据。自我主持的数字身份使用户重新负责。

在本文中,我们将探讨如何建立基本的智能合约来管理区块链上的数字身份。我们将封面:

  • 分散身份系统的好处
  • 链接身份合同的核心体系结构
  • 编码注册和管理身份凭据的关键功能
  • 诸如了解您的客户(KYC)流程之类的示例应用程序
  • 数字身份的挑战和未来方向

我们将使用坚固性和JavaScript来实现一个简单的智能合约,允许用户存储并控制对身份属性访问诸如名称,地址和出生日期之类的身份属性。甚至初学者也应该能够跟随。

为什么数字身份很重要

在今天的网络上,我们使用零散的集中身份管理系统。您的身份基本上是在不同的孤岛上切碎的 - 您的Facebook个人资料,银行帐户登录,Twitter句柄等。

这些遗产身份系统有许多缺点:

  • 安全缺陷 - 集中式数据库是黑客的蜜罐。 Equifax和其他备受瞩目的违规行为暴露了数百万个身份。
  • 没有用户控制 - 您在集中式系统中几乎无法控制数据。平台拥有您的身份。
  • 有限的可移植性 - 身份被锁定在专有孤岛中。这使得将您的身份带到跨平台上非常困难。

基于区块链的分散身份解决方案解决了这些问题。它们允许用户完全拥有和控制其数字身份。自我主张身份的一些关键原则包括:

  • 持久性 - 即使特定的公司,提供商或网络消失,身份仍然存在。它不依赖外部机构。
  • Portable - 用户应该能够将自己的身份带入他们的身份并在不同的情况下安全地传输。
  • 隐私保护 - 选择性披露允许用户在需要时仅共享某些凭据。
  • 基于同意的 - 身份详细信息的共享需要明确的用户同意。
  • 由用户控制 - 用户必须完全控制其数字身份。
  • 易于使用 - 系统应具有直观的用户体验。

我们可以与这些原理更紧密地与植根于区块链而不是集中数据库的身份保持一致。用户将对他们的个人数据和生物识别技术具有主权控制。组织可以立即安全地验证大学学位,地址和出生证明等凭据。

接下来,我们将探索如何在高级区块链上建模数字身份。

数字身份智能合同体系结构

在研究代码之前,让我们概述基本身份管理智能合约的关键组成部分。

在高级别,我们的合同需要:

  • 允许用户注册新的基于区块链的身份
  • 使用户能够为其身份添加各种凭据索赔
  • 支持不再有效的吊销凭据
  • 控制读取对身份凭据的访问

为了简单起见,我们将越链存储实际的凭据数据。区块链将存储代表用户证明的每个凭据的哈希。

这是可视化体系结构的图:

合同将在用户的地址和其凭证的哈希之间存储映射。

用户将凭据数据提交给链验证的Oracle以添加新的凭据。这可能是认可的大学,政府机构或认证权限,以验证证书。

Oracle返回凭据哈希,然后用户可以将其发送到合同以附加其身份。

后来,组织可以查询特定用户凭据哈希的合同。用户可以提供实际的明文凭据数据,从而允许组织验证哈希匹配。

存储凭证哈希而不是授权数据有助于保留隐私。合同还将在阅读凭据周围实施访问控件。

现在我们了解了高级别的关键组件,让我们开始编码合同!

要遵循本教程,您必须有以下内容,

分叉repo here,让我们开始。

安装依赖项

我们将使用坚固性实现智能合约本身和JavaScript来编写与之交互的简单测试。

首先,请确保已安装了最新版本的node.js。我们将利用硬汉开发环境来编译我们的坚固性和运行测试。

为项目创建一个新目录:

mkdir digital-identity
cd digital-identity

然后安装hardhat and ethers.js:

npm install --save-dev hardhat
npm install --save-dev @nomiclabs/hardhat-ethers ethers

ethers.js对于编写我们的测试以调用合同功能很有用。

好吧,我们准备开始编码!

实施智能合约

在数字身份目录中,创建一个名为Identity.sol的新文件 - 这将包含我们的固体智能合同代码。

让我们从一些基本的样板开始:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0; 
contract Identity {
}

此声明固体版本并创建身份合同外壳。

现在,让我们定义一个结构来表示每个身份凭据。我们将存储哈希和布尔值,指示是否撤销了证书:

struct Credential {
    bytes32 hash; 
    bool revoked; 
}

接下来,我们将定义一个映射,其中密钥是用户地址,该值是凭证类型对凭据结构的映射。

mapping (address => mapping (bytes32 => Credential)) public credentials;

这使我们能够跟踪特定用户的所有凭据,并通过唯一的字节32哈希。

引用它们。

公共关键字自动为我们生成一个getter,以访问映射中的数据。

让我们添加一个函数以允许用户添加新的凭据:

function addCredential(bytes32 credHash) external {
  credentials[msg.sender][credHash] = Credential(credHash, false);  
}

用户将调用此功能并传递他们要添加的凭据哈希。我们在凭据映射中将其添加到他们的地址。

接下来,让我们实现吊销凭据。我们将在映射中将被撤销的标志翻转为true:

function revokeCredential(bytes32 credHash) external {
  Credential storage credential = credentials[msg.sender][credHash];
  credential.revoked = true;
}

阅读凭据将需要传递用户的地址和特定的凭据哈希来检索。我们可以实现一个简单的getCredential函数:

function getCredential(address user, bytes32 credHash) 
  external
  view

  returns (Credential memory) 
{

  return credentials[user][credHash];
}

这将返回指定用户和哈希的凭据结构。它是标记的视图,因此仅读取状态,但不会修改状态。

涵盖基本功能!用户可以添加映射到其地址的凭据,在需要时撤销它们,并通过访问映射来读取特定的凭据。

现在,让我们编写一些简单的测试以与这些功能进行交互。

测试合同

HardHat使我们的合同在本地非常简单。

首先,初始化硬汉项目:

npx hardhat init

这会创建一个示例engreter.sol合同,我们可以忽略 - 我们的身份。SOL将替换它。

在hardhat.config.js文件中,让我们添加我们的坚固汇编配置:

solidity: "0.8.0"

现在,创建一个测试目录并在其中添加一个文件testIdentity.js。

我们将与Ethers和我们的合同ABI一起进口Hardhat的测试公用事业:

const { expect } = require("chai");
const { ethers } = require("hardhat");
const Identity = artifacts.require("Identity");

在我们的测试中,我们将部署身份合同的新实例并与其功能进行交互。

例如,要测试添加凭据:

it("Should add credential", async function() {
  const identity = await Identity.deployed();
  const credHash = ethers.utils.formatBytes32String("foo"); 
  await identity.addCredential(credHash);


  const credential = await identity.getCredential(owner.address, credHash);
  expect(credential.hash).to.equal(credHash);

});

我们可以以类似的方式测试撤销和检索凭证。

完整的测试套件将验证:

  • 在发件人的地址下添加凭据存储它们
  • 检索凭据返回正确的哈希
  • 可以通过翻转其身份来撤销凭据

只有这些核心功能和测试,我们已经实现了用于管理凭证的基本功能!

我们肯定可以进行改进,例如在GetCredential上的访问控件。

,但这涵盖了核心端到端工作流程。用户可以在区块链上注册可验证的凭据,然后选择性地将其披露给第三方。

接下来,探索一些示例应用程序以查看行动中的身份合同...

数字身份用例

现在我们有了基本的实施,我们的数字身份智能合约有哪些实际用例?

了解您的客户(KYC)

最常见的应用之一是使用经过验证的KYC和反洗钱法规的身份。

金融机构必须在与客户合作之前验证客户的身份。传统的KYC过程通常涉及物理检查护照等身份文件。

认可的组织可以使用数字身份合同(如法定名称,地址,出生日期等)验证身份证书。

可以通过用户的同意来证明凭据并将其存储在其地址下的映射中。银行或交易所可以通过检查用户的凭证哈希在链上立即验证。

这允许近乎固有的KYC,同时使用户负责共享其个人数据。

在线服务身份验证

超越KYC,数字身份开放了改善在线服务身份验证的机会。

我们可以使用选择性披露来证明我们对任何服务的身份,而不是居住在专有孤岛中的身份。

服务可以在登录或帐户创建期间请求用户的特定凭据哈希。他们可以在不查看原始数据的情况下验证来自受信任的发行人的哈希匹配凭据。

这有助于最大程度地减少身份数据的集中化,并为用户提供更多的控制。

可验证的凭据

另一个应用程序正在创建可验证的数字凭据 - 基本上是针对区块链检查的“ X的证明”。

一所大学可以发行可验证的数字文凭。就业证书可以授予收入或就业状况证明。认证机构可以为技能,培训和资格创建数字证书。

发行者通过证明其有效性离链,产生哈希和锚定在智能合约映射中的用户身份来造成这些可验证的凭据。

任何组织都可以以防篡改的方式立即验证凭据哈希与用户关联。这创建了现实世界凭据的便携式数字版本。

个人和组织可以利用可验证的凭据几乎无限的可能性。

挑战和未来的工作

虽然身份智能合约打开令人兴奋的可能性,但仍有挑战需要克服:

  • 凭证哈希依靠链牙神经进行实际的验证程序。完全分散的替代方案将是理想的。
  • 密钥管理和恢复是障碍 - 用户绝不能失去对其区块链帐户和钥匙的访问。
  • 用户体验仍然需要改进主流采用。现在管理密钥和哈希现在不是很友好。
  • 与现有身份系统的互操作性将花费时间。
  • Sybil攻击必须减轻实体旋转多个虚假身份的攻击。<​​/li>
  • 遵守不断发展的法规至关重要,特别是对于财务用例。

正在进行的研究正在为许多领域开发解决方案。与区块链帐户相关的分散标识符(DIDS)显示了对简化身份管理的承诺。

自我主持的数字身份的世界才刚刚开始。随着技术的成熟,分散的身份系统可能会在我们跨环境中维护和共享我们的个人数据方面发挥越来越多的作用。

结论

本文介绍了基于区块链的数字身份的好处,以及如何实施基本的智能合约功能,例如添加凭据和控制访问。

只有坚固性和JavaScript,我们建立并测试了简单的分散身份合同。虽然合同有改进的空间,但它展示了诸如选择性披露和自我主张数据控制之类的核心概念。

身份是区块链技术最引人注目的新兴用例之一。自我主张的身份使用户负责其数据和身份。

随着空间的不断发展,分散的身份系统将使全球范围内的人们能够通过财务获取,财产权和安全的数字生活。

如果您发现这篇文章令人兴奋,请在Learnhub Blog上找到更多令人兴奋的帖子;我们编写从Cloud computingFrontend DevCybersecurityAIBlockchain的所有技术。

资源