Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On-chain upgrade to consumer chain #1

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/consumer-democracy/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ func New(
&app.IBCKeeper.PortKeeper,
app.IBCKeeper.ConnectionKeeper,
app.IBCKeeper.ClientKeeper,
app.StakingKeeper,
app.SlashingKeeper,
app.BankKeeper,
app.AccountKeeper,
Expand Down
1 change: 1 addition & 0 deletions app/consumer/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ func New(
&app.IBCKeeper.PortKeeper,
app.IBCKeeper.ConnectionKeeper,
app.IBCKeeper.ClientKeeper,
nil,
Copy link

@shaspitz shaspitz Jan 24, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we pass in staking keeper here in case we'd ever want to test this upgrade with a normal consumer? Maybe I just need more clarity on how this PR affects (or shouldn't affect) the normal consumer, and the democracy consumer

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Staking keeper will only be used for democracy one, but could pass consumer keeper here since consumer keeper implement the interface of staking keeper. On consumer app, there's no staking keeper FYI.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason for not passing anything here is to show that it's not democracy app

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For all the uses of stakingKeeper, it has checker for stakingKeeper == nil check FYI

app.SlashingKeeper,
app.BankKeeper,
app.AccountKeeper,
Expand Down
313 changes: 313 additions & 0 deletions consumer/start_consumer2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
#!/bin/bash
Copy link

@shaspitz shaspitz Jan 24, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you intend to merge these shell scripts into the repo?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one could be removed - consumer2 was for hermes 1.12.0 - and consumer.sh is for hermes 0.15.0

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these scripts would be helpful for setting up local environment for future development of ICS.

set -eux

SOVEREIGN_HOME="$HOME/.sovereign"
CONSUMER_HOME="$HOME/.consumer"
CONSUMER_HOME1="$HOME/.consumer1"
PROVIDER_CHAIN_ID="provider"
CONSUMER_CHAIN_ID="consumer"
MONIKER="consumer"
VALIDATOR="validator"
VALIDATOR1="validator1"
KEYRING="--keyring-backend test"
TX_FLAGS="--gas-adjustment 100 --gas auto"
PROVIDER_BINARY="interchain-security-pd"
SOVEREIGN_BINARY="interchain-security-sd"
CONSUMER_BINARY="interchain-security-cdd"
NODE_IP="localhost"
PROVIDER_RPC_LADDR="$NODE_IP:26658"
PROVIDER_GRPC_ADDR="$NODE_IP:9091"
PROVIDER_RPC_LADDR1="$NODE_IP:26668"
PROVIDER_GRPC_ADDR1="$NODE_IP:9101"
SOVEREIGN_RPC_LADDR="$NODE_IP:26648"
SOVEREIGN_GRPC_ADDR="$NODE_IP:9081"
CONSUMER_RPC_LADDR="$NODE_IP:26638"
CONSUMER_GRPC_ADDR="$NODE_IP:9071"
CONSUMER_RPC_LADDR1="$NODE_IP:26628"
CONSUMER_GRPC_ADDR1="$NODE_IP:9061"
CONSUMER_USER="consumer"
SOVEREIGN_VALIDATOR="sovereign_validator"
PROVIDER_HOME="$HOME/.provider"
PROVIDER_HOME1="$HOME/.provider1"
PROVIDER_NODE_ADDRESS="tcp://localhost:26658"

# Clean start
killall $SOVEREIGN_BINARY &> /dev/null || true
killall $CONSUMER_BINARY &> /dev/null || true
rm -rf $CONSUMER_HOME
rm -rf $CONSUMER_HOME1
rm -rf $SOVEREIGN_HOME

################SOVEREIGN############################
$SOVEREIGN_BINARY init --chain-id $CONSUMER_CHAIN_ID $MONIKER --home $SOVEREIGN_HOME
sleep 1

# Create user account keypair
$SOVEREIGN_BINARY keys add $CONSUMER_USER $KEYRING --home $SOVEREIGN_HOME --output json > $SOVEREIGN_HOME/consumer_keypair.json 2>&1
$SOVEREIGN_BINARY keys add $SOVEREIGN_VALIDATOR $KEYRING --home $SOVEREIGN_HOME --output json > $SOVEREIGN_HOME/sovereign_validator_keypair.json 2>&1

# Add account in genesis (required by Hermes)
$SOVEREIGN_BINARY add-genesis-account $(jq -r .address $SOVEREIGN_HOME/consumer_keypair.json) 1000000000stake --home $SOVEREIGN_HOME
$SOVEREIGN_BINARY add-genesis-account $(jq -r .address $SOVEREIGN_HOME/sovereign_validator_keypair.json) 1000000000000stake --home $SOVEREIGN_HOME

# generate genesis for sovereign chain
$SOVEREIGN_BINARY gentx $SOVEREIGN_VALIDATOR 10000000000stake $KEYRING --chain-id=$CONSUMER_CHAIN_ID --home $SOVEREIGN_HOME
$SOVEREIGN_BINARY collect-gentxs --home $SOVEREIGN_HOME
sed -i '' 's/"voting_period": "172800s"/"voting_period": "20s"/g' $SOVEREIGN_HOME/config/genesis.json

################CONSUMER############################

# Build genesis file and node directory structure
$SOVEREIGN_BINARY init --chain-id $CONSUMER_CHAIN_ID $MONIKER --home $CONSUMER_HOME
sleep 1

#copy genesis
cp $SOVEREIGN_HOME/config/genesis.json $CONSUMER_HOME/config/genesis.json

# Copy validator key files
cp $PROVIDER_HOME/config/priv_validator_key.json $CONSUMER_HOME/config/priv_validator_key.json
cp $PROVIDER_HOME/config/node_key.json $CONSUMER_HOME/config/node_key.json

#######CHAIN2#######
$SOVEREIGN_BINARY init --chain-id $CONSUMER_CHAIN_ID $MONIKER --home $CONSUMER_HOME1
sleep 1
#copy genesis
cp $SOVEREIGN_HOME/config/genesis.json $CONSUMER_HOME1/config/genesis.json

# Copy validator key files
cp $PROVIDER_HOME1/config/priv_validator_key.json $CONSUMER_HOME1/config/priv_validator_key.json
cp $PROVIDER_HOME1/config/node_key.json $CONSUMER_HOME1/config/node_key.json

##########SET CONFIG.TOML#####################
# Set default client port
sed -i -r "/node =/ s/= .*/= \"tcp:\/\/${SOVEREIGN_RPC_LADDR}\"/" $SOVEREIGN_HOME/config/client.toml
sed -i -r "/node =/ s/= .*/= \"tcp:\/\/${CONSUMER_RPC_LADDR}\"/" $CONSUMER_HOME/config/client.toml
sed -i -r "/node =/ s/= .*/= \"tcp:\/\/${CONSUMER_RPC_LADDR1}\"/" $CONSUMER_HOME1/config/client.toml
sovereign=$($SOVEREIGN_BINARY tendermint show-node-id --home $SOVEREIGN_HOME)
node=$($SOVEREIGN_BINARY tendermint show-node-id --home $CONSUMER_HOME)
node1=$($SOVEREIGN_BINARY tendermint show-node-id --home $CONSUMER_HOME1)

# sed -i -r "/persistent_peers =/ s/= .*/= \"$node@localhost:26636,$node1@localhost:26626\"/" "$SOVEREIGN_HOME"/config/config.toml
# sed -i -r "/persistent_peers =/ s/= .*/= \"$sovereign@localhost:26646,$node1@localhost:26626\"/" "$CONSUMER_HOME"/config/config.toml
# sed -i -r "/persistent_peers =/ s/= .*/= \"$sovereign@localhost:26646,$node@localhost:26636\"/" "$CONSUMER_HOME1"/config/config.toml

sed -i -r "/persistent_peers =/ s/= .*/= \"$node@localhost:26636\"/" "$SOVEREIGN_HOME"/config/config.toml
sed -i -r "/persistent_peers =/ s/= .*/= \"$sovereign@localhost:26646\"/" "$CONSUMER_HOME"/config/config.toml

sed -i -r "118s/.*/address = \"tcp:\/\/0.0.0.0:1318\"/" "$CONSUMER_HOME"/config/app.toml
sed -i -r "118s/.*/address = \"tcp:\/\/0.0.0.0:1319\"/" "$CONSUMER_HOME1"/config/app.toml

# Start the chain
$SOVEREIGN_BINARY start \
--home $SOVEREIGN_HOME \
--rpc.laddr tcp://${SOVEREIGN_RPC_LADDR} \
--grpc.address ${SOVEREIGN_GRPC_ADDR} \
--address tcp://${NODE_IP}:26645 \
--p2p.laddr tcp://${NODE_IP}:26646 \
--grpc-web.enable=false \
--log_level trace \
--trace \
&> $SOVEREIGN_HOME/logs &

$SOVEREIGN_BINARY start \
--home $CONSUMER_HOME \
--rpc.laddr tcp://${CONSUMER_RPC_LADDR} \
--grpc.address ${CONSUMER_GRPC_ADDR} \
--address tcp://${NODE_IP}:26635 \
--p2p.laddr tcp://${NODE_IP}:26636 \
--grpc-web.enable=false \
--log_level trace \
--trace \
&> $CONSUMER_HOME/logs &

# $SOVEREIGN_BINARY start \
# --home $CONSUMER_HOME1 \
# --rpc.laddr tcp://${CONSUMER_RPC_LADDR1} \
# --grpc.address ${CONSUMER_GRPC_ADDR1} \
# --address tcp://${NODE_IP}:26625 \
# --p2p.laddr tcp://${NODE_IP}:26626 \
# --grpc-web.enable=false \
# --log_level trace \
# --trace \
# &> $CONSUMER_HOME1/logs &
sleep 10

###########################UPGRADE TO SOVEREIGN CHAIN##########################

$SOVEREIGN_BINARY tx gov submit-proposal software-upgrade "v07-Theta" --upgrade-height=7 \
--title="upgrade to consumer chain" --description="upgrade to consumer chain description" \
--from=$SOVEREIGN_VALIDATOR $KEYRING --chain-id=$CONSUMER_CHAIN_ID \
--home=$SOVEREIGN_HOME --yes -b block --deposit="100000000stake"

# Vote yes to proposal
$SOVEREIGN_BINARY tx gov vote 1 yes --from $SOVEREIGN_VALIDATOR --chain-id $CONSUMER_CHAIN_ID --node tcp://$SOVEREIGN_RPC_LADDR \
--home $SOVEREIGN_HOME -b block -y $KEYRING
sleep 30

###########################START BINARIES AGAIN AFTER UPGRADE##########################
$SOVEREIGN_BINARY query gov proposals --node tcp://$SOVEREIGN_RPC_LADDR
$SOVEREIGN_BINARY status --node tcp://$SOVEREIGN_RPC_LADDR
$SOVEREIGN_BINARY status --node tcp://$CONSUMER_RPC_LADDR
# $SOVEREIGN_BINARY status --node tcp://$CONSUMER_RPC_LADDR1

killall $SOVEREIGN_BINARY &> /dev/null || true

# Add ccv section to SOVEREIGN_HOME genesis to be used on upgrade handler
if ! $PROVIDER_BINARY q provider consumer-genesis "$CONSUMER_CHAIN_ID" --node "$PROVIDER_NODE_ADDRESS" --output json > "$SOVEREIGN_HOME"/consumer_section.json;
then
echo "Failed to get consumer genesis for the chain-id '$CONSUMER_CHAIN_ID'! Finalize genesis failed. For more details please check the log file in output directory."
exit 1
fi

jq -s '.[0].app_state.ccvconsumer = .[1] | .[0]' "$SOVEREIGN_HOME"/config/genesis.json "$SOVEREIGN_HOME"/consumer_section.json > "$SOVEREIGN_HOME"/genesis_consumer.json && \
mv "$SOVEREIGN_HOME"/genesis_consumer.json "$SOVEREIGN_HOME"/config/genesis.json

# Modify genesis params
jq ".app_state.ccvconsumer.params.blocks_per_distribution_transmission = \"70\" | .app_state.tokenfactory.paused = { \"paused\": false }" \
$SOVEREIGN_HOME/config/genesis.json > \
$SOVEREIGN_HOME/edited_genesis.json && mv $SOVEREIGN_HOME/edited_genesis.json $SOVEREIGN_HOME/config/genesis.json
sleep 1


$CONSUMER_BINARY start \
--home $SOVEREIGN_HOME \
--rpc.laddr tcp://${SOVEREIGN_RPC_LADDR} \
--grpc.address ${SOVEREIGN_GRPC_ADDR} \
--address tcp://${NODE_IP}:26645 \
--p2p.laddr tcp://${NODE_IP}:26646 \
--grpc-web.enable=false \
--log_level trace \
--trace \
&> $SOVEREIGN_HOME/logs &

$CONSUMER_BINARY start \
--home $CONSUMER_HOME \
--rpc.laddr tcp://${CONSUMER_RPC_LADDR} \
--grpc.address ${CONSUMER_GRPC_ADDR} \
--address tcp://${NODE_IP}:26635 \
--p2p.laddr tcp://${NODE_IP}:26636 \
--grpc-web.enable=false \
--log_level trace \
--trace \
&> $CONSUMER_HOME/logs &

# $CONSUMER_BINARY start \
# --home $CONSUMER_HOME1 \
# --rpc.laddr tcp://${CONSUMER_RPC_LADDR1} \
# --grpc.address ${CONSUMER_GRPC_ADDR1} \
# --address tcp://${NODE_IP}:26625 \
# --p2p.laddr tcp://${NODE_IP}:26626 \
# --grpc-web.enable=false \
# --log_level trace \
# --trace \
# &> $CONSUMER_HOME1/logs &
sleep 30

######################################HERMES###################################

# Setup Hermes in packet relayer mode
killall hermes 2> /dev/null || true

tee ~/.hermes/config.toml<<EOF
[global]
log_level = "trace"

[mode]

[mode.clients]
enabled = true
refresh = true
misbehaviour = true

[mode.connections]
enabled = true

[mode.channels]
enabled = true

[mode.packets]
enabled = true

[[chains]]
account_prefix = "cosmos"
clock_drift = "5s"
gas_multiplier = 1.1
grpc_addr = "tcp://${CONSUMER_GRPC_ADDR}"
id = "$CONSUMER_CHAIN_ID"
key_name = "relayer"
max_gas = 2000000
rpc_addr = "http://${CONSUMER_RPC_LADDR}"
rpc_timeout = "10s"
store_prefix = "ibc"
trusting_period = "1599s"
websocket_addr = "ws://${CONSUMER_RPC_LADDR}/websocket"

[chains.gas_price]
denom = "stake"
price = 0.00

[chains.trust_threshold]
denominator = "3"
numerator = "1"

[[chains]]
account_prefix = "cosmos"
clock_drift = "5s"
gas_multiplier = 1.1
grpc_addr = "tcp://${PROVIDER_GRPC_ADDR}"
id = "$PROVIDER_CHAIN_ID"
key_name = "relayer"
max_gas = 2000000
rpc_addr = "http://${PROVIDER_RPC_LADDR}"
rpc_timeout = "10s"
store_prefix = "ibc"
trusting_period = "1599s"
websocket_addr = "ws://${PROVIDER_RPC_LADDR}/websocket"

[chains.gas_price]
denom = "stake"
price = 0.00

[chains.trust_threshold]
denominator = "3"
numerator = "1"
EOF

# Delete all previous keys in relayer
hermes keys delete --chain $CONSUMER_CHAIN_ID --all
hermes keys delete --chain $PROVIDER_CHAIN_ID --all

# Restore keys to hermes relayer
hermes keys add --key-file $SOVEREIGN_HOME/consumer_keypair.json --chain $CONSUMER_CHAIN_ID
# temp_start_provider.sh creates key pair and stores it in keypair.json
hermes keys add --key-file $PROVIDER_HOME/keypair.json --chain $PROVIDER_CHAIN_ID

sleep 5

hermes create connection --a-chain $CONSUMER_CHAIN_ID --a-client 07-tendermint-0 --b-client 07-tendermint-0
hermes create channel --a-chain $CONSUMER_CHAIN_ID --a-connection connection-0 --a-port consumer --b-port provider --order ordered --channel-version 1

hermes -j start &> ~/.hermes/logs &

############################################################

PROVIDER_VALIDATOR_ADDRESS=$(jq -r .address $PROVIDER_HOME/keypair.json)
DELEGATIONS=$($PROVIDER_BINARY q staking delegations $PROVIDER_VALIDATOR_ADDRESS --home $PROVIDER_HOME --node tcp://${PROVIDER_RPC_LADDR} -o json)
OPERATOR_ADDR=$(echo $DELEGATIONS | jq -r .delegation_responses[0].delegation.validator_address)

$PROVIDER_BINARY tx staking delegate $OPERATOR_ADDR 50000000stake \
--from $VALIDATOR \
$KEYRING \
--home $PROVIDER_HOME \
--node tcp://${PROVIDER_RPC_LADDR} \
--chain-id $PROVIDER_CHAIN_ID -y -b block
sleep 1

$PROVIDER_BINARY status --node=tcp://${PROVIDER_RPC_LADDR}
$PROVIDER_BINARY status --node=tcp://${PROVIDER_RPC_LADDR1}

$CONSUMER_BINARY status --node tcp://$SOVEREIGN_RPC_LADDR
$CONSUMER_BINARY status --node tcp://$CONSUMER_RPC_LADDR

$CONSUMER_BINARY query staking params --node=tcp://$CONSUMER_RPC_LADDR
$PROVIDER_BINARY query staking params --node=tcp://${PROVIDER_RPC_LADDR}
Loading