n-per-epoch 提供了一种通过隐私证明,来验证正式的人类身份,并以此来进行合约的访问频率限制。
- 原文链接: https://github.com/rsproule/n-per-epoch#readme
- 译文出自:登链翻译计划
- 译者:南小芽 校对:Tiny 熊
- 本文永久链接:learnblockchain.cn/article…
n-per-epoch 提供了一个简单的合约修改器(modifier),可用于在任何智能合约函数调用中进行访问频率的限制。
n-per-epoch 库使合约创建者能够在定义的时间周期内限制特定用户调用函数的次数。时间周期的持续时间非常灵活,允许开发者将其设置为接近无限(永远只能调用一次)或者设置为很短的时间以实现更高的吞吐量。
❗️警告
设置时间周期请一定要考虑到证明生成时间和区块包含时间。"epochId" 必须同时匹配链上的证明和结算。因此,时间周期长度必须大于证明生成时间和区块包含时间之和,并留出一些缓冲时间。
你会注意到这些合约完全不关心 msg.sender(消息发起者)。这是有意设计的!在内部,n-per-epoch 利用了零知识包含证明,通过使用semaphore 库来实现。该合约通过提供的 zk 证明来强制进行身份验证,而不依赖交易的签署者。ERC4337 类型的账户抽象化可以轻松利用这种类型的身份验证!
这个示例使用了由Worldcoin 开发的已有的 anonymity set (匿名集合),其中包括大约140万个已验证的人类用户。Worldcoin通过扫描人的虹膜,并确保每个虹膜之前未被添加到集合中,建立了这个集合。只需在设置中修改groupId,即可使用不同的集合。
通过Foundry 安装:
forge install rsproule/n-per-epoch
npm i https://github.com/rsproule/n-per-epoch
查看ExampleNPerEpochContract.sol
,检查修改器已生效:
import { NPerEpoch} from "../NPerEpoch.sol";
...
...
...
constructor(IWorldID _worldId) NPerEpoch(_worldId) {}
function sendMessage(
uint256 root,
string calldata input,
uint256 nullifierHash,
uint256[8] calldata proof,
RateLimitKey calldata actionId
)
public rateLimit(
root,
abi.encodePacked(input).hashToField(),
nullifierHash,
actionId,
proof
)
{
if (nullifierHashes[nullifierHash]) revert InvalidNullifier();
nullifierHashes[nullifierHash] = true;
emit Message(input);
}
...
...
...
function settings()
public
pure
virtual
override
returns (NPerEpoch.Settings memory)
{
return Settings(1, 300, 2); // groupId (worldID=1), epochLength, numPerEpoch)
}
安装:
git clone git@github.com:rsproule/n-per-epoch.git
构建:
make
执行单元测试:
make test
n-per-epoch 代码库链接:https://github.com/rsproule/n-per-epoch#readme
感谢 Chaintool 对本翻译的支持, Chaintool 是一个为区块链开发者准备的开源工具箱
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!