## Introduction to RLN A great introduction to RLN was written by Rasul [here](https://mirror.xyz/privacy-scaling-explorations.eth/iCLmH1JVb7fDqp6Mms2NR001m2_n5OOSHsLF2QrxDnQ), discussing the capabilities of RLN. Here's a graph to understand the dependency tree of RLN, and it's downstream users - ![rln dependency tree](https://hackmd.io/_uploads/B1DgIbCin.jpg) ## Where RLN *should* be used RLN should be used in the following scenarios - - You operate in a privacy-constrained environment, i.e you wouldn't want to reveal information about yourself (IP Address, KYC). - The application doesn't care about a specific user, rather, that a message has been sent from someone within a set of users they care about. ## Where RLN *shouldn't* be used RLN shouldn't be used in the following scenario - - Applications which employ traditional DoS protection mechanisms like IP address tracking, and user KYC ## How can I use RLN today? ### 1. Define your application's registration and slashing criteria By using `RlnBase.sol`, as described above, you have full overriding capabilities over the registration process. This could mean, you accept an arbitrary amount of erc20, check if the user has a soul bound token, or any other mechanism, with which you wish to verify that a given user *can* join your membership group. This example will just check if the provided idCommitment starts with `0xdead`. We will also not require a membership deposit. Our slashing model will not use a proof, and only the owner can slash the users. ### 2. Start a new project Use any of the smart contract tooling, foundry/hardhat/truffle to scaffold your project, and install [rln-contract](https://github.com/vacp2p/rln-contract) as a dependency. We will use [Foundry](https://github.com/foundry-rs/foundry). Installation instructions are provided [here](https://book.getfoundry.sh/getting-started/installation). 1. Start a new project ```bash forge init hello_rln_app && cd hello_rln_app ``` 2. Install the `rln-contract` dependency ```bash forge install vacp2p/rln-contract ``` 3. Install the `Openzeppelin-contracts` dependency ```bash forge install Openzeppelin/openzeppelin-contracts ``` ### 3. Create the contract 1. Create a new contract in `src/` called `HelloRln.sol` ```solidity // SPDX-License-Identifier: MIT pragma solidity 0.8.15; import "rln-contract/RlnBase.sol"; import {Ownable} from "openzeppelin-contracts/contracts/access/Ownable.sol"; contract HelloRln is Ownable, RlnBase { bytes2 public constant start = 0xdead; uint256 private membershipDeposit = 0; uint256 private depth = 20; constructor(address _poseidonHasher) Ownable() RlnBase(membershipDeposit, depth, _poseidonHasher, address(0)) {} function _validateRegistration(uint256 idCommitment) internal pure override { if (bytes2(bytes32(idCommitment)) != start) revert FailedValidation(); } function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof) internal view override onlyOwner {} } ``` 2. Compile ```bash forge build ``` 3. You can write tests in the `test` directory to test out this logic. A full example can be found [here](https://github.com/vacp2p/hello_rln_app) ### 4. Deploy the contract 1. [Deploy the contract](https://book.getfoundry.sh/forge/deploying), and obtain the address. ### 5. Use the new rln app with nwaku 1. Follow the [rln-relay guide](https://github.com/waku-org/nwaku/blob/bb9d231bdca1deb1955cf2c3a083b4a107d87076/docs/operators/how-to/run-with-rln.md), and replace the address with the newly deployed contract 2. Done! you are now running rln-relay, with your app-specific validation enabled 🚀 OR ### 5. Use the new rln app with your own p2p system 1. Implement rln-relay for your application, using [zerokit's public/ffi api](https://github.com/vacp2p/zerokit) ## Attribution Most of this work would not be possible without the efforts of the [PSE group](https://pse.dev/) and past contributors at [Vac](https://vac.dev) ## References 1. [circom-rln](https://github.com/Rate-Limiting-Nullifier/circom-rln) 2. [pmtree](https://github.com/Rate-Limiting-Nullifier/pmtree) 3. [RLN Spec](https://rfc.vac.dev/spec/32) 4. [RLN-Relay Spec](https://rfc.vac.dev/spec/17) 5. [Zerokit](https://github.com/vacp2p/zerokit)