mirror of
				https://github.com/0glabs/0g-storage-node.git
				synced 2025-11-04 00:27:39 +00:00 
			
		
		
		
	Supports evmos as blockchain fullnode in python tests (#40)
* refine blockchain type * Supports evmos * cp evmos to code dir * improve timestamp
This commit is contained in:
		
							parent
							
								
									0047ab22d4
								
							
						
					
					
						commit
						3e22a6a027
					
				
							
								
								
									
										63
									
								
								tests/config/evmos-init-genesis.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								tests/config/evmos-init-genesis.sh
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EVMOSD=$(cd $(dirname ${BASH_SOURCE[0]})/../tmp; pwd)/evmosd
 | 
				
			||||||
 | 
					ROOT_DIR=${1:-.}
 | 
				
			||||||
 | 
					NUM_NODES=${2:-3}
 | 
				
			||||||
 | 
					P2P_PORT_START=${3:-26656}
 | 
				
			||||||
 | 
					CHAIN_ID=evmospy_9000-777
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# install jq if not unavailable
 | 
				
			||||||
 | 
					jq --version >/dev/null 2>&1 || sudo snap install jq -y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir -p $ROOT_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Init configs
 | 
				
			||||||
 | 
					for ((i=0; i<$NUM_NODES; i++)) do
 | 
				
			||||||
 | 
						$EVMOSD init node$i --home $ROOT_DIR/node$i --chain-id $CHAIN_ID
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						# Change parameter token denominations to aevmos
 | 
				
			||||||
 | 
						GENESIS=$ROOT_DIR/node$i/config/genesis.json
 | 
				
			||||||
 | 
						TMP_GENESIS=$ROOT_DIR/node$i/config/tmp_genesis.json
 | 
				
			||||||
 | 
						cat $GENESIS | jq '.app_state["staking"]["params"]["bond_denom"]="aevmos"' >$TMP_GENESIS && mv $TMP_GENESIS $GENESIS
 | 
				
			||||||
 | 
						cat $GENESIS | jq '.app_state["gov"]["params"]["min_deposit"][0]["denom"]="aevmos"' >$TMP_GENESIS && mv $TMP_GENESIS $GENESIS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Change app.toml
 | 
				
			||||||
 | 
						APP_TOML=$ROOT_DIR/node$i/config/app.toml
 | 
				
			||||||
 | 
						sed -i 's/minimum-gas-prices = "0aevmos"/minimum-gas-prices = "1aevmos"/' $APP_TOML
 | 
				
			||||||
 | 
						sed -i '/\[json-rpc\]/,/^\[/ s/enable = false/enable = true/' $APP_TOML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Change config.toml
 | 
				
			||||||
 | 
						CONFIG_TOML=$ROOT_DIR/node$i/config/config.toml
 | 
				
			||||||
 | 
						sed -i '/seeds = /c\seeds = ""' $CONFIG_TOML
 | 
				
			||||||
 | 
						sed -i 's/addr_book_strict = true/addr_book_strict = false/' $CONFIG_TOML
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Update persistent_peers in config.toml
 | 
				
			||||||
 | 
					for ((i=1; i<$NUM_NODES; i++)) do
 | 
				
			||||||
 | 
						PERSISTENT_NODES=""
 | 
				
			||||||
 | 
						for ((j=0; j<$i; j++)) do
 | 
				
			||||||
 | 
							if [[ $j -gt 0 ]]; then PERSISTENT_NODES=$PERSISTENT_NODES,; fi
 | 
				
			||||||
 | 
							NODE_ID=`$EVMOSD tendermint show-node-id --home $ROOT_DIR/node$j`
 | 
				
			||||||
 | 
							P2P_PORT=$(($P2P_PORT_START+$j))
 | 
				
			||||||
 | 
							PERSISTENT_NODES=$PERSISTENT_NODES$NODE_ID@127.0.0.1:$P2P_PORT
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						sed -i "/persistent_peers = /c\persistent_peers = \"$PERSISTENT_NODES\"" $ROOT_DIR/node$i/config/config.toml
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create genesis with a single validator
 | 
				
			||||||
 | 
					$EVMOSD keys add val0 --keyring-backend test --home $ROOT_DIR/node0
 | 
				
			||||||
 | 
					$EVMOSD add-genesis-account val0 1000000000evmos --keyring-backend test --home $ROOT_DIR/node0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# add genesis account for tests, see GENESIS_PRIV_KEY and GENESIS_PRIV_KEY1 in node_config.py
 | 
				
			||||||
 | 
					$EVMOSD add-genesis-account evmos1l0j9dqdvd3fatfqywhm4y6avrln4jracaapkme 1000000000evmos --home $ROOT_DIR/node0
 | 
				
			||||||
 | 
					$EVMOSD add-genesis-account evmos1pemg6y3etj9tlhkl0vdwkrw36f74u2nlpxf6wc 1000000000evmos --home $ROOT_DIR/node0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir -p $ROOT_DIR/gentxs
 | 
				
			||||||
 | 
					$EVMOSD gentx val0 500000000evmos --keyring-backend test --home $ROOT_DIR/node0 --output-document $ROOT_DIR/gentxs/node0.json
 | 
				
			||||||
 | 
					$EVMOSD collect-gentxs --home $ROOT_DIR/node0 --gentx-dir $ROOT_DIR/gentxs
 | 
				
			||||||
 | 
					$EVMOSD validate-genesis --home $ROOT_DIR/node0
 | 
				
			||||||
 | 
					for ((i=1; i<$NUM_NODES; i++)) do
 | 
				
			||||||
 | 
					    cp $ROOT_DIR/node0/config/genesis.json $ROOT_DIR/node$i/config/genesis.json
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
@ -2,6 +2,7 @@ from web3 import Web3
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ZGS_CONFIG = {
 | 
					ZGS_CONFIG = {
 | 
				
			||||||
    "log_config_file": "log_config",
 | 
					    "log_config_file": "log_config",
 | 
				
			||||||
 | 
					    "confirmation_block_count": 1,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BSC_CONFIG = dict(
 | 
					BSC_CONFIG = dict(
 | 
				
			||||||
@ -28,6 +29,7 @@ CONFLUX_CONFIG = dict(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BLOCK_SIZE_LIMIT = 200 * 1024
 | 
					BLOCK_SIZE_LIMIT = 200 * 1024
 | 
				
			||||||
 | 
					# 0xfbe45681Ac6C53D5a40475F7526baC1FE7590fb8
 | 
				
			||||||
GENESIS_PRIV_KEY = "46b9e861b63d3509c88b7817275a30d22d62c8cd8fa6486ddee35ef0d8e0495f"
 | 
					GENESIS_PRIV_KEY = "46b9e861b63d3509c88b7817275a30d22d62c8cd8fa6486ddee35ef0d8e0495f"
 | 
				
			||||||
MINER_ID = "308a6e102a5829ba35e4ba1da0473c3e8bd45f5d3ffb91e31adb43f25463dddb"
 | 
					MINER_ID = "308a6e102a5829ba35e4ba1da0473c3e8bd45f5d3ffb91e31adb43f25463dddb"
 | 
				
			||||||
GENESIS_ACCOUNT = Web3().eth.account.from_key(GENESIS_PRIV_KEY)
 | 
					GENESIS_ACCOUNT = Web3().eth.account.from_key(GENESIS_PRIV_KEY)
 | 
				
			||||||
@ -37,6 +39,7 @@ TX_PARAMS = {
 | 
				
			|||||||
    "from": GENESIS_ACCOUNT.address,
 | 
					    "from": GENESIS_ACCOUNT.address,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 0x0e768D12395C8ABFDEdF7b1aEB0Dd1D27d5E2A7F
 | 
				
			||||||
GENESIS_PRIV_KEY1 = "9a6d3ba2b0c7514b16a006ee605055d71b9edfad183aeb2d9790e9d4ccced471"
 | 
					GENESIS_PRIV_KEY1 = "9a6d3ba2b0c7514b16a006ee605055d71b9edfad183aeb2d9790e9d4ccced471"
 | 
				
			||||||
GENESIS_ACCOUNT1 = Web3().eth.account.from_key(GENESIS_PRIV_KEY1)
 | 
					GENESIS_ACCOUNT1 = Web3().eth.account.from_key(GENESIS_PRIV_KEY1)
 | 
				
			||||||
TX_PARAMS1 = {
 | 
					TX_PARAMS1 = {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					from test_framework.blockchain_node import BlockChainNodeType
 | 
				
			||||||
from test_framework.test_framework import TestFramework
 | 
					from test_framework.test_framework import TestFramework
 | 
				
			||||||
from config.node_config import MINER_ID, GENESIS_PRIV_KEY
 | 
					from config.node_config import MINER_ID, GENESIS_PRIV_KEY
 | 
				
			||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					 | 
				
			||||||
from utility.submission import create_submission, submit_data
 | 
					from utility.submission import create_submission, submit_data
 | 
				
			||||||
from utility.utils import wait_until
 | 
					from utility.utils import wait_until
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					from test_framework.blockchain_node import BlockChainNodeType
 | 
				
			||||||
from test_framework.test_framework import TestFramework
 | 
					from test_framework.test_framework import TestFramework
 | 
				
			||||||
from config.node_config import MINER_ID, GENESIS_PRIV_KEY
 | 
					from config.node_config import MINER_ID, GENESIS_PRIV_KEY
 | 
				
			||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					 | 
				
			||||||
from utility.submission import create_submission, submit_data
 | 
					from utility.submission import create_submission, submit_data
 | 
				
			||||||
from utility.utils import wait_until, assert_equal, assert_greater_than
 | 
					from utility.utils import wait_until, assert_equal, assert_greater_than
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					 | 
				
			||||||
from test_framework.test_framework import TestFramework
 | 
					from test_framework.test_framework import TestFramework
 | 
				
			||||||
from utility.submission import create_submission
 | 
					from utility.submission import create_submission
 | 
				
			||||||
from utility.submission import submit_data
 | 
					from utility.submission import submit_data
 | 
				
			||||||
@ -81,4 +80,4 @@ class RandomTest(TestFramework):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
    RandomTest(blockchain_node_type=BlockChainNodeType.Conflux).main()
 | 
					    RandomTest().main()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from test_framework.test_framework import TestFramework
 | 
					 | 
				
			||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					from test_framework.blockchain_node import BlockChainNodeType
 | 
				
			||||||
 | 
					from test_framework.test_framework import TestFramework
 | 
				
			||||||
from test_framework.conflux_node import connect_nodes, disconnect_nodes, sync_blocks
 | 
					from test_framework.conflux_node import connect_nodes, disconnect_nodes, sync_blocks
 | 
				
			||||||
from config.node_config import CONFLUX_CONFIG, TX_PARAMS1
 | 
					from config.node_config import CONFLUX_CONFIG, TX_PARAMS1
 | 
				
			||||||
from utility.submission import create_submission, submit_data
 | 
					from utility.submission import create_submission, submit_data
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,3 @@
 | 
				
			|||||||
import json
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
@ -14,9 +13,6 @@ from config.node_config import (
 | 
				
			|||||||
    GENESIS_PRIV_KEY1,
 | 
					    GENESIS_PRIV_KEY1,
 | 
				
			||||||
    TX_PARAMS,
 | 
					    TX_PARAMS,
 | 
				
			||||||
    MINER_ID,
 | 
					    MINER_ID,
 | 
				
			||||||
    NO_MERKLE_PROOF_FLAG,
 | 
					 | 
				
			||||||
    NO_SEAL_FLAG,
 | 
					 | 
				
			||||||
    TX_PARAMS1,
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from utility.simple_rpc_proxy import SimpleRpcProxy
 | 
					from utility.simple_rpc_proxy import SimpleRpcProxy
 | 
				
			||||||
from utility.utils import (
 | 
					from utility.utils import (
 | 
				
			||||||
@ -30,6 +26,7 @@ from test_framework.contracts import load_contract_metadata
 | 
				
			|||||||
class BlockChainNodeType(Enum):
 | 
					class BlockChainNodeType(Enum):
 | 
				
			||||||
    Conflux = 0
 | 
					    Conflux = 0
 | 
				
			||||||
    BSC = 1
 | 
					    BSC = 1
 | 
				
			||||||
 | 
					    Evmos = 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@unique
 | 
					@unique
 | 
				
			||||||
@ -46,7 +43,7 @@ class TestNode:
 | 
				
			|||||||
    def __init__(
 | 
					    def __init__(
 | 
				
			||||||
        self, node_type, index, data_dir, rpc_url, binary, config, log, rpc_timeout=10
 | 
					        self, node_type, index, data_dir, rpc_url, binary, config, log, rpc_timeout=10
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        assert os.path.exists(binary), ("blockchain binary not found: %s" % binary)
 | 
					        assert os.path.exists(binary), ("Binary not found: %s" % binary)
 | 
				
			||||||
        self.node_type = node_type
 | 
					        self.node_type = node_type
 | 
				
			||||||
        self.index = index
 | 
					        self.index = index
 | 
				
			||||||
        self.data_dir = data_dir
 | 
					        self.data_dir = data_dir
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										82
									
								
								tests/test_framework/evmos_node.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								tests/test_framework/evmos_node.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					import tempfile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from test_framework.blockchain_node import BlockChainNodeType, BlockchainNode
 | 
				
			||||||
 | 
					from utility.utils import blockchain_rpc_port, arrange_port
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EVMOS_PORT_CATEGORY_WS = 0
 | 
				
			||||||
 | 
					EVMOS_PORT_CATEGORY_P2P = 1
 | 
				
			||||||
 | 
					EVMOS_PORT_CATEGORY_RPC = 2
 | 
				
			||||||
 | 
					EVMOS_PORT_CATEGORY_PPROF = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def evmos_init_genesis(root_dir: str, num_nodes: int):
 | 
				
			||||||
 | 
					    assert num_nodes > 0, "Invalid number of blockchain nodes: %s" % num_nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    shell_script = os.path.join(
 | 
				
			||||||
 | 
					        os.path.dirname(os.path.realpath(__file__)), # test_framework folder
 | 
				
			||||||
 | 
					        "..", "config", "evmos-init-genesis.sh"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    evmosd_dir = os.path.join(root_dir, "evmosd")
 | 
				
			||||||
 | 
					    os.mkdir(evmosd_dir)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    log_file = tempfile.NamedTemporaryFile(dir=evmosd_dir, delete=False, prefix="init_genesis_", suffix=".log")
 | 
				
			||||||
 | 
					    p2p_port_start = arrange_port(EVMOS_PORT_CATEGORY_P2P, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = subprocess.run(
 | 
				
			||||||
 | 
					        args=["bash", shell_script, evmosd_dir, str(num_nodes), str(p2p_port_start)],
 | 
				
			||||||
 | 
					        stdout=log_file,
 | 
				
			||||||
 | 
					        stderr=log_file,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    log_file.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert ret.returncode == 0, "Failed to init evmos genesis, see more details in log file: %s" % log_file.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EvmosNode(BlockchainNode):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        index,
 | 
				
			||||||
 | 
					        root_dir,
 | 
				
			||||||
 | 
					        binary,
 | 
				
			||||||
 | 
					        updated_config,
 | 
				
			||||||
 | 
					        contract_path,
 | 
				
			||||||
 | 
					        log,
 | 
				
			||||||
 | 
					        rpc_timeout=10,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        assert len(updated_config) == 0, "updated_config not supported for evmos"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        data_dir = os.path.join(root_dir, "evmosd", "node" + str(index))
 | 
				
			||||||
 | 
					        rpc_url = "http://127.0.0.1:%s" % blockchain_rpc_port(index)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        super().__init__(
 | 
				
			||||||
 | 
					            index,
 | 
				
			||||||
 | 
					            data_dir,
 | 
				
			||||||
 | 
					            rpc_url,
 | 
				
			||||||
 | 
					            binary,
 | 
				
			||||||
 | 
					            {},
 | 
				
			||||||
 | 
					            contract_path,
 | 
				
			||||||
 | 
					            log,
 | 
				
			||||||
 | 
					            BlockChainNodeType.Evmos,
 | 
				
			||||||
 | 
					            rpc_timeout,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.config_file = None
 | 
				
			||||||
 | 
					        self.args = [
 | 
				
			||||||
 | 
					            binary, "start",
 | 
				
			||||||
 | 
					            "--home", data_dir,
 | 
				
			||||||
 | 
					            # overwrite json rpc http port: 8545
 | 
				
			||||||
 | 
					            "--json-rpc.address", "127.0.0.1:%s" % blockchain_rpc_port(index),
 | 
				
			||||||
 | 
					            # overwrite json rpc ws port: 8546
 | 
				
			||||||
 | 
					            "--json-rpc.ws-address", "127.0.0.1:%s" % arrange_port(EVMOS_PORT_CATEGORY_WS, index),
 | 
				
			||||||
 | 
					            # overwrite p2p port: 26656
 | 
				
			||||||
 | 
					            "--p2p.laddr", "tcp://127.0.0.1:%s" % arrange_port(EVMOS_PORT_CATEGORY_P2P, index),
 | 
				
			||||||
 | 
					            # overwrite rpc port: 26657
 | 
				
			||||||
 | 
					            "--rpc.laddr", "tcp://127.0.0.1:%s" % arrange_port(EVMOS_PORT_CATEGORY_RPC, index),
 | 
				
			||||||
 | 
					            # overwrite pprof port: 6060
 | 
				
			||||||
 | 
					            "--rpc.pprof_laddr", "127.0.0.1:%s" % arrange_port(EVMOS_PORT_CATEGORY_PPROF, index),
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setup_config(self):
 | 
				
			||||||
 | 
					        """ Already batch initialized by shell script in framework """
 | 
				
			||||||
@ -16,8 +16,8 @@ from test_framework.bsc_node import BSCNode
 | 
				
			|||||||
from test_framework.contract_proxy import FlowContractProxy, MineContractProxy, IRewardContractProxy
 | 
					from test_framework.contract_proxy import FlowContractProxy, MineContractProxy, IRewardContractProxy
 | 
				
			||||||
from test_framework.zgs_node import ZgsNode
 | 
					from test_framework.zgs_node import ZgsNode
 | 
				
			||||||
from test_framework.blockchain_node import BlockChainNodeType
 | 
					from test_framework.blockchain_node import BlockChainNodeType
 | 
				
			||||||
from test_framework.conflux_node import ConfluxNode, connect_sample_nodes, sync_blocks
 | 
					from test_framework.conflux_node import ConfluxNode, connect_sample_nodes
 | 
				
			||||||
 | 
					from test_framework.evmos_node import EvmosNode, evmos_init_genesis
 | 
				
			||||||
from utility.utils import PortMin, is_windows_platform, wait_until
 | 
					from utility.utils import PortMin, is_windows_platform, wait_until
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__file_path__ = os.path.dirname(os.path.realpath(__file__))
 | 
					__file_path__ = os.path.dirname(os.path.realpath(__file__))
 | 
				
			||||||
@ -33,7 +33,7 @@ TEST_EXIT_FAILED = 1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestFramework:
 | 
					class TestFramework:
 | 
				
			||||||
    def __init__(self, blockchain_node_type=BlockChainNodeType.Conflux):
 | 
					    def __init__(self, blockchain_node_type=BlockChainNodeType.Evmos):
 | 
				
			||||||
        if "http_proxy" in os.environ:
 | 
					        if "http_proxy" in os.environ:
 | 
				
			||||||
            # Print a warning message in yellow color
 | 
					            # Print a warning message in yellow color
 | 
				
			||||||
            print("\n\033[93m ⚠️   Warning: You've set the environment variable 'http_proxy', which might lead to testing issues.\033[0m\n")
 | 
					            print("\n\033[93m ⚠️   Warning: You've set the environment variable 'http_proxy', which might lead to testing issues.\033[0m\n")
 | 
				
			||||||
@ -49,6 +49,7 @@ class TestFramework:
 | 
				
			|||||||
        self.enable_market = False
 | 
					        self.enable_market = False
 | 
				
			||||||
        self.mine_period = 100
 | 
					        self.mine_period = 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Set default binary path
 | 
				
			||||||
        binary_ext = ".exe" if is_windows_platform() else ""
 | 
					        binary_ext = ".exe" if is_windows_platform() else ""
 | 
				
			||||||
        tests_dir = os.path.dirname(__file_path__)
 | 
					        tests_dir = os.path.dirname(__file_path__)
 | 
				
			||||||
        root_dir = os.path.dirname(tests_dir)
 | 
					        root_dir = os.path.dirname(tests_dir)
 | 
				
			||||||
@ -58,6 +59,9 @@ class TestFramework:
 | 
				
			|||||||
        self.__default_geth_binary__ = os.path.join(
 | 
					        self.__default_geth_binary__ = os.path.join(
 | 
				
			||||||
            tests_dir, "tmp", "geth" + binary_ext
 | 
					            tests_dir, "tmp", "geth" + binary_ext
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					        self.__default_evmos_binary__ = os.path.join(
 | 
				
			||||||
 | 
					            tests_dir, "tmp", "evmosd" + binary_ext
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        self.__default_zgs_node_binary__ = os.path.join(
 | 
					        self.__default_zgs_node_binary__ = os.path.join(
 | 
				
			||||||
            root_dir, "target", "release", "zgs_node" + binary_ext
 | 
					            root_dir, "target", "release", "zgs_node" + binary_ext
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@ -66,6 +70,10 @@ class TestFramework:
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __setup_blockchain_node(self):
 | 
					    def __setup_blockchain_node(self):
 | 
				
			||||||
 | 
					        if self.blockchain_node_type == BlockChainNodeType.Evmos:
 | 
				
			||||||
 | 
					            evmos_init_genesis(self.root_dir, self.num_blockchain_nodes)
 | 
				
			||||||
 | 
					            self.log.info("Evmos genesis initialized for %s nodes" % self.num_blockchain_nodes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for i in range(self.num_blockchain_nodes):
 | 
					        for i in range(self.num_blockchain_nodes):
 | 
				
			||||||
            if i in self.blockchain_node_configs:
 | 
					            if i in self.blockchain_node_configs:
 | 
				
			||||||
                updated_config = self.blockchain_node_configs[i]
 | 
					                updated_config = self.blockchain_node_configs[i]
 | 
				
			||||||
@ -92,6 +100,15 @@ class TestFramework:
 | 
				
			|||||||
                    self.contract_path,
 | 
					                    self.contract_path,
 | 
				
			||||||
                    self.log,
 | 
					                    self.log,
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					            elif self.blockchain_node_type == BlockChainNodeType.Evmos:
 | 
				
			||||||
 | 
					                node = EvmosNode(
 | 
				
			||||||
 | 
					                    i,
 | 
				
			||||||
 | 
					                    self.root_dir,
 | 
				
			||||||
 | 
					                    self.blockchain_binary,
 | 
				
			||||||
 | 
					                    updated_config,
 | 
				
			||||||
 | 
					                    self.contract_path,
 | 
				
			||||||
 | 
					                    self.log,
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                raise NotImplementedError
 | 
					                raise NotImplementedError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -141,6 +158,14 @@ class TestFramework:
 | 
				
			|||||||
                # The default is `dev` mode with auto mining, so it's not guaranteed that blocks
 | 
					                # The default is `dev` mode with auto mining, so it's not guaranteed that blocks
 | 
				
			||||||
                # can be synced in time for `sync_blocks` to pass.
 | 
					                # can be synced in time for `sync_blocks` to pass.
 | 
				
			||||||
                # sync_blocks(self.blockchain_nodes)
 | 
					                # sync_blocks(self.blockchain_nodes)
 | 
				
			||||||
 | 
					        elif self.blockchain_node_type == BlockChainNodeType.Evmos:
 | 
				
			||||||
 | 
					            # wait for the first block
 | 
				
			||||||
 | 
					            self.log.debug("Wait 3 seconds for evmos node to generate first block")
 | 
				
			||||||
 | 
					            time.sleep(3)
 | 
				
			||||||
 | 
					            for node in self.blockchain_nodes:
 | 
				
			||||||
 | 
					                wait_until(lambda: node.net_peerCount() == self.num_blockchain_nodes - 1)
 | 
				
			||||||
 | 
					                wait_until(lambda: node.eth_blockNumber() is not None)
 | 
				
			||||||
 | 
					                wait_until(lambda: int(node.eth_blockNumber(), 16) > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        contract, tx_hash, mine_contract, reward_contract = self.blockchain_nodes[0].setup_contract(self.enable_market, self.mine_period)
 | 
					        contract, tx_hash, mine_contract, reward_contract = self.blockchain_nodes[0].setup_contract(self.enable_market, self.mine_period)
 | 
				
			||||||
        self.contract = FlowContractProxy(contract, self.blockchain_nodes)
 | 
					        self.contract = FlowContractProxy(contract, self.blockchain_nodes)
 | 
				
			||||||
@ -172,7 +197,7 @@ class TestFramework:
 | 
				
			|||||||
            )
 | 
					            )
 | 
				
			||||||
            self.nodes.append(node)
 | 
					            self.nodes.append(node)
 | 
				
			||||||
            node.setup_config()
 | 
					            node.setup_config()
 | 
				
			||||||
            # wait firt node start for connection
 | 
					            # wait first node start for connection
 | 
				
			||||||
            if i > 0:
 | 
					            if i > 0:
 | 
				
			||||||
                time.sleep(1)
 | 
					                time.sleep(1)
 | 
				
			||||||
            node.start()
 | 
					            node.start()
 | 
				
			||||||
@ -196,6 +221,13 @@ class TestFramework:
 | 
				
			|||||||
            type=str,
 | 
					            type=str,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parser.add_argument(
 | 
				
			||||||
 | 
					            "--evmos-binary",
 | 
				
			||||||
 | 
					            dest="evmos",
 | 
				
			||||||
 | 
					            default=self.__default_evmos_binary__,
 | 
				
			||||||
 | 
					            type=str,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        parser.add_argument(
 | 
					        parser.add_argument(
 | 
				
			||||||
            "--zerog-storage-binary",
 | 
					            "--zerog-storage-binary",
 | 
				
			||||||
            dest="zerog_storage",
 | 
					            dest="zerog_storage",
 | 
				
			||||||
@ -353,7 +385,7 @@ class TestFramework:
 | 
				
			|||||||
        self.__setup_zgs_node()
 | 
					        self.__setup_zgs_node()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def stop_nodes(self):
 | 
					    def stop_nodes(self):
 | 
				
			||||||
        # stop ionion nodes first
 | 
					        # stop storage nodes first
 | 
				
			||||||
        for node in self.nodes:
 | 
					        for node in self.nodes:
 | 
				
			||||||
            node.stop()
 | 
					            node.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -394,8 +426,12 @@ class TestFramework:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if self.blockchain_node_type == BlockChainNodeType.Conflux:
 | 
					        if self.blockchain_node_type == BlockChainNodeType.Conflux:
 | 
				
			||||||
            self.blockchain_binary = os.path.abspath(self.options.conflux)
 | 
					            self.blockchain_binary = os.path.abspath(self.options.conflux)
 | 
				
			||||||
        else:
 | 
					        elif self.blockchain_node_type == BlockChainNodeType.BSC:
 | 
				
			||||||
            self.blockchain_binary = os.path.abspath(self.options.bsc)
 | 
					            self.blockchain_binary = os.path.abspath(self.options.bsc)
 | 
				
			||||||
 | 
					        elif self.blockchain_node_type == BlockChainNodeType.Evmos:
 | 
				
			||||||
 | 
					            self.blockchain_binary = os.path.abspath(self.options.evmos)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            raise NotImplementedError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.zgs_binary = os.path.abspath(self.options.zerog_storage)
 | 
					        self.zgs_binary = os.path.abspath(self.options.zerog_storage)
 | 
				
			||||||
        self.cli_binary = os.path.abspath(self.options.cli)
 | 
					        self.cli_binary = os.path.abspath(self.options.cli)
 | 
				
			||||||
@ -412,6 +448,7 @@ class TestFramework:
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            self.setup_params()
 | 
					            self.setup_params()
 | 
				
			||||||
            self.setup_nodes()
 | 
					            self.setup_nodes()
 | 
				
			||||||
 | 
					            self.log.debug("========== start to run tests ==========")
 | 
				
			||||||
            self.run_test()
 | 
					            self.run_test()
 | 
				
			||||||
            success = TestStatus.PASSED
 | 
					            success = TestStatus.PASSED
 | 
				
			||||||
        except AssertionError as e:
 | 
					        except AssertionError as e:
 | 
				
			||||||
 | 
				
			|||||||
@ -66,7 +66,7 @@ class ZgsNode(TestNode):
 | 
				
			|||||||
        os.mkdir(self.data_dir)
 | 
					        os.mkdir(self.data_dir)
 | 
				
			||||||
        log_config_path = os.path.join(self.data_dir, self.config["log_config_file"])
 | 
					        log_config_path = os.path.join(self.data_dir, self.config["log_config_file"])
 | 
				
			||||||
        with open(log_config_path, "w") as f:
 | 
					        with open(log_config_path, "w") as f:
 | 
				
			||||||
            f.write("debug")
 | 
					            f.write("debug,hyper=info,h2=info")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initialize_toml_config(self.config_file, self.config)
 | 
					        initialize_toml_config(self.config_file, self.config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,7 @@ DEFAULT_PORT_MAX = 65535
 | 
				
			|||||||
DEFAULT_PORT_RANGE = 500
 | 
					DEFAULT_PORT_RANGE = 500
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONFLUX_BINARY = "conflux.exe" if is_windows_platform() else "conflux"
 | 
					CONFLUX_BINARY = "conflux.exe" if is_windows_platform() else "conflux"
 | 
				
			||||||
 | 
					EVMOS_BINARY = "evmosd.exe" if is_windows_platform() else "evmosd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def print_testcase_result(color, glyph, script, start_time):
 | 
					def print_testcase_result(color, glyph, script, start_time):
 | 
				
			||||||
    print(color[1] + glyph + " Testcase " + script + "\telapsed: " + str(int(time.time() - start_time)) + " seconds" + color[0], flush=True)
 | 
					    print(color[1] + glyph + " Testcase " + script + "\telapsed: " + str(int(time.time() - start_time)) + " seconds" + color[0], flush=True)
 | 
				
			||||||
@ -59,13 +60,29 @@ def run_single_test(py, script, test_dir, index, port_min, port_max):
 | 
				
			|||||||
    print_testcase_result(BLUE, TICK, script, start_time)
 | 
					    print_testcase_result(BLUE, TICK, script, start_time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def run_all(test_dir: str, test_subdirs: list[str]=[], slow_tests: set[str]={}, long_manual_tests: set[str]={}):
 | 
					def run_all(test_dir: str, test_subdirs: list[str]=[], slow_tests: set[str]={}, long_manual_tests: set[str]={}):
 | 
				
			||||||
    start_time = time.time()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tmp_dir = os.path.join(test_dir, "tmp")
 | 
					    tmp_dir = os.path.join(test_dir, "tmp")
 | 
				
			||||||
    if not os.path.exists(tmp_dir):
 | 
					    if not os.path.exists(tmp_dir):
 | 
				
			||||||
        os.makedirs(tmp_dir, exist_ok=True)
 | 
					        os.makedirs(tmp_dir, exist_ok=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    build_conflux_if_absent(tmp_dir)
 | 
					    # Build conflux binary if absent
 | 
				
			||||||
 | 
					    build_from_github(
 | 
				
			||||||
 | 
					        dir=tmp_dir,
 | 
				
			||||||
 | 
					        binary_name=CONFLUX_BINARY,
 | 
				
			||||||
 | 
					        github_url="https://github.com/Conflux-Chain/conflux-rust.git",
 | 
				
			||||||
 | 
					        build_cmd="cargo build --release --bin conflux",
 | 
				
			||||||
 | 
					        compiled_relative_path=["target", "release"],
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Build evmos binary if absent
 | 
				
			||||||
 | 
					    build_from_github(
 | 
				
			||||||
 | 
					        dir=tmp_dir,
 | 
				
			||||||
 | 
					        binary_name=EVMOS_BINARY,
 | 
				
			||||||
 | 
					        github_url="https://github.com/0glabs/0g-evmos.git",
 | 
				
			||||||
 | 
					        build_cmd="make install; cp $(go env GOPATH)/bin/evmosd .",
 | 
				
			||||||
 | 
					        compiled_relative_path=[],
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    start_time = time.time()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    parser = argparse.ArgumentParser(usage="%(prog)s [options]")
 | 
					    parser = argparse.ArgumentParser(usage="%(prog)s [options]")
 | 
				
			||||||
    parser.add_argument(
 | 
					    parser.add_argument(
 | 
				
			||||||
@ -139,29 +156,38 @@ def run_all(test_dir: str, test_subdirs: list[str]=[], slow_tests: set[str]={},
 | 
				
			|||||||
            print(c)
 | 
					            print(c)
 | 
				
			||||||
        sys.exit(1)
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def build_from_github(dir: str, binary_name: str, github_url: str, build_cmd: str, compiled_relative_path: list[str]) -> bool:
 | 
				
			||||||
 | 
					    binary_path = os.path.join(dir, binary_name)
 | 
				
			||||||
 | 
					    if os.path.exists(binary_path):
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
def build_conflux_if_absent(tmp_dir):
 | 
					    start_time = time.time()
 | 
				
			||||||
    conflux_path = os.path.join(tmp_dir, CONFLUX_BINARY)
 | 
					 | 
				
			||||||
    if os.path.exists(conflux_path):
 | 
					 | 
				
			||||||
        return
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    conflux_tmp_dir = os.path.join(tmp_dir, "conflux_tmp")
 | 
					    # clone code from github to a temp folder
 | 
				
			||||||
    if os.path.exists(conflux_tmp_dir):
 | 
					    code_tmp_dir_name = (binary_name[:-4] if is_windows_platform() else binary_name) + "_tmp"
 | 
				
			||||||
        shutil.rmtree(conflux_tmp_dir)
 | 
					    code_tmp_dir = os.path.join(dir, code_tmp_dir_name)
 | 
				
			||||||
 | 
					    if os.path.exists(code_tmp_dir):
 | 
				
			||||||
    clone_command = "git clone https://github.com/Conflux-Chain/conflux-rust.git"
 | 
					        shutil.rmtree(code_tmp_dir)
 | 
				
			||||||
    clone_with_path = clone_command + " " + conflux_tmp_dir
 | 
					    clone_command = "git clone " + github_url + " " + code_tmp_dir
 | 
				
			||||||
    os.system(clone_with_path)
 | 
					    os.system(clone_command)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # build binary
 | 
				
			||||||
    origin_path = os.getcwd()
 | 
					    origin_path = os.getcwd()
 | 
				
			||||||
    os.chdir(conflux_tmp_dir)
 | 
					    os.chdir(code_tmp_dir)
 | 
				
			||||||
    os.system("cargo build --release --bin conflux")
 | 
					    os.system(build_cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    path = os.path.join(conflux_tmp_dir, "target", "release", CONFLUX_BINARY)
 | 
					    # copy compiled binary to right place
 | 
				
			||||||
    shutil.copyfile(path, conflux_path)
 | 
					    compiled_binary = os.path.join(code_tmp_dir, *compiled_relative_path, binary_name)
 | 
				
			||||||
 | 
					    shutil.copyfile(compiled_binary, binary_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not is_windows_platform():
 | 
					    if not is_windows_platform():
 | 
				
			||||||
        st = os.stat(conflux_path)
 | 
					        st = os.stat(binary_path)
 | 
				
			||||||
        os.chmod(conflux_path, st.st_mode | stat.S_IEXEC)
 | 
					        os.chmod(binary_path, st.st_mode | stat.S_IEXEC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    os.chdir(origin_path)
 | 
					    os.chdir(origin_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    shutil.rmtree(code_tmp_dir, ignore_errors=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print("Completed to build binary " + binary_name + ", Elapsed: " + str(int(time.time() - start_time)) + " seconds", flush=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return True
 | 
				
			||||||
 | 
				
			|||||||
@ -37,6 +37,8 @@ def blockchain_rpc_port(n):
 | 
				
			|||||||
def blockchain_rpc_port_core(n):
 | 
					def blockchain_rpc_port_core(n):
 | 
				
			||||||
    return PortMin.n + 4 * MAX_NODES + n
 | 
					    return PortMin.n + 4 * MAX_NODES + n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def arrange_port(category: int, node_index: int) -> int:
 | 
				
			||||||
 | 
					    return PortMin.n + (100 + category) * MAX_NODES + node_index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def wait_until(predicate, *, attempts=float("inf"), timeout=float("inf"), lock=None):
 | 
					def wait_until(predicate, *, attempts=float("inf"), timeout=float("inf"), lock=None):
 | 
				
			||||||
    if attempts == float("inf") and timeout == float("inf"):
 | 
					    if attempts == float("inf") and timeout == float("inf"):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user