Skip to content

Commit c5b9fde

Browse files
authored
add evm debug trace profile (#38)
- add evm.debug_trace locust profile - add get_random_tx in test_data\base.py - change default block range to 10000 instead of 20 - add print to console to display test data preparation progress - add debug_traceCall params factory and add timeout to trace configs
1 parent e405cfe commit c5b9fde

File tree

4 files changed

+90
-4
lines changed

4 files changed

+90
-4
lines changed

chainbench/profile/evm/debug_trace.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
Ethereum profile (heavy mode).
3+
"""
4+
5+
from locust import constant_pacing, task
6+
7+
from chainbench.user.evm import EVMBenchUser
8+
from chainbench.util.rng import get_rng
9+
10+
11+
class EthereumDebugTraceProfile(EVMBenchUser):
12+
wait_time = constant_pacing(10)
13+
14+
@task(324)
15+
def debug_trace_transaction_task(self):
16+
self.make_call(
17+
name="debug_trace_transaction",
18+
method="debug_traceTransaction",
19+
params=self._trace_transaction_params_factory(get_rng()),
20+
),
21+
22+
@task(41)
23+
def debug_trace_call_task(self):
24+
self.make_call(
25+
name="debug_trace_call",
26+
method="debug_traceCall",
27+
params=self._trace_call_params_factory(get_rng()),
28+
),
29+
30+
@task(36)
31+
def debug_trace_block_by_number_task(self):
32+
self.make_call(
33+
name="debug_trace_block_by_number",
34+
method="debug_traceBlockByNumber",
35+
params=self._trace_block_by_number_params_factory(get_rng()),
36+
),
37+
38+
@task(1)
39+
def debug_trace_block_by_hash_task(self):
40+
self.make_call(
41+
name="debug_trace_block_by_hash",
42+
method="debug_traceBlockByHash",
43+
params=self._trace_block_by_hash_params_factory(get_rng()),
44+
),

chainbench/test_data/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ def get_random_tx_hash(self, rng: RNG | None = None) -> TxHash:
189189
rng = get_rng()
190190
return rng.random.choice(self.tx_hashes)
191191

192+
def get_random_tx(self, rng: RNG | None = None) -> Tx:
193+
if rng is None:
194+
rng = get_rng()
195+
return rng.random.choice(self.txs)
196+
192197
def get_random_recent_block_number(self, n: int, rng: RNG | None = None) -> BlockNumber:
193198
if rng is None:
194199
rng = get_rng()

chainbench/test_data/evm.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def _get_start_and_end_blocks(self, use_recent_blocks: bool) -> tuple[int, int]:
8383
return start_block_number, end_block_number
8484
else:
8585
end_block_number = self._fetch_latest_block_number()
86-
start_block_number = end_block_number - 20
86+
start_block_number = end_block_number - 10000
8787
logger.info("Using recent blocks from %s to %s as test data", start_block_number, end_block_number)
8888
return start_block_number, end_block_number
8989

@@ -99,6 +99,11 @@ def _get_init_data(self, parsed_options) -> BlockchainData:
9999
start_block_number, end_block_number = self._get_start_and_end_blocks(parsed_options.use_recent_blocks)
100100

101101
while self.TXS_REQUIRED > len(txs) or self.ACCOUNTS_REQUIRED > len(accounts) or self.SAVE_BLOCKS > len(blocks):
102+
print(
103+
f"txs = {len(txs)}/{self.TXS_REQUIRED} "
104+
f"accounts = {len(accounts)}/{self.ACCOUNTS_REQUIRED} "
105+
f"blocks = {len(blocks)}/{self.SAVE_BLOCKS}"
106+
)
102107
if self.ACCOUNTS_REQUIRED > len(accounts) or self.TXS_REQUIRED > len(txs):
103108
return_txs = True
104109
else:

chainbench/user/evm.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ class EVMBenchUser(BaseBenchUser):
99
abstract = True
1010
test_data = EVMTestData()
1111

12+
_default_trace_timeout = "120s"
13+
1214
def _get_logs_params_factory(self, rng: RNG):
1315
return [
1416
{
@@ -38,16 +40,43 @@ def _get_balance_params_factory(self, rng: RNG):
3840
hex(self.test_data.get_random_block_number(rng)),
3941
]
4042

43+
def _trace_call_params_factory(self, rng: RNG):
44+
tx_data = self.test_data.get_random_tx(rng)
45+
tx_param = {
46+
"to": tx_data["to"],
47+
"gas": tx_data["gas"],
48+
"value": tx_data["value"],
49+
}
50+
51+
if "maxFeePerGas" in tx_data:
52+
tx_param["maxFeePerGas"] = tx_data["maxFeePerGas"]
53+
else:
54+
tx_param["gasPrice"] = tx_data["gasPrice"]
55+
56+
if "input" in tx_data:
57+
if tx_data["input"] != "0x":
58+
tx_param["data"] = tx_data["input"]
59+
60+
if "accessList" in tx_data:
61+
if len(tx_data["accessList"]) > 0:
62+
tx_param["accessList"] = tx_data["accessList"]
63+
64+
return [
65+
tx_param,
66+
tx_data["blockNumber"],
67+
{"tracer": "callTracer", "timeout": self._default_trace_timeout},
68+
]
69+
4170
def _trace_block_by_number_params_factory(self, rng: RNG):
4271
return [
4372
hex(self.test_data.get_random_block_number(rng)),
44-
{"tracer": "callTracer"},
73+
{"tracer": "callTracer", "timeout": self._default_trace_timeout},
4574
]
4675

4776
def _trace_block_by_hash_params_factory(self, rng: RNG):
4877
return [
4978
self.test_data.get_random_block_hash(rng),
50-
{"tracer": "callTracer"},
79+
{"tracer": "callTracer", "timeout": self._default_trace_timeout},
5180
]
5281

5382
def _trace_replay_block_transaction_params_factory(self, rng: RNG):
@@ -63,7 +92,10 @@ def _trace_replay_transaction_params_factory(self, rng: RNG):
6392
]
6493

6594
def _trace_transaction_params_factory(self, rng: RNG):
66-
return [self.test_data.get_random_tx_hash(rng), {"tracer": "prestateTracer"}]
95+
return [
96+
self.test_data.get_random_tx_hash(rng),
97+
{"tracer": "callTracer", "timeout": self._default_trace_timeout},
98+
]
6799

68100
def _trace_filter_params_factory(self, rng: RNG):
69101
block_number = self.test_data.get_random_block_number(rng)

0 commit comments

Comments
 (0)