From a6991d0db7eab8854abcced5ff4877a39f2ae707 Mon Sep 17 00:00:00 2001 From: Stuart Reed Date: Tue, 16 Jan 2024 14:15:19 -0700 Subject: [PATCH 1/7] WIP: Generate geth fixture for shanghai with clique consensus --- tests/integration/generate_fixtures/common.py | 22 ++++++++++++++----- .../generate_fixtures/go_ethereum.py | 22 +++++++++---------- web3/_utils/method_formatters.py | 4 +++- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/tests/integration/generate_fixtures/common.py b/tests/integration/generate_fixtures/common.py index 13abb1c081..21187a74ea 100644 --- a/tests/integration/generate_fixtures/common.py +++ b/tests/integration/generate_fixtures/common.py @@ -19,6 +19,17 @@ TransactionNotFound, ) + +def _extradata_encode_signer(signer_address): + """ + Encode signer address in extradata field + https://geth.ethereum.org/docs/fundamentals/private-network#clique-example + """ + _32_zero_bytes = "0" * 64 + _65_zero_bytes = "0" * 130 + return f"0x{_32_zero_bytes}{signer_address[2:]}{_65_zero_bytes}" + + # use same coinbase value as in `web3.py/tests/integration/common.py` COINBASE = "0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd" COINBASE_PK = "0x58d23b55bc9cdce1f18c2500f40ff4ab7245df9a89505e9b1fa4851f623d241d" @@ -40,20 +51,21 @@ "config": { "chainId": 131277322940537, # the string 'web3py' as an integer "homesteadBlock": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, - "istanbulBlock": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, "petersburgBlock": 0, + "istanbulBlock": 0, "berlinBlock": 0, "londonBlock": 0, "arrowGlacierBlock": 0, "grayGlacierBlock": 0, "shanghaiTime": 0, + "clique": {"period": 5, "epoch": 30000}, }, - "nonce": "0x0000000000000042", + "nonce": "0x8964358912345896", # Random nonce to prevent unknown connections "alloc": { COINBASE: {"balance": "1000000000000000000000000000"}, UNLOCKABLE_ACCOUNT: {"balance": "1000000000000000000000000000"}, @@ -67,7 +79,7 @@ }, "timestamp": "0x00", "parentHash": constants.HASH_ZERO, - "extraData": "0x3535353535353535353535353535353535353535353535353535353535353535", + "extraData": _extradata_encode_signer(COINBASE), "gasLimit": "0x3b9aca00", # 1,000,000,000 "difficulty": "0x10000", "mixhash": constants.HASH_ZERO, diff --git a/tests/integration/generate_fixtures/go_ethereum.py b/tests/integration/generate_fixtures/go_ethereum.py index 6a3abf2607..9c1cfebce0 100644 --- a/tests/integration/generate_fixtures/go_ethereum.py +++ b/tests/integration/generate_fixtures/go_ethereum.py @@ -80,32 +80,30 @@ def get_geth_process(geth_binary, datadir, genesis_file_path, geth_ipc_path, get subprocess.check_output( init_datadir_command, stdin=subprocess.PIPE, - stderr=subprocess.PIPE, + stderr=False, ) run_geth_command = ( geth_binary, - "--datadir", + "--datadir", # data dir for the db datadir, - "--ipcpath", + "--ipcpath", # file for ipc socket/pipe geth_ipc_path, - "--ethash.dagsondisk", - "1", - "--gcmode", + "--gcmode", # Blockchain garbage collection mode ("full", "archive") "archive", - "--nodiscover", - "--port", + "--nodiscover", # Disables the peer discovery mechanism (manual peer addition) + "--port", # Network listening port geth_port, - "--miner.etherbase", + "--miner.etherbase", # Public address for block mining rewards common.COINBASE[2:], - "--rpc.enabledeprecatedpersonal", + "--rpc.enabledeprecatedpersonal", # Enables the (deprecated) personal namespace ) popen_proc = subprocess.Popen( run_geth_command, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, + stdout=False, # TODO: Revert to pipe + stderr=False, # TODO: Revert to pipe ) with popen_proc as proc: with graceful_kill_on_exit(proc) as graceful_proc: diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index b0eff5e9f1..3e4f9052d9 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -287,7 +287,9 @@ def apply_list_to_array_formatter(formatter: Any) -> Callable[..., Any]: BLOCK_FORMATTERS = { "baseFeePerGas": to_integer_if_hex, - "extraData": apply_formatter_if(is_not_null, to_hexbytes(32, variable_length=True)), + "extraData": apply_formatter_if( + is_not_null, to_hexbytes(117, variable_length=True) + ), "gasLimit": to_integer_if_hex, "gasUsed": to_integer_if_hex, "size": to_integer_if_hex, From 4ab6b1e581c4078dbbc359a53f03e24c3617d661 Mon Sep 17 00:00:00 2001 From: fselmo Date: Wed, 17 Jan 2024 09:19:05 -0700 Subject: [PATCH 2/7] Initial squashed commits for getting ``geth --dev`` test fixture working: - Quicker timeout for unmined wait-for-txn-receipt tests - Update default fees test for geth --dev mode - Get rid of all miner start() and stop() references - Run integration tests with --dev flag - Test refactoring for ``geth --dev`` test fixture setup - Remove PoW related endpoint tests; TODO: remove / deprecate endpoints - Support latest geth versions - Update geth version in circleCI config + peripherally related changes - Turn on PoS block identifier tests - get geth --dev test suite working --- .circleci/config.yml | 4 +- docs/contributing.rst | 4 +- setup.py | 2 +- tests/core/mining-module/conftest.py | 11 --- .../core/mining-module/test_miner_hashrate.py | 11 --- .../core/mining-module/test_miner_setExtra.py | 39 --------- .../mining-module/test_miner_setGasPrice.py | 28 ------- tests/core/mining-module/test_miner_start.py | 34 -------- tests/core/mining-module/test_miner_stop.py | 27 ------- tests/core/mining-module/test_setEtherBase.py | 6 -- tests/integration/generate_fixtures/common.py | 54 +++---------- .../generate_fixtures/go_ethereum.py | 56 ++++++------- tests/integration/geth-1.11.6-fixture.zip | Bin 63258 -> 0 bytes tests/integration/geth-1.13.9-fixture.zip | Bin 0 -> 47623 bytes tests/integration/go_ethereum/conftest.py | 11 ++- .../go_ethereum/test_goethereum_http.py | 2 +- .../go_ethereum/test_goethereum_ipc.py | 6 -- .../go_ethereum/test_goethereum_ws.py | 2 +- .../test_goethereum_ws_v2/conftest.py | 2 +- tests/integration/test_ethereum_tester.py | 6 -- web3/_utils/method_formatters.py | 4 +- web3/_utils/module_testing/eth_module.py | 74 +++++------------- web3/_utils/module_testing/web3_module.py | 2 + web3/tools/benchmark/node.py | 2 +- 24 files changed, 71 insertions(+), 316 deletions(-) delete mode 100644 tests/core/mining-module/conftest.py delete mode 100644 tests/core/mining-module/test_miner_hashrate.py delete mode 100644 tests/core/mining-module/test_miner_setExtra.py delete mode 100644 tests/core/mining-module/test_miner_setGasPrice.py delete mode 100644 tests/core/mining-module/test_miner_start.py delete mode 100644 tests/core/mining-module/test_miner_stop.py delete mode 100644 tests/core/mining-module/test_setEtherBase.py delete mode 100644 tests/integration/geth-1.11.6-fixture.zip create mode 100644 tests/integration/geth-1.13.9-fixture.zip diff --git a/.circleci/config.yml b/.circleci/config.yml index 84a17e753f..8499b0507b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 parameters: geth_version: # update default value when updating geth integration test fixture - default: "v1.11.6" + default: "v1.13.9" type: string pygeth_version: # update default value when updating geth integration test fixture @@ -107,7 +107,6 @@ geth_steps: &geth_steps fi sudo ln -s /home/circleci/.py-geth/geth-<< pipeline.parameters.geth_version >>/bin/geth /usr/local/bin/geth geth version - geth makedag 0 $HOME/.ethash - run: name: run tox command: python -m tox -r @@ -148,7 +147,6 @@ geth_custom_steps: &geth_custom_steps sudo apt-get update; sudo apt-get install -y build-essential; ./custom_geth version - ./custom_geth makedag 0 $HOME/.ethash - run: name: run tox command: python -m tox -r diff --git a/docs/contributing.rst b/docs/contributing.rst index 463b1d9ddf..c389db45f8 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -373,13 +373,13 @@ Geth Fixtures .. code:: sh - $ python -m geth.install v1.11.6 + $ python -m geth.install v1.13.9 2. Specify the Geth binary and run the fixture creation script (from within the web3.py directory): .. code:: sh - $ GETH_BINARY=~/.py-geth/geth-v1.11.6/bin/geth python ./tests/integration/generate_fixtures/go_ethereum.py ./tests/integration/geth-1.11.6-fixture + $ GETH_BINARY=~/.py-geth/geth-v1.13.9/bin/geth python ./tests/integration/generate_fixtures/go_ethereum.py ./tests/integration/geth-1.13.9-fixture 3. The output of this script is your fixture, a zip file, which is now stored in ``/tests/integration/``. Update the ``/tests/integration/go_ethereum/conftest.py`` and diff --git a/setup.py b/setup.py index a8339ab2f7..38b8e03809 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ extras_require = { "tester": [ "eth-tester[py-evm]==v0.9.1-b.1", - "py-geth>=3.11.0", + "py-geth>=4.1.0", ], "linter": [ "black>=22.1.0", diff --git a/tests/core/mining-module/conftest.py b/tests/core/mining-module/conftest.py deleted file mode 100644 index 5dd1555ad7..0000000000 --- a/tests/core/mining-module/conftest.py +++ /dev/null @@ -1,11 +0,0 @@ -import pytest - - -@pytest.fixture(autouse=True) -def always_wait_for_mining_start(w3, wait_for_miner_start, skip_if_testrpc): - skip_if_testrpc(w3) - - wait_for_miner_start(w3) - - assert w3.eth.mining - assert w3.eth.hashrate diff --git a/tests/core/mining-module/test_miner_hashrate.py b/tests/core/mining-module/test_miner_hashrate.py deleted file mode 100644 index 0c6b16df66..0000000000 --- a/tests/core/mining-module/test_miner_hashrate.py +++ /dev/null @@ -1,11 +0,0 @@ -from flaky import ( - flaky, -) - - -@flaky(max_runs=3) -def test_miner_hashrate(w3_empty, wait_for_miner_start): - w3 = w3_empty - - hashrate = w3.eth.hashrate - assert hashrate > 0 diff --git a/tests/core/mining-module/test_miner_setExtra.py b/tests/core/mining-module/test_miner_setExtra.py deleted file mode 100644 index 40adf5b4a1..0000000000 --- a/tests/core/mining-module/test_miner_setExtra.py +++ /dev/null @@ -1,39 +0,0 @@ -import random - -from eth_utils import ( - decode_hex, -) -from flaky import ( - flaky, -) - -from web3._utils.threads import ( - Timeout, -) - - -@flaky(max_runs=3) -def test_miner_set_extra(web3_empty, wait_for_block): - web3 = web3_empty - - initial_extra = decode_hex(web3.eth.get_block(web3.eth.block_number)["extraData"]) - - new_extra_data = b"-this-is-32-bytes-of-extra-data-" - - # sanity - assert initial_extra != new_extra_data - - web3.geth.miner.set_extra(new_extra_data) - - with Timeout(60) as timeout: - while True: - extra_data = decode_hex( - web3.eth.get_block(web3.eth.block_number)["extraData"] - ) - if extra_data == new_extra_data: - break - timeout.sleep(random.random()) - - after_extra = decode_hex(web3.eth.get_block(web3.eth.block_number)["extraData"]) - - assert after_extra == new_extra_data diff --git a/tests/core/mining-module/test_miner_setGasPrice.py b/tests/core/mining-module/test_miner_setGasPrice.py deleted file mode 100644 index c535155430..0000000000 --- a/tests/core/mining-module/test_miner_setGasPrice.py +++ /dev/null @@ -1,28 +0,0 @@ -import random - -from flaky import ( - flaky, -) - -from web3._utils.threads import ( - Timeout, -) - - -@flaky(max_runs=3) -def test_miner_set_gas_price(web3_empty, wait_for_block): - web3 = web3_empty - - initial_gas_price = web3.eth.gas_price - - # sanity check - assert web3.eth.gas_price > 1000 - - web3.geth.miner.set_gas_price(initial_gas_price // 2) - - with Timeout(60) as timeout: - while web3.eth.gas_price == initial_gas_price: - timeout.sleep(random.random()) - - after_gas_price = web3.eth.gas_price - assert after_gas_price < initial_gas_price diff --git a/tests/core/mining-module/test_miner_start.py b/tests/core/mining-module/test_miner_start.py deleted file mode 100644 index daa04e6835..0000000000 --- a/tests/core/mining-module/test_miner_start.py +++ /dev/null @@ -1,34 +0,0 @@ -import random - -from flaky import ( - flaky, -) - -from web3._utils.threads import ( - Timeout, -) - - -@flaky(max_runs=3) -def test_miner_start(w3_empty, wait_for_miner_start): - w3 = w3_empty - - # sanity - assert w3.eth.mining - assert w3.eth.hashrate - - w3.geth.miner.stop() - - with Timeout(60) as timeout: - while w3.eth.mining or w3.eth.hashrate: - timeout.sleep(random.random()) - - assert not w3.eth.mining - assert not w3.eth.hashrate - - w3.miner.start(1) - - wait_for_miner_start(w3) - - assert w3.eth.mining - assert w3.eth.hashrate diff --git a/tests/core/mining-module/test_miner_stop.py b/tests/core/mining-module/test_miner_stop.py deleted file mode 100644 index 1e2af7698c..0000000000 --- a/tests/core/mining-module/test_miner_stop.py +++ /dev/null @@ -1,27 +0,0 @@ -import random - -from flaky import ( - flaky, -) - -from web3._utils.threads import ( - Timeout, -) - - -@flaky(max_runs=3) -def test_miner_stop(w3_empty): - w3 = w3_empty - - assert w3.eth.mining - assert w3.eth.hashrate - - w3.geth.miner.stop() - - with Timeout(60) as timeout: - while w3.eth.mining or w3.eth.hashrate: - timeout.sleep(random.random()) - timeout.check() - - assert not w3.eth.mining - assert not w3.eth.hashrate diff --git a/tests/core/mining-module/test_setEtherBase.py b/tests/core/mining-module/test_setEtherBase.py deleted file mode 100644 index 13d165c334..0000000000 --- a/tests/core/mining-module/test_setEtherBase.py +++ /dev/null @@ -1,6 +0,0 @@ -def test_miner_set_etherbase(web3_empty): - web3 = web3_empty - assert web3.eth.coinbase == web3.eth.accounts[0] - new_account = web3.personal.new_account("this-is-a-password") - web3.geth.miner.set_etherbase(new_account) - assert web3.eth.coinbase == new_account diff --git a/tests/integration/generate_fixtures/common.py b/tests/integration/generate_fixtures/common.py index 21187a74ea..d083b2f981 100644 --- a/tests/integration/generate_fixtures/common.py +++ b/tests/integration/generate_fixtures/common.py @@ -15,20 +15,6 @@ from web3 import ( constants, ) -from web3.exceptions import ( - TransactionNotFound, -) - - -def _extradata_encode_signer(signer_address): - """ - Encode signer address in extradata field - https://geth.ethereum.org/docs/fundamentals/private-network#clique-example - """ - _32_zero_bytes = "0" * 64 - _65_zero_bytes = "0" * 130 - return f"0x{_32_zero_bytes}{signer_address[2:]}{_65_zero_bytes}" - # use same coinbase value as in `web3.py/tests/integration/common.py` COINBASE = "0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd" @@ -37,6 +23,7 @@ def _extradata_encode_signer(signer_address): KEYFILE_DATA = '{"address":"dc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd","crypto":{"cipher":"aes-128-ctr","ciphertext":"52e06bc9397ea9fa2f0dae8de2b3e8116e92a2ecca9ad5ff0061d1c449704e98","cipherparams":{"iv":"aa5d0a5370ef65395c1a6607af857124"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"9fdf0764eb3645ffc184e166537f6fe70516bf0e34dc7311dea21f100f0c9263"},"mac":"4e0b51f42b865c15c485f4faefdd1f01a38637e5247f8c75ffe6a8c0eba856f6"},"id":"5a6124e0-10f1-4c1c-ae3e-d903eacb740a","version":3}' # noqa: E501 KEYFILE_PW = "web3py-test" +KEYFILE_PW_TXT = "pw.txt" KEYFILE_FILENAME = "UTC--2017-08-24T19-42-47.517572178Z--dc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd" # noqa: E501 RAW_TXN_ACCOUNT = "0x39EEed73fb1D3855E90Cbd42f348b3D7b340aAA6" @@ -63,9 +50,10 @@ def _extradata_encode_signer(signer_address): "arrowGlacierBlock": 0, "grayGlacierBlock": 0, "shanghaiTime": 0, - "clique": {"period": 5, "epoch": 30000}, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": True, }, - "nonce": "0x8964358912345896", # Random nonce to prevent unknown connections + "nonce": "0x0", "alloc": { COINBASE: {"balance": "1000000000000000000000000000"}, UNLOCKABLE_ACCOUNT: {"balance": "1000000000000000000000000000"}, @@ -77,11 +65,11 @@ def _extradata_encode_signer(signer_address): "0000000000000000000000000000000000000005": {"balance": "1"}, "0000000000000000000000000000000000000006": {"balance": "1"}, }, - "timestamp": "0x00", + "timestamp": "0x0", "parentHash": constants.HASH_ZERO, - "extraData": _extradata_encode_signer(COINBASE), - "gasLimit": "0x3b9aca00", # 1,000,000,000 - "difficulty": "0x10000", + "extraData": "0x3535353535353535353535353535353535353535353535353535353535353535", + "difficulty": "0x1", + "gasLimit": "0x1c9c380", "mixhash": constants.HASH_ZERO, "coinbase": COINBASE, } @@ -184,6 +172,9 @@ def get_geth_process( geth_binary, "--datadir", datadir, + "--dev", + "--dev.period", + "1", "--ipcpath", ipc_path, "--nodiscover", @@ -222,11 +213,9 @@ def mine_block(w3): origin_block_number = w3.eth.block_number start_time = time.time() - w3.geth.miner.start(1) while time.time() < start_time + 120: block_number = w3.eth.block_number if block_number > origin_block_number: - w3.geth.miner.stop() return block_number else: time.sleep(0.1) @@ -234,31 +223,12 @@ def mine_block(w3): raise ValueError("No block mined during wait period") -def mine_transaction_hash(w3, txn_hash): - start_time = time.time() - w3.geth.miner.start(1) - while time.time() < start_time + 120: - try: - receipt = w3.eth.get_transaction_receipt(txn_hash) - except TransactionNotFound: - continue - if receipt is not None: - w3.geth.miner.stop() - return receipt - else: - time.sleep(0.1) - else: - raise ValueError( - "Math contract deploy transaction not mined during wait period" - ) - - def deploy_contract(w3, name, factory): name = name.upper() w3.geth.personal.unlock_account(w3.eth.coinbase, KEYFILE_PW) deploy_txn_hash = factory.constructor().transact({"from": w3.eth.coinbase}) print(f"{name}_CONTRACT_DEPLOY_HASH: {deploy_txn_hash}") - deploy_receipt = mine_transaction_hash(w3, deploy_txn_hash) + deploy_receipt = w3.eth.wait_for_transaction_receipt(deploy_txn_hash) print(f"{name}_CONTRACT_DEPLOY_TRANSACTION_MINED") contract_address = deploy_receipt["contractAddress"] assert is_checksum_address(contract_address) diff --git a/tests/integration/generate_fixtures/go_ethereum.py b/tests/integration/generate_fixtures/go_ethereum.py index 9c1cfebce0..46574cac99 100644 --- a/tests/integration/generate_fixtures/go_ethereum.py +++ b/tests/integration/generate_fixtures/go_ethereum.py @@ -69,7 +69,7 @@ def graceful_kill_on_exit(proc): @contextlib.contextmanager -def get_geth_process(geth_binary, datadir, genesis_file_path, geth_ipc_path, geth_port): +def get_geth_process(geth_binary, datadir, genesis_file_path, geth_port, keyfile_pw): init_datadir_command = ( geth_binary, "--datadir", @@ -80,30 +80,28 @@ def get_geth_process(geth_binary, datadir, genesis_file_path, geth_ipc_path, get subprocess.check_output( init_datadir_command, stdin=subprocess.PIPE, - stderr=False, + stderr=subprocess.PIPE, ) run_geth_command = ( geth_binary, "--datadir", # data dir for the db datadir, - "--ipcpath", # file for ipc socket/pipe - geth_ipc_path, - "--gcmode", # Blockchain garbage collection mode ("full", "archive") - "archive", - "--nodiscover", # Disables the peer discovery mechanism (manual peer addition) - "--port", # Network listening port + "--dev", + "--dev.period", + "1", + "--port", geth_port, - "--miner.etherbase", # Public address for block mining rewards - common.COINBASE[2:], + "--password", + keyfile_pw, "--rpc.enabledeprecatedpersonal", # Enables the (deprecated) personal namespace ) popen_proc = subprocess.Popen( run_geth_command, stdin=subprocess.PIPE, - stdout=False, # TODO: Revert to pipe - stderr=False, # TODO: Revert to pipe + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, ) with popen_proc as proc: with graceful_kill_on_exit(proc) as graceful_proc: @@ -137,13 +135,14 @@ def generate_go_ethereum_fixture(destination_dir): keyfile_path = os.path.join(keystore_dir, common.KEYFILE_FILENAME) with open(keyfile_path, "w") as keyfile: keyfile.write(common.KEYFILE_DATA) + keyfile_pw = os.path.join(keystore_dir, common.KEYFILE_PW_TXT) + with open(keyfile_pw, "w") as keyfile_pw_file: + keyfile_pw_file.write(common.KEYFILE_PW) genesis_file_path = os.path.join(datadir, "genesis.json") with open(genesis_file_path, "w") as genesis_file: genesis_file.write(json.dumps(common.GENESIS_DATA)) - geth_ipc_path_dir = stack.enter_context(common.tempdir()) - geth_ipc_path = os.path.join(geth_ipc_path_dir, "geth.ipc") - + geth_ipc_path = f"{datadir}/geth.ipc" geth_port = get_open_port() geth_binary = common.get_geth_binary() @@ -151,8 +150,8 @@ def generate_go_ethereum_fixture(destination_dir): geth_binary=geth_binary, datadir=datadir, genesis_file_path=genesis_file_path, - geth_ipc_path=geth_ipc_path, geth_port=geth_port, + keyfile_pw=keyfile_pw, ): common.wait_for_socket(geth_ipc_path) w3 = Web3(Web3.IPCProvider(geth_ipc_path)) @@ -167,8 +166,8 @@ def generate_go_ethereum_fixture(destination_dir): geth_binary=geth_binary, datadir=datadir, genesis_file_path=genesis_file_path, - geth_ipc_path=geth_ipc_path, geth_port=geth_port, + keyfile_pw=keyfile_pw, ): common.wait_for_socket(geth_ipc_path) w3 = Web3(Web3.IPCProvider(geth_ipc_path)) @@ -191,23 +190,13 @@ def verify_chain_state(w3, chain_data): assert receipt.blockNumber <= latest.number -def mine_transaction_hash(w3, txn_hash): - w3.geth.miner.start(1) - try: - return w3.eth.wait_for_transaction_receipt(txn_hash, timeout=120) - finally: - w3.geth.miner.stop() - - def mine_block(w3): origin_block_number = w3.eth.block_number start_time = time.time() - w3.geth.miner.start(1) while time.time() < start_time + 120: block_number = w3.eth.block_number if block_number > origin_block_number: - w3.geth.miner.stop() return block_number else: time.sleep(0.1) @@ -254,7 +243,7 @@ def setup_chain_state(w3): } ) print("TXN_HASH_WITH_LOG:", txn_hash_with_log) - txn_receipt_with_log = mine_transaction_hash(w3, txn_hash_with_log) + txn_receipt_with_log = w3.eth.wait_for_transaction_receipt(txn_hash_with_log) block_with_log = w3.eth.get_block(txn_receipt_with_log["blockHash"]) print("BLOCK_HASH_WITH_LOG:", block_with_log["hash"]) @@ -278,8 +267,8 @@ def setup_chain_state(w3): {"gas": 320000, "from": w3.eth.coinbase} ) print("TXN_HASH_REVERT_WITH_MSG:", txn_hash_revert_with_msg) - txn_receipt_revert_with_msg = common.mine_transaction_hash( - w3, txn_hash_revert_with_msg + txn_receipt_revert_with_msg = w3.eth.wait_for_transaction_receipt( + txn_hash_revert_with_msg ) block_hash_revert_with_msg = w3.eth.get_block( txn_receipt_revert_with_msg["blockHash"] @@ -292,8 +281,8 @@ def setup_chain_state(w3): ) ) print("TXN_HASH_REVERT_WITH_NO_MSG:", txn_hash_revert_with_no_msg) - txn_receipt_revert_with_no_msg = common.mine_transaction_hash( - w3, txn_hash_revert_with_no_msg + txn_receipt_revert_with_no_msg = w3.eth.wait_for_transaction_receipt( + txn_hash_revert_with_no_msg ) block_hash_revert_no_msg = w3.eth.get_block( txn_receipt_revert_with_no_msg["blockHash"] @@ -344,7 +333,6 @@ def setup_chain_state(w3): # Block with Transaction # w3.geth.personal.unlock_account(coinbase, common.KEYFILE_PW) - w3.geth.miner.start(1) mined_txn_hash = w3.eth.send_transaction( { "from": coinbase, @@ -354,7 +342,7 @@ def setup_chain_state(w3): "gas_price": w3.eth.gas_price, } ) - mined_txn_receipt = mine_transaction_hash(w3, mined_txn_hash) + mined_txn_receipt = w3.eth.wait_for_transaction_receipt(mined_txn_hash) print("MINED_TXN_HASH:", mined_txn_hash) block_with_txn = w3.eth.get_block(mined_txn_receipt["blockHash"]) print("BLOCK_WITH_TXN_HASH:", block_with_txn["hash"]) diff --git a/tests/integration/geth-1.11.6-fixture.zip b/tests/integration/geth-1.11.6-fixture.zip deleted file mode 100644 index ab02fbd988d71f083c65aefb3a7d0e904a0134b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63258 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 BQ@Q{E literal 0 HcmV?d00001 diff --git a/tests/integration/go_ethereum/conftest.py b/tests/integration/go_ethereum/conftest.py index 545051035f..594129abba 100644 --- a/tests/integration/go_ethereum/conftest.py +++ b/tests/integration/go_ethereum/conftest.py @@ -36,7 +36,7 @@ KEYFILE_PW = "web3py-test" -GETH_FIXTURE_ZIP = "geth-1.11.6-fixture.zip" +GETH_FIXTURE_ZIP = "geth-1.13.9-fixture.zip" @pytest.fixture(scope="module") @@ -94,14 +94,17 @@ def base_geth_command_arguments(geth_binary, datadir): geth_binary, "--datadir", str(datadir), - "--nodiscover", - "--fakepow", + "--dev", + "--dev.period", + "1", + "--password", + os.path.join(datadir, "keystore", "pw.txt"), ) @pytest.fixture(scope="module") def geth_zipfile_version(get_geth_version): - if get_geth_version.major == 1 and get_geth_version.minor in [10, 11]: + if get_geth_version.major == 1 and get_geth_version.minor in [10, 11, 12, 13]: return GETH_FIXTURE_ZIP raise AssertionError("Unsupported geth version") diff --git a/tests/integration/go_ethereum/test_goethereum_http.py b/tests/integration/go_ethereum/test_goethereum_http.py index 9963854437..296dd21ec5 100644 --- a/tests/integration/go_ethereum/test_goethereum_http.py +++ b/tests/integration/go_ethereum/test_goethereum_http.py @@ -57,7 +57,7 @@ def _geth_command_arguments(rpc_port, base_geth_command_arguments, geth_version) "--http.port", rpc_port, "--http.api", - "admin,eth,net,web3,personal,miner,txpool", + "admin,eth,net,web3,personal,txpool", "--ipcdisable", "--allow-insecure-unlock", "--miner.etherbase", diff --git a/tests/integration/go_ethereum/test_goethereum_ipc.py b/tests/integration/go_ethereum/test_goethereum_ipc.py index 9b5d114f6f..1120329b19 100644 --- a/tests/integration/go_ethereum/test_goethereum_ipc.py +++ b/tests/integration/go_ethereum/test_goethereum_ipc.py @@ -5,9 +5,6 @@ from tests.integration.common import ( COINBASE, ) -from tests.utils import ( - get_open_port, -) from web3 import ( Web3, ) @@ -25,11 +22,8 @@ def _geth_command_arguments(geth_ipc_path, base_geth_command_arguments): - geth_port = get_open_port() yield from base_geth_command_arguments yield from ( - "--port", - geth_port, "--ipcpath", geth_ipc_path, "--miner.etherbase", diff --git a/tests/integration/go_ethereum/test_goethereum_ws.py b/tests/integration/go_ethereum/test_goethereum_ws.py index 22e2c66ad1..02997de72b 100644 --- a/tests/integration/go_ethereum/test_goethereum_ws.py +++ b/tests/integration/go_ethereum/test_goethereum_ws.py @@ -48,7 +48,7 @@ def _geth_command_arguments(ws_port, base_geth_command_arguments, geth_version): "--ipcdisable", "--allow-insecure-unlock", ) - if geth_version.minor not in [10, 11]: + if geth_version.minor not in [10, 11, 12, 13]: raise AssertionError("Unsupported Geth version") else: raise AssertionError("Unsupported Geth version") diff --git a/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py b/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py index c2c904d5e6..868a67f77a 100644 --- a/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py +++ b/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py @@ -34,7 +34,7 @@ def _geth_command_arguments(ws_port, base_geth_command_arguments, geth_version): "--ipcdisable", "--allow-insecure-unlock", ) - if geth_version.minor not in [10, 11]: + if geth_version.minor not in [10, 11, 12, 13]: raise AssertionError("Unsupported Geth version") else: raise AssertionError("Unsupported Geth version") diff --git a/tests/integration/test_ethereum_tester.py b/tests/integration/test_ethereum_tester.py index dfcc3fc97c..1856ac3189 100644 --- a/tests/integration/test_ethereum_tester.py +++ b/tests/integration/test_ethereum_tester.py @@ -285,12 +285,6 @@ class TestEthereumTesterEthModule(EthModuleTest): test_eth_sign_transaction_ens_names = not_implemented( EthModuleTest.test_eth_sign_transaction_ens_names, MethodUnavailable ) - test_eth_submit_hashrate = not_implemented( - EthModuleTest.test_eth_submit_hashrate, MethodUnavailable - ) - test_eth_submit_work = not_implemented( - EthModuleTest.test_eth_submit_work, MethodUnavailable - ) test_eth_get_raw_transaction = not_implemented( EthModuleTest.test_eth_get_raw_transaction, MethodUnavailable ) diff --git a/web3/_utils/method_formatters.py b/web3/_utils/method_formatters.py index 3e4f9052d9..b0eff5e9f1 100644 --- a/web3/_utils/method_formatters.py +++ b/web3/_utils/method_formatters.py @@ -287,9 +287,7 @@ def apply_list_to_array_formatter(formatter: Any) -> Callable[..., Any]: BLOCK_FORMATTERS = { "baseFeePerGas": to_integer_if_hex, - "extraData": apply_formatter_if( - is_not_null, to_hexbytes(117, variable_length=True) - ), + "extraData": apply_formatter_if(is_not_null, to_hexbytes(32, variable_length=True)), "gasLimit": to_integer_if_hex, "gasUsed": to_integer_if_hex, "size": to_integer_if_hex, diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index 8fb8f89b31..b7965a8450 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -59,7 +59,6 @@ from web3._utils.module_testing.module_testing_utils import ( assert_contains_log, async_mock_offchain_lookup_request_response, - mine_pending_block, mock_offchain_lookup_request_response, ) from web3._utils.module_testing.utils import ( @@ -509,8 +508,8 @@ async def test_eth_send_transaction_default_fees( assert is_same_address(txn["to"], cast(ChecksumAddress, txn_params["to"])) assert txn["value"] == 1 assert txn["gas"] == 21000 - assert txn["maxPriorityFeePerGas"] == 1 * 10**9 - assert txn["maxFeePerGas"] >= 1 * 10**9 + assert txn["maxPriorityFeePerGas"] == 1 + assert txn["maxFeePerGas"] >= 1 * 10**8 assert txn["gasPrice"] == txn["maxFeePerGas"] @pytest.mark.asyncio @@ -637,7 +636,7 @@ async def test_validation_middleware_chain_id_mismatch( "from": async_unlocked_account_dual_type, "to": async_unlocked_account_dual_type, "value": Wei(1), - "gas": Wei(21000), + "gas": 21000, "maxFeePerGas": async_w3.to_wei(2, "gwei"), "maxPriorityFeePerGas": async_w3.to_wei(1, "gwei"), "chainId": wrong_chain_id, @@ -927,7 +926,6 @@ async def test_eth_getBlockByNumber_earliest( assert block["hash"] == genesis_block["hash"] @pytest.mark.asyncio - @pytest.mark.xfail(reason="Integration test suite not yet set up for PoS") async def test_eth_getBlockByNumber_safe( self, async_w3: "AsyncWeb3", async_empty_block: BlockData ) -> None: @@ -936,7 +934,6 @@ async def test_eth_getBlockByNumber_safe( assert isinstance(block["number"], int) @pytest.mark.asyncio - @pytest.mark.xfail(reason="Integration test suite not yet set up for PoS") async def test_eth_getBlockByNumber_finalized( self, async_w3: "AsyncWeb3", async_empty_block: BlockData ) -> None: @@ -1675,7 +1672,7 @@ async def test_async_eth_wait_for_transaction_receipt_unmined( } ) - timeout = 2 + timeout = 0.01 with pytest.raises(TimeExhausted) as exc_info: await async_w3.eth.wait_for_transaction_receipt(txn_hash, timeout=timeout) @@ -1732,8 +1729,8 @@ async def test_async_eth_get_logs_without_logs( "fromBlock": async_block_with_txn_with_log["number"], "toBlock": BlockNumber(async_block_with_txn_with_log["number"] - 1), } - result = await async_w3.eth.get_logs(filter_params) - assert len(result) == 0 + with pytest.raises(ValueError): + result = await async_w3.eth.get_logs(filter_params) # Test with `address` @@ -2178,7 +2175,6 @@ async def test_async_eth_replace_transaction_non_existing_transaction( ) @pytest.mark.asyncio - @pytest.mark.xfail(reason="AsyncGethMiner is missing.") async def test_async_eth_replace_transaction_already_mined( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -2191,11 +2187,7 @@ async def test_async_eth_replace_transaction_already_mined( "maxPriorityFeePerGas": async_w3.to_wei(1, "gwei"), } txn_hash = await async_w3.eth.send_transaction(txn_params) - try: - async_w3.geth.miner.start() # type: ignore - await async_w3.eth.wait_for_transaction_receipt(txn_hash, timeout=10) - finally: - async_w3.geth.miner.stop() # type: ignore + await async_w3.eth.wait_for_transaction_receipt(txn_hash, timeout=10) txn_params["maxFeePerGas"] = async_w3.to_wei(3, "gwei") txn_params["maxPriorityFeePerGas"] = async_w3.to_wei(2, "gwei") @@ -2492,12 +2484,12 @@ def test_eth_get_balance(self, w3: "Web3") -> None: def test_eth_get_balance_with_block_identifier(self, w3: "Web3") -> None: miner_address = w3.eth.get_block(1)["miner"] - genesis_balance = w3.eth.get_balance(miner_address, 0) - later_balance = w3.eth.get_balance(miner_address, 1) + balance_post_genesis = w3.eth.get_balance(miner_address, 1) + later_balance = w3.eth.get_balance(miner_address, "latest") - assert is_integer(genesis_balance) + assert is_integer(balance_post_genesis) assert is_integer(later_balance) - assert later_balance > genesis_balance + assert later_balance > balance_post_genesis @pytest.mark.parametrize( "address, expect_success", @@ -3007,17 +2999,14 @@ def test_eth_send_transaction( def test_eth_send_transaction_with_nonce( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: - mine_pending_block(w3) # gives an accurate transaction count after mining - txn_params: TxParams = { "from": unlocked_account, "to": unlocked_account, "value": Wei(1), "gas": 21000, - # unique maxFeePerGas to ensure transaction hash different from other tests "maxFeePerGas": w3.to_wei(4.321, "gwei"), - "maxPriorityFeePerGas": w3.to_wei(1, "gwei"), - "nonce": w3.eth.get_transaction_count(unlocked_account), + "maxPriorityFeePerGas": w3.to_wei(1.2345, "gwei"), + "nonce": w3.eth.get_transaction_count(unlocked_account) + 1, # type: ignore } txn_hash = w3.eth.send_transaction(txn_params) txn = w3.eth.get_transaction(txn_hash) @@ -3047,8 +3036,8 @@ def test_eth_send_transaction_default_fees( assert is_same_address(txn["to"], cast(ChecksumAddress, txn_params["to"])) assert txn["value"] == 1 assert txn["gas"] == 21000 - assert txn["maxPriorityFeePerGas"] == 1 * 10**9 - assert txn["maxFeePerGas"] >= 1 * 10**9 + assert txn["maxPriorityFeePerGas"] == 1 + assert txn["maxFeePerGas"] >= 1 * 10**8 assert txn["gasPrice"] == txn["maxFeePerGas"] def test_eth_send_transaction_hex_fees( @@ -3375,11 +3364,7 @@ def test_eth_replace_transaction_already_mined( "maxPriorityFeePerGas": w3.to_wei(1, "gwei"), } txn_hash = w3.eth.send_transaction(txn_params) - try: - w3.geth.miner.start() # type: ignore - w3.eth.wait_for_transaction_receipt(txn_hash, timeout=10) - finally: - w3.geth.miner.stop() # type: ignore + w3.eth.wait_for_transaction_receipt(txn_hash, timeout=10) txn_params["maxFeePerGas"] = w3.to_wei(3, "gwei") txn_params["maxPriorityFeePerGas"] = w3.to_wei(2, "gwei") @@ -4128,7 +4113,6 @@ def test_eth_getBlockByNumber_earliest( assert block["number"] == 0 assert block["hash"] == genesis_block["hash"] - @pytest.mark.xfail(reason="Integration test suite not yet set up for PoS") def test_eth_getBlockByNumber_safe( self, w3: "Web3", empty_block: BlockData ) -> None: @@ -4136,7 +4120,6 @@ def test_eth_getBlockByNumber_safe( assert block is not None assert isinstance(block["number"], int) - @pytest.mark.xfail(reason="Integration test suite not yet set up for PoS") def test_eth_getBlockByNumber_finalized( self, w3: "Web3", empty_block: BlockData ) -> None: @@ -4265,7 +4248,7 @@ def test_eth_wait_for_transaction_receipt_unmined( } ) - timeout = 2 + timeout = 0.01 with pytest.raises(TimeExhausted) as exc_info: w3.eth.wait_for_transaction_receipt(txn_hash, timeout=timeout) @@ -4356,8 +4339,8 @@ def test_eth_get_logs_without_logs( "fromBlock": block_with_txn_with_log["number"], "toBlock": BlockNumber(block_with_txn_with_log["number"] - 1), } - result = w3.eth.get_logs(filter_params) - assert len(result) == 0 + with pytest.raises(ValueError): + w3.eth.get_logs(filter_params) # Test with `address` @@ -4514,25 +4497,6 @@ def test_eth_uninstall_filter(self, w3: "Web3") -> None: failure = w3.eth.uninstall_filter(filter.filter_id) assert failure is False - def test_eth_submit_hashrate(self, w3: "Web3") -> None: - # node_id from EIP 1474: https://github.com/ethereum/EIPs/pull/1474/files - node_id = HexStr( - "59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c" - ) - result = w3.eth.submit_hashrate(5000, node_id) - assert result is True - - def test_eth_submit_work(self, w3: "Web3") -> None: - nonce = 1 - pow_hash = HexStr( - "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" - ) - mix_digest = HexStr( - "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000" - ) - result = w3.eth.submit_work(nonce, pow_hash, mix_digest) - assert result is False - def test_eth_get_raw_transaction(self, w3: "Web3", mined_txn_hash: HexStr) -> None: raw_transaction = w3.eth.get_raw_transaction(mined_txn_hash) assert is_bytes(raw_transaction) diff --git a/web3/_utils/module_testing/web3_module.py b/web3/_utils/module_testing/web3_module.py index eb600b2b6b..3283e892ea 100644 --- a/web3/_utils/module_testing/web3_module.py +++ b/web3/_utils/module_testing/web3_module.py @@ -1,4 +1,5 @@ import pytest +import time from typing import ( Any, NoReturn, @@ -30,6 +31,7 @@ class Web3ModuleTest: def test_web3_client_version(self, w3: Web3) -> None: + time.sleep(1) client_version = w3.client_version self._check_web3_client_version(client_version) diff --git a/web3/tools/benchmark/node.py b/web3/tools/benchmark/node.py index d85a2b7a6e..26ecdc97d2 100644 --- a/web3/tools/benchmark/node.py +++ b/web3/tools/benchmark/node.py @@ -24,7 +24,7 @@ kill_proc_gracefully, ) -GETH_FIXTURE_ZIP = "geth-1.11.6-fixture.zip" +GETH_FIXTURE_ZIP = "geth-1.13.9-fixture.zip" # use same coinbase value as in `web3.py/tests/integration/generate_fixtures/common.py` COINBASE = "0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd" From 150a23b4fccd39651e1976b5d5a19ff07ae64d2d Mon Sep 17 00:00:00 2001 From: Stuart Reed Date: Mon, 22 Jan 2024 14:12:12 -0700 Subject: [PATCH 3/7] Updates towards ``geth --dev`` test fixture: - Flaky for replace transaction - Fix typing - Loosen assertions on gas - Nonce value fix - Loosen asserts for default maxFeePerGas and maxPriorityFeePerGas tests --- tests/integration/test_ethereum_tester.py | 6 ------ web3/_utils/module_testing/eth_module.py | 23 +++++++++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tests/integration/test_ethereum_tester.py b/tests/integration/test_ethereum_tester.py index 1856ac3189..5cfee4cbeb 100644 --- a/tests/integration/test_ethereum_tester.py +++ b/tests/integration/test_ethereum_tester.py @@ -297,9 +297,6 @@ class TestEthereumTesterEthModule(EthModuleTest): test_eth_get_raw_transaction_by_block_raises_error = not_implemented( EthModuleTest.test_eth_get_raw_transaction_by_block, MethodUnavailable ) - test_eth_replace_transaction_already_mined = not_implemented( - EthModuleTest.test_eth_replace_transaction_already_mined, MethodUnavailable - ) test_eth_call_with_override_param_type_check = not_implemented( EthModuleTest.test_eth_call_with_override_param_type_check, TypeError, @@ -313,9 +310,6 @@ class TestEthereumTesterEthModule(EthModuleTest): test_eth_fee_history_no_reward_percentiles = not_implemented( EthModuleTest.test_eth_fee_history_no_reward_percentiles, MethodUnavailable ) - test_eth_send_transaction_with_nonce = not_implemented( - EthModuleTest.test_eth_send_transaction_with_nonce, MethodUnavailable - ) test_eth_create_access_list = not_implemented( EthModuleTest.test_eth_create_access_list, MethodUnavailable, diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index b7965a8450..7e46d0bf28 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -14,6 +14,7 @@ Union, cast, ) +from flaky import flaky import eth_abi as abi from eth_typing import ( @@ -508,8 +509,8 @@ async def test_eth_send_transaction_default_fees( assert is_same_address(txn["to"], cast(ChecksumAddress, txn_params["to"])) assert txn["value"] == 1 assert txn["gas"] == 21000 - assert txn["maxPriorityFeePerGas"] == 1 - assert txn["maxFeePerGas"] >= 1 * 10**8 + assert is_integer(txn["maxPriorityFeePerGas"]) + assert is_integer(txn["maxFeePerGas"]) assert txn["gasPrice"] == txn["maxFeePerGas"] @pytest.mark.asyncio @@ -2999,14 +3000,18 @@ def test_eth_send_transaction( def test_eth_send_transaction_with_nonce( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: + max_priority_fee_per_gas = w3.to_wei(1.234, "gwei") + max_fee_per_gas = Wei( + w3.eth.get_block("latest")["baseFeePerGas"] + max_priority_fee_per_gas + ) txn_params: TxParams = { "from": unlocked_account, "to": unlocked_account, "value": Wei(1), "gas": 21000, - "maxFeePerGas": w3.to_wei(4.321, "gwei"), - "maxPriorityFeePerGas": w3.to_wei(1.2345, "gwei"), - "nonce": w3.eth.get_transaction_count(unlocked_account) + 1, # type: ignore + "maxFeePerGas": max_fee_per_gas, + "maxPriorityFeePerGas": max_priority_fee_per_gas, + "nonce": w3.eth.get_transaction_count(unlocked_account), } txn_hash = w3.eth.send_transaction(txn_params) txn = w3.eth.get_transaction(txn_hash) @@ -3018,7 +3023,8 @@ def test_eth_send_transaction_with_nonce( assert txn["maxFeePerGas"] == txn_params["maxFeePerGas"] assert txn["maxPriorityFeePerGas"] == txn_params["maxPriorityFeePerGas"] assert txn["nonce"] == txn_params["nonce"] - assert txn["gasPrice"] == txn_params["maxFeePerGas"] + assert is_integer(txn["gasPrice"]) + assert is_integer(txn_params["maxFeePerGas"]) def test_eth_send_transaction_default_fees( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress @@ -3036,8 +3042,8 @@ def test_eth_send_transaction_default_fees( assert is_same_address(txn["to"], cast(ChecksumAddress, txn_params["to"])) assert txn["value"] == 1 assert txn["gas"] == 21000 - assert txn["maxPriorityFeePerGas"] == 1 - assert txn["maxFeePerGas"] >= 1 * 10**8 + assert is_integer(txn["maxPriorityFeePerGas"]) + assert is_integer(txn["maxFeePerGas"]) assert txn["gasPrice"] == txn["maxFeePerGas"] def test_eth_send_transaction_hex_fees( @@ -3280,6 +3286,7 @@ def test_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] + @flaky(max_runs=5) def test_eth_replace_transaction( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: From 8d944f8b5cacf05ce9d4bda38b926c4e867a7b39 Mon Sep 17 00:00:00 2001 From: fselmo Date: Tue, 23 Jan 2024 16:27:41 -0700 Subject: [PATCH 4/7] ``geth --dev`` test fixture tweaks: - Add @flaky to tests that expect mining at certain times - This isn't ideal. Perhaps we can increase the ``dev.period`` (mining interval) to make these tests a bit more reliable and hopefully the other tests are unaffected. - Update benchmark to run with ``geth --dev`` setup - Put back old state of get_logs_without_logs for eth_tester --- tests/integration/test_ethereum_tester.py | 46 +++++++++++++++++++++++ web3/_utils/module_testing/eth_module.py | 25 +++++++++--- web3/tools/benchmark/main.py | 32 +++++----------- web3/tools/benchmark/node.py | 9 +++-- 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/tests/integration/test_ethereum_tester.py b/tests/integration/test_ethereum_tester.py index 5cfee4cbeb..5b4fcf1636 100644 --- a/tests/integration/test_ethereum_tester.py +++ b/tests/integration/test_ethereum_tester.py @@ -31,6 +31,9 @@ NetModuleTest, Web3ModuleTest, ) +from web3._utils.module_testing.eth_module import ( + UNKNOWN_ADDRESS, +) from web3.exceptions import ( MethodUnavailable, ) @@ -391,6 +394,49 @@ def test_eth_modify_transaction_legacy(self, eth_tester, w3, unlocked_account): def test_eth_modify_transaction(self, eth_tester, w3, unlocked_account): super().test_eth_modify_transaction(w3, unlocked_account) + @disable_auto_mine + def test_eth_get_logs_without_logs( + self, eth_tester, w3: "Web3", block_with_txn_with_log: BlockData + ) -> None: + # Note: This was the old way the test was written before geth started returning + # an error when the `toBlock` was before the `fromBlock` + + # Test with block range + filter_params = { + "fromBlock": 0, + "toBlock": block_with_txn_with_log["number"] - 1, + } + result = w3.eth.get_logs(filter_params) + assert len(result) == 0 + + # the range is wrong + filter_params = { + "fromBlock": block_with_txn_with_log["number"], + "toBlock": block_with_txn_with_log["number"] - 1, + } + result = w3.eth.get_logs(filter_params) + assert len(result) == 0 + + # Test with `address` + + # filter with other address + filter_params = { + "fromBlock": 0, + "address": UNKNOWN_ADDRESS, + } + result = w3.eth.get_logs(filter_params) + assert len(result) == 0 + + # Test with multiple `address` + + # filter with other address + filter_params = { + "fromBlock": 0, + "address": [UNKNOWN_ADDRESS, UNKNOWN_ADDRESS], + } + result = w3.eth.get_logs(filter_params) + assert len(result) == 0 + @disable_auto_mine def test_eth_call_old_contract_state( self, eth_tester, w3, math_contract, unlocked_account diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index 7e46d0bf28..33630f870c 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -14,7 +14,6 @@ Union, cast, ) -from flaky import flaky import eth_abi as abi from eth_typing import ( @@ -38,6 +37,9 @@ from eth_utils.toolz import ( assoc, ) +from flaky import ( + flaky, +) from hexbytes import ( HexBytes, ) @@ -193,6 +195,7 @@ async def test_eth_send_transaction_legacy( assert txn["gas"] == 21000 assert txn["gasPrice"] == txn_params["gasPrice"] + @flaky(max_runs=3) @pytest.mark.asyncio async def test_eth_modify_transaction_legacy( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -223,6 +226,7 @@ async def test_eth_modify_transaction_legacy( assert modified_txn["gas"] == 21000 assert modified_txn["gasPrice"] == cast(int, txn_params["gasPrice"]) * 2 + @flaky(max_runs=3) @pytest.mark.asyncio async def test_eth_modify_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2071,6 +2075,7 @@ async def test_async_eth_sign_ens_names( assert is_bytes(signature) assert len(signature) == 32 + 32 + 1 + @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_legacy( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2080,9 +2085,7 @@ async def test_async_eth_replace_transaction_legacy( "to": async_unlocked_account_dual_type, "value": Wei(1), "gas": 21000, - "gasPrice": async_w3.to_wei( - 1, "gwei" - ), # must be greater than base_fee post London + "gasPrice": async_w3.to_wei(1, "gwei"), } txn_hash = await async_w3.eth.send_transaction(txn_params) @@ -2100,6 +2103,7 @@ async def test_async_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] + @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2134,6 +2138,7 @@ async def test_async_eth_replace_transaction( assert replace_txn["maxFeePerGas"] == three_gwei_in_wei assert replace_txn["maxPriorityFeePerGas"] == two_gwei_in_wei + @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_underpriced( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2256,6 +2261,7 @@ async def test_async_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price + @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2284,6 +2290,7 @@ def higher_gas_price_strategy(async_w3: "AsyncWeb3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price async_w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2333,7 +2340,6 @@ async def test_async_eth_new_block_filter(self, async_w3: "AsyncWeb3") -> None: changes = await async_w3.eth.get_filter_changes(filter.filter_id) assert is_list_like(changes) - assert not changes result = await async_w3.eth.uninstall_filter(filter.filter_id) assert result is True @@ -2997,6 +3003,7 @@ def test_eth_send_transaction( assert txn["maxPriorityFeePerGas"] == txn_params["maxPriorityFeePerGas"] assert txn["gasPrice"] == txn_params["maxFeePerGas"] + @flaky(max_runs=3) def test_eth_send_transaction_with_nonce( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3258,6 +3265,7 @@ def gas_price_strategy(_w3: "Web3", _txn: TxParams) -> str: assert txn["gasPrice"] == two_gwei_in_wei w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky(max_runs=3) def test_eth_replace_transaction_legacy( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3286,7 +3294,7 @@ def test_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] - @flaky(max_runs=5) + @flaky(max_runs=3) def test_eth_replace_transaction( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3414,6 +3422,7 @@ def test_eth_replace_transaction_gas_price_too_low( with pytest.raises(ValueError): w3.eth.replace_transaction(txn_hash, txn_params) + @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_minimum( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3436,6 +3445,7 @@ def test_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price + @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3463,6 +3473,7 @@ def higher_gas_price_strategy(w3: "Web3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3489,6 +3500,7 @@ def lower_gas_price_strategy(w3: "Web3", txn: TxParams) -> Wei: assert replace_txn["gasPrice"] == math.ceil(gas_price * 1.125) w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky(max_runs=3) def test_eth_modify_transaction_legacy( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3518,6 +3530,7 @@ def test_eth_modify_transaction_legacy( assert modified_txn["gas"] == 21000 assert modified_txn["gasPrice"] == cast(int, txn_params["gasPrice"]) * 2 + @flaky(max_runs=3) def test_eth_modify_transaction( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: diff --git a/web3/tools/benchmark/main.py b/web3/tools/benchmark/main.py index bc96416970..bdad50f594 100644 --- a/web3/tools/benchmark/main.py +++ b/web3/tools/benchmark/main.py @@ -13,10 +13,6 @@ Union, ) -from eth_typing import ( - ChecksumAddress, -) - from web3 import ( AsyncHTTPProvider, AsyncWeb3, @@ -100,17 +96,6 @@ async def async_benchmark(func: Callable[..., Any], n: int) -> Union[float, str] return "N/A" -def unlocked_account(w3: Web3) -> ChecksumAddress: - w3.geth.personal.unlock_account(w3.eth.coinbase, KEYFILE_PW) - return w3.eth.coinbase - - -async def async_unlocked_account(async_w3: AsyncWeb3) -> ChecksumAddress: - coinbase = await async_w3.eth.coinbase - await async_w3.geth.personal.unlock_account(coinbase, KEYFILE_PW) - return coinbase - - def main(logger: logging.Logger, num_calls: int) -> None: fixture = GethBenchmarkFixture() for built_fixture in fixture.build(): @@ -122,12 +107,15 @@ def main(logger: logging.Logger, num_calls: int) -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) + # -- sync -- # + coinbase = w3_http.eth.coinbase + + # -- async -- # async_w3_http = loop.run_until_complete( build_async_w3_http(fixture.endpoint_uri) ) - async_unlocked_acct = loop.run_until_complete( - async_unlocked_account(async_w3_http) - ) + async_coinbase = loop.run_until_complete(async_w3_http.eth.coinbase) + methods = [ { "name": "eth_gasPrice", @@ -141,15 +129,15 @@ def main(logger: logging.Logger, num_calls: int) -> None: "exec": lambda: w3_http.eth.send_transaction( { "to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601", - "from": unlocked_account(w3_http), - "value": Wei(12345), + "from": coinbase, + "value": Wei(1), } ), "async_exec": lambda: async_w3_http.eth.send_transaction( { "to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601", - "from": async_unlocked_acct, - "value": Wei(12345), + "from": async_coinbase, + "value": Wei(1), } ), }, diff --git a/web3/tools/benchmark/node.py b/web3/tools/benchmark/node.py index 26ecdc97d2..43895d1caa 100644 --- a/web3/tools/benchmark/node.py +++ b/web3/tools/benchmark/node.py @@ -80,20 +80,23 @@ def _geth_binary(self) -> str: def _geth_command_arguments(self, datadir: str) -> Sequence[str]: return ( self.geth_binary, + "--dev", + "--dev.period", + "100", "--datadir", str(datadir), "--nodiscover", - "--fakepow", "--http", "--http.port", self.rpc_port, "--http.api", - "admin,eth,net,web3,personal,miner", + "admin,eth,net,web3", "--ipcdisable", "--allow-insecure-unlock", "--miner.etherbase", COINBASE[2:], - "--rpc.enabledeprecatedpersonal", + "--password", + os.path.join(datadir, "keystore", "pw.txt"), ) def _geth_process( From ff62cd4bd2c67aacb271fd7582a9e3af6e151f4e Mon Sep 17 00:00:00 2001 From: Stuart Reed Date: Wed, 24 Jan 2024 09:47:31 -0700 Subject: [PATCH 5/7] More work towards ``geth --dev`` test fixture: - Try with --dev.period=5 - Remove assert from test_eth_new_block_filter - Remove sleep from test_web3_client_version - Try without flaky - Fixes test_eth_send_transaction_with_nonce without the need for retries. - Retries were causing transactions to be sent with the same nonce, which in turn requires more gas to go through. Running the test once fixes this issue. - Obtain the transaction count providing the 'pending' argument. - Fix test_eth_send_transaction_no_max_fee --- tests/integration/go_ethereum/conftest.py | 2 +- web3/_utils/module_testing/eth_module.py | 31 +++++------------------ web3/_utils/module_testing/web3_module.py | 2 -- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/tests/integration/go_ethereum/conftest.py b/tests/integration/go_ethereum/conftest.py index 594129abba..510f02031f 100644 --- a/tests/integration/go_ethereum/conftest.py +++ b/tests/integration/go_ethereum/conftest.py @@ -96,7 +96,7 @@ def base_geth_command_arguments(geth_binary, datadir): str(datadir), "--dev", "--dev.period", - "1", + "5", "--password", os.path.join(datadir, "keystore", "pw.txt"), ) diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index 33630f870c..da2dc058f5 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -37,9 +37,6 @@ from eth_utils.toolz import ( assoc, ) -from flaky import ( - flaky, -) from hexbytes import ( HexBytes, ) @@ -195,7 +192,6 @@ async def test_eth_send_transaction_legacy( assert txn["gas"] == 21000 assert txn["gasPrice"] == txn_params["gasPrice"] - @flaky(max_runs=3) @pytest.mark.asyncio async def test_eth_modify_transaction_legacy( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -226,7 +222,6 @@ async def test_eth_modify_transaction_legacy( assert modified_txn["gas"] == 21000 assert modified_txn["gasPrice"] == cast(int, txn_params["gasPrice"]) * 2 - @flaky(max_runs=3) @pytest.mark.asyncio async def test_eth_modify_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2075,7 +2070,6 @@ async def test_async_eth_sign_ens_names( assert is_bytes(signature) assert len(signature) == 32 + 32 + 1 - @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_legacy( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2103,7 +2097,6 @@ async def test_async_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] - @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2138,7 +2131,6 @@ async def test_async_eth_replace_transaction( assert replace_txn["maxFeePerGas"] == three_gwei_in_wei assert replace_txn["maxPriorityFeePerGas"] == two_gwei_in_wei - @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_underpriced( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2261,7 +2253,6 @@ async def test_async_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price - @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2290,7 +2281,6 @@ def higher_gas_price_strategy(async_w3: "AsyncWeb3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price async_w3.eth.set_gas_price_strategy(None) # reset strategy - @flaky(max_runs=3) @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -3003,7 +2993,6 @@ def test_eth_send_transaction( assert txn["maxPriorityFeePerGas"] == txn_params["maxPriorityFeePerGas"] assert txn["gasPrice"] == txn_params["maxFeePerGas"] - @flaky(max_runs=3) def test_eth_send_transaction_with_nonce( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3018,7 +3007,7 @@ def test_eth_send_transaction_with_nonce( "gas": 21000, "maxFeePerGas": max_fee_per_gas, "maxPriorityFeePerGas": max_priority_fee_per_gas, - "nonce": w3.eth.get_transaction_count(unlocked_account), + "nonce": Nonce(w3.eth.get_transaction_count(unlocked_account, "pending")), } txn_hash = w3.eth.send_transaction(txn_params) txn = w3.eth.get_transaction(txn_hash) @@ -3125,13 +3114,13 @@ def test_eth_send_transaction_no_priority_fee( def test_eth_send_transaction_no_max_fee( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: - maxPriorityFeePerGas = w3.to_wei(2, "gwei") + max_priority_fee_per_gas = w3.to_wei(2, "gwei") txn_params: TxParams = { "from": unlocked_account_dual_type, "to": unlocked_account_dual_type, "value": Wei(1), "gas": 21000, - "maxPriorityFeePerGas": maxPriorityFeePerGas, + "maxPriorityFeePerGas": max_priority_fee_per_gas, } txn_hash = w3.eth.send_transaction(txn_params) txn = w3.eth.get_transaction(txn_hash) @@ -3140,9 +3129,9 @@ def test_eth_send_transaction_no_max_fee( assert is_same_address(txn["to"], cast(ChecksumAddress, txn_params["to"])) assert txn["value"] == 1 assert txn["gas"] == 21000 - - block = w3.eth.get_block("latest") - assert txn["maxFeePerGas"] == maxPriorityFeePerGas + 2 * block["baseFeePerGas"] + assert is_integer(txn["maxPriorityFeePerGas"]) + assert txn["maxPriorityFeePerGas"] == max_priority_fee_per_gas + assert is_integer(txn["maxFeePerGas"]) def test_eth_send_transaction_max_fee_less_than_tip( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress @@ -3265,7 +3254,6 @@ def gas_price_strategy(_w3: "Web3", _txn: TxParams) -> str: assert txn["gasPrice"] == two_gwei_in_wei w3.eth.set_gas_price_strategy(None) # reset strategy - @flaky(max_runs=3) def test_eth_replace_transaction_legacy( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3294,7 +3282,6 @@ def test_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] - @flaky(max_runs=3) def test_eth_replace_transaction( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3422,7 +3409,6 @@ def test_eth_replace_transaction_gas_price_too_low( with pytest.raises(ValueError): w3.eth.replace_transaction(txn_hash, txn_params) - @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_minimum( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3445,7 +3431,6 @@ def test_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price - @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3473,7 +3458,6 @@ def higher_gas_price_strategy(w3: "Web3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price w3.eth.set_gas_price_strategy(None) # reset strategy - @flaky(max_runs=3) def test_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3500,7 +3484,6 @@ def lower_gas_price_strategy(w3: "Web3", txn: TxParams) -> Wei: assert replace_txn["gasPrice"] == math.ceil(gas_price * 1.125) w3.eth.set_gas_price_strategy(None) # reset strategy - @flaky(max_runs=3) def test_eth_modify_transaction_legacy( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3530,7 +3513,6 @@ def test_eth_modify_transaction_legacy( assert modified_txn["gas"] == 21000 assert modified_txn["gasPrice"] == cast(int, txn_params["gasPrice"]) * 2 - @flaky(max_runs=3) def test_eth_modify_transaction( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -4326,7 +4308,6 @@ def test_eth_new_block_filter(self, w3: "Web3") -> None: changes = w3.eth.get_filter_changes(filter.filter_id) assert is_list_like(changes) - assert not changes result = w3.eth.uninstall_filter(filter.filter_id) assert result is True diff --git a/web3/_utils/module_testing/web3_module.py b/web3/_utils/module_testing/web3_module.py index 3283e892ea..eb600b2b6b 100644 --- a/web3/_utils/module_testing/web3_module.py +++ b/web3/_utils/module_testing/web3_module.py @@ -1,5 +1,4 @@ import pytest -import time from typing import ( Any, NoReturn, @@ -31,7 +30,6 @@ class Web3ModuleTest: def test_web3_client_version(self, w3: Web3) -> None: - time.sleep(1) client_version = w3.client_version self._check_web3_client_version(client_version) From bb312eeb279d9eb59e7fa348ed75d81811d3cf09 Mon Sep 17 00:00:00 2001 From: Stuart Reed Date: Thu, 25 Jan 2024 15:01:44 -0700 Subject: [PATCH 6/7] Additional cleanup for ``geth --dev`` test fixture --- newsfragments/3191.internal.rst | 1 + tests/integration/generate_fixtures/common.py | 4 ++-- .../generate_fixtures/go_ethereum.py | 6 +++-- tests/integration/geth-1.13.9-fixture.zip | Bin 47623 -> 48558 bytes tests/integration/go_ethereum/conftest.py | 2 +- web3/_utils/module_testing/eth_module.py | 21 ++++++++++++++++++ .../module_testing/module_testing_utils.py | 11 +++++++++ 7 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 newsfragments/3191.internal.rst diff --git a/newsfragments/3191.internal.rst b/newsfragments/3191.internal.rst new file mode 100644 index 0000000000..dab22fede9 --- /dev/null +++ b/newsfragments/3191.internal.rst @@ -0,0 +1 @@ +Create test fixture for latest ``geth`` version. Run tests with ``geth`` in ``--dev`` mode. \ No newline at end of file diff --git a/tests/integration/generate_fixtures/common.py b/tests/integration/generate_fixtures/common.py index d083b2f981..844f354758 100644 --- a/tests/integration/generate_fixtures/common.py +++ b/tests/integration/generate_fixtures/common.py @@ -68,8 +68,8 @@ "timestamp": "0x0", "parentHash": constants.HASH_ZERO, "extraData": "0x3535353535353535353535353535353535353535353535353535353535353535", - "difficulty": "0x1", - "gasLimit": "0x1c9c380", + "gasLimit": "0x3b9aca00", # 1,000,000,000 + "difficulty": "0x10000", "mixhash": constants.HASH_ZERO, "coinbase": COINBASE, } diff --git a/tests/integration/generate_fixtures/go_ethereum.py b/tests/integration/generate_fixtures/go_ethereum.py index 46574cac99..41d4743b61 100644 --- a/tests/integration/generate_fixtures/go_ethereum.py +++ b/tests/integration/generate_fixtures/go_ethereum.py @@ -85,16 +85,18 @@ def get_geth_process(geth_binary, datadir, genesis_file_path, geth_port, keyfile run_geth_command = ( geth_binary, - "--datadir", # data dir for the db + "--datadir", datadir, "--dev", "--dev.period", "1", "--port", geth_port, + "--miner.etherbase", + common.COINBASE[2:], "--password", keyfile_pw, - "--rpc.enabledeprecatedpersonal", # Enables the (deprecated) personal namespace + "--rpc.enabledeprecatedpersonal", ) popen_proc = subprocess.Popen( diff --git a/tests/integration/geth-1.13.9-fixture.zip b/tests/integration/geth-1.13.9-fixture.zip index a146ececafa38efbb5e1b2826d91f2e52042465e..8917945623371fd6dfae4a6df8066a4f6c2e8dba 100644 GIT binary patch literal 48558 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 A4FCWD literal 47623 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 BQ@Q{E diff --git a/tests/integration/go_ethereum/conftest.py b/tests/integration/go_ethereum/conftest.py index 510f02031f..9b282f2e77 100644 --- a/tests/integration/go_ethereum/conftest.py +++ b/tests/integration/go_ethereum/conftest.py @@ -96,7 +96,7 @@ def base_geth_command_arguments(geth_binary, datadir): str(datadir), "--dev", "--dev.period", - "5", + "5", # dev.period > 1 for tests which require pending blocks "--password", os.path.join(datadir, "keystore", "pw.txt"), ) diff --git a/web3/_utils/module_testing/eth_module.py b/web3/_utils/module_testing/eth_module.py index da2dc058f5..8415d101b6 100644 --- a/web3/_utils/module_testing/eth_module.py +++ b/web3/_utils/module_testing/eth_module.py @@ -59,6 +59,7 @@ from web3._utils.module_testing.module_testing_utils import ( assert_contains_log, async_mock_offchain_lookup_request_response, + flaky_geth_dev_mining, mock_offchain_lookup_request_response, ) from web3._utils.module_testing.utils import ( @@ -2070,6 +2071,7 @@ async def test_async_eth_sign_ens_names( assert is_bytes(signature) assert len(signature) == 32 + 32 + 1 + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_legacy( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2097,6 +2099,7 @@ async def test_async_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2131,6 +2134,7 @@ async def test_async_eth_replace_transaction( assert replace_txn["maxFeePerGas"] == three_gwei_in_wei assert replace_txn["maxPriorityFeePerGas"] == two_gwei_in_wei + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_underpriced( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2152,6 +2156,7 @@ async def test_async_eth_replace_transaction_underpriced( with pytest.raises(ValueError, match="replacement transaction underpriced"): await async_w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_non_existing_transaction( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2172,6 +2177,7 @@ async def test_async_eth_replace_transaction_non_existing_transaction( txn_params, ) + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_already_mined( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2192,6 +2198,7 @@ async def test_async_eth_replace_transaction_already_mined( with pytest.raises(ValueError, match="Supplied transaction with hash"): await async_w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_incorrect_nonce( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2213,6 +2220,7 @@ async def test_async_eth_replace_transaction_incorrect_nonce( with pytest.raises(ValueError): await async_w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_too_low( self, async_w3: "AsyncWeb3", async_unlocked_account_dual_type: ChecksumAddress @@ -2230,6 +2238,7 @@ async def test_async_eth_replace_transaction_gas_price_too_low( with pytest.raises(ValueError): await async_w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_minimum( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2253,6 +2262,7 @@ async def test_async_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -2281,6 +2291,7 @@ def higher_gas_price_strategy(async_w3: "AsyncWeb3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price async_w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky_geth_dev_mining @pytest.mark.asyncio async def test_async_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, async_w3: "AsyncWeb3", async_unlocked_account: ChecksumAddress @@ -3254,6 +3265,7 @@ def gas_price_strategy(_w3: "Web3", _txn: TxParams) -> str: assert txn["gasPrice"] == two_gwei_in_wei w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky_geth_dev_mining def test_eth_replace_transaction_legacy( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3282,6 +3294,7 @@ def test_eth_replace_transaction_legacy( assert replace_txn["gas"] == 21000 assert replace_txn["gasPrice"] == txn_params["gasPrice"] + @flaky_geth_dev_mining def test_eth_replace_transaction( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3315,6 +3328,7 @@ def test_eth_replace_transaction( assert replace_txn["maxFeePerGas"] == three_gwei_in_wei assert replace_txn["maxPriorityFeePerGas"] == two_gwei_in_wei + @flaky_geth_dev_mining def test_eth_replace_transaction_underpriced( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3335,6 +3349,7 @@ def test_eth_replace_transaction_underpriced( with pytest.raises(ValueError, match="replacement transaction underpriced"): w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining def test_eth_replace_transaction_non_existing_transaction( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3354,6 +3369,7 @@ def test_eth_replace_transaction_non_existing_transaction( txn_params, ) + @flaky_geth_dev_mining def test_eth_replace_transaction_already_mined( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3373,6 +3389,7 @@ def test_eth_replace_transaction_already_mined( with pytest.raises(ValueError, match="Supplied transaction with hash"): w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining def test_eth_replace_transaction_incorrect_nonce( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3393,6 +3410,7 @@ def test_eth_replace_transaction_incorrect_nonce( with pytest.raises(ValueError): w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining def test_eth_replace_transaction_gas_price_too_low( self, w3: "Web3", unlocked_account_dual_type: ChecksumAddress ) -> None: @@ -3409,6 +3427,7 @@ def test_eth_replace_transaction_gas_price_too_low( with pytest.raises(ValueError): w3.eth.replace_transaction(txn_hash, txn_params) + @flaky_geth_dev_mining def test_eth_replace_transaction_gas_price_defaulting_minimum( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3431,6 +3450,7 @@ def test_eth_replace_transaction_gas_price_defaulting_minimum( gas_price * 1.125 ) # minimum gas price + @flaky_geth_dev_mining def test_eth_replace_transaction_gas_price_defaulting_strategy_higher( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: @@ -3458,6 +3478,7 @@ def higher_gas_price_strategy(w3: "Web3", txn: TxParams) -> Wei: ) # Strategy provides higher gas price w3.eth.set_gas_price_strategy(None) # reset strategy + @flaky_geth_dev_mining def test_eth_replace_transaction_gas_price_defaulting_strategy_lower( self, w3: "Web3", unlocked_account: ChecksumAddress ) -> None: diff --git a/web3/_utils/module_testing/module_testing_utils.py b/web3/_utils/module_testing/module_testing_utils.py index 7cb0e0b25a..6d66400961 100644 --- a/web3/_utils/module_testing/module_testing_utils.py +++ b/web3/_utils/module_testing/module_testing_utils.py @@ -22,6 +22,9 @@ from eth_utils import ( is_same_address, ) +from flaky import ( + flaky, +) from hexbytes import ( HexBytes, ) @@ -49,6 +52,14 @@ ) +""" +flaky_geth_dev_mining decorator for tests requiring a pending block +for the duration of the test. This behavior can be flaky +due to timing of the test running as a block is mined. +""" +flaky_geth_dev_mining = flaky(max_runs=3) + + def mine_pending_block(w3: "Web3") -> None: timeout = 10 From 6191d09229f5f3e38a6e0de013dde41c64d58bcf Mon Sep 17 00:00:00 2001 From: Stuart Reed Date: Fri, 26 Jan 2024 14:04:35 -0700 Subject: [PATCH 7/7] Address feedback for ``geth --dev`` test fixture --- tests/integration/generate_fixtures/go_ethereum.py | 10 +++------- tests/integration/go_ethereum/conftest.py | 2 +- tests/integration/go_ethereum/test_goethereum_ws.py | 4 ++-- .../go_ethereum/test_goethereum_ws_v2/conftest.py | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/integration/generate_fixtures/go_ethereum.py b/tests/integration/generate_fixtures/go_ethereum.py index 41d4743b61..038e25c9a3 100644 --- a/tests/integration/generate_fixtures/go_ethereum.py +++ b/tests/integration/generate_fixtures/go_ethereum.py @@ -69,13 +69,13 @@ def graceful_kill_on_exit(proc): @contextlib.contextmanager -def get_geth_process(geth_binary, datadir, genesis_file_path, geth_port, keyfile_pw): +def get_geth_process(geth_binary, datadir, geth_port): init_datadir_command = ( geth_binary, "--datadir", datadir, "init", - genesis_file_path, + os.path.join(datadir, "genesis.json"), ) subprocess.check_output( init_datadir_command, @@ -95,7 +95,7 @@ def get_geth_process(geth_binary, datadir, genesis_file_path, geth_port, keyfile "--miner.etherbase", common.COINBASE[2:], "--password", - keyfile_pw, + os.path.join(datadir, "keystore", "pw.txt"), "--rpc.enabledeprecatedpersonal", ) @@ -151,9 +151,7 @@ def generate_go_ethereum_fixture(destination_dir): with get_geth_process( geth_binary=geth_binary, datadir=datadir, - genesis_file_path=genesis_file_path, geth_port=geth_port, - keyfile_pw=keyfile_pw, ): common.wait_for_socket(geth_ipc_path) w3 = Web3(Web3.IPCProvider(geth_ipc_path)) @@ -167,9 +165,7 @@ def generate_go_ethereum_fixture(destination_dir): with get_geth_process( geth_binary=geth_binary, datadir=datadir, - genesis_file_path=genesis_file_path, geth_port=geth_port, - keyfile_pw=keyfile_pw, ): common.wait_for_socket(geth_ipc_path) w3 = Web3(Web3.IPCProvider(geth_ipc_path)) diff --git a/tests/integration/go_ethereum/conftest.py b/tests/integration/go_ethereum/conftest.py index 9b282f2e77..758a4eff07 100644 --- a/tests/integration/go_ethereum/conftest.py +++ b/tests/integration/go_ethereum/conftest.py @@ -104,7 +104,7 @@ def base_geth_command_arguments(geth_binary, datadir): @pytest.fixture(scope="module") def geth_zipfile_version(get_geth_version): - if get_geth_version.major == 1 and get_geth_version.minor in [10, 11, 12, 13]: + if get_geth_version.major == 1 and get_geth_version.minor in [11, 12, 13]: return GETH_FIXTURE_ZIP raise AssertionError("Unsupported geth version") diff --git a/tests/integration/go_ethereum/test_goethereum_ws.py b/tests/integration/go_ethereum/test_goethereum_ws.py index 02997de72b..f24ae85917 100644 --- a/tests/integration/go_ethereum/test_goethereum_ws.py +++ b/tests/integration/go_ethereum/test_goethereum_ws.py @@ -42,13 +42,13 @@ def _geth_command_arguments(ws_port, base_geth_command_arguments, geth_version): "--ws.port", ws_port, "--ws.api", - "admin,eth,net,web3,personal,miner", + "admin,eth,net,web3,personal", "--ws.origins", "*", "--ipcdisable", "--allow-insecure-unlock", ) - if geth_version.minor not in [10, 11, 12, 13]: + if geth_version.minor not in [11, 12, 13]: raise AssertionError("Unsupported Geth version") else: raise AssertionError("Unsupported Geth version") diff --git a/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py b/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py index 868a67f77a..87ad255c72 100644 --- a/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py +++ b/tests/integration/go_ethereum/test_goethereum_ws_v2/conftest.py @@ -34,7 +34,7 @@ def _geth_command_arguments(ws_port, base_geth_command_arguments, geth_version): "--ipcdisable", "--allow-insecure-unlock", ) - if geth_version.minor not in [10, 11, 12, 13]: + if geth_version.minor not in [11, 12, 13]: raise AssertionError("Unsupported Geth version") else: raise AssertionError("Unsupported Geth version")