# Interchain Security Sandbox Setup We will set up the following testnet in a single machine: - 4 provider validator nodes on chain "earth" - 4 consumer validator nodes on chain "moon" - 1 relayer - Both chains will have denom "stake" - Validators: - alpha - alpha-provider.stg.earthball.xyz - beta - beta-provider.stg.earthball.xyz - gamma - gamma-provider.stg.earthball.xyz - delta - delta-provider.stg.earthball.xyz ## 1. Set up a provider chain Set up a 4-validator provider chain. Set up gov_testing and voting time to 1 minute. Set up a single validator with a minimal amount of staked tokens, and airdrop tokens to a non-validator "playmaker" account that will do a lot of the delegating. In this case, the playmaker address comes from the public-facing mnemonics. Single-validator play: ```yaml= --- # yamllint disable rule:line-length all: vars: ansible_user: root node_user: provider-alpha chain_home: "{{node_user_home}}/.isp" chain_binary_name: interchain-security-pd chain_version: tags/v0.1.4 chain_repository: https://github.com/cosmos/interchain-security.git chain_denom: stake chain_id: earth chain_home_clear: true node_service_name: "provider-alpha" chain_create_validator: true chain_validator_coins: "10000000" chain_gentx_validator: "1000000" cosmovisor_service_name: "cv-provider-alpha" chain_gov_testing: true chain_voting_period: 60s chain_airdrop: true chain_airdrop_accounts: - cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl reboot: false pruning: nothing p2p_allow_duplicate_ip: true children: node: hosts: "{{ target }}": fast_sync: false api_enabled: true api_port: 26650 rpc_port: 26651 p2p_port: 26652 grpc_port: 26653 rpc_pprof_port: 26654 grpc_web_enabled: false ``` Verify that the airdrop account has funds: ``` interchain-security-pd q bank balances cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --node http://localhost:26651 ``` ## 2. Join the chain with three more nodes. Copy genesis file from first node, and collect the node ID as well as p2p port (26652 from the play above). The node id can be obtained from the genesis file by looking for "memo", or running `interchain-security-pd tendermint show-node-id` on the alpha node. Run the "join playbook" using different ports for each node: ```yaml= --- # yamllint disable rule:line-length all: vars: ansible_user: root chain_binary_name: interchain-security-pd chain_version: tags/v0.1.4 chain_repository: https://github.com/cosmos/interchain-security.git genesis_file: 'provider-genesis.json' p2p_persistent_peers: '47652c26df2489e9e3c0c63ede8a5b7c86e05690@138.197.134.60:26652' chain_denom: stake chain_id: earth chain_home_clear: true reboot: false pruning: nothing p2p_allow_duplicate_ip: true api_enabled: true grpc_web_enabled: false children: node: hosts: beta-provider.stg.earthball.xyz: node_user: provider-beta chain_home: "{{node_user_home}}/.isp" node_service_name: "provider-beta" cosmovisor_service_name: "cv-provider-beta" api_port: 26660 rpc_port: 26661 p2p_port: 26662 grpc_port: 26663 rpc_pprof_port: 26664 gamma-provider.stg.earthball.xyz: node_user: provider-gamma chain_home: "{{node_user_home}}/.isp" node_service_name: "provider-gamma" cosmovisor_service_name: "cv-provider-gamma" api_port: 26670 rpc_port: 26671 p2p_port: 26672 grpc_port: 26673 rpc_pprof_port: 26674 delta-provider.stg.earthball.xyz: node_user: provider-delta chain_home: "{{node_user_home}}/.isp" node_service_name: "provider-delta" cosmovisor_service_name: "cv-provider-delta" api_port: 26680 rpc_port: 26681 p2p_port: 26682 grpc_port: 26683 rpc_pprof_port: 26684 ``` ## 3. Create a new validator in each node. beta Create self-delegation account ``` interchain-security-pd keys add beta-validator --home ~/.isp --keyring-backend test - name: beta-validator type: local address: cosmos1sc82038qv9st0tenrqnavft78gyryt0r0vsvqs pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AzG47vQp5mzpNTtE9GFnmwwZHIWn25BLOWjO5lL0vzA5"}' mnemonic: "" **Important** write this mnemonic phrase in a safe place. It is the only way to recover your account if you ever forget your password. cycle story emotion consider combine emotion walk shield early sand post useless blouse busy cry proof test neglect hundred atom fun already chicken diesel ``` gamma Create self-delegation account ``` interchain-security-pd keys add gamma-validator --home ~/.isp --keyring-backend test - name: gamma-validator type: local address: cosmos1lxnr0nvq30ulvleg3ww9rtedt6rk3dde9tw8wq pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AjX788vp+VTYZpQ99QfKN8RLPBF8pa3taTodAFo2uwKL"}' mnemonic: "" **Important** write this mnemonic phrase in a safe place. It is the only way to recover your account if you ever forget your password. card mammal leave cause clarify unknown liar sick fade cabbage upgrade limit type endorse ahead identify clutch sentence flush rough reason virtual poverty dress ``` delta Create self-delegation account ``` interchain-security-pd keys add delta-validator --home ~/.isp --keyring-backend test - name: delta-validator type: local address: cosmos167xwcvk408tmcv5tmwjau9vd7h64d2lnfxmzwe pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AioclXNo7vnvEG8wZPm8K3cAjc0EkrCHqm81Y9GZI/tU"}' mnemonic: "" **Important** write this mnemonic phrase in a safe place. It is the only way to recover your account if you ever forget your password. lend south shell chest staff great brisk wool tube metal bracket wrap uphold couple script child also spider primary capital dizzy spin dismiss seek ``` Fund all validator accounts from playmaker account. beta ``` interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos1sc82038qv9st0tenrqnavft78gyryt0r0vsvqs 10000000stake --home ~/.isp ``` gamma ``` interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos1lxnr0nvq30ulvleg3ww9rtedt6rk3dde9tw8wq 10000000stake --home ~/.isp ``` delta ``` interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos167xwcvk408tmcv5tmwjau9vd7h64d2lnfxmzwe 10000000stake --home ~/.isp ``` Get validator pubkey with and create validator: beta ``` pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp) interchain-security-pd tx staking create-validator --moniker "beta" --amount 1000000stake --from beta-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block ``` gamma ``` pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp) interchain-security-pd tx staking create-validator --moniker "gamma" --amount 1000000stake --from gamma-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block ``` delta ``` pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp) interchain-security-pd tx staking create-validator --moniker "delta" --amount 1000000stake --from delta-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block ``` Change moniker of alpha validator to `alpha` ``` interchain-security-pd tx staking edit-validator --from validator --moniker alpha --home ~/.isp ``` We can now check the validator set here: http://alpha-provider.stg.earthball.xyz:26660/cosmos/staking/v1beta1/validators Verify playmaker can delegate tokens. Delegate 1000000stake more to alpha: ``` interchain-security-pd tx staking delegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 1000000stake --from playmaker --home ~/.isp ``` Delegate 1000000stake more to beta: ``` interchain-security-pd tx staking delegate cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp ``` Delegate 1000000stake more to gamma: ``` interchain-security-pd tx staking delegate cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn 1000000stake --from playmaker --home ~/.isp ``` Delegate 1000000stake more to delta: ``` interchain-security-pd tx staking delegate cosmosvaloper167xwcvk408tmcv5tmwjau9vd7h64d2lnvj0hz2 1000000stake --from playmaker --home ~/.isp ``` Check delegations from playmaker account: ``` interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp ``` Test redelegating 1000000stake from alpha to beta ``` interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp {"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgBeginRedelegate","delegator_address":"cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl","validator_src_address":"cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87","validator_dst_address":"cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr","amount":{"denom":"stake","amount":"1000000"}}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} confirm transaction before signing and broadcasting [y/N]: y code: 0 codespace: "" data: "" events: [] gas_used: "0" gas_wanted: "0" height: "0" info: "" logs: [] raw_log: '[]' timestamp: "" tx: null txhash: B98F1BB3971C0153826B73A80C37DC42111A151FCB103272A3F245F681603BFC ``` Check the transaction: ``` interchain-security-pd q tx --type=hash B98F1BB3971C0153826B73A80C37DC42111A151FCB103272A3F245F681603BFC --home ~/.isp ... (metadata, events, etc.) ... raw_log: 'out of gas in location: WriteFlat; gasWanted: 200000, gasUsed: 201607: out of gas' timestamp: "2022-10-21T19:04:28Z ``` Try re-delegating from alpha to beta again, this time with `--gas=auto` ``` interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp --gas auto ``` Check delegations from playmaker account: ``` interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp ``` That works. Try re-delegating from beta to alpha now ``` interchain-security-pd tx staking redelegate cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 1000000stake --from playmaker --home ~/.isp --gas auto ``` Check delegations from playmaker account: ``` interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp ``` Try re-delegating from alpha to gamma and back: ``` interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn 500000stake --from playmaker --home ~/.isp --gas auto interchain-security-pd tx staking redelegate cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 500000stake --from playmaker --home ~/.isp --gas auto ``` ## 4. Initialize the consumer chain with a validator account. Set up a node with the consumer chain binary using the keys from the alpha validator. The node role must be modified slightly in order for the mnemonic to be registered and cosmovisor to not start. Run this play: ```yaml= --- # yamllint disable rule:line-length all: vars: ansible_user: root node_user: consumer-alpha chain_home: "{{node_user_home}}/.isc" chain_binary_name: interchain-security-cd chain_version: tags/v0.1.4 chain_repository: https://github.com/cosmos/interchain-security.git chain_denom: stake chain_id: moon2 chain_home_clear: true node_service_name: "consumer-alpha" chain_restore_account: true chain_restored_coins: "1000000000000000" cosmovisor_service_name: "cv-consumer-alpha" reboot: false pruning: nothing p2p_allow_duplicate_ip: true chain_defer_start: true priv_validator_key_file: 'alpha-validator-key.json' node_key_file: 'alpha-node-key.json' children: node: hosts: "{{ target }}": fast_sync: false api_enabled: true api_port: 26655 rpc_port: 26656 p2p_port: 26657 grpc_port: 26658 rpc_pprof_port: 26659 grpc_web_enabled: false ``` Run the play with the mnemonic as an extra variable: ``` ansible-playbook node.yml -i examples/ics-init-consumer-chain.yml -e 'target=alpha-provider.stg.earthball.xyz restored_account_mnemonic="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art"' ``` Save the genesis file to the local machine. ## 5. Increase the signed blocks window to 10000 blocks Change the parameter under the slashing section called `"signed_blocks_window"` to `10000`. ## 6. Propose and pass the new consumer chain. We will start a consumer chain that uses the `interchain-security-cd` binary. Populate `consumer-proposal.json` with the relevant values: ```json { "title": "Create a new consumer chain", "description": "Consumer chain ", "chain_id": "moon2", "initial_height": { "revision_height": 1 }, "genesis_hash": "748e648ac57d9849ba0c03f83286453edd9885faa249340e301ad811d731526a", "binary_hash": "5ae76b4206c0bb8f87208c6ab2b68545fde4cf2c27d53041e24218cab4b3e925", "spawn_time": "2022-10-01T10:10:00.000000Z", "deposit": "1stake" } ``` Submit gov proposal from provider chain: ```bash interchain-security-pd tx gov submit-proposal create-consumer-chain consumer-proposal.json --from validator --home ~/.isp --keyring-backend test ``` Vote on gov proposal on provider chain: ```bash interchain-security-pd tx gov vote 2 yes --from validator --home ~/.isp --keyring-backend test -y ``` Check that the proposal passed ``` interchain-security-pd q gov proposal 2 --home ~/.isp ``` ## 4. Update the genesis file Collect CCV states in the provider chain ```bash interchain-security-pd q provider consumer-genesis moon2 --output json --home ~/.isp > moon2_ccv_states.json ``` Copy json file to local machine Update fresh consumer genesis file with CCV states ```bash jq -s '.[0].app_state.ccvconsumer = .[1] | .[0]' fresh-consumer-genesis.json moon_ccv_states.json > consumer_genesis.json ``` ## 5. Start the consumer chain Collect the node id for the validator to use it in the p2p_persistent_peers variable. Start the cosmovisor service in the first node. Join the consumer chain with an updated inventory file that uses: - modified genesis file - p2p_persistent_peers - priv_validator_key_file for each validator (copied from the provider /config folder) - node_key_file (copied from the provider /config folder) ```yaml= --- # yamllint disable rule:line-length all: vars: ansible_user: root chain_binary_name: interchain-security-cd chain_version: tags/v0.1.4 chain_repository: https://github.com/cosmos/interchain-security.git genesis_file: 'consumer_genesis.json' p2p_persistent_peers: '47652c26df2489e9e3c0c63ede8a5b7c86e05690@138.197.134.60:26657' chain_denom: stake chain_id: moon2 chain_home_clear: true reboot: false pruning: nothing p2p_allow_duplicate_ip: true api_enabled: true grpc_web_enabled: false children: node: hosts: alpha-provider.stg.earthball.xyz: node_user: consumer-alpha chain_home: "{{node_user_home}}/.isc" node_service_name: "consumer-alpha" cosmovisor_service_name: "cv-consumer-alpha" api_port: 26655 rpc_port: 26656 p2p_port: 26657 grpc_port: 26658 rpc_pprof_port: 26659 priv_validator_key_file: alpha-validator-key.json node_key_file: alpha-node-key.json beta-provider.stg.earthball.xyz: node_user: consumer-beta chain_home: "{{node_user_home}}/.isc" node_service_name: "consumer-beta" cosmovisor_service_name: "cv-consumer-beta" api_port: 26665 rpc_port: 26666 p2p_port: 26667 grpc_port: 26668 rpc_pprof_port: 26669 priv_validator_key_file: beta-validator.json node_key_file: beta-node.json gamma-provider.stg.earthball.xyz: node_user: consumer-gamma chain_home: "{{node_user_home}}/.isc" node_service_name: "consumer-gamma" cosmovisor_service_name: "cv-consumer-gamma" api_port: 26675 rpc_port: 26676 p2p_port: 26677 grpc_port: 26678 rpc_pprof_port: 26679 priv_validator_key_file: gamma-validator.json node_key_file: gamma-node.json delta-provider.stg.earthball.xyz: node_user: consumer-delta chain_home: "{{node_user_home}}/.isc" node_service_name: "consumer-delta" cosmovisor_service_name: "cv-consumer-delta" api_port: 26689 rpc_port: 26689 p2p_port: 26689 grpc_port: 26689 rpc_pprof_port: 26689 priv_validator_key_file: delta-validator.json node_key_file: delta-node.json ``` Blocks should be coming in now on the consumer chain, but we need to link it to the provider chain next. ## 6. Set up the relayer between chains - Set `hermes_order: ordered` - Set `hermes_channel_version: '1'` - The consumer chain must be the first chain listed (chain a) - The port name of the consumer chain must be `consumer` - The port name of the provider chain must be `provider` - The client id must be specified - Enable the channel workers for handshake completion. Inventory file: ```yaml= --- # yamllint disable rule:line-length all: vars: chain_home_clear: true hermes_version: v1.0.0 ansible_user: root reboot: false children: hermes: hosts: alpha-provider.stg.earthball.xyz: hermes_relayer_mnemonics: true hermes_order: ordered hermes_channel_version: '1' hermes_chains: moon2: hermes_relayer_mnemonic: 'playmaker-mnemonic.txt' hermes_port_name: consumer hermes_chain_rpc_url_schema: http hermes_chain_rpc_hostname: alpha-provider.stg.earthball.xyz hermes_chain_rpc_port: 26656 hermes_chain_grpc_url_schema: http hermes_chain_grpc_hostname: alpha-provider.stg.earthball.xyz hermes_chain_grpc_port: 26658 hermes_chain_websocket_url_schema: ws hermes_chain_rpc_timeout: '10s' hermes_chain_account_prefix: 'cosmos' hermes_chain_key_name: 'testkey' hermes_chain_store_prefix: 'ibc' hermes_chain_max_gas: 2000000 hermes_chain_fee_granter: '' gas_price: "{ price = 0.00, denom = 'stake' }" hermes_chain_gas_multiplier: 1.1 hermes_chain_clock_drift: '5s' hermes_chain_trusting_period: '14days' hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }" earth: hermes_relayer_mnemonic: 'playmaker-mnemonic.txt' hermes_port_name: provider hermes_chain_rpc_url_schema: http hermes_chain_rpc_hostname: alpha-provider.stg.earthball.xyz hermes_chain_rpc_port: 26651 hermes_chain_grpc_url_schema: http hermes_chain_grpc_hostname: alpha-provider.stg.earthball.xyz hermes_chain_grpc_port: 26653 hermes_chain_websocket_url_schema: ws hermes_chain_rpc_timeout: '10s' hermes_chain_account_prefix: 'cosmos' hermes_chain_key_name: 'testkey' hermes_chain_store_prefix: 'ibc' hermes_chain_max_gas: 2000000 hermes_chain_fee_granter: '' gas_price: "{ price = 0.00, denom = 'stake' }" hermes_chain_gas_multiplier: 1.1 hermes_chain_clock_drift: '5s' hermes_chain_trusting_period: '14days' hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }" ``` The hermes play because the unbonding period is too short. We need to increase it to 21 days again (or more than 1209600s). We can do that with a gov proposal: The IBC connection could not be created due to a handshake timeout on the moon chain. We will attempt to re-start another consumer chain. We have also changed the app proxy port to 26648 in the consumer alpha node and 26638 in the provider alpha node. The hermes play errored out during connection creation, so we ran this command in the hermes machine afterwards: ```bash= hermes create connection --a-chain moon2 --a-client 07-tendermint-0 --b-client 07-tendermint-1 ... SUCCESS Connection { delay_period: 0ns, a_side: ConnectionSide { chain: BaseChainHandle { chain_id: ChainId { id: "moon2", version: 0, }, runtime_sender: Sender { .. }, }, client_id: ClientId( "07-tendermint-0", ), connection_id: Some( ConnectionId( "connection-0", ), ), }, b_side: ConnectionSide { chain: BaseChainHandle { chain_id: ChainId { id: "earth", version: 0, }, runtime_sender: Sender { .. }, }, client_id: ClientId( "07-tendermint-1", ), connection_id: Some( ConnectionId( "connection-0", ), ), }, } ``` That seemed to work. Next we can create the channel. ``` hermes create channel --a-chain moon2 --a-port consumer --b-port provider --order ordered --a-connection connection-0 --channel-version 1 ... SUCCESS Channel { ordering: Ordered, a_side: ChannelSide { chain: BaseChainHandle { chain_id: ChainId { id: "moon2", version: 0, }, runtime_sender: Sender { .. }, }, client_id: ClientId( "07-tendermint-0", ), connection_id: ConnectionId( "connection-0", ), port_id: PortId( "consumer", ), channel_id: Some( ChannelId( "channel-0", ), ), version: Some( Version( "1", ), ), }, b_side: ChannelSide { chain: BaseChainHandle { chain_id: ChainId { id: "earth", version: 0, }, runtime_sender: Sender { .. }, }, client_id: ClientId( "07-tendermint-1", ), connection_id: ConnectionId( "connection-0", ), port_id: PortId( "provider", ), channel_id: Some( ChannelId( "channel-0", ), ), version: Some( Version( "1", ), ), }, connection_delay: 0ns, } ``` That also seemed to work. Start the hermes service (because the play errored out before setting it up). ## 7. Check the validator set matches between chains. On earth: ``` interchain-security-pd q tendermint-validator-set --home ~/.isp block_height: "40104" total: "4" validators: - address: cosmosvalcons1jep6hexugh70cultnd5hwarzvdfpayu45h89az proposer_priority: "-14413" pub_key: type: tendermint/PubKeyEd25519 value: q+sy4tVCZ80VjCMiwYWCKAXfoJXuFfGrRtOshzm15w8= voting_power: "20999" - address: cosmosvalcons1vqf7st30jsje4qx7spf8vkzfmm6j35hy287l2c proposer_priority: "127" pub_key: type: tendermint/PubKeyEd25519 value: 3LPkv6rfr6n0girXCGUZ2X5/lSLBVKbaO5Kkop1g2OU= voting_power: "20998" - address: cosmosvalcons1p9ze7ntpfu2gm0g5qqpl0japlcfdl7untltmm4 proposer_priority: "23099" pub_key: type: tendermint/PubKeyEd25519 value: 7qC/rP6wueX+2Jeza6pc15EksixyvCGmMc79zGA9FUQ= voting_power: "20997" - address: cosmosvalcons147amlw2uzmvkhm96ffgcr33v5hz882znu425as proposer_priority: "-8813" pub_key: type: tendermint/PubKeyEd25519 value: yEzuV/fjUQXDMwTC/ZjsmaoE7UYzs8vt+pSCW09Ce8s= voting_power: "20816" ``` On moon2: ``` interchain-security-cd q tendermint-validator-set --home ~/.isc block_height: "735" total: "4" validators: - address: cosmosvalcons1jep6hexugh70cultnd5hwarzvdfpayu45h89az proposer_priority: "17212" pub_key: type: tendermint/PubKeyEd25519 value: q+sy4tVCZ80VjCMiwYWCKAXfoJXuFfGrRtOshzm15w8= voting_power: "20999" - address: cosmosvalcons1vqf7st30jsje4qx7spf8vkzfmm6j35hy287l2c proposer_priority: "-3956" pub_key: type: tendermint/PubKeyEd25519 value: 3LPkv6rfr6n0girXCGUZ2X5/lSLBVKbaO5Kkop1g2OU= voting_power: "20998" - address: cosmosvalcons1p9ze7ntpfu2gm0g5qqpl0japlcfdl7untltmm4 proposer_priority: "-4988" pub_key: type: tendermint/PubKeyEd25519 value: 7qC/rP6wueX+2Jeza6pc15EksixyvCGmMc79zGA9FUQ= voting_power: "20997" - address: cosmosvalcons147amlw2uzmvkhm96ffgcr33v5hz882znu425as proposer_priority: "-8266" pub_key: type: tendermint/PubKeyEd25519 value: yEzuV/fjUQXDMwTC/ZjsmaoE7UYzs8vt+pSCW09Ce8s= voting_power: "20816" ```