智能合约的白名单技术
白名单技术,是一项区分服务允许与禁止用户的关键技术。虽然几十年来一直在网络安全领域广泛运用,但在区块链领域,尤其是在2017年ICO热潮中,白名单技术变得愈发普遍。
在这篇文章中,我们将首先深入探讨自2017年以来在Solidity智能合约中采用的两种白名单技术。这些创新方法赋予地址访问DApp功能的权限。具体而言,这两种技术包括:
最终,我们将探讨一项创新性的前沿技术——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 根被存储,就无法添加或删除任何地址。因此,这种技术不适用于白名单列表是动态的情况。