# RLN:零知识证明防女巫方案简介

By [jackygu's blog](https://paragraph.com/@jackygu) · 2023-06-13

---

RLN(Rate Limiting Nullifier)是一个零知识应用，可用于去中心化、匿名环境下的垃圾邮件预防。

区块链的匿名性为某些应用程序打开了垃圾邮件和Sybil攻击（女巫攻击）的可能性，这可能会严重影响用户体验和应用程序的整体功能。例如，一个Web3聊天应用程序，其中的用户是匿名的。每个人都可以发送无限量的消息，但我们没有能力踢出这个成员，因为消息的发送者是匿名的。

`RLN`帮助我们识别并“踢出”垃圾邮件发送者。

此外，在匿名环境中，`RLN`不仅有助于防止垃圾邮件攻击，而且可以限制用户的行为次数（例如投票或竞标）。

circon电路结构:
-----------

![](https://storage.googleapis.com/papyrus_images/80ef29ccb518361c76be408062356bffdb3aefc2b47fe80f7524a17ba8c22b0f.jpg)

原理
--

`RLN`的功能由三个部分组成，将它们集成在一起可以提供垃圾邮件和Sybil攻击保护。这些部分应该由需要匿名和垃圾邮件保护的上游应用程序进行集成。应用程序可以是中心化的或去中心化的。对于去中心化的应用程序，每个用户为应用程序维护独立的存储和计算资源。这三个部分是：

*   用户注册(Registration)
    
*   用户交互(Interaction)
    
*   用户移除（Slashing）
    

### 用户注册

在注册应用程序之前，用户需要生成一个密钥，并使用`Poseidon`哈希函数`identityCommitment = posseidonHash(secretKey)`从秘密密钥派生出身份。

用户通过提供某种形式的抵押和他们从密钥派生出的身份来注册应用程序。应用程序维护一个`Merkle`树数据结构（在`RLN`的最新迭代中，我们使用增量`Merkle`树算法来提高Gas的使用效率，但`Merkle`树不一定要在链上），该结构存储已注册用户的身份。注册成功后，用户的身份将存储在`Merkle`树的叶子节点中，并为他们分配一个索引，表示他们在树中的位置。

### 用户交互

对于用户想要与应用程序进行的每个交互(如合约调用)，用户必须生成一个零知识证明(zk proof)，确保他们的身份是成员`Merkle`树的一部分。

`RLN`有许多用例，例如投票应用程序（每次选举1票）、聊天（每秒1条消息）和交互速率限制访问等。验证器可以是集中化应用程序的服务器或去中心化应用程序的其他用户。

通常，反垃圾邮件规则的抽象形式为：用户每个时期(epoch)内不得进行超过X个交互。为了简单起见，让我们将规则转化为：“用户每秒钟不能发送超过一条消息。”

可以使用`Shamir`秘密共享方案（[阅读更多](https://rate-limiting-nullifier.github.io/rln-docs/sss.html)），该方案允许将秘密（例如分成n个部分）并在呈现n个部分中的任何m个部分（m <= n）时恢复它。

因此，用户必须将其`secret_key`分成n个部分，并为每个交互显示`secret_key`的新部分。因此，除了证明成为`Merkle`树成员外，用户还必须证明显示的部分真正是他们的`secret_key`的部分。

如果他们每个时期(epoch)内进行交互的次数超过了允许的数量，他们的`secret_key`可能会被完全重建。

### 用户移除

`RLN`机制的最后一个功能是，它允许任何人通过知道用户的秘密密钥将其从成员树中移除。

成员树包含所有已注册用户的身份。用户的身份是从其密钥派生出来的，用户的密钥仅在垃圾邮件事件中（除非原始用户想要自行删除，因为他们知道自己的密钥）才会被揭示。当存在经济押金时，`RLN`机制可以以这样的方式实现，即将垃圾邮件发送者的押金发送给第一个正确报告垃圾邮件发送者的用户，以提供已重建垃圾邮件发送者的密钥作为证明。

参考《[https://rate-limiting-nullifier.github.io/rln-docs/what\_is\_rln.html》](https://rate-limiting-nullifier.github.io/rln-docs/what_is_rln.html%E3%80%8B)

> RLN是（PSE）隐私与扩展性探索的一部分，该文章的写作团队由以太坊基金会支持，由多学科团队组成。PSE探索零知识证明和其他加密原语的新用例。

---

*Originally published on [jackygu's blog](https://paragraph.com/@jackygu/rln)*
