[WIP] E2E Relay Own Your Own Service
Intended as a sketchpad by @olshansk that will be productionized by @olshansk
This guide walks you through setting up a RelayMiner for testing purposes using Anvil as the backend service.
- Prerequisites
- Account Preparation
- Service Setup
- Anvil Node Setup
- RelayMiner Configuration
- Testing
- Next Steps
Prerequisites
Before starting, ensure you have:
- Vultr service setup: Follow the Vultr instance creation guide
- RC helpers configured: Set up RC helpers for Shannon environments
- Funding account: You need a
$FUNDING_ADDR
environment variable set with an account that has sufficient POKT to fund test accounts
Account Preparation
Create Local Accounts
Run the following commands on your local machine to create the required accounts:
# Create accounts
pocketd keys add olshansky_anvil_test_service_owner
pocketd keys add olshansky_anvil_test_app
pocketd keys add olshansky_anvil_test_gateway
pocketd keys add olshansky_anvil_test_supplier
# Export addresses
export OLSHANSKY_ANVIL_TEST_SERVICE_OWNER_ADDR=$(pocketd keys show olshansky_anvil_test_service_owner -a)
export OLSHANSKY_ANVIL_TEST_APP_ADDR=$(pocketd keys show olshansky_anvil_test_app -a)
export OLSHANSKY_ANVIL_TEST_GATEWAY_ADDR=$(pocketd keys show olshansky_anvil_test_gateway -a)
export OLSHANSKY_ANVIL_TEST_SUPPLIER_ADDR=$(pocketd keys show olshansky_anvil_test_supplier -a)
# Fund accounts
pocketd tx bank send $FUNDING_ADDR $OLSHANSKY_ANVIL_TEST_SERVICE_OWNER_ADDR 100000000upokt --network=beta --fees=100upokt --unordered --timeout-duration=5s --yes
pocketd tx bank send $FUNDING_ADDR $OLSHANSKY_ANVIL_TEST_APP_ADDR 100000000upokt --network=beta --fees=100upokt --unordered --timeout-duration=5s --yes
pocketd tx bank send $FUNDING_ADDR $OLSHANSKY_ANVIL_TEST_GATEWAY_ADDR 100000000upokt --network=beta --fees=100upokt --unordered --timeout-duration=5s --yes
pocketd tx bank send $FUNDING_ADDR $OLSHANSKY_ANVIL_TEST_SUPPLIER_ADDR 100000000upokt --network=beta --fees=100upokt --unordered --timeout-duration=5s --yes
# Export private keys
pocketd keys export olshansky_anvil_test_service_owner --unsafe --unarmored-hex --yes
pocketd keys export olshansky_anvil_test_app --unsafe --unarmored-hex --yes
pocketd keys export olshansky_anvil_test_gateway --unsafe --unarmored-hex --yes
pocketd keys export olshansky_anvil_test_supplier --unsafe --unarmored-hex --yes
Import Accounts to Vultr Instance
SSH into your Vultr instance and import the accounts.
Replace <hex>
with the actual hex private keys exported in the previous step:
ssh root@$VULTR_INSTANCE_IP
# Import accounts using the hex private keys from previous step
pocketd keys import-hex --keyring-backend=test olshansky_anvil_test_service_owner <hex>
pocketd keys import-hex --keyring-backend=test olshansky_anvil_test_app <hex>
pocketd keys import-hex --keyring-backend=test olshansky_anvil_test_gateway <hex>
pocketd keys import-hex --keyring-backend=test olshansky_anvil_test_supplier <hex>
Service Setup
Create Service
Create a new service on-chain for your Anvil test environment:
# Format: pocketd tx service add-service <service_id> <name> <compute_units_per_relay>
pocketd tx service add-service olshansky_anvil_test "Test service for olshansky by olshansky" 7 --keyring-backend=test --from=olshansky_anvil_test_service_owner --network=beta --yes --fees=200upokt
The value 7
represents compute units per relay for this service. Adjust based on your service's computational cost.
Create Application
Create the application configuration:
cat <<EOF > stake_app_config.yaml
stake_amount: 60000000000upokt # 60,000 POKT minimum for testnet
service_ids:
- "olshansky_anvil_test"
EOF
Stake the application:
pocketd tx application stake-application --config=stake_app_config.yaml --keyring-backend=test --from=olshansky_anvil_test_app --network=beta --yes --fees=200upokt --unordered --timeout-duration=1m
Verify the application:
pocketd query application show-application $(pocketd keys show olshansky_anvil_test_app -a --keyring-backend=test) --network=beta
Create Supplier
Create the supplier configuration:
cat <<EOF > stake_supplier_config.yaml
owner_address: $(pocketd keys show olshansky_anvil_test_supplier -a --keyring-backend=test)
operator_address: $(pocketd keys show olshansky_anvil_test_supplier -a --keyring-backend=test)
stake_amount: 100000000upokt # 100 POKT minimum for testnet
default_rev_share_percent:
$(pocketd keys show olshansky_anvil_test_supplier -a --keyring-backend=test): 100
services:
- service_id: "olshansky_anvil_test"
endpoints:
- publicly_exposed_url: http://$(curl ifconfig.me):8545 # Uses your public IP
rpc_type: JSON_RPC
EOF
Stake the supplier:
pocketd tx supplier stake-supplier --config=stake_supplier_config.yaml --keyring-backend=test --from=olshansky_anvil_test_supplier --network=beta --yes --fees=200upokt --unordered --timeout-duration=1m
Verify the supplier:
pocketd query supplier show-supplier $(pocketd keys show olshansky_anvil_test_supplier -a --keyring-backend=test) --network=beta
Anvil Node Setup
Install Foundry
curl -L https://foundry.paradigm.xyz | bash
source ~/.foundry/bin
foundryup
Start Anvil
Create a startup script:
cat <<EOF> start_anvil.sh
#!/bin/bash
# Run Anvil in background with nohup, redirecting output to anvil.log
nohup anvil --port 8545 > anvil.log 2>&1 &
echo "Anvil started on port 8545. Logs: anvil.log"
EOF
chmod +x start_anvil.sh
Start Anvil:
./start_anvil.sh
Verify Anvil is running:
# Check if Anvil process is running
ps aux | grep anvil
# View recent logs
tail -20 anvil.log
Test the connection:
curl -X POST http://127.0.0.1:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": []}'
RelayMiner Configuration
Create RelayMiner Config
cat <<EOF> relay_miner_config.yaml
default_signing_key_names:
- olshansky_anvil_test_supplier
smt_store_path: /root/.pocket/smt
pocket_node:
query_node_rpc_url: https://shannon-testnet-grove-rpc.beta.poktroll.com
query_node_grpc_url: https://shannon-testnet-grove-grpc.beta.poktroll.com:443
tx_node_rpc_url: https://shannon-testnet-grove-rpc.beta.poktroll.com
suppliers:
- service_id: "olshansky_anvil_test" # change if not using Anvil
service_config:
backend_url: "http://127.0.0.1:8545" # change if not using Anvil
listen_url: http://0.0.0.0:8545 # must match Supplier's public URL
metrics:
enabled: false
addr: :9090
pprof:
enabled: false
addr: :6060
EOF
Start RelayMiner
Configure firewall to allow external connections on port 8545:
sudo ufw allow 8545/tcp
Start the RelayMiner:
pocketd relayminer start --config=relay_miner_config.yaml --chain-id=pocket-beta --keyring-backend=test --grpc-insecure=false
Consider running the RelayMiner in a tmux
or screen
session, or as a systemd service for production use.
Testing
Send a Test Relay
In a separate shell, send a test relay:
pocketd relayminer relay --keyring-backend=test \
--app=$(pocketd keys show olshansky_anvil_test_app -a --keyring-backend=test) \
--supplier=$(pocketd keys show olshansky_anvil_test_supplier -a --keyring-backend=test) \
--node=https://shannon-testnet-grove-rpc.beta.poktroll.com \
--grpc-addr=shannon-testnet-grove-grpc.beta.poktroll.com:443 \
--grpc-insecure=false \
--payload="{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"eth_blockNumber\", \"params\": []}"
Verify Claims
Check if your RelayMiner created any claims:
pocketd query txs --node=https://shannon-testnet-grove-rpc.beta.poktroll.com \
--query="tx.height>20000 AND message.action='/pocket.proof.MsgCreateClaim'" \
--limit 10 --page 1 -o json | jq '[.txs[].tx.body.messages[] | select(."@type" == "/pocket.proof.MsgCreateClaim") | .supplier_operator_address] | unique'
Next Steps
Your RelayMiner should now be running and processing relays.
Monitoring and troubleshooting:
- Monitor RelayMiner logs for incoming relay requests
- Check Anvil logs at
anvil.log
for backend activity - Query claims periodically to verify relay processing
- Use
pocketd query proof list-claims --network=beta
to see all recent claims
Common issues:
- Port conflicts: Ensure port 8545 is not already in use (
netstat -tlnp | grep 8545
) - Firewall blocking: Verify UFW allows port 8545 (
sudo ufw status
) - Session not started: Relays only work during active sessions; check session timing with
pocketd query session get-session