diff --git a/Cargo.lock b/Cargo.lock index 85e6167f7793..5f355e51fe25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10114,6 +10114,7 @@ dependencies = [ "codegen 0.1.0", "ethereum-types 0.12.1", "hex", + "lazy_static", "num 0.3.1", "num_enum 0.6.1", "once_cell", diff --git a/core/lib/types/Cargo.toml b/core/lib/types/Cargo.toml index 594160c27287..fe2a0508a01f 100644 --- a/core/lib/types/Cargo.toml +++ b/core/lib/types/Cargo.toml @@ -37,6 +37,7 @@ thiserror = "1.0" num_enum = "0.6" hex = "0.4" prost = "0.12.1" +lazy_static = "1.4.0" # Crypto stuff # TODO (PLA-440): remove parity-crypto diff --git a/core/lib/types/src/commitment.rs b/core/lib/types/src/commitment.rs index 3c4ec610d280..0961c347b871 100644 --- a/core/lib/types/src/commitment.rs +++ b/core/lib/types/src/commitment.rs @@ -8,7 +8,9 @@ use std::{collections::HashMap, convert::TryFrom}; +use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; +use std::sync::{Arc, Mutex}; use zksync_mini_merkle_tree::MiniMerkleTree; use zksync_system_constants::{ L2_TO_L1_LOGS_TREE_ROOT_KEY, STATE_DIFF_HASH_KEY, ZKPORTER_IS_AVAILABLE, @@ -27,6 +29,18 @@ use crate::{ H256, KNOWN_CODES_STORAGE_ADDRESS, U256, }; +#[derive(Debug, Default)] +struct L2Pubdata { + l2_to_l1_messages: Vec, + factory_deps: Vec, + state_diffs_compressed: Vec, +} + +// Create a global instance of the data using Mutex +lazy_static! { + static ref L2_PUBDATA: Mutex = Mutex::new(L2Pubdata::default()); +} + /// Type that can be serialized for commitment. pub trait SerializeCommitment { /// Size of the structure in bytes. @@ -248,8 +262,34 @@ impl L1BatchWithMetadata { // Extend with Compressed StateDiffs res.extend(&self.metadata.state_diffs_compressed); - } + } else { + let mut l2_pubdata = L2_PUBDATA.lock().unwrap(); + l2_pubdata + .l2_to_l1_messages + .extend((self.header.l2_to_l1_messages.len() as u32).to_be_bytes()); + for msg in &self.header.l2_to_l1_messages { + l2_pubdata + .l2_to_l1_messages + .extend((msg.len() as u32).to_be_bytes()); + l2_pubdata.l2_to_l1_messages.extend(msg); + } + // Process and Pack Bytecodes + l2_pubdata + .factory_deps + .extend((self.factory_deps.len() as u32).to_be_bytes()); + for bytecode in &self.factory_deps { + l2_pubdata + .factory_deps + .extend((bytecode.len() as u32).to_be_bytes()); + l2_pubdata.factory_deps.extend(bytecode); + } + + // Extend with Compressed StateDiffs + l2_pubdata + .state_diffs_compressed + .extend(&self.metadata.state_diffs_compressed); + } res } } diff --git a/era-contracts-lambda b/era-contracts-lambda new file mode 160000 index 000000000000..7fe797934f1e --- /dev/null +++ b/era-contracts-lambda @@ -0,0 +1 @@ +Subproject commit 7fe797934f1ef198d0ef8362c4422928778d7236