diff --git a/go.mod b/go.mod index 5726a63..466cc37 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ replace ( require ( github.com/datachainlab/ethereum-ibc-relay-chain v0.3.18 github.com/datachainlab/ibc-hd-signer v0.1.3 - github.com/hyperledger-labs/yui-relayer v0.5.16 + github.com/hyperledger-labs/yui-relayer v0.5.19 ) require ( diff --git a/go.sum b/go.sum index dbd82cb..cbce190 100644 --- a/go.sum +++ b/go.sum @@ -777,8 +777,8 @@ github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXM github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/hyperledger-labs/yui-relayer v0.5.16 h1:NauHZ08JsfIvkzopafR/5/TbRCAH7JSUgqm7YrUEQ/4= -github.com/hyperledger-labs/yui-relayer v0.5.16/go.mod h1:tGNMIE1y4cGNyRRKhR9rfBtCGLVjgejf3EIXouvdDQc= +github.com/hyperledger-labs/yui-relayer v0.5.19 h1:PuEOXXGjq9tjzzdOTYtA1KAE0hETAsMd3a8YMkMjZuE= +github.com/hyperledger-labs/yui-relayer v0.5.19/go.mod h1:tGNMIE1y4cGNyRRKhR9rfBtCGLVjgejf3EIXouvdDQc= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= diff --git a/relayer/main.go b/relayer/main.go index b5e6900..8ee0e86 100644 --- a/relayer/main.go +++ b/relayer/main.go @@ -5,8 +5,10 @@ import ( "github.com/datachainlab/ethereum-ibc-relay-chain/pkg/relay/ethereum" "github.com/datachainlab/ibc-hd-signer/pkg/hd" + debug_chain "github.com/hyperledger-labs/yui-relayer/chains/debug/module" tendermint "github.com/hyperledger-labs/yui-relayer/chains/tendermint/module" "github.com/hyperledger-labs/yui-relayer/cmd" + debug_prover "github.com/hyperledger-labs/yui-relayer/provers/debug/module" mock "github.com/hyperledger-labs/yui-relayer/provers/mock/module" ) @@ -14,6 +16,8 @@ func main() { if err := cmd.Execute( tendermint.Module{}, mock.Module{}, + debug_chain.Module{}, + debug_prover.Module{}, ethereum.Module{}, hd.Module{}, ); err != nil { diff --git a/tests/cases/docker-compose-test.yaml b/tests/cases/docker-compose-test.yaml index 524554a..90a2581 100644 --- a/tests/cases/docker-compose-test.yaml +++ b/tests/cases/docker-compose-test.yaml @@ -39,13 +39,13 @@ services: container_name: tendermint-chain0-mock environment: USE_MOCK_CLIENT: 1 - IBC_CHANNEL_UPGRADE_TIMEOUT: 30000000000 + IBC_CHANNEL_UPGRADE_TIMEOUT: 480000000000 #480 sec tendermint-chain1-mock: <<: *tendermint-chain1 container_name: tendermint-chain1-mock environment: USE_MOCK_CLIENT: 1 - IBC_CHANNEL_UPGRADE_TIMEOUT: 30000000000 + IBC_CHANNEL_UPGRADE_TIMEOUT: 480000000000 #480 sec # Ethereum ethereum-geth0: diff --git a/tests/cases/tm2eth/Makefile b/tests/cases/tm2eth/Makefile index 0fa0935..9e972fb 100644 --- a/tests/cases/tm2eth/Makefile +++ b/tests/cases/tm2eth/Makefile @@ -1,5 +1,7 @@ include ../../docker.mk +export USE_FAKELOST ?= yes + .PHONY: network network: TAG=${DOCKER_TAG} $(DOCKER_COMPOSE) \ @@ -15,6 +17,7 @@ test: ./scripts/test-channel-upgrade ./scripts/test-mockapp-packet-relay ./scripts/test-ics20-packet-relay + ./scripts/test-service .PHONY: network-down network-down: diff --git a/tests/cases/tm2eth/configs/demo/ibc-0.json b/tests/cases/tm2eth/configs/demo/ibc-0.json index c683dd6..e5f973a 100644 --- a/tests/cases/tm2eth/configs/demo/ibc-0.json +++ b/tests/cases/tm2eth/configs/demo/ibc-0.json @@ -1,17 +1,23 @@ { "chain": { - "@type": "/relayer.chains.tendermint.config.ChainConfig", - "key": "testkey", - "chain_id": "ibc0", - "rpc_addr": "http://localhost:26657", - "account_prefix": "cosmos", - "gas_adjustment": 1.5, - "gas_prices": "0.025stake", - "average_block_time_msec": 1000, - "max_retry_for_commit": 5 + "@type": "/relayer.chains.debug.config.ChainConfig", + "origin_chain": { + "@type": "/relayer.chains.tendermint.config.ChainConfig", + "key": "testkey", + "chain_id": "ibc0", + "rpc_addr": "http://localhost:26657", + "account_prefix": "cosmos", + "gas_adjustment": 1.5, + "gas_prices": "0.025stake", + "average_block_time_msec": 1000, + "max_retry_for_commit": 5 + } }, "prover": { - "@type": "/relayer.provers.mock.config.ProverConfig", - "finality_delay": 0 + "@type": "/relayer.provers.debug.config.ProverConfig", + "origin_prover": { + "@type": "/relayer.provers.mock.config.ProverConfig", + "finality_delay": 0 + } } } diff --git a/tests/cases/tm2eth/configs/template/ibc-1.template.json b/tests/cases/tm2eth/configs/template/ibc-1.template.json index e74cd0b..7fa62a7 100644 --- a/tests/cases/tm2eth/configs/template/ibc-1.template.json +++ b/tests/cases/tm2eth/configs/template/ibc-1.template.json @@ -1,34 +1,40 @@ { "chain": { - "@type": "/relayer.chains.ethereum.config.ChainConfig", - "chain_id": "ibc1", - "eth_chain_id": 2018, - "rpc_addr": "http://localhost:8645", - "signer": { - "@type": "/relayer.signers.hd.SignerConfig", - "mnemonic": "math razor capable expose worth grape metal sunset metal sudden usage scheme", - "path": "m/44'/60'/0'/0/0" - }, - "ibc_address": "PLACE_HOLDER", - "initial_send_checkpoint": 1, - "initial_recv_checkpoint": 1, - "enable_debug_trace": true, - "average_block_time_msec": 1000, - "max_retry_for_inclusion": 5, - "gas_estimate_rate": { - "numerator": 3, - "denominator": 2 - }, - "max_gas_limit": 10000000, - "tx_type": "auto", - "blocks_per_event_query": 1000, - "abi_paths": [ - "fixtures/ethereum/ibc1/abis" - ], - "price_bump": 10 + "@type": "/relayer.chains.debug.config.ChainConfig", + "origin_chain": { + "@type": "/relayer.chains.ethereum.config.ChainConfig", + "chain_id": "ibc1", + "eth_chain_id": 2018, + "rpc_addr": "http://localhost:8645", + "signer": { + "@type": "/relayer.signers.hd.SignerConfig", + "mnemonic": "math razor capable expose worth grape metal sunset metal sudden usage scheme", + "path": "m/44'/60'/0'/0/0" + }, + "ibc_address": "PLACE_HOLDER", + "initial_send_checkpoint": 1, + "initial_recv_checkpoint": 1, + "enable_debug_trace": true, + "average_block_time_msec": 1000, + "max_retry_for_inclusion": 5, + "gas_estimate_rate": { + "numerator": 3, + "denominator": 2 + }, + "max_gas_limit": 10000000, + "tx_type": "auto", + "blocks_per_event_query": 1000, + "abi_paths": [ + "fixtures/ethereum/ibc1/abis" + ], + "price_bump": 10 + } }, "prover": { - "@type": "/relayer.provers.mock.config.ProverConfig", - "finality_delay": 0 + "@type": "/relayer.provers.debug.config.ProverConfig", + "origin_prover": { + "@type": "/relayer.provers.mock.config.ProverConfig", + "finality_delay": 0 + } } } diff --git a/tests/cases/tm2eth/scripts/fixture b/tests/cases/tm2eth/scripts/fixture index df94e14..fcd8385 100755 --- a/tests/cases/tm2eth/scripts/fixture +++ b/tests/cases/tm2eth/scripts/fixture @@ -23,4 +23,4 @@ ${DOCKER} cp ethereum-geth0:/root/addresses ${FIXTURES_DIR}/ethereum/ibc1/addres # assign the contract address to ChainConfig IBC_HANDLER_ADDRESS=`cat ${FIXTURES_DIR}/ethereum/ibc1/addresses/IBCHandler` -jq ".chain.ibc_address |= \"$IBC_HANDLER_ADDRESS\"" < "$CONF_DIR/template/ibc-1.template.json" > "$CONF_DIR/demo/ibc-1.json" +jq ".chain.origin_chain.ibc_address |= \"$IBC_HANDLER_ADDRESS\"" < "$CONF_DIR/template/ibc-1.template.json" > "$CONF_DIR/demo/ibc-1.json" diff --git a/tests/cases/tm2eth/scripts/handshake b/tests/cases/tm2eth/scripts/handshake index 5ff7521..0b1e05f 100755 --- a/tests/cases/tm2eth/scripts/handshake +++ b/tests/cases/tm2eth/scripts/handshake @@ -14,6 +14,12 @@ RLYKEY=testkey MOCKAPP_PATH=mockapp-path ICS20_PATH=ics20-path +if [ "USE_FAKELOST-$USE_FAKELOST" = "USE_FAKELOST-yes" ]; then + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_CHAIN_ibc1="10" + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_PROVER_ibc1="10" + export DEBUG_RELAYER_SHFU_WAIT_ibc0="20" +fi + # add a path between chain0 and chain1 $RLY paths add $CHAINID_ONE $CHAINID_TWO $MOCKAPP_PATH --file=./configs/mockapp-path.json diff --git a/tests/cases/tm2eth/scripts/test-channel-upgrade b/tests/cases/tm2eth/scripts/test-channel-upgrade index dbe91e0..960ef5b 100755 --- a/tests/cases/tm2eth/scripts/test-channel-upgrade +++ b/tests/cases/tm2eth/scripts/test-channel-upgrade @@ -11,6 +11,12 @@ RELAYER_CONF="$HOME/.yui-relayer" RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly RLY="${RLY_BINARY} --debug" +if [ "USE_FAKELOST-$USE_FAKELOST" = "USE_FAKELOST-yes" ]; then + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_CHAIN_ibc1="10" + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_PROVER_ibc1="10" + export DEBUG_RELAYER_SHFU_WAIT_ibc0="20" +fi + PATH_NAME=mockapp-path checkEq() { diff --git a/tests/cases/tm2eth/scripts/test-ics20-packet-relay b/tests/cases/tm2eth/scripts/test-ics20-packet-relay index f2b0aa0..cfbd929 100755 --- a/tests/cases/tm2eth/scripts/test-ics20-packet-relay +++ b/tests/cases/tm2eth/scripts/test-ics20-packet-relay @@ -9,6 +9,12 @@ RELAYER_CONF="$HOME/.yui-relayer" RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly RLY="${RLY_BINARY} --debug" +if [ "USE_FAKELOST-$USE_FAKELOST" = "USE_FAKELOST-yes" ]; then + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_CHAIN_ibc1="10" + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_PROVER_ibc1="10" + export DEBUG_RELAYER_SHFU_WAIT_ibc0="20" +fi + PATH_NAME=ics20-path TM_ADDRESS=$(${RLY} tendermint keys show ibc0 testkey) @@ -19,8 +25,8 @@ ADDRESSES_DIR_B="${FIXTURES_DIR}/ethereum/ibc1/addresses" ERC20_TOKEN_CONTRACT_B=`cat ${ADDRESSES_DIR_B}/ERC20Token` ICS20_TRANSFER_CONTRACT_B=`cat ${ADDRESSES_DIR_B}/ICS20Transfer` -MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.signer.mnemonic') -RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.rpc_addr') +MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.signer.mnemonic') +RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.rpc_addr') PORT_A=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].src."port-id"') PORT_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."port-id"') CHANNEL_A=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].src."channel-id"') diff --git a/tests/cases/tm2eth/scripts/test-mockapp-packet-relay b/tests/cases/tm2eth/scripts/test-mockapp-packet-relay index 6b25022..dc3f969 100755 --- a/tests/cases/tm2eth/scripts/test-mockapp-packet-relay +++ b/tests/cases/tm2eth/scripts/test-mockapp-packet-relay @@ -3,19 +3,26 @@ set -eux SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) +source ${SCRIPT_DIR}/utils FIXTURES_DIR=${SCRIPT_DIR}/../fixtures RELAYER_CONF="$HOME/.yui-relayer" RLY_BINARY=${SCRIPT_DIR}/../../../../build/yrly RLY="${RLY_BINARY} --debug" +if [ "USE_FAKELOST-$USE_FAKELOST" = "USE_FAKELOST-yes" ]; then + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_CHAIN_ibc1="10" + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_PROVER_ibc1="10" + export DEBUG_RELAYER_SHFU_WAIT_ibc0="20" +fi + PATH_NAME=mockapp-path ADDRESSES_DIR_B="${FIXTURES_DIR}/ethereum/ibc1/addresses" MOCKAPP_CONTRACT_B=`cat ${ADDRESSES_DIR_B}/AppV1` -MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.signer.mnemonic') -RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.chain_id == "ibc1").chain.rpc_addr') +MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.signer.mnemonic') +RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.rpc_addr') PORT_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."port-id"') CHANNEL_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."channel-id"') @@ -31,18 +38,8 @@ ${RLY} tx acks $PATH_NAME --dst-seqs 1 sleep ${TX_INTERVAL} echo "!!! ibc1 -> ibc0 !!!" -BOB_INDEX=2 -cast send \ - --rpc-url $RPC_ADDRESS_B \ - --mnemonic "$MNEMONIC_B" \ - --mnemonic-index ${BOB_INDEX} \ - $MOCKAPP_CONTRACT_B \ - 'sendPacket(bytes,string,string,(uint64,uint64),uint64)' \ - $(cast from-utf8 'mock packet data') \ - $PORT_B \ - $CHANNEL_B \ - '(0,100000)' \ - $(date -d 1hour +%s%N) +sendPacketOnEth $PATH_NAME + sleep ${TX_INTERVAL} ${RLY} tx relay $PATH_NAME --dst-seqs 1 sleep ${TX_INTERVAL} diff --git a/tests/cases/tm2eth/scripts/test-service b/tests/cases/tm2eth/scripts/test-service new file mode 100755 index 0000000..16fc7b1 --- /dev/null +++ b/tests/cases/tm2eth/scripts/test-service @@ -0,0 +1,55 @@ +#!/bin/bash + +: <<'END_COMMENT' +* relay-interval = 20s +* src-relay-optimize-interval = 30s +* src-relay-optimize-count = 3 +* dst-relay-optimize-interval = 30s +* dst-relay-optimize-count = 3 +END_COMMENT + +set -eux + +SCRIPT_DIR=$(cd $(dirname $0); pwd) +source $SCRIPT_DIR/utils +RLY_BIN=${SCRIPT_DIR}/../../../../build/yrly +RLY="${RLY_BIN} --debug" + +if [ "USE_FAKELOST-$USE_FAKELOST" = "USE_FAKELOST-yes" ]; then + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_CHAIN_ibc1="10" + export DEBUG_RELAYER_PRUNE_AFTER_BLOCKS_PROVER_ibc1="10" + export DEBUG_RELAYER_SHFU_WAIT_ibc0="20" +fi + +PATH_NAME=mockapp-path +TM_ADDRESS0=$(${RLY} tendermint keys show ibc0 testkey) + +expectUnrelayedCount $PATH_NAME "unrelayed-packets" "src" 0 +expectUnrelayedCount $PATH_NAME "unrelayed-packets" "dst" 0 +expectUnrelayedCount $PATH_NAME "unrelayed-acknowledgements" "src" 0 +expectUnrelayedCount $PATH_NAME "unrelayed-acknowledgements" "dst" 0 + +${RLY} service start $PATH_NAME --relay-interval 20s --src-relay-optimize-interval 30s --src-relay-optimize-count 3 --dst-relay-optimize-interval 30s --dst-relay-optimize-count 3 & +RLY_PID=$! + +sendPacketOnEth $PATH_NAME +waitUnrelayedCount $PATH_NAME "unrelayed-packets" "dst" 1 300 + +docker exec tendermint-chain0-mock sh -c "simd --home /root/data/ibc0 tx --keyring-backend=test --from ${TM_ADDRESS0} --chain-id ibc0 mockapp send mockapp channel-0 'mock packet data' --yes" +waitUnrelayedCount $PATH_NAME "unrelayed-packets" "src" 1 30 + +date; echo "Server has started. Both chains already have a message to relay which will be ready after optimize-interval (30s)." + +echo "Waiting dst->src packets are relayed. Note that src chain(tendermint) has fast confirmation time" +waitUnrelayedCount $PATH_NAME "unrelayed-packets" "dst" 0 300 +echo "Waiting src->dst packets are relayed" +waitUnrelayedCount $PATH_NAME "unrelayed-packets" "src" 0 300 + +echo "Waiting dst->src ack is relayed. Note that the time of src->dst->src relay and dst->src->dst relay takes nearly same time" +waitUnrelayedCount $PATH_NAME "unrelayed-acknowledgements" "dst" 0 300 +echo "Waiting src->dst ack is relayed" +waitUnrelayedCount $PATH_NAME "unrelayed-acknowledgements" "src" 0 300 + +echo "$0 Finished" + +kill $RLY_PID diff --git a/tests/cases/tm2eth/scripts/utils b/tests/cases/tm2eth/scripts/utils new file mode 100644 index 0000000..158bc38 --- /dev/null +++ b/tests/cases/tm2eth/scripts/utils @@ -0,0 +1,58 @@ +expectUnrelayedCount() { + local PATH_NAME=$1 + local query_type=$2 + local filter=".$3 | length" + local expect_count=$4 + unrelayed_count=$(${RLY} query ${query_type} $PATH_NAME | jq "${filter}") + if [ "$unrelayed_count" -ne "${expect_count}" ]; then + echo "$query_type: $unrelayed_count" + test -z "$RLY_PID" || kill $RLY_PID + exit 1 + fi +} + +waitUnrelayedCount() { + local PATH_NAME=$1 + local query_type=$2 + local chain=$3 + local filter=".$chain | length" + local expect_count=$4 + timeout=$(( $(date +%s) + $5 )) + unrelayed_count=999 + until [ "$unrelayed_count" -eq "$expect_count" ]; do + unrelayed_count=$(${RLY} query ${query_type} $PATH_NAME | jq "${filter}") + date + echo "$0 ${query_type} is $unrelayed_count" + t=$(date +%s) + if [ $t -gt $timeout ]; then + echo "TIMEOUT waitUnrelayedCount: $query_type $chain expect $expect_count but $unrelayed_count" + exit 1 + fi + sleep 10 + done +} + +sendPacketOnEth() { + local PATH_NAME=$1 + local MOCKAPP_CONTRACT_B=$(cat $(dirname $0)/../fixtures/ethereum/ibc1/addresses/AppV1) + local RPC_ADDRESS_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.rpc_addr') + local PORT_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."port-id"') + local CHANNEL_B=$($RLY paths list --json | jq -r --arg path $PATH_NAME '.[$path].dst."channel-id"') + + local MNEMONIC_B=$($RLY config show | jq -r '.chains[] | select(.chain.origin_chain.chain_id == "ibc1").chain.origin_chain.signer.mnemonic') + local SENDER=$(cast wallet address --mnemonic "$MNEMONIC_B" --mnemonic-index 2) + + cast balance $SENDER --rpc-url $RPC_ADDRESS_B + cast nonce $SENDER --rpc-url $RPC_ADDRESS_B + cast send \ + --rpc-url $RPC_ADDRESS_B \ + --mnemonic "$MNEMONIC_B" --mnemonic-index 2 \ + --legacy \ + $MOCKAPP_CONTRACT_B \ + 'sendPacket(bytes,string,string,(uint64,uint64),uint64)' \ + $(cast from-utf8 'mock packet data') \ + $PORT_B \ + $CHANNEL_B \ + '(0,100000)' \ + $(date -d 1hour +%s%N) || exit 1 +} diff --git a/tests/chains/ethereum/Makefile b/tests/chains/ethereum/Makefile index 73f0864..5a07047 100644 --- a/tests/chains/ethereum/Makefile +++ b/tests/chains/ethereum/Makefile @@ -33,3 +33,6 @@ down-scaffold: docker-commit: $(SCRIPT_DIR)/docker/commitImage.sh $(DOCKER_REPO) $(DOCKER_TAG) ethereum-geth0 ethereum-geth0-scaffold $(CHAIN_ID0) $(SCRIPT_DIR)/docker/commitImage.sh $(DOCKER_REPO) $(DOCKER_TAG) ethereum-geth1 ethereum-geth1-scaffold $(CHAIN_ID1) + +clean: + rm -rf contracts/addresses contracts/artifacts contracts/cache contracts/.openzeppelin