From 94f063f3b1ef1538bd825bcdac07d877c0bd03ae Mon Sep 17 00:00:00 2001 From: Conor Schaefer Date: Wed, 15 Mar 2023 09:28:48 -0700 Subject: [PATCH] BEGIN relayer config generation The plan is to post transactions between testnet & preview, using the relayer, which must be configured with chain info for both networks, as well as wallet identities. --- deployments/relayer/README.md | 20 ++++++++++ .../relayer/configs/penumbra-preview.json | 16 ++++++++ .../relayer/configs/penumbra-testnet.json | 16 ++++++++ deployments/relayer/configs/penumbra.tpl | 16 ++++++++ deployments/relayer/configure-relayer | 40 +++++++++++++++++++ deployments/relayer/generate-configs | 38 ++++++++++++++++++ deployments/relayer/justfile | 11 +++++ deployments/relayer/run-relayer | 8 ++++ 8 files changed, 165 insertions(+) create mode 100644 deployments/relayer/README.md create mode 100644 deployments/relayer/configs/penumbra-preview.json create mode 100644 deployments/relayer/configs/penumbra-testnet.json create mode 100644 deployments/relayer/configs/penumbra.tpl create mode 100755 deployments/relayer/configure-relayer create mode 100755 deployments/relayer/generate-configs create mode 100644 deployments/relayer/justfile create mode 100755 deployments/relayer/run-relayer diff --git a/deployments/relayer/README.md b/deployments/relayer/README.md new file mode 100644 index 0000000000..cf41eeffd3 --- /dev/null +++ b/deployments/relayer/README.md @@ -0,0 +1,20 @@ +# relayer config + +Stores config generation scripts for use with the [relayer](https://github.com/cosmos/relayer), +for IBC functionality. Prior to mainnet, we use `relayer` to synchronize actions +from testnet-preview to testnet. + +## Running it + +``` +./generate-configs preview +./generate-configs testnet +./configure-relayer +``` + +## Further reading +The config format for the JSON files are adapted from the [example-configs](https://github.com/cosmos/relayer/tree/main/docs/example-configs) +in the relayer repo. Our configs will get out of date very quickly: the preview chain id changes +on every merge into main, for instance. Short-term, that's fine: we want to exercise IBC +in our CI deployments, and dynamically generating the configs is good enough. Longer term, we'll want +to upload our configs to the [chain-registry repo](https://github.com/cosmos/chain-registry). diff --git a/deployments/relayer/configs/penumbra-preview.json b/deployments/relayer/configs/penumbra-preview.json new file mode 100644 index 0000000000..e30810deec --- /dev/null +++ b/deployments/relayer/configs/penumbra-preview.json @@ -0,0 +1,16 @@ +{ + "type": "penumbra", + "value": { + "key": "default", + "chain-id": "penumbra-testnet-carme-e248c323", + "rpc-addr": "https://rpc.testnet-preview.penumbra.zone:443", + "account-prefix": "penumbrav2t", + "keyring-backend": "test", + "gas-adjustment": 1.0, + "gas-prices": "0.00upenumbra", + "debug": true, + "timeout": "20s", + "output-format": "json", + "sign-mode": "direct" + } +} diff --git a/deployments/relayer/configs/penumbra-testnet.json b/deployments/relayer/configs/penumbra-testnet.json new file mode 100644 index 0000000000..a628172907 --- /dev/null +++ b/deployments/relayer/configs/penumbra-testnet.json @@ -0,0 +1,16 @@ +{ + "type": "penumbra", + "value": { + "key": "default", + "chain-id": "penumbra-testnet-carme", + "rpc-addr": "https://rpc.testnet.penumbra.zone:443", + "account-prefix": "penumbrav2t", + "keyring-backend": "test", + "gas-adjustment": 1.0, + "gas-prices": "0.00upenumbra", + "debug": true, + "timeout": "20s", + "output-format": "json", + "sign-mode": "direct" + } +} diff --git a/deployments/relayer/configs/penumbra.tpl b/deployments/relayer/configs/penumbra.tpl new file mode 100644 index 0000000000..7a61b8c1c3 --- /dev/null +++ b/deployments/relayer/configs/penumbra.tpl @@ -0,0 +1,16 @@ +{ + "type": "penumbra", + "value": { + "key": "default", + "chain-id": "$PENUMBRA_CHAIN_ID", + "rpc-addr": "$PENUMBRA_RPC_URL", + "account-prefix": "penumbrav2t", + "keyring-backend": "test", + "gas-adjustment": 1.0, + "gas-prices": "0.00upenumbra", + "debug": true, + "timeout": "20s", + "output-format": "json", + "sign-mode": "direct" + } +} diff --git a/deployments/relayer/configure-relayer b/deployments/relayer/configure-relayer new file mode 100755 index 0000000000..5dd95c6daa --- /dev/null +++ b/deployments/relayer/configure-relayer @@ -0,0 +1,40 @@ +#!/bin/bash +# Configure relayer from scratch; nukes any previous state, so use with caution. +# Follows the config steps documented in relayer README: +# https://github.com/cosmos/relayer/ +set -euo pipefail + + +rm -rf ~/.relayer +rly config init --memo "Automatic IBC for Penumbra, via relayer" + +# Must serve JSON files over network; `file:///` URLs are not supported. +python3 -m http.server --directory configs/ & +job_pid="$!" +trap 'kill -9 "$job_pid"' EXIT +sleep 2 + +>&2 echo "Generating relayer configs..." +rly chains add penumbra-testnet --url http://localhost:8000/penumbra-testnet.json +rly chains add penumbra-preview --url http://localhost:8000/penumbra-preview.json + +# Ideally we wouldn't need to bother with generating keys for the relayer paths, +# because Penumbra hasn't implemented fees yet, so there's no need for a wallet to pay out of. +# If we skip keygen, though, then `rly transact link ` shows an error: +# +# Error: key default not found on src chain penumbra-testnet-carme-dac8be27 +>&2 echo "Generating key for testnet:" +rly keys add penumbra-testnet default +>&2 echo "Generating key for preview:" +rly keys add penumbra-preview default + +# TODO: configure paths. We can't fetch from an external registry, so we'll +# need to munge the YAML config directly. See docs at +# https://github.com/cosmos/relayer/blob/main/docs/create-path-across-chain.md +testnet_chain_id="$(jq -r '.value["chain-id"]' configs/penumbra-testnet.json)" +preview_chain_id="$(jq -r '.value["chain-id"]' configs/penumbra-preview.json)" +rly paths new "$preview_chain_id" "$testnet_chain_id" penumbra_path + +>&2 echo "Emitting status info:" +rly chains list +rly paths list diff --git a/deployments/relayer/generate-configs b/deployments/relayer/generate-configs new file mode 100755 index 0000000000..d8e702b431 --- /dev/null +++ b/deployments/relayer/generate-configs @@ -0,0 +1,38 @@ +#!/bin/bash +set -euo pipefail + + +if [[ $# -lt 1 ]] ; then + >&2 echo "ERROR: no network declared. Use either 'testnet' or 'preview'." + >&2 echo "Usage: $0 " + exit 1 +fi +penumbra_network="${1:-}" +shift 1 + +function get_chain_id() { + local u + u="${1:-}" + shift 1 + curl -s "${u}/status" | jq -r .result.node_info.network +} + +case $penumbra_network in + # N.B. the port suffix on the URL is required; otherwise, rly complains about missing port. + preview) + PENUMBRA_RPC_URL="https://rpc.testnet-preview.penumbra.zone:443" + PENUMBRA_CHAIN_ID="$(get_chain_id "$PENUMBRA_RPC_URL")" + ;; + testnet) + PENUMBRA_RPC_URL="https://rpc.testnet.penumbra.zone:443" + PENUMBRA_CHAIN_ID="$(get_chain_id "$PENUMBRA_RPC_URL")" + ;; + *) + >&2 echo "ERROR: network '$penumbra_network' not supported" + exit 2 + ;; +esac + +export PENUMBRA_RPC_URL +export PENUMBRA_CHAIN_ID +envsubst < configs/penumbra.tpl > "configs/penumbra-${penumbra_network}.json" diff --git a/deployments/relayer/justfile b/deployments/relayer/justfile new file mode 100644 index 0000000000..86b4843e3a --- /dev/null +++ b/deployments/relayer/justfile @@ -0,0 +1,11 @@ +all: + just configs + just run + +configs: + ./generate-configs preview + ./generate-configs testnet + +run: + ./configure-relayer + ./run-relayer diff --git a/deployments/relayer/run-relayer b/deployments/relayer/run-relayer new file mode 100755 index 0000000000..5739cd4754 --- /dev/null +++ b/deployments/relayer/run-relayer @@ -0,0 +1,8 @@ +#!/bin/bash +# Wrapper script to finalize configuration on relayer, +# and submit a transaction to verify manual relaying of cross-chain +# info for Penumbra. (Doesn't work yet =) + + +>&2 echo "Attempting to 'transact link' the path..." +rly --debug transact link penumbra_path