几个月前,加密货币团队a16z 发表了中本挑战,区块链中需要解决的最重要问题的列表。第四个特别引起了我们的注意:“合规可编程隐私”,因为我们已经积极思考这个问题有一段时间了。今天,我们提出第一个使用同态加密和我们的 fhEVM 机密智能合约协议的解决方案。
fhEVM 是一个带有一些预编译的常规 EVM,可以使用我们的 TFHE-rs 同态加密库对加密状态进行计算。从开发人员的角度来看,不涉及加密:他们只是使用我们提供的加密数据类型(euint32、ebool 等)编写 Solidity 代码。与其他隐私解决方案相比,fhEVM 的一大优势是所有数据和计算都发生在链上。这意味着您可以拥有与常规明文合约相同级别的可组合性和数据可用性。
此属性是构建可编程隐私的关键,因为所有访问控制逻辑都可以在合约本身中定义。无需将任何内容硬编码到协议中,用户也无需在链下执行任何操作即可合规。应用程序可以直接强制合规性,只需几行 Solidity 代码!
在本文中,我们将展示如何使用链上 DID 构建兼容的 ERC20 代币。本教程的源代码可以在示例文件夹fhEVM 存储库的。
通过链上保密的去中心化身份识别(DID)进行身份抽象
去中心化身份识别(DID)是由政府、登记机构、公司或用户本身等实体颁发的唯一数字身份。这种DID可以与证明用户拥有该DID的加密密钥(例如EVM钱包)绑定。但它还可以存储大量属性,例如用户的年龄、国籍、社会安全号码等。反过来,这些属性可以用来证明你满足某些条件(称为“认证”),例如年满18岁或不是纳尼亚公民。
大多数DID都是在客户端实现的,并使用零知识证明来生成认证。虽然在许多情况下这是可以的,但当涉及到交易中有多个用户参与、必须对DID应用复杂规则、或需要为所有人遵循一套共同规则时,情况就变得复杂了。这本质上和边缘计算与云计算应用中的权衡是一样的。
然而,拥有一个集中式的DID注册机构可以解决这些问题,因为你可以简单地要求注册机构检查每个人是否合规。这也使得跟踪法规变得更简单,因为你只需要在一个地方实施它。区块链将是这方面的完美基础设施,因为它将使DID与需要合规性的应用之间、以及法规本身之间的组合性成为可能。
问题:每个人都会看到每个人的身份!
幸运的是,我们有解决方案:同态加密,更具体地说是fhEVM!多亏了在加密状态上实现组合性的能力,我们可以将用户DID直接以加密形式托管在链上,并通过简单的合约调用让合规应用验证属性。通过智能合约管理身份的能力,我们称之为“身份抽象”,类似于人们可以通过智能合约管理资金的账户抽象。
本教程分为 3 个部分:
身份抽象是通过一个负责管理身份和认证的注册合约完成的。这里我们假设DID是官方政府ID。注册机构本身由中央机构(例如AFNIC)管理,它们可以创建注册商(例如KYC公司,如Onfido、Jumio等),然后轮流创建用户DID。用户然后通过其注册商管理和更新其DID。
规定 是在合约中定义的,该合约根据 DID 中包含的信息,对个人之间的代币传输的一组规则进行编码。它基本上是在合同层面而不是用户层面实施监管。
合规机密传输 在合规的 ERC20 合约中实现,该合约使用监管合约来强制代币传输合规,而无需对 ERC20 API 本身进行任何更改。在此示例中,我们使用机密 ERC20 合约,其中隐藏余额和金额,但它与常规明文 ERC20 代币一样有效。
我们的链上机密 DID 协议的架构
身份登记合约
IdentityRegistry 合约是由注册商颁发的用户 DID 的注册表,其中包括一组加密的标识符,例如国籍、年龄、社会安全号码等。这些标识符存储为加密的 32 位值 (euint32)。
合约还处理权限,例如:
使合同所有者(例如 AFNIC)能够添加、删除或更新注册商。
使注册商能够添加、删除或更新他们创建的用户 DID。
允许用户授予智能合约访问其 DID 特定属性的权限。这里需要注意的是,用户有责任不授予对恶意合约的访问权限,就像他们有责任不让恶意合约花费其代币一样。
第一步,让我们实现创建和管理 DID 的逻辑:
// SPDX-许可证-标识符:BSD-3-条款-清除
杂注 坚固性 19.0.8;
进口 “fhevm/lib/TFHE.sol”;
合同 身份注册中心 是 EIP712WithModifier,可拥有
现在下一步是实现标识符和访问控制的逻辑。
标识符只是一个字符串(例如“出生日期”)和一个加密的 32 位值。它只能由注册商创建或更新。用户无法创建自己的标识符,因为我们希望它们得到注册商的认证。
然而,由于标识符是加密的,用户需要授予合约访问特定值的权限,我们将通过一个简单的访问控制机制来处理,类似于允许合约使用 ERC20 代币的方式。
合同 身份注册中心 是 EIP712WithModifier,可拥有
现在,我们可以通过添加必要的 getter 以及一些条件和错误处理来封装我们的身份注册合约。
合同 身份注册中心 是 EIP712WithModifier,可拥有
监管合同
下一步是创建我们的监管合同。
在实施一套用于两个人之间转移的规则时,重要的是要认识到这些规则可能会随着时间的推移而演变。拥有一个智能合约来定义特定环境(例如汇款)的所有监管意味着 ERC20 合约本身不必跟踪监管。政府只需更新此合约,它就会自动传播到所有实施它的代币。
从本质上讲,监管合约只是与加密身份属性相匹配的一组条件。为了避免滥用,用户不会直接授予对监管合约的访问权限,而是授予对 ERC20 代币合约的访问权限,然后 ERC20 代币合约对监管合约执行委托调用。这种方法确保只有用户信任的 ERC20 合约才能访问他们的信息。请记住,发送者和接收者都必须先授予 ERC20 合约许可,然后才能在他们之间进行转账。
在此示例中,我们将实现一些基本规则:
国内转账无限制,但向国外转账上限为 10,000 个代币。
列入黑名单的用户无法转移或接收代币。
用户无法将代币转移到黑名单国家。
如果不满足其中一个条件,我们将简单地将转账金额设置为 0,而不是使交易失败(这可能会泄露敏感信息)。这使用了称为 cmux 的同态三元运算符:值 = TFHE.cmux(加密条件, valueIfTrue, valueIfFalse);
合规保密ERC20合约
现在我们有了身份注册表和监管合约,我们终于可以创建合规的、隐私保护的代币合约了。该合约将被称为 CompliantERC20 并具有以下主要特点:
用户余额和转账金额均已加密。
通过调用监管合约来强制传输合规性。
某些余额的可见性可以授予白名单地址(例如监管机构)
通过简单的调用即可调用监管合约。这意味着用户必须在开始任何转账之前提供对 ERC20 合约的访问权限;否则,转移将被恢复。
最后,我们现在可以创建我们的 ERC20 合约:
与用户如何向 DeFi 协议授予使用其代币的权限类似,他们需要向合约授予访问监管合约所需的标识符的权限。这是通过调用 Identity.grantAccess(contractAddress,identifiers) 来完成的,可以通过调用 ERC20.identifiers() 视图方法来检索。该列表直接来自 ERC20Rules 合约,以允许更新属性。
合规与隐私可以共存!
希望本教程向您展示,如果有可用的权限工具,那么构建合规性并不是一件困难的事情。虽然我们最初构建 fhEVM 是为了实现区块链中的隐私,但我们很快意识到该技术可用于身份管理,从而实现可编程合规性。
拟议的设计这里远非完美,但我们相信它可以轻松改进并作为现实世界的用例启动,以便合规性不再是监视的代名词!
声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!