mirror of
https://github.com/vacp2p/rfc-index.git
synced 2026-01-09 15:48:03 -05:00
141 lines
5.1 KiB
Markdown
141 lines
5.1 KiB
Markdown
---
|
|
title: RLN-INTEREP-SPEC
|
|
name: Interep as group management for RLN
|
|
status: raw
|
|
category:
|
|
tags: rln
|
|
editor: Aaryamann Challani <p1ge0nh8er@proton.me>
|
|
contributors:
|
|
---
|
|
|
|
## Abstract
|
|
|
|
This spec integrates [Interep](https://interep.link)
|
|
into the [RLN](../32/rln-v1.md) spec.
|
|
Interep is a group management protocol
|
|
that allows for the creation of groups of users and
|
|
the management of their membership.
|
|
It is used to manage the membership of the RLN group.
|
|
|
|
Interep ties in web2 identities with reputation, and
|
|
sorts the users into groups based on their reputation score.
|
|
For example, a GitHub user with over 100 followers is considered to have "gold" reputation.
|
|
|
|
Interep uses [Semaphore](https://semaphore.appliedzkp.org/)
|
|
under the hood to allow anonymous signaling of membership in a group.
|
|
Therefore, a user with a "gold" reputation can prove the existence
|
|
of their membership without revealing their identity.
|
|
|
|
RLN is used for spam prevention, and Interep is used for group management.
|
|
|
|
By using Interep with RLN,
|
|
we allow users to join RLN membership groups
|
|
without the need for on-chain financial stake.
|
|
|
|
## Motivation
|
|
|
|
To have Sybil-Resistant group management,
|
|
there are [implementations](https://github.com/vacp2p/rln-contract)
|
|
of RLN which make use of financial stake on-chain.
|
|
However, this is not ideal because it reduces the barrier of entry for honest participants.
|
|
|
|
In this case,
|
|
honest participants will most likely have a web2 identity accessible to them,
|
|
which can be used for joining an Interep reputation group.
|
|
By modifying the RLN spec to use Interep,
|
|
we can have Sybil-Resistant group management
|
|
without the need for on-chain financial stake.
|
|
|
|
Since RLN and Interep both use Semaphore-style credentials,
|
|
it is possible to use the same set of credentials for both.
|
|
|
|
## Functional Operation
|
|
|
|
Using Interep with RLN involves the following steps -
|
|
|
|
1. Generate Semaphore credentials
|
|
2. Verify reputation and join Interep group
|
|
3. Join RLN membership group via interaction with Smart Contract,
|
|
by passing a proof of membership to the Interep group
|
|
|
|
### 1. Generate Semaphore credentials
|
|
|
|
Semaphore credentials are generated in a standard way,
|
|
depicted in the [Semaphore documentation](https://semaphore.appliedzkp.org/docs/guides/identities#create-deterministic-identities).
|
|
|
|
### 2. Verify reputation and join Interep group
|
|
|
|
Using the Interep app deployed on [Goerli](https://goerli.interep.link/),
|
|
the user can check their reputation tier and join the corresponding group.
|
|
This results in a transaction to the Interep contract, which adds them to the group.
|
|
|
|
### 3. Join RLN membership group
|
|
|
|
Instead of sending funds to the RLN contract to join the membership group,
|
|
the user can send a proof of membership to the Interep group.
|
|
This proof is generated by the user, and
|
|
is verified by the contract.
|
|
The contract ensures that the user is a member of the Interep group, and
|
|
then adds them to the RLN membership group.
|
|
|
|
Following is the modified signature of the register function
|
|
in the RLN contract -
|
|
|
|
```solidity
|
|
/// @param groupId: Id of the group.
|
|
/// @param signal: Semaphore signal.
|
|
/// @param nullifierHash: Nullifier hash.
|
|
/// @param externalNullifier: External nullifier.
|
|
/// @param proof: Zero-knowledge proof.
|
|
/// @param idCommitment: ID Commitment of the member.
|
|
function register(
|
|
uint256 groupId,
|
|
bytes32 signal,
|
|
uint256 nullifierHash,
|
|
uint256 externalNullifier,
|
|
uint256[8] calldata proof,
|
|
uint256 idCommitment
|
|
)
|
|
```
|
|
|
|
## Verification of messages
|
|
|
|
Messages are verified the same way as in the [RLN spec](../32/rln-v1.md/#verification).
|
|
|
|
## Slashing
|
|
|
|
The slashing mechanism is the same as in the [RLN spec](../32/rln-v1.md/#slashing).
|
|
It is important to note that the slashing
|
|
may not have the intended effect on the user,
|
|
since the only consequence is that they cannot send messages.
|
|
This is due to the fact that the user
|
|
can send a identity commitment in the registration to the RLN contract,
|
|
which is different than the one used in the Interep group.
|
|
|
|
## Proof of Concept
|
|
|
|
A proof of concept is available at
|
|
[vacp2p/rln-interp-contract](https://github.com/vacp2p/rln-interep-contract)
|
|
which integrates Interep with RLN.
|
|
|
|
## Security Considerations
|
|
|
|
1. As mentioned in [Slashing](#slashing),
|
|
the slashing mechanism may not have the intended effect on the user.
|
|
2. This spec inherits the security considerations of the [RLN spec](../32/rln-v1.md/#security-considerations).
|
|
3. This spec inherits the security considerations of [Interep](https://docs.interep.link/).
|
|
4. A user may make multiple registrations using the same Interep proofs but
|
|
different identity commitments.
|
|
The way to mitigate this is to check if the nullifier hash has been detected
|
|
previously in proof verification.
|
|
|
|
## References
|
|
|
|
1. [RLN spec](../32/rln-v1.md)
|
|
2. [Interep](https://interep.link)
|
|
3. [Semaphore](https://semaphore.appliedzkp.org/)
|
|
4. [Decentralized cloudflare using Interep](https://ethresear.ch/t/decentralised-cloudflare-using-rln-and-rich-user-identities/10774)
|
|
5. [Interep contracts](https://github.com/interep-project/contracts)
|
|
6. [RLN contract](https://github.com/vacp2p/rln-contract)
|
|
7. [RLNP2P](https://rlnp2p.vac.dev/)
|