deftest_block_full_access_list_and_data(benchmark_test:BenchmarkTestFiller,pre:Alloc,intrinsic_cost:int,total_cost_standard_per_token:int,fork:Fork,gas_benchmark_value:int,tx_gas_limit_cap:int,)->None:""" Test a block with access lists (60% gas) and calldata (40% gas) using random mixed bytes. """iteration_count=math.ceil(gas_benchmark_value/tx_gas_limit_cap)gas_remaining=gas_benchmark_valuetotal_gas_used=0txs=[]for_inrange(iteration_count):gas_available=min(tx_gas_limit_cap,gas_remaining)-intrinsic_cost# Split available gas: 60% for access lists, 40% for calldatagas_for_access_list=int(gas_available*0.6)gas_for_calldata=int(gas_available*0.4)# Access list gas costs from fork's gas_costsgas_costs=fork.gas_costs()gas_per_address=gas_costs.G_ACCESS_LIST_ADDRESSgas_per_storage_key=gas_costs.G_ACCESS_LIST_STORAGE# Calculate number of storage keys we can fitgas_after_address=gas_for_access_list-gas_per_addressnum_storage_keys=gas_after_address//gas_per_storage_key# Create access list with 1 address and many storage keysaccess_address=Address("0x1234567890123456789012345678901234567890")storage_keys=[]foriinrange(num_storage_keys):# Generate random-looking storage keysstorage_keys.append(Hash(i))access_list=[AccessList(address=access_address,storage_keys=storage_keys,)]# Calculate calldata with 29% of gas for zero bytes and 71% for# non-zero bytes# Token accounting: tokens_in_calldata = zero_bytes + 4 *# non_zero_bytes# We want to split the gas budget:# - 29% of gas_for_calldata for zero bytes# - 71% of gas_for_calldata for non-zero bytesmax_tokens_in_calldata=gas_for_calldata//total_cost_standard_per_token# Calculate how many tokens to allocate to each typetokens_for_zero_bytes=int(max_tokens_in_calldata*0.29)tokens_for_non_zero_bytes=max_tokens_in_calldata-tokens_for_zero_bytes# Convert tokens to actual byte counts# Zero bytes: 1 token per byte# Non-zero bytes: 4 tokens per bytenum_zero_bytes=tokens_for_zero_bytes# 1 token = 1 zero bytenum_non_zero_bytes=tokens_for_non_zero_bytes//4# 4 tokens = 1 non-zero byte# Create calldata with mixed bytescalldata=bytearray()# Add zero bytescalldata.extend(b"\x00"*num_zero_bytes)# Add non-zero bytes (random values from 0x01 to 0xff)rng=random.Random(42)# For reproducibilityfor_inrange(num_non_zero_bytes):calldata.append(rng.randint(1,255))# Shuffle the bytes to mix zero and non-zero bytescalldata_list=list(calldata)rng.shuffle(calldata_list)shuffled_calldata=bytes(calldata_list)txs.append(Transaction(to=pre.fund_eoa(amount=0),data=shuffled_calldata,gas_limit=gas_available+intrinsic_cost,sender=pre.fund_eoa(),access_list=access_list,))gas_remaining-=gas_for_access_list+intrinsic_costtotal_gas_used+=fork.transaction_intrinsic_cost_calculator()(calldata=shuffled_calldata,access_list=access_list,)benchmark_test(blocks=[Block(txs=txs)],expected_benchmark_gas_used=total_gas_used,)