From 67801a7b46c522c79fdfd688f01caa8cf292c07c Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 15 Mar 2025 19:05:23 +0100 Subject: [PATCH 1/3] Add test for calling g1 msm --- crates/optimism/src/evm.rs | 67 +++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/crates/optimism/src/evm.rs b/crates/optimism/src/evm.rs index dc7981f696..958f6f3904 100644 --- a/crates/optimism/src/evm.rs +++ b/crates/optimism/src/evm.rs @@ -108,7 +108,7 @@ mod tests { context::result::{ExecutionResult, OutOfGasError}, context_interface::result::HaltReason, database::{BenchmarkDB, BENCH_CALLER, BENCH_CALLER_BALANCE, BENCH_TARGET}, - precompile::{bls12_381_const, bn128, u64_to_address}, + precompile::{bls12_381_const, bls12_381_utils, bn128, u64_to_address}, primitives::{Address, Bytes, TxKind, U256}, state::Bytecode, Context, ExecuteEvm, @@ -315,4 +315,69 @@ mod tests { } )); } + + #[test] + #[cfg(feature = "blst")] + fn test_halted_tx_call_bls12_381_g1_msm_input_wrong_size() { + let ctx = Context::op() + .modify_tx_chained(|tx| { + tx.base.kind = TxKind::Call(u64_to_address(bls12_381_const::G1_MSM_ADDRESS)); + tx.base.data = Bytes::from([1; bls12_381_const::G1_MSM_INPUT_LENGTH - 1]); + }) + .modify_chain_chained(|l1_block| { + l1_block.operator_fee_constant = Some(U256::ZERO); + l1_block.operator_fee_scalar = Some(U256::ZERO) + }) + .modify_cfg_chained(|cfg| cfg.spec = OpSpecId::ISTHMUS); + + let mut evm = ctx.build_op(); + + let output = evm.replay().unwrap(); + + // assert fails pre gas check, because input is wrong size + assert!(matches!( + output.result, + ExecutionResult::Halt { + reason: OpHaltReason::Base(HaltReason::PrecompileError), + .. + } + )); + } + + #[test] + #[cfg(feature = "blst")] + fn test_halted_tx_call_bls12_381_g1_msm_out_of_gas() { + let gs1_msm_gas = bls12_381_utils::msm_required_gas( + 1, + &bls12_381_const::DISCOUNT_TABLE_G1_MSM, + bls12_381_const::G1_MSM_BASE_GAS_FEE, + ); + + let ctx = Context::op() + .modify_tx_chained(|tx| { + tx.base.kind = TxKind::Call(u64_to_address(bls12_381_const::G1_MSM_ADDRESS)); + tx.base.data = Bytes::from([1; bls12_381_const::G1_MSM_INPUT_LENGTH]); + tx.base.gas_limit = 23_560 //initial gas for input + + gs1_msm_gas + - 1; // 1 gas low + }) + .modify_chain_chained(|l1_block| { + l1_block.operator_fee_constant = Some(U256::ZERO); + l1_block.operator_fee_scalar = Some(U256::ZERO) + }) + .modify_cfg_chained(|cfg| cfg.spec = OpSpecId::ISTHMUS); + + let mut evm = ctx.build_op(); + + let output = evm.replay().unwrap(); + + // assert out of gas + assert!(matches!( + output.result, + ExecutionResult::Halt { + reason: OpHaltReason::Base(HaltReason::OutOfGas(OutOfGasError::Precompile)), + .. + } + )); + } } From 26b9eb19a5cfd264ff09f19dca0cb75fa5b78479 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 15 Mar 2025 19:10:21 +0100 Subject: [PATCH 2/3] Drive-by, rename test --- crates/optimism/src/evm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/optimism/src/evm.rs b/crates/optimism/src/evm.rs index 958f6f3904..cca381b646 100644 --- a/crates/optimism/src/evm.rs +++ b/crates/optimism/src/evm.rs @@ -290,7 +290,7 @@ mod tests { #[test] #[cfg(feature = "blst")] - fn test_halted_tx_call_bls12_381_g1_add_input_too_small() { + fn test_halted_tx_call_bls12_381_g1_add_input_wrong_size() { let ctx = Context::op() .modify_tx_chained(|tx| { tx.base.kind = TxKind::Call(u64_to_address(bls12_381_const::G1_ADD_ADDRESS)); From 56ff535124d869ebdaa8837bddaa13acd0c76f73 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 17 Mar 2025 10:00:50 -0100 Subject: [PATCH 3/3] Add test for showing gas calculation passes --- crates/optimism/src/evm.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/crates/optimism/src/evm.rs b/crates/optimism/src/evm.rs index cca381b646..5ee70e00f0 100644 --- a/crates/optimism/src/evm.rs +++ b/crates/optimism/src/evm.rs @@ -380,4 +380,40 @@ mod tests { } )); } + + #[test] + #[cfg(feature = "blst")] + fn test_halted_tx_call_bls12_381_g1_msm_wrong_input_layout() { + let gs1_msm_gas = bls12_381_utils::msm_required_gas( + 1, + &bls12_381_const::DISCOUNT_TABLE_G1_MSM, + bls12_381_const::G1_MSM_BASE_GAS_FEE, + ); + + let ctx = Context::op() + .modify_tx_chained(|tx| { + tx.base.kind = TxKind::Call(u64_to_address(bls12_381_const::G1_MSM_ADDRESS)); + tx.base.data = Bytes::from([1; bls12_381_const::G1_MSM_INPUT_LENGTH]); + tx.base.gas_limit = 23_560 //initial gas for input + + gs1_msm_gas; + }) + .modify_chain_chained(|l1_block| { + l1_block.operator_fee_constant = Some(U256::ZERO); + l1_block.operator_fee_scalar = Some(U256::ZERO) + }) + .modify_cfg_chained(|cfg| cfg.spec = OpSpecId::ISTHMUS); + + let mut evm = ctx.build_op(); + + let output = evm.replay().unwrap(); + + // assert fails post gas check, because input is wrong layout + assert!(matches!( + output.result, + ExecutionResult::Halt { + reason: OpHaltReason::Base(HaltReason::PrecompileError), + .. + } + )); + } }