diff --git a/src/kernel_evm/ethereum/src/block.rs b/src/kernel_evm/ethereum/src/block.rs index c59e85801d4422e46c93f762754613c9cbe5417d..8e71c9b49541f181c662c684e68e130526fec4bd 100644 --- a/src/kernel_evm/ethereum/src/block.rs +++ b/src/kernel_evm/ethereum/src/block.rs @@ -42,7 +42,7 @@ impl BlockConstants { /// Return the first block of the chain (genisis). /// TODO find suitable values for gas_limit et.c. /// To be done in . - pub fn first_block(timestamp: U256) -> Self { + pub fn first_block(timestamp: U256, chain_id: U256) -> Self { Self { gas_price: U256::one(), number: U256::zero(), @@ -51,7 +51,7 @@ impl BlockConstants { difficulty: U256::zero(), gas_limit: 1u64, base_fee_per_gas: U256::one(), - chain_id: U256::zero(), + chain_id, } } } @@ -107,7 +107,7 @@ impl L2Block { } } - pub fn constants(&self) -> BlockConstants { + pub fn constants(&self, chain_id: U256) -> BlockConstants { let timestamp = U256::from(self.timestamp.as_u64()); BlockConstants { gas_price: U256::one(), @@ -117,7 +117,7 @@ impl L2Block { difficulty: self.difficulty, gas_limit: self.gas_limit, base_fee_per_gas: U256::one(), - chain_id: U256::zero(), + chain_id, } } } diff --git a/src/kernel_evm/evm_execution/src/handler.rs b/src/kernel_evm/evm_execution/src/handler.rs index 6cc8a8adef0c405c4a3e0db6c53eeec2587bfa0b..9c75daf2b69863742403896cedf9d233383d7a4b 100644 --- a/src/kernel_evm/evm_execution/src/handler.rs +++ b/src/kernel_evm/evm_execution/src/handler.rs @@ -1514,7 +1514,7 @@ mod test { #[test] fn legacy_create_to_correct_address() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1549,7 +1549,7 @@ mod test { #[test] fn create2_to_correct_address() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1583,7 +1583,7 @@ mod test { #[test] fn create2_to_correct_address_nonzero_salt() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1620,7 +1620,7 @@ mod test { #[test] fn origin_instruction_returns_origin_address() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1679,7 +1679,7 @@ mod test { #[test] fn contract_call_produces_correct_output() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1773,7 +1773,7 @@ mod test { #[test] fn contract_call_fails_beyond_max_stack_depth() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1873,7 +1873,7 @@ mod test { #[test] fn contract_call_succeeds_at_maximum_stack_depth() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -1960,7 +1960,7 @@ mod test { #[test] fn contract_can_use_durable_storage() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -2026,7 +2026,7 @@ mod test { #[test] fn contract_create_can_use_durable_storage() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -2072,7 +2072,7 @@ mod test { #[test] fn contract_call_does_transfer() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -2129,7 +2129,7 @@ mod test { #[test] fn contract_call_fails_when_insufficient_funds_for_transfer() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); @@ -2188,7 +2188,7 @@ mod test { #[test] fn revert_can_return_a_value() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_account_storage().unwrap(); let config = Config::london(); diff --git a/src/kernel_evm/evm_execution/src/lib.rs b/src/kernel_evm/evm_execution/src/lib.rs index d1f2317dd406b97c17e2dd7da15820a3c8cc9592..910392c6851b29830c6995b7e3280c8d313ce8ba 100644 --- a/src/kernel_evm/evm_execution/src/lib.rs +++ b/src/kernel_evm/evm_execution/src/lib.rs @@ -265,7 +265,7 @@ mod test { #[test] fn transfer_without_sufficient_funds_fails() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -325,7 +325,7 @@ mod test { #[test] fn transfer_funds_with_sufficient_balance() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -386,7 +386,7 @@ mod test { #[test] fn create_contract_fails_with_insufficient_funds() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -435,7 +435,7 @@ mod test { #[test] fn create_contract_succeeds_with_valid_initialization() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -563,7 +563,7 @@ mod test { #[test] fn create_contract_erc20_succeeds() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -608,7 +608,7 @@ mod test { #[test] fn create_contract_fails_when_initialization_fails() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -661,7 +661,7 @@ mod test { fn call_non_existing_contract() { // Arange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117u64); @@ -792,7 +792,7 @@ mod test { fn call_simple_return_contract() { // Arrange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117u64); @@ -847,7 +847,7 @@ mod test { fn call_simple_revert_contract() { // Arrange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117u64); @@ -902,7 +902,7 @@ mod test { fn call_contract_with_invalid_opcode() { // Arrange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117u64); @@ -950,7 +950,7 @@ mod test { #[test] fn no_transfer_when_contract_call_fails() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let caller = H160::from_low_u64_be(118_u64); @@ -1011,7 +1011,7 @@ mod test { fn call_precompiled_contract() { // Arrange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let target = H160::from_low_u64_be(4u64); let mut evm_account_storage = init_evm_account_storage().unwrap(); @@ -1057,7 +1057,7 @@ mod test { fn create_and_call_contract() { // Arrange let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117u64); @@ -1154,7 +1154,7 @@ mod test { #[test] fn static_calls_cannot_update_storage() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117_u64); @@ -1239,7 +1239,7 @@ mod test { #[test] fn static_calls_fail_when_logging() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117_u64); @@ -1323,7 +1323,7 @@ mod test { #[test] fn logs_get_written_to_output() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117_u64); @@ -1437,7 +1437,7 @@ mod test { #[test] fn no_logs_when_contract_reverts() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(117_u64); @@ -1536,7 +1536,7 @@ mod test { #[test] fn contract_selfdestruct_deletes_contract() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(42_u64); @@ -1642,7 +1642,7 @@ mod test { #[test] fn selfdestruct_is_ignored_when_call_fails() { let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = init_evm_account_storage().unwrap(); let target = H160::from_low_u64_be(42_u64); @@ -1752,4 +1752,66 @@ mod test { 0.into() ); } + + #[test] + fn test_chain_id() { + // Arrange + let mut mock_runtime = MockHost::default(); + let chain_id = U256::from(42); + let mut chain_id_bytes = [0u8; 32]; + chain_id.to_big_endian(&mut chain_id_bytes); + let block = BlockConstants::first_block(U256::zero(), chain_id); + let precompiles = precompiles::precompile_set::(); + let mut evm_account_storage = init_evm_account_storage().unwrap(); + let target = H160::from_low_u64_be(117u64); + let caller = H160::from_low_u64_be(118u64); + let data = [0u8; 32]; // Need some data to make it a call + let code = vec![ + Opcode::CHAINID.as_u8(), + Opcode::PUSH1.as_u8(), // push ost + 0, + Opcode::MSTORE.as_u8(), + Opcode::PUSH1.as_u8(), // push len + 32, + Opcode::PUSH1.as_u8(), // push ost + 0, + Opcode::RETURN.as_u8(), + ]; + let all_the_gas = 21_017_u64; + + set_balance( + &mut mock_runtime, + &mut evm_account_storage, + &caller, + all_the_gas.into(), + ); + + set_account_code(&mut mock_runtime, &mut evm_account_storage, &target, &code); + + // Act + let result = run_transaction( + &mut mock_runtime, + &block, + &mut evm_account_storage, + &precompiles, + CONFIG, + Some(target), + caller, + data.to_vec(), + Some(all_the_gas), + None, + true, + ); + + // Assert + let expected_result = Ok(Some(ExecutionOutcome { + gas_used: 21017, + is_success: true, + new_address: None, + logs: vec![], + result: Some(chain_id_bytes.into()), + withdrawals: vec![], + })); + assert_eq!(result, expected_result); + } } diff --git a/src/kernel_evm/evm_execution/src/precompiles.rs b/src/kernel_evm/evm_execution/src/precompiles.rs index 9ce9baed1fe7b5a552216cafda70b683d4fb67a1..84af2b10907d3e46c74e796b842fd5d34c5809a0 100644 --- a/src/kernel_evm/evm_execution/src/precompiles.rs +++ b/src/kernel_evm/evm_execution/src/precompiles.rs @@ -211,7 +211,7 @@ mod tests { ) -> Option> { let caller = H160::from_low_u64_be(118u64); let mut mock_runtime = MockHost::default(); - let block = BlockConstants::first_block(U256::zero()); + let block = BlockConstants::first_block(U256::zero(), U256::one()); let mut evm_account_storage = init_evm_account_storage().unwrap(); let precompiles = precompile_set::(); let config = Config::london(); diff --git a/src/kernel_evm/kernel/src/block.rs b/src/kernel_evm/kernel/src/block.rs index ee262302974efb01204e5f552196a5de905d8133..130601b6b7a9c27643c9143b4189812176aa9182 100644 --- a/src/kernel_evm/kernel/src/block.rs +++ b/src/kernel_evm/kernel/src/block.rs @@ -114,14 +114,18 @@ fn compute( pub fn produce( host: &mut Host, queue: Queue, + chain_id: U256, ) -> Result<(), anyhow::Error> { let (mut current_constants, mut current_block_number) = match storage::read_current_block(host) { - Ok(block) => (block.constants(), block.number + 1), + Ok(block) => (block.constants(chain_id), block.number + 1), Err(_) => { let timestamp = current_timestamp(host); let timestamp = U256::from(timestamp.as_u64()); - (BlockConstants::first_block(timestamp), U256::zero()) + ( + BlockConstants::first_block(timestamp, chain_id), + U256::zero(), + ) } }; let mut evm_account_storage = @@ -166,7 +170,7 @@ pub fn produce( .finalize_and_store(host) .context("Failed to finalize the block in progress")?; current_block_number = new_block.number + 1; - current_constants = new_block.constants(); + current_constants = new_block.constants(chain_id); storage::delete_block_in_progress(host)?; } } @@ -183,6 +187,7 @@ mod tests { use crate::inbox::TransactionContent; use crate::inbox::TransactionContent::Ethereum; use crate::indexable_storage::internal_for_tests::{get_value, length}; + use crate::retrieve_chain_id; use crate::storage::internal_for_tests::{ read_transaction_receipt, read_transaction_receipt_status, }; @@ -248,13 +253,15 @@ mod tests { account.balance(host).unwrap() } + const DUMMY_CHAIN_ID: U256 = U256::one(); + fn dummy_eth_gen_transaction( nonce: U256, v: U256, r: H256, s: H256, ) -> EthereumTransactionCommon { - let chain_id = U256::one(); + let chain_id = DUMMY_CHAIN_ID; let gas_price = U256::from(40000000u64); let gas_limit = 21000u64; let to = address_from_str("423163e58aabec5daa3dd1130b759d24bef0f6ea"); @@ -316,7 +323,7 @@ mod tests { let tx = EthereumTransactionCommon { type_: tezos_ethereum::transaction::TransactionType::Legacy, - chain_id: U256::one(), + chain_id: DUMMY_CHAIN_ID, nonce, max_priority_fee_per_gas: gas_price, max_fee_per_gas: gas_price, @@ -370,7 +377,7 @@ mod tests { U256::from(10000000000000000000u64), ); - produce(host, queue).expect("The block production failed.") + produce(host, queue, DUMMY_CHAIN_ID).expect("The block production failed.") } fn assert_current_block_reading_validity(host: &mut MockHost) { @@ -400,7 +407,7 @@ mod tests { kernel_upgrade: None, }; - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let status = read_transaction_receipt_status(&mut host, &tx_hash) .expect("Should have found receipt"); @@ -434,7 +441,7 @@ mod tests { U256::from(5000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let status = read_transaction_receipt_status(&mut host, &tx_hash) .expect("Should have found receipt"); @@ -472,7 +479,7 @@ mod tests { U256::from(5000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let receipt = read_transaction_receipt(&mut host, &tx_hash) .expect("should have found receipt"); @@ -535,7 +542,7 @@ mod tests { U256::from(10000000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let dest_address = H160::from_str("423163e58aabec5daa3dd1130b759d24bef0f6ea").unwrap(); @@ -579,7 +586,7 @@ mod tests { U256::from(10000000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let receipt0 = read_transaction_receipt(&mut host, &tx_hash_0) .expect("should have found receipt"); let receipt1 = read_transaction_receipt(&mut host, &tx_hash_1) @@ -630,7 +637,7 @@ mod tests { U256::from(10000000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let dest_address = H160::from_str("423163e58aabec5daa3dd1130b759d24bef0f6ea").unwrap(); @@ -662,7 +669,7 @@ mod tests { let indexed_accounts = length(&host, &accounts_index).unwrap(); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let indexed_accounts_after_produce = length(&host, &accounts_index).unwrap(); @@ -693,7 +700,7 @@ mod tests { kernel_upgrade: None, }; - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let indexed_accounts = length(&host, &accounts_index).unwrap(); @@ -702,7 +709,8 @@ mod tests { kernel_upgrade: None, }; - produce(&mut host, next_queue).expect("The block production failed."); + produce(&mut host, next_queue, DUMMY_CHAIN_ID) + .expect("The block production failed."); let indexed_accounts_after_second_produce = length(&host, &accounts_index).unwrap(); @@ -746,7 +754,7 @@ mod tests { &sender, U256::from(10000000000000000000u64), ); - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let new_number_of_blocks_indexed = length(&host, &blocks_index).unwrap(); let new_number_of_transactions_indexed = @@ -781,7 +789,9 @@ mod tests { fn first_block(host: &mut MockHost) -> BlockConstants { let timestamp = current_timestamp(host); let timestamp = U256::from(timestamp.as_u64()); - BlockConstants::first_block(timestamp) + let chain_id = retrieve_chain_id(host); + assert!(chain_id.is_ok(), "chain_id should be defined"); + BlockConstants::first_block(timestamp, chain_id.unwrap()) } fn compute_block( @@ -977,7 +987,8 @@ mod tests { // Ensures the caller has enough balance to pay for the fees, but not // the transaction itself, otherwise the transaction will not even be // taken into account. - let fees = BlockConstants::first_block(U256::from(0)).gas_price * tx.gas_limit; + let fees = BlockConstants::first_block(U256::from(0), DUMMY_CHAIN_ID).gas_price + * tx.gas_limit; set_balance(&mut host, &mut evm_account_storage, &caller, fees); // Prepare a invalid transaction, i.e. with not enough funds. @@ -992,7 +1003,7 @@ mod tests { }; // Apply the transaction - produce(&mut host, queue).expect("The block production failed."); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("The block production failed."); let receipt = read_transaction_receipt(&mut host, &tx_hash) .expect("should have found receipt"); assert_eq!( @@ -1035,17 +1046,17 @@ mod tests { let mut host = MockHost::default(); // first block should be 0 - produce(&mut host, almost_empty_queue()) + produce(&mut host, almost_empty_queue(), DUMMY_CHAIN_ID) .expect("Empty block should have been produced"); check_current_block_number(&mut host, 0); // second block - produce(&mut host, almost_empty_queue()) + produce(&mut host, almost_empty_queue(), DUMMY_CHAIN_ID) .expect("Empty block should have been produced"); check_current_block_number(&mut host, 1); // third block - produce(&mut host, almost_empty_queue()) + produce(&mut host, almost_empty_queue(), DUMMY_CHAIN_ID) .expect("Empty block should have been produced"); check_current_block_number(&mut host, 2); } @@ -1127,7 +1138,7 @@ mod tests { host.reboot_left().expect("should be some reboot left"); - produce(&mut host, queue).expect("Should have produced"); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("Should have produced"); // test no new block assert!( @@ -1178,7 +1189,7 @@ mod tests { kernel_upgrade: None, }; - produce(&mut host, queue).expect("Should have produced"); + produce(&mut host, queue, DUMMY_CHAIN_ID).expect("Should have produced"); // test no new block assert!( diff --git a/src/kernel_evm/kernel/src/lib.rs b/src/kernel_evm/kernel/src/lib.rs index b351c3a80832515976cbc0e1cb5f73519a1f6b7b..1aed2cc3f5706ea3277be83979ab41a42c3874d2 100644 --- a/src/kernel_evm/kernel/src/lib.rs +++ b/src/kernel_evm/kernel/src/lib.rs @@ -124,11 +124,12 @@ fn produce_and_upgrade( host: &mut Host, queue: Queue, kernel_upgrade: KernelUpgrade, + chain_id: U256, ) -> Result<(), anyhow::Error> { // Since a kernel upgrade was detected, in case an error is thrown // by the block production, we exceptionally "recover" from it and // still process the kernel upgrade. - if let Err(e) = block::produce(host, queue) { + if let Err(e) = block::produce(host, queue, chain_id) { log!( host, Error, @@ -149,13 +150,14 @@ fn produce_and_upgrade( pub fn stage_two( host: &mut Host, queue: Queue, + chain_id: U256, ) -> Result<(), anyhow::Error> { log!(host, Info, "Entering stage two."); let kernel_upgrade = queue.kernel_upgrade.clone(); if let Some(kernel_upgrade) = kernel_upgrade { - produce_and_upgrade(host, queue, kernel_upgrade) + produce_and_upgrade(host, queue, kernel_upgrade, chain_id) } else { - block::produce(host, queue) + block::produce(host, queue, chain_id) } } @@ -216,6 +218,7 @@ fn fetch_queue_left(host: &mut Host) -> Result(host: &mut Host) -> Result<(), anyhow::Error> { + let chain_id = retrieve_chain_id(host).context("Failed to retrieve chain id")?; let queue = if storage::was_rebooted(host)? { // kernel was rebooted log!( @@ -238,7 +241,6 @@ pub fn main(host: &mut Host) -> Result<(), anyhow::Error> { retrieve_chain_id(host).context("Failed to retrieve chain id")?; let ticketer = read_ticketer(host); let admin = read_admin(host); - stage_one(host, smart_rollup_address, chain_id, ticketer, admin) .context("Failed during stage 1")? } @@ -246,7 +248,7 @@ pub fn main(host: &mut Host) -> Result<(), anyhow::Error> { } }; - stage_two(host, queue).context("Failed during stage 2") + stage_two(host, queue, chain_id).context("Failed during stage 2") } const EVM_PATH: RefPath = RefPath::assert_from(b"/evm"); diff --git a/src/kernel_evm/kernel/src/simulation.rs b/src/kernel_evm/kernel/src/simulation.rs index a6bedc1cd8d323cee1ca482eedaa19014675bd7c..a25f465b9b5f459905f8863993585ff4c4ff7950 100644 --- a/src/kernel_evm/kernel/src/simulation.rs +++ b/src/kernel_evm/kernel/src/simulation.rs @@ -9,7 +9,7 @@ use crate::{error::Error, error::StorageError, storage}; -use crate::{current_timestamp, parsable, parsing, CONFIG}; +use crate::{current_timestamp, parsable, parsing, retrieve_chain_id, CONFIG}; use evm_execution::{account_storage, handler::ExecutionOutcome, precompiles}; use primitive_types::{H160, U256}; @@ -87,7 +87,8 @@ impl Evaluation { ) -> Result, Error> { let timestamp = current_timestamp(host); let timestamp = U256::from(timestamp.as_u64()); - let block_constants = BlockConstants::first_block(timestamp); + let chain_id = retrieve_chain_id(host)?; + let block_constants = BlockConstants::first_block(timestamp, chain_id); let mut evm_account_storage = account_storage::init_account_storage() .map_err(|_| Error::Storage(StorageError::AccountInitialisation))?; let precompiles = precompiles::precompile_set::(); @@ -391,7 +392,7 @@ mod tests { }; use tezos_smart_rollup_mock::MockHost; - use crate::current_timestamp; + use crate::{current_timestamp, retrieve_chain_id}; use super::*; @@ -473,7 +474,9 @@ mod tests { { let timestamp = current_timestamp(host); let timestamp = U256::from(timestamp.as_u64()); - let block = BlockConstants::first_block(timestamp); + let chain_id = retrieve_chain_id(host); + assert!(chain_id.is_ok(), "chain_id should be defined"); + let block = BlockConstants::first_block(timestamp, chain_id.unwrap()); let precompiles = precompiles::precompile_set::(); let mut evm_account_storage = account_storage::init_account_storage().unwrap();