@pytest.mark.valid_from("Cancun")@pytest.mark.slow()deftest_amortized_bn128_pairings(state_test:StateTestFiller,pre:Alloc,fork:Fork,):"""Test running a block with as many BN128 pairings as possible."""env=Environment()base_cost=45_000pairing_cost=34_000size_per_pairing=192gsc=fork.gas_costs()intrinsic_gas_calculator=fork.transaction_intrinsic_cost_calculator()mem_exp_gas_calculator=fork.memory_expansion_gas_calculator()# This is a theoretical maximum number of pairings that can be done in a block.# It is only used for an upper bound for calculating the optimal number of pairings below.maximum_number_of_pairings=(env.gas_limit-base_cost)//pairing_cost# Discover the optimal number of pairings balancing two dimensions:# 1. Amortize the precompile base cost as much as possible.# 2. The cost of the memory expansion.max_pairings=0optimal_per_call_num_pairings=0foriinrange(1,maximum_number_of_pairings+1):# We'll pass all pairing arguments via calldata.available_gas_after_intrinsic=env.gas_limit-intrinsic_gas_calculator(calldata=[0xFF]*size_per_pairing*i# 0xFF is to indicate non-zero bytes.)available_gas_after_expansion=max(0,available_gas_after_intrinsic-mem_exp_gas_calculator(new_bytes=i*size_per_pairing),)# This is ignoring "glue" opcodes, but helps to have a rough idea of the right# cutting point.approx_gas_cost_per_call=gsc.G_WARM_ACCOUNT_ACCESS+base_cost+i*pairing_costnum_precompile_calls=available_gas_after_expansion//approx_gas_cost_per_callnum_pairings_done=num_precompile_calls*i# Each precompile call does i pairings.ifnum_pairings_done>max_pairings:max_pairings=num_pairings_doneoptimal_per_call_num_pairings=icalldata=Op.CALLDATACOPY(size=Op.CALLDATASIZE)attack_block=Op.POP(Op.STATICCALL(Op.GAS,0x08,0,Op.CALLDATASIZE,0,0))code=code_loop_precompile_call(calldata,attack_block,fork)code_address=pre.deploy_contract(code=code)tx=Transaction(to=code_address,gas_limit=env.gas_limit,data=_generate_bn128_pairs(optimal_per_call_num_pairings,42),sender=pre.fund_eoa(),)state_test(env=env,pre=pre,post={},tx=tx,)