diff --git a/README.md b/README.md index 359181cf..1cb22ec8 100644 --- a/README.md +++ b/README.md @@ -824,3 +824,21 @@ kurtosis-test . ``` The tests can be found in `*_test.star` scripts located in the `test` directory. + +### Dev accounts being used + +Index| Address | Private Key | In use | Tool +---|---|---|---|--- +0| `0xf39F...2266` | `0xac09...f80` | ✅ | [op-transaction-fuzzer](src/transaction_fuzzer/transaction_fuzzer.star#L33) +1| `0x7099...79C8` | `0x59c6...690d` | ❌ | "" +2| `0x3C49...3359` | `0x5de4...365a` | ❌ | "" +3| `0x90F7...9b906` | `0x7c85...a07a6` | ❌ | "" +4| `0x15d3...9f1b9` | `0x47e1...9c6` | ❌ | "" +5| `0x9965...0A4dc` | `0x8b3a...ba` | ❌ | "" +6| `0x976E...9b906` | `0x92db...64e` | ❌ | "" +7| `0x14dC...3356` | `0x4bbbf...356` | ❌ | "" +8| `0x2361...226a` | `0xdbda...b97` | ❌ | "" +9| `0xa0Ee...720` | `0xa0Ee...c6` | ❌ | "" + +mnemonic: `test test test test test test test test test test test junk` + diff --git a/network_params.yaml b/network_params.yaml index 397deb77..6a01aa86 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -43,6 +43,8 @@ optimism_package: builder_host: "" builder_port: "" additional_services: [] + tx_fuzzer_params: + tx_fuzzer_extra_args: [] op_contract_deployer_params: image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-deployer:v0.0.12 l1_artifacts_locator: https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz diff --git a/src/l2.star b/src/l2.star index e42867fc..c5cd85a8 100644 --- a/src/l2.star +++ b/src/l2.star @@ -4,6 +4,7 @@ da_server_launcher = import_module("./alt-da/da-server/da_server_launcher.star") contract_deployer = import_module("./contracts/contract_deployer.star") input_parser = import_module("./package_io/input_parser.star") util = import_module("./util.star") +tx_fuzzer = import_module("./transaction_fuzzer/transaction_fuzzer.star") def launch_l2( @@ -29,6 +30,7 @@ def launch_l2( challenger_params = l2_args.challenger_params proposer_params = l2_args.proposer_params mev_params = l2_args.mev_params + tx_fuzzer_params = l2_args.tx_fuzzer_params plan.print("Deploying L2 with name {0}".format(network_params.name)) @@ -99,6 +101,20 @@ def launch_l2( network_params.network_id, ) plan.print("Successfully launched op-blockscout") + elif additional_service == "tx_fuzzer": + plan.print("Launching transaction spammer") + fuzz_target = "http://{0}:{1}".format( + all_el_contexts[0].ip_addr, + all_el_contexts[0].rpc_port_num, + ) + tx_fuzzer.launch( + plan, + "op-transaction-fuzzer-{0}".format(network_params.name), + fuzz_target, + tx_fuzzer_params, + global_node_selectors, + ) + plan.print("Successfully launched transaction spammer") plan.print(l2.participants) plan.print( diff --git a/src/package_io/constants.star b/src/package_io/constants.star index bc2a94da..b1f50610 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -36,3 +36,48 @@ VOLUME_SIZE = { "hildr_volume_size": 1000, # 1GB }, } + +dev_accounts = [ + { + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "private_key": "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + }, + { + "address": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "private_key": "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + }, + { + "address": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "private_key": "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + }, + { + "address": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "private_key": "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", + }, + { + "address": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + "private_key": "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a", + }, + { + "address": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", + "private_key": "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba", + }, + { + "address": "0x976EA74026E726554dB657fA54763abd0C3a0aa9", + "private_key": "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e", + }, + { + "address": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", + "private_key": "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", + }, + { + "address": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "private_key": "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97", + }, + { + "address": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "private_key": "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6", + }, +] + +mnemonic = "test test test test test test test test test test test junk" diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 5db9acc3..8b3b63bd 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -54,6 +54,9 @@ DEFAULT_DA_SERVER_PARAMS = { ], } +DEFAULT_TX_FUZZER_IMAGES = { + "tx-fuzzer": "ethpandaops/tx-fuzz:master", +} DEFAULT_ADDITIONAL_SERVICES = [] @@ -253,6 +256,12 @@ def input_parser(plan, input_args): cmd=result["da_server_params"]["cmd"], ), additional_services=result["additional_services"], + tx_fuzzer_params=struct( + image=result["tx_fuzzer_params"]["image"], + tx_fuzzer_extra_args=result["tx_fuzzer_params"][ + "tx_fuzzer_extra_args" + ], + ), ) for result in results["chains"] ], @@ -413,6 +422,9 @@ def parse_network_params(plan, input_args): ) participants.append(participant_copy) + tx_fuzzer_params = default_tx_fuzzer_params() + tx_fuzzer_params.update(chain.get("tx_fuzzer_params", {})) + result = { "participants": participants, "network_params": network_params, @@ -425,6 +437,7 @@ def parse_network_params(plan, input_args): "additional_services": chain.get( "additional_services", DEFAULT_ADDITIONAL_SERVICES ), + "tx_fuzzer_params": tx_fuzzer_params, } chains.append(result) @@ -549,6 +562,7 @@ def default_chains(): "mev_params": default_mev_params(), "da_server_params": default_da_server_params(), "additional_services": DEFAULT_ADDITIONAL_SERVICES, + "tx_fuzzer_params": default_tx_fuzzer_params(), } ] @@ -707,3 +721,10 @@ def default_da_server_params(): "image": DEFAULT_DA_SERVER_PARAMS["image"], "cmd": DEFAULT_DA_SERVER_PARAMS["cmd"], } + + +def default_tx_fuzzer_params(): + return { + "image": "ethpandaops/tx-fuzz:master", + "tx_fuzzer_extra_args": [], + } diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 19a8843a..ddbc60e0 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -161,6 +161,10 @@ SUBCATEGORY_PARAMS = { "image", "cmd", ], + "tx_fuzzer_params": [ + "image", + "tx_fuzzer_extra_args", + ], } OP_CONTRACT_DEPLOYER_PARAMS = [ @@ -172,11 +176,7 @@ OP_CONTRACT_DEPLOYER_PARAMS = [ OP_CONTRACT_DEPLOYER_GLOBAL_DEPLOY_OVERRIDES = ["faultGameAbsolutePrestate"] -ADDITIONAL_SERVICES_PARAMS = [ - "blockscout", - "rollup-boost", - "da_server", -] +ADDITIONAL_SERVICES_PARAMS = ["blockscout", "rollup-boost", "da_server", "tx_fuzzer"] EXTERNAL_L1_NETWORK_PARAMS = [ "network_id", diff --git a/src/transaction_fuzzer/transaction_fuzzer.star b/src/transaction_fuzzer/transaction_fuzzer.star new file mode 100644 index 00000000..043f81b6 --- /dev/null +++ b/src/transaction_fuzzer/transaction_fuzzer.star @@ -0,0 +1,47 @@ +constants = import_module("../package_io/constants.star") + +# The min/max CPU/memory that tx-fuzzer can use +MIN_CPU = 100 +MAX_CPU = 1000 +MIN_MEMORY = 20 +MAX_MEMORY = 300 + + +def launch( + plan, + service_name, + el_uri, + tx_fuzzer_params, + global_node_selectors, +): + config = get_config( + el_uri, + tx_fuzzer_params, + global_node_selectors, + ) + plan.add_service(service_name, config) + + +def get_config( + el_uri, + tx_fuzzer_params, + node_selectors, +): + cmd = [ + "spam", + "--rpc={}".format(el_uri), + "--sk={0}".format(constants.dev_accounts[0]["private_key"]), + ] + + if len(tx_fuzzer_params.tx_fuzzer_extra_args) > 0: + cmd.extend([param for param in tx_fuzzer_params.tx_fuzzer_extra_args]) + + return ServiceConfig( + image=tx_fuzzer_params.image, + cmd=cmd, + min_cpu=MIN_CPU, + max_cpu=MAX_CPU, + min_memory=MIN_MEMORY, + max_memory=MAX_MEMORY, + node_selectors=node_selectors, + ) diff --git a/test/tx_fuzzer_launcher_test.star b/test/tx_fuzzer_launcher_test.star new file mode 100644 index 00000000..be8ae24a --- /dev/null +++ b/test/tx_fuzzer_launcher_test.star @@ -0,0 +1,63 @@ +transaction_fuzzer = import_module("/src/transaction_fuzzer/transaction_fuzzer.star") +input_parser = import_module("/src/package_io/input_parser.star") +observability = import_module("/src/observability/observability.star") +ethereum_package_constants = import_module( + "github.com/ethpandaops/ethereum-package/src/package_io/constants.star" +) +constants = import_module("/src/package_io/constants.star") +util = import_module("/src/util.star") + + +def test_launch_with_defaults(plan): + parsed_input_args = input_parser.input_parser( + plan, + { + "chains": [ + { + "participants": [ + { + "el_type": "op-reth", + "el_image": "op-reth:latest", + "cl_type": "op-node", + "cl_image": "op-node:latest", + } + ], + "additional_services": [ + "tx_fuzzer", + ], + } + ] + }, + ) + + fuzzer_image = input_parser.DEFAULT_TX_FUZZER_IMAGES["tx-fuzzer"] + + chains = parsed_input_args.chains + chain = chains[0] + service_name = "op-transaction-fuzzer" + + el_rpc_url = "http://rpc.el" + transaction_fuzzer.launch( + plan=plan, + service_name=service_name, + el_uri=el_rpc_url, + tx_fuzzer_params=chain.tx_fuzzer_params, + global_node_selectors=parsed_input_args.global_node_selectors, + ) + + fuzzer_service_config = kurtosistest.get_service_config(service_name=service_name) + expect.ne(fuzzer_service_config, None) + expect.eq(fuzzer_service_config.image, fuzzer_image) + expect.eq(fuzzer_service_config.env_vars, {}) + expect.eq( + fuzzer_service_config.entrypoint, + [], + ) + expect.eq( + fuzzer_service_config.cmd, + [ + "spam", + "--rpc={}".format(el_rpc_url), + "--sk={0}".format(constants.dev_accounts[0]["private_key"]), + ], + )