diff --git a/Cargo.lock b/Cargo.lock index ef4bfbd41ad0..de8460372bba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8108,9 +8108,9 @@ dependencies = [ [[package]] name = "zksync_concurrency" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28279a743cd2ec5a0e3f0fec31b2e4fdd509d0b513e0aaeb000200ce464123e5" +checksum = "1af85d9a31c534a29877c88474cf5f1c46ad25f7c48efff61ea40f4aa83c5459" dependencies = [ "anyhow", "once_cell", @@ -8142,9 +8142,9 @@ dependencies = [ [[package]] name = "zksync_consensus_bft" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011210cdeb207516fe95ec2c8a77b3c36e444e2cd17e7db57afdc55a263025d6" +checksum = "ddbee11ed4fafe461092fb73d3879325f08243fe50351baab6b5f593fee88f06" dependencies = [ "anyhow", "async-trait", @@ -8164,9 +8164,9 @@ dependencies = [ [[package]] name = "zksync_consensus_crypto" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbbc36ff78548f022192f20fb76909b1b0a460fc85289ccc54ce0ce54263165" +checksum = "7b3867f9b4778616d87f157d1049e47290a3bca5ec9db208164f8902524ae92c" dependencies = [ "anyhow", "blst", @@ -8188,9 +8188,9 @@ dependencies = [ [[package]] name = "zksync_consensus_executor" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f6811105b9b0fffb5983382c504d466a415f41f4a3b0f6743837bcbfc0b332" +checksum = "2e7d50aa34616a9c1f4cdc7c47aae2df61474e137e41125c9d5fbfc1e5a1faaa" dependencies = [ "anyhow", "rand 0.8.5", @@ -8208,9 +8208,9 @@ dependencies = [ [[package]] name = "zksync_consensus_network" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79538ef206af7006c94c8d047582cf214ac493f7dd8340d40cace4f248d8c35" +checksum = "ced7deafe460c74321edf79486980f9f75da121a1e52e5805392946dabafdf82" dependencies = [ "anyhow", "async-trait", @@ -8243,9 +8243,9 @@ dependencies = [ [[package]] name = "zksync_consensus_roles" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0070c54eed2f5cf26e76d9ec3ccdf05fdafb18c0712c8d97ef4987634972396" +checksum = "55dacdf1bad5d9efe7dd9db200421afa0c3bf5cfc7fdce4a64720a5dd0685807" dependencies = [ "anyhow", "bit-vec", @@ -8265,9 +8265,9 @@ dependencies = [ [[package]] name = "zksync_consensus_storage" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d221fbd8e22f49175132c252a4923a945c1fa4a548ad66c3fc0366789cc9e53" +checksum = "f796020459775391094b9dcd133f01b5127059fe167cf412b2d1aed23fe0e52f" dependencies = [ "anyhow", "async-trait", @@ -8277,6 +8277,7 @@ dependencies = [ "tracing", "vise", "zksync_concurrency", + "zksync_consensus_crypto", "zksync_consensus_roles", "zksync_protobuf", "zksync_protobuf_build", @@ -8284,9 +8285,9 @@ dependencies = [ [[package]] name = "zksync_consensus_utils" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c3d9b3b6b795ce16e0ead2b8813a2f7a1a01c9a9e3fb50993d6ecbfcdbca98" +checksum = "587de103f745d0b88b49a9fb98cb002c4b7ce6ad042e17845091dce67b8aa984" dependencies = [ "anyhow", "rand 0.8.5", @@ -9231,9 +9232,9 @@ dependencies = [ [[package]] name = "zksync_protobuf" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe77d262206bb22f4bc26e75b68466b2e7043baa4963fe97190ce8540a5d700" +checksum = "d86baa84d8bbbbeea269c0f99aca88364e4fd2a08e6ae7051ff87317132b4ef9" dependencies = [ "anyhow", "bit-vec", @@ -9252,9 +9253,9 @@ dependencies = [ [[package]] name = "zksync_protobuf_build" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1205d607aa7291e3e016ce202d97cd7eb7d232913076dd873cbe48d564bf656" +checksum = "f221ce83f4622c3d8732d09f4461d116d7b10f1cc9d1d1cd014c1fa836c168e6" dependencies = [ "anyhow", "heck 0.5.0", diff --git a/Cargo.toml b/Cargo.toml index b9e24fe6fb53..f36af0a33c3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -207,16 +207,16 @@ zk_evm_1_4_1 = { package = "zk_evm", version = "0.141.0" } zk_evm_1_5_0 = { package = "zk_evm", version = "0.150.0" } # Consensus dependencies. -zksync_concurrency = "=0.1.0-rc.1" -zksync_consensus_bft = "=0.1.0-rc.1" -zksync_consensus_crypto = "=0.1.0-rc.1" -zksync_consensus_executor = "=0.1.0-rc.1" -zksync_consensus_network = "=0.1.0-rc.1" -zksync_consensus_roles = "=0.1.0-rc.1" -zksync_consensus_storage = "=0.1.0-rc.1" -zksync_consensus_utils = "=0.1.0-rc.1" -zksync_protobuf = "=0.1.0-rc.1" -zksync_protobuf_build = "=0.1.0-rc.1" +zksync_concurrency = "=0.1.0-rc.2" +zksync_consensus_bft = "=0.1.0-rc.2" +zksync_consensus_crypto = "=0.1.0-rc.2" +zksync_consensus_executor = "=0.1.0-rc.2" +zksync_consensus_network = "=0.1.0-rc.2" +zksync_consensus_roles = "=0.1.0-rc.2" +zksync_consensus_storage = "=0.1.0-rc.2" +zksync_consensus_utils = "=0.1.0-rc.2" +zksync_protobuf = "=0.1.0-rc.2" +zksync_protobuf_build = "=0.1.0-rc.2" # "Local" dependencies zksync_multivm = { path = "core/lib/multivm" } diff --git a/core/lib/config/src/configs/consensus.rs b/core/lib/config/src/configs/consensus.rs index ec4edd486ac0..50885a6ec6fe 100644 --- a/core/lib/config/src/configs/consensus.rs +++ b/core/lib/config/src/configs/consensus.rs @@ -120,6 +120,13 @@ pub struct ConsensusConfig { /// Maximal allowed size of the payload in bytes. pub max_payload_size: usize, + /// Maximal allowed size of the sync-batch payloads in bytes. + /// + /// The batch consists of block payloads and a Merkle proof of inclusion on L1 (~1kB), + /// so the maximum batch size should be the maximum payload size times the maximum number + /// of blocks in a batch. + pub max_batch_size: usize, + /// Limit on the number of inbound connections outside /// of the `static_inbound` set. pub gossip_dynamic_inbound_limit: usize, diff --git a/core/lib/config/src/testonly.rs b/core/lib/config/src/testonly.rs index c41180fe42b3..b9a78676697e 100644 --- a/core/lib/config/src/testonly.rs +++ b/core/lib/config/src/testonly.rs @@ -755,6 +755,7 @@ impl Distribution for EncodeDist { server_addr: self.sample(rng), public_addr: Host(self.sample(rng)), max_payload_size: self.sample(rng), + max_batch_size: self.sample(rng), gossip_dynamic_inbound_limit: self.sample(rng), gossip_static_inbound: self .sample_range(rng) diff --git a/core/lib/dal/src/consensus_dal.rs b/core/lib/dal/src/consensus_dal.rs index 3efdf5ee577b..7655abbe230c 100644 --- a/core/lib/dal/src/consensus_dal.rs +++ b/core/lib/dal/src/consensus_dal.rs @@ -7,7 +7,7 @@ use zksync_db_connection::{ error::{DalError, DalResult, SqlxContext}, instrument::{InstrumentExt, Instrumented}, }; -use zksync_types::{L1BatchNumber, L2BlockNumber}; +use zksync_types::L2BlockNumber; pub use crate::consensus::Payload; use crate::{Core, CoreDal}; @@ -409,29 +409,12 @@ impl ConsensusDal<'_, '_> { /// /// Insertion is allowed even if it creates gaps in the L1 batch history. /// - /// It fails if the batch payload is missing or it's not consistent with the QC. + /// This method assumes that all payload validation has been carried out by the caller. pub async fn insert_batch_certificate( &mut self, cert: &attester::BatchQC, ) -> Result<(), InsertCertificateError> { - use InsertCertificateError as E; - let mut txn = self.storage.start_transaction().await?; - - let l1_batch_number = L1BatchNumber(cert.message.number.0 as u32); - let _l1_batch_header = txn - .blocks_dal() - .get_l1_batch_header(l1_batch_number) - .await? - .ok_or(E::MissingPayload)?; - - // TODO: Verify that the certificate matches the stored batch: - // * add the hash of the batch to the `BatchQC` - // * find out which field in the `l1_batches` table contains the hash we need to match - // * ideally move the responsibility of validation outside this method - - // if header.payload != want_payload.encode().hash() { - // return Err(E::PayloadMismatch); - // } + let l1_batch_number = cert.message.number.0 as i64; let res = sqlx::query!( r#" @@ -441,20 +424,18 @@ impl ConsensusDal<'_, '_> { ($1, $2, NOW(), NOW()) ON CONFLICT (l1_batch_number) DO NOTHING "#, - i64::from(l1_batch_number.0), + l1_batch_number, zksync_protobuf::serde::serialize(cert, serde_json::value::Serializer).unwrap(), ) .instrument("insert_batch_certificate") .report_latency() - .execute(&mut txn) + .execute(self.storage) .await?; if res.rows_affected().is_zero() { - tracing::debug!(%l1_batch_number, "duplicate batch certificate"); + tracing::debug!(l1_batch_number, "duplicate batch certificate"); } - txn.commit().await.context("commit")?; - Ok(()) } @@ -551,7 +532,8 @@ mod tests { // Insert some mock L2 blocks and L1 batches let mut block_number = 0; let mut batch_number = 0; - for _ in 0..3 { + let num_batches = 3; + for _ in 0..num_batches { for _ in 0..3 { block_number += 1; let l2_block = create_l2_block_header(block_number); @@ -612,5 +594,11 @@ mod tests { .insert_batch_certificate(&cert3) .await .expect_err("missing payload"); + + // Insert one more L1 batch without a certificate. + conn.blocks_dal() + .insert_mock_l1_batch(&create_l1_batch_header(batch_number + 1)) + .await + .unwrap(); } } diff --git a/core/lib/protobuf_config/src/consensus.rs b/core/lib/protobuf_config/src/consensus.rs index c04120edcc54..a659a6f16abc 100644 --- a/core/lib/protobuf_config/src/consensus.rs +++ b/core/lib/protobuf_config/src/consensus.rs @@ -4,7 +4,7 @@ use zksync_config::configs::consensus::{ AttesterPublicKey, ConsensusConfig, GenesisSpec, Host, NodePublicKey, ProtocolVersion, RpcConfig, ValidatorPublicKey, WeightedAttester, WeightedValidator, }; -use zksync_protobuf::{read_optional, repr::ProtoRepr, required, ProtoFmt}; +use zksync_protobuf::{kB, read_optional, repr::ProtoRepr, required, ProtoFmt}; use crate::{proto::consensus as proto, read_optional_repr}; @@ -100,14 +100,31 @@ impl ProtoRepr for proto::Config { let addr = Host(required(&e.addr).context("addr")?.clone()); anyhow::Ok((key, addr)) }; + + let max_payload_size = required(&self.max_payload_size) + .and_then(|x| Ok((*x).try_into()?)) + .context("max_payload_size")?; + + let max_batch_size = match self.max_batch_size { + Some(x) => x.try_into().context("max_batch_size")?, + None => { + // Compute a default batch size, so operators are not caught out by the missing setting + // while we're still working on batch syncing. The batch interval is ~1 minute, + // so there will be ~60 blocks, and an Ethereum Merkle proof is ~1kB, but under high + // traffic there can be thousands of huge transactions that quickly fill up blocks + // and there could be more blocks in a batch then expected. We chose a generous + // limit so as not to prevent any legitimate batch from being transmitted. + max_payload_size * 5000 + kB + } + }; + Ok(Self::Type { server_addr: required(&self.server_addr) .and_then(|x| Ok(x.parse()?)) .context("server_addr")?, public_addr: Host(required(&self.public_addr).context("public_addr")?.clone()), - max_payload_size: required(&self.max_payload_size) - .and_then(|x| Ok((*x).try_into()?)) - .context("max_payload_size")?, + max_payload_size, + max_batch_size, gossip_dynamic_inbound_limit: required(&self.gossip_dynamic_inbound_limit) .and_then(|x| Ok((*x).try_into()?)) .context("gossip_dynamic_inbound_limit")?, @@ -132,6 +149,7 @@ impl ProtoRepr for proto::Config { server_addr: Some(this.server_addr.to_string()), public_addr: Some(this.public_addr.0.clone()), max_payload_size: Some(this.max_payload_size.try_into().unwrap()), + max_batch_size: Some(this.max_batch_size.try_into().unwrap()), gossip_dynamic_inbound_limit: Some( this.gossip_dynamic_inbound_limit.try_into().unwrap(), ), diff --git a/core/lib/protobuf_config/src/proto/core/consensus.proto b/core/lib/protobuf_config/src/proto/core/consensus.proto index 2adc70886e9e..c64c993be7c8 100644 --- a/core/lib/protobuf_config/src/proto/core/consensus.proto +++ b/core/lib/protobuf_config/src/proto/core/consensus.proto @@ -78,6 +78,9 @@ message Config { // Maximal allowed size of the payload. optional uint64 max_payload_size = 4; // required; bytes + // Maximal allowed size of the sync batches. + optional uint64 max_batch_size = 10; // required; bytes + // Inbound connections that should be unconditionally accepted on the gossip network. repeated string gossip_static_inbound = 5; // required; NodePublicKey diff --git a/core/node/consensus/src/config.rs b/core/node/consensus/src/config.rs index 75e329d6c347..f2ca16956a2d 100644 --- a/core/node/consensus/src/config.rs +++ b/core/node/consensus/src/config.rs @@ -126,6 +126,7 @@ pub(super) fn executor( server_addr: cfg.server_addr, public_addr: net::Host(cfg.public_addr.0.clone()), max_payload_size: cfg.max_payload_size, + max_batch_size: cfg.max_batch_size, node_key: node_key(secrets) .context("node_key")? .context("missing node_key")?, diff --git a/core/node/consensus/src/storage/connection.rs b/core/node/consensus/src/storage/connection.rs index 1d8dfc3aed57..ad27490bfa81 100644 --- a/core/node/consensus/src/storage/connection.rs +++ b/core/node/consensus/src/storage/connection.rs @@ -3,6 +3,7 @@ use zksync_concurrency::{ctx, error::Wrap as _, time}; use zksync_consensus_roles::{attester, validator}; use zksync_consensus_storage::{self as storage, BatchStoreState}; use zksync_dal::{consensus_dal::Payload, Core, CoreDal, DalError}; +use zksync_l1_contract_interface::i_executor::structures::StoredBatchInfo; use zksync_node_sync::{fetcher::IoCursorExt as _, ActionQueueSender, SyncState}; use zksync_state_keeper::io::common::IoCursor; use zksync_types::{commitment::L1BatchWithMetadata, L1BatchNumber}; @@ -120,6 +121,26 @@ impl<'a> Connection<'a> { ctx: &ctx::Ctx, cert: &attester::BatchQC, ) -> Result<(), InsertCertificateError> { + use crate::storage::consensus_dal::InsertCertificateError as E; + + let l1_batch_number = L1BatchNumber(cert.message.number.0 as u32); + + let Some(l1_batch) = self + .0 + .blocks_dal() + .get_l1_batch_metadata(l1_batch_number) + .await + .map_err(E::Dal)? + else { + return Err(E::MissingPayload.into()); + }; + + let l1_batch_info = StoredBatchInfo::from(&l1_batch); + + if l1_batch_info.hash().0 != *cert.message.hash.0.as_bytes() { + return Err(E::PayloadMismatch.into()); + } + Ok(ctx .wait(self.0.consensus_dal().insert_batch_certificate(cert)) .await??) @@ -344,8 +365,8 @@ impl<'a> Connection<'a> { // TODO: Fill out the proof when we have the stateless L1 batch validation story finished. // It is supposed to be a Merkle proof that the rolling hash of the batch has been included - // in the L1 state tree. The state root hash of L1 won't be available in the DB, it requires - // an API client. + // in the L1 system contract state tree. It is *not* the Ethereum state root hash, so producing + // it can be done without an L1 client, which is only required for validation. let batch = attester::SyncBatch { number, payloads, diff --git a/core/node/consensus/src/storage/store.rs b/core/node/consensus/src/storage/store.rs index c196989c300b..ad8f4948831b 100644 --- a/core/node/consensus/src/storage/store.rs +++ b/core/node/consensus/src/storage/store.rs @@ -3,11 +3,13 @@ use std::sync::Arc; use anyhow::Context as _; use zksync_concurrency::{ctx, error::Wrap as _, scope, sync, time}; use zksync_consensus_bft::PayloadManager; +use zksync_consensus_crypto::keccak256::Keccak256; use zksync_consensus_roles::{attester, validator}; use zksync_consensus_storage::{self as storage, BatchStoreState}; use zksync_dal::consensus_dal::{self, Payload}; +use zksync_l1_contract_interface::i_executor::structures::StoredBatchInfo; use zksync_node_sync::fetcher::{FetchedBlock, FetchedTransaction}; -use zksync_types::L2BlockNumber; +use zksync_types::{L1BatchNumber, L2BlockNumber}; use super::{Connection, PayloadQueue}; use crate::storage::{ConnectionPool, InsertCertificateError}; @@ -441,20 +443,36 @@ impl PayloadManager for Store { impl storage::PersistentBatchStore for Store { /// Range of batches persisted in storage. fn persisted(&self) -> sync::watch::Receiver { - // Normally we'd return this, but it causes the following test to run forever: - // RUST_LOG=info zk test rust test_full_nodes --no-capture - // - // The error seems to be related to the size of messages, although I'm not sure - // why it retries it forever. Since the gossip of SyncBatch is not fully functional - // yet, for now let's just return a fake response that never changes, which should - // disable gossiping on honest nodes. - let _ = self.batches_persisted.clone(); - - sync::watch::channel(storage::BatchStoreState { - first: attester::BatchNumber(0), - last: None, - }) - .1 + self.batches_persisted.clone() + } + + /// Get the earliest L1 batch number which has to be (re)signed by a node. + /// + /// Ideally we would make this decision by looking up the last batch submitted to L1, + /// and so it might require a quorum of attesters to sign a certificate for it. + async fn earliest_batch_number_to_sign( + &self, + ctx: &ctx::Ctx, + ) -> ctx::Result> { + // This is the rough roadmap of how this logic will evolve: + // 1. Make best effort at gossiping and collecting votes; the `BatchVotes` in consensus only considers the last vote per attesters. + // Still, we can re-sign more than the last batch, anticipating step 2. + // 2. Change `BatchVotes` to handle multiple pending batch numbers, anticipating that batch intervals might decrease dramatically. + // 3. Ask the Main Node what is the earliest batch number that it still expects votes for (ie. what is the last submission + 1). + // 4. Look at L1 to figure out what is the last submssion, and sign after that. + + // Originally this method returned all unsigned batch numbers by doing a DAL query, but we decided it shoudl be okay and cheap + // to resend signatures for already signed batches, and we don't have to worry about skipping them. Because of that, we also + // didn't think it makes sense to query the database for the earliest unsigned batch *after* the submission, because we might + // as well just re-sign everything. Until we have a way to argue about the "last submission" we just re-sign the last 10 to + // try to produce as many QCs as the voting register allows, within reason. + + let Some(last_batch_number) = self.last_batch(ctx).await? else { + return Ok(None); + }; + Ok(Some(attester::BatchNumber( + last_batch_number.0.saturating_sub(10), + ))) } /// Get the highest L1 batch number from storage. @@ -498,6 +516,36 @@ impl storage::PersistentBatchStore for Store { .wrap("get_batch") } + /// Returns the [attester::Batch] with the given number, which is the `message` that + /// appears in [attester::BatchQC], and represents the content that needs to be signed + /// by the attesters. + async fn get_batch_to_sign( + &self, + ctx: &ctx::Ctx, + number: attester::BatchNumber, + ) -> ctx::Result> { + let Some(batch) = self + .conn(ctx) + .await? + .batch( + ctx, + L1BatchNumber(u32::try_from(number.0).context("number")?), + ) + .await + .wrap("batch")? + else { + return Ok(None); + }; + + let info = StoredBatchInfo::from(&batch); + let hash = Keccak256::from_bytes(info.hash().0); + + Ok(Some(attester::Batch { + number, + hash: attester::BatchHash(hash), + })) + } + /// Returns the QC of the batch with the given number. async fn get_batch_qc( &self, diff --git a/core/node/consensus/src/testonly.rs b/core/node/consensus/src/testonly.rs index 7ca518a183a7..922b53f11f8d 100644 --- a/core/node/consensus/src/testonly.rs +++ b/core/node/consensus/src/testonly.rs @@ -79,6 +79,7 @@ pub(super) fn config(cfg: &network::Config) -> (config::ConsensusConfig, config: server_addr: *cfg.server_addr, public_addr: config::Host(cfg.public_addr.0.clone()), max_payload_size: usize::MAX, + max_batch_size: usize::MAX, gossip_dynamic_inbound_limit: cfg.gossip.dynamic_inbound_limit, gossip_static_inbound: cfg .gossip diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 0bb525c98664..5bc006faa457 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -7763,9 +7763,9 @@ dependencies = [ [[package]] name = "zksync_concurrency" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28279a743cd2ec5a0e3f0fec31b2e4fdd509d0b513e0aaeb000200ce464123e5" +checksum = "1af85d9a31c534a29877c88474cf5f1c46ad25f7c48efff61ea40f4aa83c5459" dependencies = [ "anyhow", "once_cell", @@ -7797,9 +7797,9 @@ dependencies = [ [[package]] name = "zksync_consensus_crypto" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbbc36ff78548f022192f20fb76909b1b0a460fc85289ccc54ce0ce54263165" +checksum = "7b3867f9b4778616d87f157d1049e47290a3bca5ec9db208164f8902524ae92c" dependencies = [ "anyhow", "blst", @@ -7821,9 +7821,9 @@ dependencies = [ [[package]] name = "zksync_consensus_roles" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0070c54eed2f5cf26e76d9ec3ccdf05fdafb18c0712c8d97ef4987634972396" +checksum = "55dacdf1bad5d9efe7dd9db200421afa0c3bf5cfc7fdce4a64720a5dd0685807" dependencies = [ "anyhow", "bit-vec", @@ -7843,9 +7843,9 @@ dependencies = [ [[package]] name = "zksync_consensus_storage" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d221fbd8e22f49175132c252a4923a945c1fa4a548ad66c3fc0366789cc9e53" +checksum = "f796020459775391094b9dcd133f01b5127059fe167cf412b2d1aed23fe0e52f" dependencies = [ "anyhow", "async-trait", @@ -7855,6 +7855,7 @@ dependencies = [ "tracing", "vise", "zksync_concurrency", + "zksync_consensus_crypto", "zksync_consensus_roles", "zksync_protobuf", "zksync_protobuf_build", @@ -7862,9 +7863,9 @@ dependencies = [ [[package]] name = "zksync_consensus_utils" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c3d9b3b6b795ce16e0ead2b8813a2f7a1a01c9a9e3fb50993d6ecbfcdbca98" +checksum = "587de103f745d0b88b49a9fb98cb002c4b7ce6ad042e17845091dce67b8aa984" dependencies = [ "anyhow", "rand 0.8.5", @@ -8182,9 +8183,9 @@ dependencies = [ [[package]] name = "zksync_protobuf" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe77d262206bb22f4bc26e75b68466b2e7043baa4963fe97190ce8540a5d700" +checksum = "d86baa84d8bbbbeea269c0f99aca88364e4fd2a08e6ae7051ff87317132b4ef9" dependencies = [ "anyhow", "bit-vec", @@ -8203,9 +8204,9 @@ dependencies = [ [[package]] name = "zksync_protobuf_build" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1205d607aa7291e3e016ce202d97cd7eb7d232913076dd873cbe48d564bf656" +checksum = "f221ce83f4622c3d8732d09f4461d116d7b10f1cc9d1d1cd014c1fa836c168e6" dependencies = [ "anyhow", "heck 0.5.0", diff --git a/zk_toolbox/Cargo.lock b/zk_toolbox/Cargo.lock index 29547a4b47fe..5b85dc5f8e99 100644 --- a/zk_toolbox/Cargo.lock +++ b/zk_toolbox/Cargo.lock @@ -6380,9 +6380,9 @@ dependencies = [ [[package]] name = "zksync_concurrency" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28279a743cd2ec5a0e3f0fec31b2e4fdd509d0b513e0aaeb000200ce464123e5" +checksum = "1af85d9a31c534a29877c88474cf5f1c46ad25f7c48efff61ea40f4aa83c5459" dependencies = [ "anyhow", "once_cell", @@ -6414,9 +6414,9 @@ dependencies = [ [[package]] name = "zksync_consensus_utils" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c3d9b3b6b795ce16e0ead2b8813a2f7a1a01c9a9e3fb50993d6ecbfcdbca98" +checksum = "587de103f745d0b88b49a9fb98cb002c4b7ce6ad042e17845091dce67b8aa984" dependencies = [ "anyhow", "rand", @@ -6476,9 +6476,9 @@ dependencies = [ [[package]] name = "zksync_protobuf" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe77d262206bb22f4bc26e75b68466b2e7043baa4963fe97190ce8540a5d700" +checksum = "d86baa84d8bbbbeea269c0f99aca88364e4fd2a08e6ae7051ff87317132b4ef9" dependencies = [ "anyhow", "bit-vec", @@ -6497,9 +6497,9 @@ dependencies = [ [[package]] name = "zksync_protobuf_build" -version = "0.1.0-rc.1" +version = "0.1.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1205d607aa7291e3e016ce202d97cd7eb7d232913076dd873cbe48d564bf656" +checksum = "f221ce83f4622c3d8732d09f4461d116d7b10f1cc9d1d1cd014c1fa836c168e6" dependencies = [ "anyhow", "heck 0.5.0",