diff --git a/README.md b/README.md index 0c55929..18ead9f 100644 --- a/README.md +++ b/README.md @@ -1,97 +1,50 @@ # nwaku-compose -Ready‑to‑use **docker‑compose** stack for running your own [nwaku](https://github.com/waku-org/nwaku) node: - -* RLN‑enabled nwaku node (relay + store protocols, excluding message publishing) -* Grafana dashboard for metrics -* Requires **Docker Compose** and **Git** +Ready‑to‑use **docker compose** stack for running your own [nwaku](https://github.com/waku-org/nwaku) node. ## 📝 Prerequisites -* **Linea Sepolia RPC endpoint** — grab one for free on [Infura](https://www.infura.io) -* **Linea Sepolia wallet** with at least **0.01 ETH** (Only Required For RLN Membership Registration which is WIP) - * Need test ETH? Use the [Linea Sepolia faucet](https://www.infura.io/faucet/sepolia) - * Already have ETH on Sepolia? Bridge it to Linea via the [official bridge](https://bridge.linea.build/native-bridge) - +- **Docker** and **Git** +- **Linea Sepolia RPC endpoint** You can get a free endpoint from [Infura](https://www.infura.io) or any other Linea Sepolia RPC provider. + ### 🚀 Starting your node -| # | Option | Quick-start command | What happens | -|-------|----------------------|-------------------------------|-----------------------------------------------------------------------------| -| **A** | **script** | Power user / CI | setup a .env file manually and then start the node. | -| **B** | **WIP setup-wizard** | Fastest one-command bootstrap | Generates `.env`, registers RLN, and spins up the whole stack automatically | +| # | Setup Type | Setup Style | What happens | +|-------|---------------------|----------------------|-----------------------------------------------------------------------------| +| **A** | **manual** | Power User | Setup a .env file manually and then start the node. | +| **B** | **setup-wizard** | Command-Line | Generates `.env`, starts the node. |
-🧪 option A :- SCRIPT [ manual ] [ recommended ] +🧪 OPTION A :- manual [ recommended ] +### 1. Setup .env file ``` cp .env.example .env ``` Edit the .env file and fill in all required parameters +### 💽 2. Set Database Parameters -### 💽 2. Select DB Parameters +Waku uses PostgreSQL to store and serve messages. +Limit disk usage and (optionally) increase shared memory for better performance. -Waku runs a PostgreSQL Database to store messages from the network and serve them to other peers. -To prevent the database to grow indefinitely, you need to select how much disk space to allocate. -You can either run a script that will estimate and set a good value: - -``` -./set_storage_retention.sh -``` - -Or select your own value. For example, `50GB`: - -```shell -echo "STORAGE_SIZE=50GB" >> .env -``` - -Depending on your machine's memory, it may be worth allocating more memory to the Postgres container to ensure heavy queries are served: - -```shell -./set_postgres_shm.sh -``` - -Or select your own value manually, for example, `4g`: - -```shell -echo "POSTGRES_SHM=4g" >> .env -``` +| Setting | Auto-set command | Manual example | +|----------------|---------------------------------|--------------------------------------| +| Storage size | `./set_storage_retention.sh` | `echo "STORAGE_SIZE=50GB" >> .env` | +| Shared memory | `./set_postgres_shm.sh` | `echo "POSTGRES_SHM=4g" >> .env` | ### 🖥️ 3. Start your node -Start all processes: nwaku node, database and grafana for metrics. Your [RLN](https://rate-limiting-nullifier.github.io/rln-docs/what_is_rln.html) membership is loaded into nwaku under the hood. -```console -docker-compose up -d -``` -⚠️ The node might take a few minutes the very first time it runs because it needs to build locally the RLN community membership tree. - -###🏄🏼‍♂️ 4. Interact with your nwaku node - -* See [localhost:3000](http://localhost:3000/d/yns_4vFVk/nwaku-monitoring) for node metrics. - -**📬 4. Use the REST API** - -Your nwaku node exposes a [REST API](https://waku-org.github.io/waku-rest-api/) to interact with it. +Start all processes: nwaku node, database and grafana for metrics. ``` -# get nwaku version -curl http://127.0.0.1:8645/debug/v1/version -# get nwaku info -curl http://127.0.0.1:8645/debug/v1/info +docker compose up -d ``` -**Get messages sent to a `contentTopic`**. Note that any store node in the network is used to reply. -``` -curl -X GET "http://127.0.0.1:8645/store/v1/messages?contentTopics=%2Fmy-app%2F2%2Fchatroom-1%2Fproto&pageSize=50&ascending=true" \ - -H "accept: application/json" -``` - -For advanced documentation, refer to [ADVANCED.md](https://github.com/waku-org/nwaku-compose/blob/master/ADVANCED.md). -
-⚙️ option B (not recommended at this time):- SETUP-WIZARD [ experimental ] +⚙️ OPTION B :- setup-wizard [ experimental ] Run the wizard script. Once the script is done, the node will be started for you, so there is nothing else to do. @@ -104,6 +57,7 @@ The script is experimental, feedback and pull requests are welcome.
+<<<<<<< Updated upstream ### 🛑 Shutting down your node @@ -112,6 +66,32 @@ To gracefully shut down your node: docker compose down ``` +======= +### 🏄🏼‍♂️ 4. Monitor your nwaku node + +- **Metrics (Grafana):** + Open [localhost:3000](http://localhost:3000/d/yns_4vFVk/nwaku-monitoring) to view node metrics. + Metrics will appear **only if your node is running correctly**. + +- **Live logs:** + See what’s happening inside your node in real time: + ```bash + docker compose logs nwaku -f --tail 100 + ``` + +**📬 5. Use the REST API** + +Your nwaku node exposes a [REST API](https://waku-org.github.io/waku-rest-api/) to interact with it. +``` +# get nwaku version +curl http://127.0.0.1:8645/debug/v1/version +# get nwaku info +curl http://127.0.0.1:8645/debug/v1/info +``` + +For advanced documentation, refer to [ADVANCED.md](https://waku-org.github.io/waku-rest-api/). + +>>>>>>> Stashed changes ### 📌 Note RLN membership is your access key to The Waku Network. It is registered on-chain, enabling your nwaku node to send messages in a decentralized and privacy-preserving way while adhering to rate limits. Messages exceeding the rate limit will not be relayed by other peers. @@ -127,7 +107,6 @@ We regularly announce new available versions in our [Discord](https://discord.wa Please review the latest https://github.com/waku-org/nwaku-compose/blob/master/.env.example env var template file and update your .env accordingly. -Make sure you have some ETH in your Linea Sepolia account. Also, move your Sepolia RPC client (e.g., Infura) to a Linea Sepolia RPC client. You will need to delete both the `keystore` and `rln_tree` folders, and register your membership again before using the new version by running the following commands: diff --git a/dogfooding/.env.example.rln b/dogfooding/.env.example.rln new file mode 100644 index 0000000..998e639 --- /dev/null +++ b/dogfooding/.env.example.rln @@ -0,0 +1,19 @@ +## RLN Credentials - EXPERIMENTAL +## If you have/want an RLN membership to send messages + +# Account of testnet where you have Linea Sepolia ETH that would be staked into RLN contract. +# e.g.: ETH_TESTNET_ACCOUNT=0xbecd1546a397a6bad875247d51c4c6da0e469021 +ETH_TESTNET_ACCOUNT= + +# Address of the RLN Membership Token contract on Linea Sepolia used to pay for membership. +TOKEN_CONTRACT_ADDRESS= + +# Private key of testnet where you have Linea Sepolia ETH that would be staked into RLN contract. +# Note: make sure you don't use the '0x' prefix. +# Use the following as a format example, but replace it with your own private key value +# e.g. ETH_TESTNET_KEY=abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234 +ETH_TESTNET_KEY= + +# Path and password to the keystore file +RLN_RELAY_CRED_PATH= +RLN_RELAY_CRED_PASSWORD= \ No newline at end of file diff --git a/register_rln.sh b/dogfooding/register_rln.sh similarity index 100% rename from register_rln.sh rename to dogfooding/register_rln.sh diff --git a/setup_wizard.sh b/setup_wizard.sh index b45be9f..bbfc4f7 100755 --- a/setup_wizard.sh +++ b/setup_wizard.sh @@ -8,20 +8,7 @@ echocol() } RLN_CONTRACT_ADDRESS=0xB9cd878C90E49F797B4431fBF4fb333108CB90e6 -TOKEN_CONTRACT_ADDRESS=0x185A0015aC462a0aECb81beCc0497b649a64B9ea -REQUIRED_AMOUNT=5 -check_eth_balance() { - # 0.01 ETH in wei - local MIN=10000000000000000 - local BAL - - BAL=$(cast balance "$ETH_TESTNET_ACCOUNT" --rpc-url "$RLN_RELAY_ETH_CLIENT_ADDRESS" 2>/dev/null | tr -d '[:space:]') - [ -z "$BAL" ] && { echocol "Couldn’t fetch ETH balance."; exit 1; } - [ "$BAL" -lt "$MIN" ] && { echocol "Need ≥ 0.01 Linea Sepolia ETH. Top up at https://www.infura.io/faucet/sepolia"; exit 1; } - - echocol "✅ You have enough Linea Sepolia ETH to register." -} if [ -f ./.env ]; then echocol ".env file already exists." @@ -35,16 +22,6 @@ if [ -f ./.env ]; then fi fi -if [ -f keystore/keystore.json ]; then - echocol "'keystore/keystore.json' already exists." - read -p "Do you want to delete and regenerate it? (y/N): " RECREATE_KEYSTORE - if [ "$RECREATE_KEYSTORE" = "y" ] || [ "$RECREATE_KEYSTORE" = "Y" ]; then - rm -f keystore/keystore.json - echocol "Old keystore/keystore.json removed. Generating a new one..." - else - echocol "Keeping existing keystore/keystore.json. Exiting wizard." - fi -fi # Ensure Foundry (cast & foundryup) is available for token mint/approve calls if ! command -v cast >/dev/null 2>&1; then @@ -83,33 +60,6 @@ if [ -z "$RLN_RELAY_ETH_CLIENT_ADDRESS" ] \ exit 1 fi -echocol "" -echocol "Now enter your Linea Sepolia Testnet account address (should start with 0x and be 42 characters)" -read -p "ETH_TESTNET_ACCOUNT: " ETH_TESTNET_ACCOUNT - -if ! [[ "$ETH_TESTNET_ACCOUNT" =~ ^0x[0-9a-fA-F]{40}$ ]]; then - echo "Invalid value, received '$ETH_TESTNET_ACCOUNT'" - exit 1 -fi - -echocol "" -echocol "Checking your Linea Sepolia Testnet balance..." -check_eth_balance -echocol "" - -echocol "Now enter your Linea Sepolia Testnet private key in hex format 0a...1f without 0x prefix" -read -p "ETH_TESTNET_KEY: " ETH_TESTNET_KEY - -if ! [[ "$ETH_TESTNET_KEY" =~ ^[0-9a-fA-F]{64}$ ]]; then - echo "Invalid value, received '$ETH_TESTNET_KEY'" - exit 1 -fi - -echocol "" -echocol "Generating a password for the RLN membership keystore file..." -read -p "Press ENTER to continue..." foo -RLN_RELAY_CRED_PASSWORD=$(LC_ALL=C < /dev/urandom tr -dc ',/.;:<>?!@#$%^&*()+\-_A-Z-a-z-0-9' | head -c${1:-16}; echo) - echocol "" echocol "Estimating storage size for DB..." read -p "Press ENTER to continue..." foo @@ -136,52 +86,17 @@ echocol "They will be saved to '.env'. Press ENTER to confirm or CONTROL-C to ca echocol "" echocol "RLN_RELAY_ETH_CLIENT_ADDRESS: $RLN_RELAY_ETH_CLIENT_ADDRESS" -echocol "ETH_TESTNET_KEY: $ETH_TESTNET_KEY" -echocol "ETH_TESTNET_ACCOUNT: $ETH_TESTNET_ACCOUNT" -echocol "RLN_RELAY_CRED_PASSWORD: $RLN_RELAY_CRED_PASSWORD" +echocol "RLN_CONTRACT_ADDRESS: $RLN_CONTRACT_ADDRESS" echocol "STORAGE_SIZE: $STORAGE_SIZE" echocol "POSTGRES_SHM: $POSTGRES_SHM" read -p "Press ENTER to continue..." foo echo "RLN_RELAY_ETH_CLIENT_ADDRESS='$RLN_RELAY_ETH_CLIENT_ADDRESS' -ETH_TESTNET_KEY=$ETH_TESTNET_KEY -ETH_TESTNET_ACCOUNT=$ETH_TESTNET_ACCOUNT -RLN_RELAY_CRED_PASSWORD='$RLN_RELAY_CRED_PASSWORD' +RLN_CONTRACT_ADDRESS=$RLN_CONTRACT_ADDRESS STORAGE_SIZE=$STORAGE_SIZE POSTGRES_SHM=$POSTGRES_SHM" > ./.env -echocol "" -echocol "Checking your TTT token balance..." -USER_BALANCE_RAW=$(cast call $TOKEN_CONTRACT_ADDRESS "balanceOf(address)(uint256)" $ETH_TESTNET_ACCOUNT --rpc-url $RLN_RELAY_ETH_CLIENT_ADDRESS 2>/dev/null) -USER_BALANCE=$(echo "$USER_BALANCE_RAW" | awk '{print $1}') -USER_BALANCE=$(echo "$USER_BALANCE / 10^18" | bc) - -if [ -z "$USER_BALANCE" ]; then - echocol "Could not fetch balance. Please ensure your RPC endpoint and account are correct." - exit 1 -fi - -echocol "Your current TTT token balance is: $USER_BALANCE" -echocol "Required amount: $REQUIRED_AMOUNT" -echocol "" - -MINT_CHOICE="y" -if [ "$USER_BALANCE" -ge "$REQUIRED_AMOUNT" ]; then - echocol "You already have enough TTT tokens to register." - read -p "Do you want to mint more tokens? (y/N): " MINT_CHOICE -fi - -if [ "$MINT_CHOICE" = "y" ] || [ "$MINT_CHOICE" = "Y" ]; then - ./register_rln.sh --mint; -else - ./register_rln.sh --no-mint; -fi - -echocol "" -echocol "✅ RLN membership registered successfully!" -echocol "" - echocol "Your node is ready! enter the following command to start it:" read -p "Press ENTER to continue..." foo docker-compose up -d