智能合约的白名单技术

Smart Contractsof白名单技术

电报联系方式

白名单技术,是一项区分服务允许与禁止用户的关键技术。虽然几十年来一直在网络安全领域广泛运用,但在Blockchain领域,尤其是在2017年ICO热潮中,白名单技术变得愈发普遍。

智能合约的白名单技术

在这篇文章中,我们将首先深入探讨自2017年以来在Solidity智能合约中采用的两种白名单技术。这些创新方法赋予地址访问DApp功能的权限。具体而言,这两种技术包括:

  1. Use白名单地址映射
  2. 运用Merkle树记录白名单地址

最终,我们将探讨一项创新性的前沿技术——Semaphore。该技术以隐私保护的方式在区块链上维护地址白名单,同时绝不泄露有关这些地址的任何敏感信息。Semaphore借助零知识证明确保在区块链上不会披露任何有关用户的信息。

技术 1: 白名单地址映射

白名单地址的第一种技术是简单地在智能合约中保存映射,并编写相应的 getter 和 setter 函数,只有智能合约的管理员才能调用。

要实现这个简单的智能合约,可以使用以下代码:

contract OnChainWhitelistContract is Ownable {

mapping(address => bool) public whitelist;

/**
* @notice Add to whitelist
*/
function addToWhitelist(address[] calldata toAddAddresses)
external onlyOwner {
for (uint i = 0; i < toAddAddresses.length; i++) {
whitelist[toAddAddresses[i]] = true;
}
}

/**
* @notice Remove from whitelist
*/
function removeFromWhitelist(address[] calldata toRemoveAddresses)
external onlyOwner {
for (uint i = 0; i < toRemoveAddresses.length; i++) {
delete whitelist[toRemoveAddresses[i]];
}
}

/**
* @notice Function with whitelist
*/
function whitelistFunc() external
{
require(whitelist[msg.sender], “NOT_IN_WHITELIST”);

// Do some useful stuff
}
}

尽管这项技术实现起来相对容易,但随着Gas成本的迅速增长,情况变得更为复杂。每次向智能合约插入一个地址,都需要支付相应的Gas费用。如果你需要将数以千计甚至上万个地址列入白名单,这将耗费大量ETH。因此,对于需要大规模添加到白名单的地址而言,这项技术并不是最理想的选择。

技术 2: 使用 Merkel 树存储预先计算的白名单地址列表

这种技术在2021年的空投和NFT热潮中变得极为受欢迎。在许多情况下,dApp的所有者已经了解需要将空投或初始NFT发送到哪些地址,比如dApp的初期用户或采用者。

为了让用户领取奖励,可以在链下创建一个白名单地址的Merkle树,并将Merkle树的根哈希存储在智能合约中。白名单地址持有者可以通过链下应用程序获取其Merkle证明,然后将该证明提交到智能合约,从而成功领取奖励。这种方法有效地结合了链下信息和智能合约,实现了高效的奖励分发机制。

这种技术的好处是它是无需 gas 的,一旦你在智能合约中存储了 Merkel 根,其余的验证完全免费,为 dApp 所有者节省了大量费用。

但是,该列表是静态的,无法更改。一旦 Merkel 根被存储,就无法添加或删除任何地址。因此,这种技术不适用于白名单列表是动态的情况。

技术 3: 使用 Semaphore 的零知识证明生成白名单

Semaphore是一项构建在以太坊上的隐私层技术,采用零知识SNARK电路。通过零知识,Semaphore使以太坊用户能够证明他们属于某个群组,发出类似投票或认可的信号,同时无需披露他们的真实身份。

通过使用Semaphore,dApp可以让用户在链下完成身份验证,并为他们生成相应的链上身份,以便将其纳入特定群组。生成的链上身份与区块链身份不同,但用户可以借此证明自己是群组的成员;换言之,他们被列入了白名单。这种方法允许用户保护其原始身份的同时,有效地参与特定活动或服务。

Semaphore 特点

使用Semaphore可以执行以下操作:

  1. 使用 javascript 库在链下创建一个 Semaphore 身份
  2. 在链上创建一个群组
  3. 将身份添加到群组
  4. 验证用户是否属于一个群组

步骤 1: 创建用户的身份

要创建用户的身份需要创建一个使用 Semaphore 的 Identity npm 库的链下 dapp

import { Identity } from “@semaphore-protocol/identity”
const { trapdoor, nullifier, commitment } = new Identity()

生成的身份包含两个随机秘密值:trapdoor 和 nullifier,以及一个公共值:commitment。用户必须将 trapdoor 和 nullifier 保存在一个秘密的地方。

步骤 2: 在链上创建一个群组

在创建群组之前,我们需要在以太坊上部署一个Semaphore智能合约,该合约能够处理白名单功能。请使用您选择的所有者地址进行智能合约的部署。

完成智能合约的部署后,现在所有者可以通过调用智能合约的CreateGroup函数在区块链上创建群组。在链下,您可以利用Semaphore的group npm库来轻松地创建群组。

import { Group } from “@semaphore-protocol/group”
const group = new Group(1)

步骤 3: 将身份添加到群组

我们需要保持链上和链下群组状态的同步,因此我们将在链上和链下都将身份添加到群组。我们只需要公共的 identityCommitment 来将身份添加到群组。

要在链下将身份添加到群组:

group.addMember(identityCommitment)

要在链上将身份添加到群组,所有者需要调用智能合约的 addMember 函数。

步骤 4: 验证用户是否属于一个群组/白名单

为验证用户是否在白名单内,用户需要利用其公共和私有身份材料,即commitment、nullifier和trapdoor,在链下生成一份证明。

import { generateProof } from “@semaphore-protocol/proof”
const signal = 1
const fullZKProof = await generateProof(identity, group, groupId, signal)

随后,用户将生成的零知识证明提交给dApp的所有者,该所有者具有群组的最新状态。所有者接着可以利用智能合约的VerifyProof函数将此证明提交到区块链。

若交易成功,表示用户已成功列入白名单。而交易失败则意味着用户可能从未被列入白名单,或者已从白名单群组中移除。

额外步骤: 撤销

Semaphore还提供了支持成员撤销的功能。您可以通过使用链下函数group.remove(identityCommitment)和智能合约的removeMember链上函数来移除成员。

一旦成员被移除,需要经过一段时间才能真正从白名单中移除。在官方的Semaphore合约中,这个过期时间为1小时,但在我们更新过的智能合约中,我们将过期时间缩短为1分钟。

开发联系:DEXDAO

 

© 版权声明

Related posts

No comments

No comments...