From 4f9fe2ccfe02762bbd8f3de2478b4e4307a2fc3f Mon Sep 17 00:00:00 2001 From: Stanislav Breadless Date: Thu, 23 May 2024 21:59:43 +0200 Subject: [PATCH 01/19] adapt server to work with the new model --- contracts | 2 +- core/lib/basic_types/src/protocol_version.rs | 30 +++++++++++++++++++ core/lib/config/src/configs/genesis.rs | 9 ++++-- core/lib/config/src/testonly.rs | 6 ++-- core/lib/env_config/src/genesis.rs | 10 +++++-- core/lib/protobuf_config/src/genesis.rs | 10 +++++-- core/lib/types/src/protocol_upgrade.rs | 17 +++++------ .../node/api_server/src/web3/namespaces/en.rs | 9 ++++-- .../node/consistency_checker/src/tests/mod.rs | 2 +- core/node/genesis/src/lib.rs | 6 ++-- core/node/genesis/src/tests.rs | 2 +- core/node/state_keeper/src/io/common/tests.rs | 2 +- etc/env/base/contracts.toml | 3 +- infrastructure/zk/src/config.ts | 4 ++- infrastructure/zk/src/utils.ts | 17 +++++++++++ 15 files changed, 95 insertions(+), 34 deletions(-) diff --git a/contracts b/contracts index 452a54f67243..5c61a50d35c5 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit 452a54f6724347b7e517be1a3d948299ab827d8c +Subproject commit 5c61a50d35c5d31627078c2cd008aef68361ff54 diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index b5d15e6cbc70..6cfdbedb003e 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -10,6 +10,11 @@ use crate::{ H256, U256, }; +/// `ProtocolVersionId` is a unique identifier of the protocol version. +/// Note, that it is an identifier of the `minor` semver version of the protocol, with +/// the `major` version being `0`. Also, the protocol version on the contracts may contain +/// potential minor versions, that may have different contract behavior (e.g. Verifier), but it should not +/// impact the users. #[repr(u16)] #[derive( Debug, @@ -68,6 +73,31 @@ impl ProtocolVersionId { Self::Version25 } + pub fn try_from_packed_semver(packed_semver: U256) -> Result { + const PACKED_SEMVER_MINOR_OFFSET: u32 = 32; + const PACKED_SEMVER_MINOR_MASK: u32 = 0xFFFF; + + let minor = (packed_semver >> U256::from(PACKED_SEMVER_MINOR_OFFSET)) + & U256::from(PACKED_SEMVER_MINOR_MASK); + + Self::try_from(minor) + } + + pub fn try_from_str_semver(str_semver: String) -> Result { + let parts: Vec<_> = str_semver.split(".").collect(); + if parts.len() != 3 { + return Err(format!("unknown protocol version ID: {}", str_semver)); + } + + let minor = parts[1] + .parse::() + .map_err(|_| format!("unknown protocol version ID: {}", str_semver))?; + + minor + .try_into() + .map_err(|err| format!("unknown protocol version ID: {}", err)) + } + /// Returns VM version to be used by API for this protocol version. /// We temporary support only two latest VM versions for API. pub fn into_api_vm_version(self) -> VmVersion { diff --git a/core/lib/config/src/configs/genesis.rs b/core/lib/config/src/configs/genesis.rs index 0d1949cdfe9e..37274be0072a 100644 --- a/core/lib/config/src/configs/genesis.rs +++ b/core/lib/config/src/configs/genesis.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; -use zksync_basic_types::{commitment::L1BatchCommitmentMode, Address, L1ChainId, L2ChainId, H256}; +use zksync_basic_types::{ + commitment::L1BatchCommitmentMode, protocol_version::ProtocolVersionId, Address, L1ChainId, + L2ChainId, H256, +}; /// This config represents the genesis state of the chain. /// Each chain has this config immutable and we update it only during the protocol upgrade @@ -7,7 +10,7 @@ use zksync_basic_types::{commitment::L1BatchCommitmentMode, Address, L1ChainId, pub struct GenesisConfig { // TODO make fields non optional, once we fully moved to file based configs. // Now for backward compatibility we keep it optional - pub protocol_version: Option, + pub protocol_version: Option, pub genesis_root_hash: Option, pub rollup_last_leaf_index: Option, pub genesis_commitment: Option, @@ -38,7 +41,7 @@ impl GenesisConfig { bootloader_hash: Default::default(), default_aa_hash: Default::default(), l1_chain_id: L1ChainId(9), - protocol_version: Some(22), + protocol_version: Some(ProtocolVersionId::Version22), l2_chain_id: L2ChainId::default(), dummy_verifier: false, l1_batch_commit_data_generator_mode: L1BatchCommitmentMode::Rollup, diff --git a/core/lib/config/src/testonly.rs b/core/lib/config/src/testonly.rs index f914a0390d43..8f66f8148992 100644 --- a/core/lib/config/src/testonly.rs +++ b/core/lib/config/src/testonly.rs @@ -3,7 +3,7 @@ use std::num::NonZeroUsize; use rand::{distributions::Distribution, Rng}; use zksync_basic_types::{ basic_fri_types::CircuitIdRoundTuple, commitment::L1BatchCommitmentMode, network::Network, - L1ChainId, L2ChainId, + protocol_version::ProtocolVersionId, L1ChainId, L2ChainId, }; use zksync_consensus_utils::EncodeDist; @@ -660,7 +660,9 @@ impl Distribution for EncodeDist { impl Distribution for EncodeDist { fn sample(&self, rng: &mut R) -> configs::GenesisConfig { configs::GenesisConfig { - protocol_version: self.sample(rng), + protocol_version: Some( + ProtocolVersionId::try_from(rng.gen_range(0..24) as u16).unwrap(), + ), genesis_root_hash: rng.gen(), rollup_last_leaf_index: self.sample(rng), genesis_commitment: rng.gen(), diff --git a/core/lib/env_config/src/genesis.rs b/core/lib/env_config/src/genesis.rs index cf9a48d3ca92..362e86975655 100644 --- a/core/lib/env_config/src/genesis.rs +++ b/core/lib/env_config/src/genesis.rs @@ -1,6 +1,6 @@ use anyhow::Context; use serde::{Deserialize, Serialize}; -use zksync_basic_types::{Address, H256}; +use zksync_basic_types::{protocol_version::ProtocolVersionId, Address, H256}; use zksync_config::{ configs::chain::{NetworkConfig, StateKeeperConfig}, GenesisConfig, @@ -15,7 +15,7 @@ struct ContractsForGenesis { pub genesis_root: Option, pub genesis_rollup_leaf_index: Option, pub genesis_batch_commitment: Option, - pub genesis_protocol_version: Option, + pub genesis_protocol_version: Option, pub fri_recursion_scheduler_level_vk_hash: H256, pub fri_recursion_node_level_vk_hash: H256, pub fri_recursion_leaf_level_vk_hash: H256, @@ -47,7 +47,11 @@ impl FromEnv for GenesisConfig { #[allow(deprecated)] Ok(GenesisConfig { - protocol_version: contracts_config.genesis_protocol_version, + protocol_version: contracts_config + .genesis_protocol_version + .clone() + .map(|version| ProtocolVersionId::try_from_str_semver(version).ok()) + .flatten(), genesis_root_hash: contracts_config.genesis_root, rollup_last_leaf_index: contracts_config.genesis_rollup_leaf_index, genesis_commitment: contracts_config.genesis_batch_commitment, diff --git a/core/lib/protobuf_config/src/genesis.rs b/core/lib/protobuf_config/src/genesis.rs index 56e24031a5af..2688cc20f7e5 100644 --- a/core/lib/protobuf_config/src/genesis.rs +++ b/core/lib/protobuf_config/src/genesis.rs @@ -2,6 +2,7 @@ use anyhow::Context as _; use zksync_basic_types::{commitment::L1BatchCommitmentMode, L1ChainId, L2ChainId}; use zksync_config::configs; use zksync_protobuf::{repr::ProtoRepr, required}; +use zksync_types::ProtocolVersionId; use crate::{parse_h160, parse_h256, proto::genesis as proto}; @@ -24,11 +25,14 @@ impl ProtoRepr for proto::Genesis { type Type = configs::GenesisConfig; fn read(&self) -> anyhow::Result { let prover = required(&self.prover).context("prover")?; + + let protocol_version = required(&self.genesis_protocol_version) + .map(|x| *x as u16) + .context("protocol_version")?; + Ok(Self::Type { protocol_version: Some( - required(&self.genesis_protocol_version) - .map(|x| *x as u16) - .context("protocol_version")?, + ProtocolVersionId::try_from(protocol_version).context("protocol_version")?, ), genesis_root_hash: Some( required(&self.genesis_root) diff --git a/core/lib/types/src/protocol_upgrade.rs b/core/lib/types/src/protocol_upgrade.rs index 677f22e7fe44..788b2e742e94 100644 --- a/core/lib/types/src/protocol_upgrade.rs +++ b/core/lib/types/src/protocol_upgrade.rs @@ -3,7 +3,7 @@ use std::convert::{TryFrom, TryInto}; use serde::{Deserialize, Serialize}; use zksync_basic_types::protocol_version::{L1VerifierConfig, ProtocolVersionId, VerifierParams}; use zksync_contracts::BaseSystemContractsHashes; -use zksync_utils::u256_to_account_address; +use zksync_utils::{h256_to_u256, u256_to_account_address}; use crate::{ ethabi::{decode, encode, ParamType, Token}, @@ -179,13 +179,10 @@ impl TryFrom for ProtocolUpgrade { let _l1_custom_data = decoded.remove(0); let _l1_post_upgrade_custom_data = decoded.remove(0); let timestamp = decoded.remove(0).into_uint().unwrap(); - let version_id = decoded.remove(0).into_uint().unwrap(); - if version_id > u16::MAX.into() { - panic!("Version ID is too big, max expected is {}", u16::MAX); - } + let packed_version_id_semver = decoded.remove(0).into_uint().unwrap(); Ok(Self { - id: ProtocolVersionId::try_from(version_id.as_u32() as u16) + id: ProtocolVersionId::try_from_packed_semver(packed_version_id_semver) .expect("Version is not supported"), bootloader_code_hash: (bootloader_code_hash != H256::zero()) .then_some(bootloader_code_hash), @@ -216,7 +213,9 @@ pub fn decode_set_chain_id_event( unreachable!() }; - let version_id = event.topics[2].to_low_u64_be(); + let full_version_id = h256_to_u256(event.topics[2]); + let protocol_version = ProtocolVersionId::try_from_packed_semver(full_version_id) + .expect("Version is not supported"); let eth_hash = event .transaction_hash @@ -230,10 +229,8 @@ pub fn decode_set_chain_id_event( let upgrade_tx = ProtocolUpgradeTx::decode_tx(transaction, eth_hash, eth_block, factory_deps) .expect("Upgrade tx is missing"); - let version_id = - ProtocolVersionId::try_from(version_id as u16).expect("Version is not supported"); - Ok((version_id, upgrade_tx)) + Ok((protocol_version, upgrade_tx)) } impl ProtocolUpgradeTx { diff --git a/core/node/api_server/src/web3/namespaces/en.rs b/core/node/api_server/src/web3/namespaces/en.rs index 321e407e14b3..020d4468b84b 100644 --- a/core/node/api_server/src/web3/namespaces/en.rs +++ b/core/node/api_server/src/web3/namespaces/en.rs @@ -1,7 +1,9 @@ use anyhow::Context as _; use zksync_config::{configs::EcosystemContracts, GenesisConfig}; use zksync_dal::{CoreDal, DalError}; -use zksync_types::{api::en, tokens::TokenInfo, Address, L1BatchNumber, L2BlockNumber, H256}; +use zksync_types::{ + api::en, tokens::TokenInfo, Address, L1BatchNumber, L2BlockNumber, ProtocolVersionId, H256, +}; use zksync_web3_decl::error::Web3Error; use crate::web3::{backend_jsonrpsee::MethodTracer, state::RpcState}; @@ -111,7 +113,10 @@ impl EnNamespace { .context("Genesis not finished")?; let config = GenesisConfig { - protocol_version: Some(protocol_version), + protocol_version: Some( + ProtocolVersionId::try_from(protocol_version) + .context("Malformed protocol version")?, + ), genesis_root_hash: Some(H256::from_slice( &genesis_batch.hash.context("Genesis is not finished")?, )), diff --git a/core/node/consistency_checker/src/tests/mod.rs b/core/node/consistency_checker/src/tests/mod.rs index 37c9d73f473b..d4a5bbf466f1 100644 --- a/core/node/consistency_checker/src/tests/mod.rs +++ b/core/node/consistency_checker/src/tests/mod.rs @@ -466,7 +466,7 @@ async fn checker_processes_pre_boojum_batches( let pool = ConnectionPool::::test_pool().await; let mut storage = pool.connection().await.unwrap(); let genesis_params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(PRE_BOOJUM_PROTOCOL_VERSION as u16), + protocol_version: Some(PRE_BOOJUM_PROTOCOL_VERSION), ..mock_genesis_config() }) .unwrap(); diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index 6e8ec8fb3782..fcb55b871121 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -114,9 +114,7 @@ impl GenesisParams { // if the version doesn't exist let _: ProtocolVersionId = config .protocol_version - .ok_or(GenesisError::MalformedConfig("protocol_version"))? - .try_into() - .map_err(|_| GenesisError::ProtocolVersion(config.protocol_version.unwrap()))?; + .ok_or(GenesisError::MalformedConfig("protocol_version"))?; Ok(GenesisParams { base_system_contracts, system_contracts, @@ -161,7 +159,7 @@ pub fn mock_genesis_config() -> GenesisConfig { let first_l1_verifier_config = L1VerifierConfig::default(); GenesisConfig { - protocol_version: Some(ProtocolVersionId::latest() as u16), + protocol_version: Some(ProtocolVersionId::latest()), genesis_root_hash: Some(H256::default()), rollup_last_leaf_index: Some(26), genesis_commitment: Some(H256::default()), diff --git a/core/node/genesis/src/tests.rs b/core/node/genesis/src/tests.rs index 51300bf2a0a2..5b5cc2d411c7 100644 --- a/core/node/genesis/src/tests.rs +++ b/core/node/genesis/src/tests.rs @@ -53,7 +53,7 @@ async fn running_genesis_with_non_latest_protocol_version() { let pool = ConnectionPool::::test_pool().await; let mut conn = pool.connection().await.unwrap(); let params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(ProtocolVersionId::Version10 as u16), + protocol_version: Some(ProtocolVersionId::Version10), ..mock_genesis_config() }) .unwrap(); diff --git a/core/node/state_keeper/src/io/common/tests.rs b/core/node/state_keeper/src/io/common/tests.rs index 59eae1bb7e6f..f368ed0b8a64 100644 --- a/core/node/state_keeper/src/io/common/tests.rs +++ b/core/node/state_keeper/src/io/common/tests.rs @@ -447,7 +447,7 @@ async fn getting_batch_version_with_genesis() { let pool = ConnectionPool::::test_pool().await; let mut storage = pool.connection().await.unwrap(); let genesis_params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(ProtocolVersionId::Version5 as u16), + protocol_version: Some(ProtocolVersionId::Version5), ..mock_genesis_config() }) .unwrap(); diff --git a/etc/env/base/contracts.toml b/etc/env/base/contracts.toml index 1820c9e57c22..abb6c980b1f7 100644 --- a/etc/env/base/contracts.toml +++ b/etc/env/base/contracts.toml @@ -31,7 +31,7 @@ GENESIS_BATCH_COMMITMENT = "0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb676031 PRIORITY_TX_MAX_GAS_LIMIT = 72000000 DEPLOY_L2_BRIDGE_COUNTERPART_GAS_LIMIT = 10000000 GENESIS_ROLLUP_LEAF_INDEX = "54" -GENESIS_PROTOCOL_VERSION = "24" +GENESIS_PROTOCOL_VERSION = "0.24.0" L1_WETH_BRIDGE_IMPL_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_BRIDGE_PROXY_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_TOKEN_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" @@ -39,7 +39,6 @@ L2_WETH_BRIDGE_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L2_WETH_TOKEN_IMPL_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L2_WETH_TOKEN_PROXY_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" BLOB_VERSIONED_HASH_RETRIEVER_ADDR = "0x0000000000000000000000000000000000000000" -INITIAL_PROTOCOL_VERSION = 22 L1_SHARED_BRIDGE_IMPL_ADDR = "0xFC073319977e314F251EAE6ae6bE76B0B3BAeeCF" # These are currently not used, but will be used once the shared bridge is up diff --git a/infrastructure/zk/src/config.ts b/infrastructure/zk/src/config.ts index 49bb2cd7cd33..e22c125b9b4c 100644 --- a/infrastructure/zk/src/config.ts +++ b/infrastructure/zk/src/config.ts @@ -5,6 +5,7 @@ import deepExtend from 'deep-extend'; import * as env from './env'; import path from 'path'; import dotenv from 'dotenv'; +import { packSemver, unpackStringSemVer } from './utils'; function loadConfigFile(configPath: string, stack: string[] = []) { if (stack.includes(configPath)) { @@ -180,9 +181,10 @@ export function pushConfig(environment?: string, diff?: string) { env.modify('DATABASE_MERKLE_TREE_BACKUP_PATH', `./db/${environment}/backups`, l2InitFile, false); if (process.env.CONTRACTS_DEV_PROTOCOL_VERSION) { + const [major, minor, patch] = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION); env.modify( 'CONTRACTS_GENESIS_PROTOCOL_VERSION', - (parseInt(process.env.CONTRACTS_GENESIS_PROTOCOL_VERSION!) + 1).toString(), + packSemver(major, minor + 1, patch).toString(), l1InitFile, false ); diff --git a/infrastructure/zk/src/utils.ts b/infrastructure/zk/src/utils.ts index 43030d84fadc..c3627db7f10a 100644 --- a/infrastructure/zk/src/utils.ts +++ b/infrastructure/zk/src/utils.ts @@ -172,3 +172,20 @@ export const announced = async (fn: string, promise: Promise | void) => { const timestampLine = timestamp(`(${time}ms)`); console.log(`${successLine} ${timestampLine}`); }; + +export function unpackStringSemVer(semver: string): [number, number, number] { + const [major, minor, patch] = semver.split("."); + return [parseInt(major), parseInt(minor), parseInt(patch)]; +} + +const SEMVER_MINOR_VERSION_OFFSET = 32; + +// The major version is always 0 for now +export function packSemver(major: number, minor: number, patch: number) { + if (major !== 0) { + throw new Error("Major version must be 0"); + } + + return (minor << SEMVER_MINOR_VERSION_OFFSET) | patch; +} + \ No newline at end of file From f9fca2d915aaa2c66fe13a2b060b0bee546405a1 Mon Sep 17 00:00:00 2001 From: Stanislav Breadless Date: Fri, 24 May 2024 08:37:01 +0200 Subject: [PATCH 02/19] fmt --- contracts | 2 +- infrastructure/zk/src/utils.ts | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts b/contracts index 5c61a50d35c5..504ddbf2a510 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit 5c61a50d35c5d31627078c2cd008aef68361ff54 +Subproject commit 504ddbf2a510f993c5d540ac9fe554904b03d881 diff --git a/infrastructure/zk/src/utils.ts b/infrastructure/zk/src/utils.ts index c3627db7f10a..d9bdea075e6c 100644 --- a/infrastructure/zk/src/utils.ts +++ b/infrastructure/zk/src/utils.ts @@ -174,18 +174,17 @@ export const announced = async (fn: string, promise: Promise | void) => { }; export function unpackStringSemVer(semver: string): [number, number, number] { - const [major, minor, patch] = semver.split("."); + const [major, minor, patch] = semver.split('.'); return [parseInt(major), parseInt(minor), parseInt(patch)]; } const SEMVER_MINOR_VERSION_OFFSET = 32; - + // The major version is always 0 for now export function packSemver(major: number, minor: number, patch: number) { if (major !== 0) { - throw new Error("Major version must be 0"); + throw new Error('Major version must be 0'); } return (minor << SEMVER_MINOR_VERSION_OFFSET) | patch; } - \ No newline at end of file From 3bccf73726382b4999c9d6d82abb59c3e2e8a45e Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Fri, 24 May 2024 12:40:16 +0300 Subject: [PATCH 03/19] Add types --- core/bin/genesis_generator/src/main.rs | 2 +- core/lib/basic_types/src/protocol_version.rs | 37 +++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/bin/genesis_generator/src/main.rs b/core/bin/genesis_generator/src/main.rs index 91cbf61ba39a..602d4529c469 100644 --- a/core/bin/genesis_generator/src/main.rs +++ b/core/bin/genesis_generator/src/main.rs @@ -80,7 +80,7 @@ async fn generate_new_config( let base_system_contracts = BaseSystemContracts::load_from_disk().hashes(); let mut updated_genesis = GenesisConfig { - protocol_version: Some(ProtocolVersionId::latest() as u16), + protocol_version: Some(ProtocolVersionId::latest()), genesis_root_hash: None, rollup_last_leaf_index: None, genesis_commitment: None, diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 6cfdbedb003e..29cb6b56c0cc 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -1,4 +1,10 @@ -use std::convert::{TryFrom, TryInto}; +use std::{ + convert::{TryFrom, TryInto}, + fmt, + num::ParseIntError, + ops::{Add, Deref, DerefMut, Sub}, + str::FromStr, +}; use num_enum::TryFromPrimitive; use serde::{Deserialize, Serialize}; @@ -276,3 +282,32 @@ impl From for VmVersion { } } } + +basic_type!( + /// Patch part of semantic protocol version. + VkPatch, + u16 +); + +/// Semantic protocol version. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Hash, PartialOrd, Ord)] +pub struct ProtocolSemanticVersion { + pub minor: ProtocolVersionId, + pub patch: VkPatch, +} + +impl ProtocolSemanticVersion { + const MAJOR_VERSION: u8 = 0; +} + +impl fmt::Display for ProtocolSemanticVersion { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}.{}.{}", + Self::MAJOR_VERSION, + self.minor as u16, + self.patch + ) + } +} From b52468f62038b4f68f67cda531c49c63a5d60d3a Mon Sep 17 00:00:00 2001 From: Stanislav Breadless Date: Fri, 24 May 2024 13:17:02 +0200 Subject: [PATCH 04/19] support both old and the new interface for protocol version --- contracts | 2 +- core/bin/external_node/src/tests.rs | 5 ++--- core/lib/basic_types/src/protocol_version.rs | 13 ++++++++++--- core/lib/eth_client/src/clients/mock.rs | 5 ++--- core/node/consistency_checker/src/tests/mod.rs | 4 +++- core/node/eth_sender/src/eth_tx_aggregator.rs | 14 ++++++++++---- 6 files changed, 28 insertions(+), 15 deletions(-) diff --git a/contracts b/contracts index 504ddbf2a510..cc456584c718 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit 504ddbf2a510f993c5d540ac9fe554904b03d881 +Subproject commit cc456584c71850723d849889b1e33f8bff5ed3f7 diff --git a/core/bin/external_node/src/tests.rs b/core/bin/external_node/src/tests.rs index b7c105a83bad..00301e1b8234 100644 --- a/core/bin/external_node/src/tests.rs +++ b/core/bin/external_node/src/tests.rs @@ -103,6 +103,7 @@ fn mock_eth_client(diamond_proxy_addr: Address) -> MockClient { let mock = MockEthereum::builder().with_call_handler(move |call, _| { tracing::info!("L1 call: {call:?}"); if call.to == Some(diamond_proxy_addr) { + let packed_semver = ProtocolVersionId::latest().into_packed_semver_with_patch(0); let call_signature = &call.data.as_ref().unwrap().0[..4]; let contract = zksync_contracts::hyperchain_contract(); let pricing_mode_sig = contract @@ -117,9 +118,7 @@ fn mock_eth_client(diamond_proxy_addr: Address) -> MockClient { sig if sig == pricing_mode_sig => { return ethabi::Token::Uint(0.into()); // "rollup" mode encoding } - sig if sig == protocol_version_sig => { - return ethabi::Token::Uint((ProtocolVersionId::latest() as u16).into()) - } + sig if sig == protocol_version_sig => return ethabi::Token::Uint(packed_semver), _ => { /* unknown call; panic below */ } } } diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 29cb6b56c0cc..6bb14f0c1106 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -16,6 +16,9 @@ use crate::{ H256, U256, }; +pub const PACKED_SEMVER_MINOR_OFFSET: u32 = 32; +pub const PACKED_SEMVER_MINOR_MASK: u32 = 0xFFFF; + /// `ProtocolVersionId` is a unique identifier of the protocol version. /// Note, that it is an identifier of the `minor` semver version of the protocol, with /// the `major` version being `0`. Also, the protocol version on the contracts may contain @@ -80,9 +83,6 @@ impl ProtocolVersionId { } pub fn try_from_packed_semver(packed_semver: U256) -> Result { - const PACKED_SEMVER_MINOR_OFFSET: u32 = 32; - const PACKED_SEMVER_MINOR_MASK: u32 = 0xFFFF; - let minor = (packed_semver >> U256::from(PACKED_SEMVER_MINOR_OFFSET)) & U256::from(PACKED_SEMVER_MINOR_MASK); @@ -104,6 +104,13 @@ impl ProtocolVersionId { .map_err(|err| format!("unknown protocol version ID: {}", err)) } + pub fn into_packed_semver_with_patch(self, patch: usize) -> U256 { + let minor = U256::from(self as u16); + let patch = U256::from(patch as u32); + + (minor << U256::from(PACKED_SEMVER_MINOR_OFFSET)) | patch + } + /// Returns VM version to be used by API for this protocol version. /// We temporary support only two latest VM versions for API. pub fn into_api_vm_version(self) -> VmVersion { diff --git a/core/lib/eth_client/src/clients/mock.rs b/core/lib/eth_client/src/clients/mock.rs index 086bc10e204d..2d6d06e373bd 100644 --- a/core/lib/eth_client/src/clients/mock.rs +++ b/core/lib/eth_client/src/clients/mock.rs @@ -695,6 +695,7 @@ mod tests { async fn calling_contracts() { let client = MockEthereum::builder() .with_call_handler(|req, _block_id| { + let packed_semver = ProtocolVersionId::latest().into_packed_semver_with_patch(0); let call_signature = &req.data.as_ref().unwrap().0[..4]; let contract = zksync_contracts::hyperchain_contract(); let pricing_mode_sig = contract @@ -709,9 +710,7 @@ mod tests { sig if sig == pricing_mode_sig => { ethabi::Token::Uint(0.into()) // "rollup" mode encoding } - sig if sig == protocol_version_sig => { - ethabi::Token::Uint((ProtocolVersionId::latest() as u16).into()) - } + sig if sig == protocol_version_sig => ethabi::Token::Uint(packed_semver), _ => panic!("unexpected call"), } }) diff --git a/core/node/consistency_checker/src/tests/mod.rs b/core/node/consistency_checker/src/tests/mod.rs index d4a5bbf466f1..493db4705289 100644 --- a/core/node/consistency_checker/src/tests/mod.rs +++ b/core/node/consistency_checker/src/tests/mod.rs @@ -113,6 +113,7 @@ pub(crate) fn create_mock_checker( fn create_mock_ethereum() -> MockEthereum { let mock = MockEthereum::builder().with_call_handler(|call, _block_id| { assert_eq!(call.to, Some(DIAMOND_PROXY_ADDR)); + let packed_semver = ProtocolVersionId::latest().into_packed_semver_with_patch(0); let contract = zksync_contracts::hyperchain_contract(); let expected_input = contract .function("getProtocolVersion") @@ -120,7 +121,8 @@ fn create_mock_ethereum() -> MockEthereum { .encode_input(&[]) .unwrap(); assert_eq!(call.data, Some(expected_input.into())); - ethabi::Token::Uint((ProtocolVersionId::latest() as u16).into()) + + ethabi::Token::Uint(packed_semver) }); mock.build() } diff --git a/core/node/eth_sender/src/eth_tx_aggregator.rs b/core/node/eth_sender/src/eth_tx_aggregator.rs index 7c522d5d6a48..11c4f6362b7b 100644 --- a/core/node/eth_sender/src/eth_tx_aggregator.rs +++ b/core/node/eth_sender/src/eth_tx_aggregator.rs @@ -18,7 +18,7 @@ use zksync_types::{ eth_sender::{EthTx, EthTxBlobSidecar, EthTxBlobSidecarV1, SidecarBlobV1}, ethabi::{Function, Token}, l2_to_l1_log::UserL2ToL1Log, - protocol_version::{L1VerifierConfig, VerifierParams}, + protocol_version::{L1VerifierConfig, VerifierParams, PACKED_SEMVER_MINOR_MASK}, pubdata_da::PubdataDA, web3::{contract::Error as Web3ContractError, BlockNumber}, Address, L2ChainId, ProtocolVersionId, H256, U256, @@ -310,9 +310,15 @@ impl EthTxAggregator { )), )); } - let protocol_version_id = U256::from_big_endian(&multicall3_protocol_version) - .try_into() - .unwrap(); + + let protocol_version = U256::from_big_endian(&multicall3_protocol_version); + // In case the protocol version is smaller than `PACKED_SEMVER_MINOR_MASK`, it will mean that it is + // equal to the `protocol_version_id` value, since it the interface from before the semver was supported. + let protocol_version_id = if protocol_version < U256::from(PACKED_SEMVER_MINOR_MASK) { + ProtocolVersionId::try_from(protocol_version.as_u32() as u16).unwrap() + } else { + ProtocolVersionId::try_from_packed_semver(protocol_version).unwrap() + }; return Ok(MulticallData { base_system_contracts_hashes, From 005fd333e580b97abd7836dbc6051e188e5071ae Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Fri, 24 May 2024 14:49:55 +0300 Subject: [PATCH 05/19] Update genesis config --- Cargo.lock | 1 + contracts | 2 +- core/bin/genesis_generator/src/main.rs | 9 +++- core/lib/basic_types/Cargo.toml | 1 + core/lib/basic_types/src/protocol_version.rs | 48 ++++++++++++++++++- core/lib/config/src/configs/genesis.rs | 12 +++-- core/lib/config/src/testonly.rs | 17 +++++-- core/lib/env_config/src/genesis.rs | 21 +++++--- core/lib/protobuf_config/src/genesis.rs | 19 ++++---- .../src/proto/config/genesis.proto | 3 +- .../node/api_server/src/web3/namespaces/en.rs | 10 ++-- .../node/consistency_checker/src/tests/mod.rs | 9 ++-- core/node/genesis/src/lib.rs | 9 +++- core/node/genesis/src/tests.rs | 5 +- core/node/state_keeper/src/io/common/tests.rs | 9 ++-- etc/env/base/contracts.toml | 3 +- etc/env/file_based/genesis.yaml | 2 +- infrastructure/zk/src/config.ts | 6 +-- infrastructure/zk/src/utils.ts | 11 ----- 19 files changed, 139 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 815dde1687f4..0b4a95ad003e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8009,6 +8009,7 @@ dependencies = [ "num_enum 0.7.2", "serde", "serde_json", + "serde_with", "strum", "thiserror", "tiny-keccak 2.0.2", diff --git a/contracts b/contracts index cc456584c718..cf215f1093e7 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit cc456584c71850723d849889b1e33f8bff5ed3f7 +Subproject commit cf215f1093e7cf86182a60453a9685567f84d83b diff --git a/core/bin/genesis_generator/src/main.rs b/core/bin/genesis_generator/src/main.rs index 602d4529c469..a6db0c115f4d 100644 --- a/core/bin/genesis_generator/src/main.rs +++ b/core/bin/genesis_generator/src/main.rs @@ -18,7 +18,9 @@ use zksync_protobuf::{ ProtoRepr, }; use zksync_protobuf_config::proto::genesis::Genesis; -use zksync_types::{url::SensitiveUrl, ProtocolVersionId}; +use zksync_types::{ + protocol_version::ProtocolSemanticVersion, url::SensitiveUrl, ProtocolVersionId, +}; const DEFAULT_GENESIS_FILE_PATH: &str = "./etc/env/file_based/genesis.yaml"; @@ -80,7 +82,10 @@ async fn generate_new_config( let base_system_contracts = BaseSystemContracts::load_from_disk().hashes(); let mut updated_genesis = GenesisConfig { - protocol_version: Some(ProtocolVersionId::latest()), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 0.into(), + }), genesis_root_hash: None, rollup_last_leaf_index: None, genesis_commitment: None, diff --git a/core/lib/basic_types/Cargo.toml b/core/lib/basic_types/Cargo.toml index 918aa41cad02..937006bb2578 100644 --- a/core/lib/basic_types/Cargo.toml +++ b/core/lib/basic_types/Cargo.toml @@ -21,6 +21,7 @@ strum = { workspace = true, features = ["derive"] } num_enum.workspace = true anyhow.workspace = true url = { workspace = true, features = ["serde"] } +serde_with.workspace = true [dev-dependencies] bincode.workspace = true diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 6bb14f0c1106..d3da4fe6526a 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -8,6 +8,7 @@ use std::{ use num_enum::TryFromPrimitive; use serde::{Deserialize, Serialize}; +use serde_with::{DeserializeFromStr, SerializeDisplay}; use crate::{ ethabi::Token, @@ -297,7 +298,9 @@ basic_type!( ); /// Semantic protocol version. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Hash, PartialOrd, Ord)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, SerializeDisplay, DeserializeFromStr, Hash, PartialOrd, Ord, +)] pub struct ProtocolSemanticVersion { pub minor: ProtocolVersionId, pub patch: VkPatch, @@ -318,3 +321,46 @@ impl fmt::Display for ProtocolSemanticVersion { ) } } + +#[derive(Debug, thiserror::Error)] +pub enum ParseProtocolSemanticVersionError { + #[error("invalid format")] + InvalidFormat, + #[error("non zero major version")] + NonZeroMajorVersion, + #[error("{0}")] + ParseIntError(ParseIntError), +} + +impl FromStr for ProtocolSemanticVersion { + type Err = ParseProtocolSemanticVersionError; + + fn from_str(s: &str) -> Result { + let parts: Vec<&str> = s.split('.').collect(); + if parts.len() != 3 { + return Err(ParseProtocolSemanticVersionError::InvalidFormat); + } + + let major = parts[0] + .parse::() + .map_err(ParseProtocolSemanticVersionError::ParseIntError)?; + if major != 0 { + return Err(ParseProtocolSemanticVersionError::NonZeroMajorVersion); + } + + let minor = parts[1] + .parse::() + .map_err(ParseProtocolSemanticVersionError::ParseIntError)?; + let minor = ProtocolVersionId::try_from(minor) + .map_err(|_| ParseProtocolSemanticVersionError::InvalidFormat)?; + + let patch = parts[2] + .parse::() + .map_err(ParseProtocolSemanticVersionError::ParseIntError)?; + + Ok(ProtocolSemanticVersion { + minor, + patch: patch.into(), + }) + } +} diff --git a/core/lib/config/src/configs/genesis.rs b/core/lib/config/src/configs/genesis.rs index 37274be0072a..0f4d39732f9c 100644 --- a/core/lib/config/src/configs/genesis.rs +++ b/core/lib/config/src/configs/genesis.rs @@ -1,7 +1,8 @@ use serde::{Deserialize, Serialize}; use zksync_basic_types::{ - commitment::L1BatchCommitmentMode, protocol_version::ProtocolVersionId, Address, L1ChainId, - L2ChainId, H256, + commitment::L1BatchCommitmentMode, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId}, + Address, L1ChainId, L2ChainId, H256, }; /// This config represents the genesis state of the chain. @@ -10,7 +11,7 @@ use zksync_basic_types::{ pub struct GenesisConfig { // TODO make fields non optional, once we fully moved to file based configs. // Now for backward compatibility we keep it optional - pub protocol_version: Option, + pub protocol_version: Option, pub genesis_root_hash: Option, pub rollup_last_leaf_index: Option, pub genesis_commitment: Option, @@ -41,7 +42,10 @@ impl GenesisConfig { bootloader_hash: Default::default(), default_aa_hash: Default::default(), l1_chain_id: L1ChainId(9), - protocol_version: Some(ProtocolVersionId::Version22), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 0.into(), + }), l2_chain_id: L2ChainId::default(), dummy_verifier: false, l1_batch_commit_data_generator_mode: L1BatchCommitmentMode::Rollup, diff --git a/core/lib/config/src/testonly.rs b/core/lib/config/src/testonly.rs index 8f66f8148992..fa5d1006e006 100644 --- a/core/lib/config/src/testonly.rs +++ b/core/lib/config/src/testonly.rs @@ -2,8 +2,11 @@ use std::num::NonZeroUsize; use rand::{distributions::Distribution, Rng}; use zksync_basic_types::{ - basic_fri_types::CircuitIdRoundTuple, commitment::L1BatchCommitmentMode, network::Network, - protocol_version::ProtocolVersionId, L1ChainId, L2ChainId, + basic_fri_types::CircuitIdRoundTuple, + commitment::L1BatchCommitmentMode, + network::Network, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VkPatch}, + L1ChainId, L2ChainId, }; use zksync_consensus_utils::EncodeDist; @@ -660,9 +663,13 @@ impl Distribution for EncodeDist { impl Distribution for EncodeDist { fn sample(&self, rng: &mut R) -> configs::GenesisConfig { configs::GenesisConfig { - protocol_version: Some( - ProtocolVersionId::try_from(rng.gen_range(0..24) as u16).unwrap(), - ), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::try_from( + rng.gen_range(0..(ProtocolVersionId::latest() as u16)), + ) + .unwrap(), + patch: VkPatch(rng.gen()), + }), genesis_root_hash: rng.gen(), rollup_last_leaf_index: self.sample(rng), genesis_commitment: rng.gen(), diff --git a/core/lib/env_config/src/genesis.rs b/core/lib/env_config/src/genesis.rs index 362e86975655..1d01555a7d18 100644 --- a/core/lib/env_config/src/genesis.rs +++ b/core/lib/env_config/src/genesis.rs @@ -1,6 +1,9 @@ use anyhow::Context; use serde::{Deserialize, Serialize}; -use zksync_basic_types::{protocol_version::ProtocolVersionId, Address, H256}; +use zksync_basic_types::{ + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId}, + Address, H256, +}; use zksync_config::{ configs::chain::{NetworkConfig, StateKeeperConfig}, GenesisConfig, @@ -15,7 +18,8 @@ struct ContractsForGenesis { pub genesis_root: Option, pub genesis_rollup_leaf_index: Option, pub genesis_batch_commitment: Option, - pub genesis_protocol_version: Option, + pub genesis_protocol_version: Option, + pub genesis_protocol_semantic_version: Option, pub fri_recursion_scheduler_level_vk_hash: H256, pub fri_recursion_node_level_vk_hash: H256, pub fri_recursion_leaf_level_vk_hash: H256, @@ -48,10 +52,15 @@ impl FromEnv for GenesisConfig { #[allow(deprecated)] Ok(GenesisConfig { protocol_version: contracts_config - .genesis_protocol_version - .clone() - .map(|version| ProtocolVersionId::try_from_str_semver(version).ok()) - .flatten(), + .genesis_protocol_semantic_version + .or_else(|| { + contracts_config + .genesis_protocol_version + .map(|minor| ProtocolSemanticVersion { + minor, + patch: 0.into(), + }) + }), genesis_root_hash: contracts_config.genesis_root, rollup_last_leaf_index: contracts_config.genesis_rollup_leaf_index, genesis_commitment: contracts_config.genesis_batch_commitment, diff --git a/core/lib/protobuf_config/src/genesis.rs b/core/lib/protobuf_config/src/genesis.rs index 2688cc20f7e5..754f1fc16d0e 100644 --- a/core/lib/protobuf_config/src/genesis.rs +++ b/core/lib/protobuf_config/src/genesis.rs @@ -1,8 +1,12 @@ +use std::str::FromStr; + use anyhow::Context as _; -use zksync_basic_types::{commitment::L1BatchCommitmentMode, L1ChainId, L2ChainId}; +use zksync_basic_types::{ + commitment::L1BatchCommitmentMode, protocol_version::ProtocolSemanticVersion, L1ChainId, + L2ChainId, +}; use zksync_config::configs; use zksync_protobuf::{repr::ProtoRepr, required}; -use zksync_types::ProtocolVersionId; use crate::{parse_h160, parse_h256, proto::genesis as proto}; @@ -25,14 +29,11 @@ impl ProtoRepr for proto::Genesis { type Type = configs::GenesisConfig; fn read(&self) -> anyhow::Result { let prover = required(&self.prover).context("prover")?; - - let protocol_version = required(&self.genesis_protocol_version) - .map(|x| *x as u16) - .context("protocol_version")?; - Ok(Self::Type { protocol_version: Some( - ProtocolVersionId::try_from(protocol_version).context("protocol_version")?, + required(&self.genesis_protocol_semantic_version) + .and_then(|x| ProtocolSemanticVersion::from_str(x).map_err(Into::into)) + .context("protocol_version")?, ), genesis_root_hash: Some( required(&self.genesis_root) @@ -97,7 +98,7 @@ impl ProtoRepr for proto::Genesis { genesis_root: this.genesis_root_hash.map(|x| format!("{:?}", x)), genesis_rollup_leaf_index: this.rollup_last_leaf_index, genesis_batch_commitment: this.genesis_commitment.map(|x| format!("{:?}", x)), - genesis_protocol_version: this.protocol_version.map(|x| x as u32), + genesis_protocol_semantic_version: this.protocol_version.map(|x| x.to_string()), default_aa_hash: this.default_aa_hash.map(|x| format!("{:?}", x)), bootloader_hash: this.bootloader_hash.map(|x| format!("{:?}", x)), fee_account: Some(format!("{:?}", this.fee_account)), diff --git a/core/lib/protobuf_config/src/proto/config/genesis.proto b/core/lib/protobuf_config/src/proto/config/genesis.proto index f5f05f249342..5a5e7f1d539d 100644 --- a/core/lib/protobuf_config/src/proto/config/genesis.proto +++ b/core/lib/protobuf_config/src/proto/config/genesis.proto @@ -20,7 +20,6 @@ message Genesis { optional string genesis_root = 1; // optional; h256 optional uint64 genesis_rollup_leaf_index = 2; // optional; optional string genesis_batch_commitment = 3; // optional; h256 - optional uint32 genesis_protocol_version = 4; // optional; optional string default_aa_hash = 5; // optional; h256 optional string bootloader_hash = 6; // optional; h256 optional uint64 l1_chain_id = 7; // optional; @@ -28,5 +27,7 @@ message Genesis { optional string fee_account = 9; // h160 optional Prover prover = 10; optional L1BatchCommitDataGeneratorMode l1_batch_commit_data_generator_mode = 29; // optional, default to rollup + optional string genesis_protocol_semantic_version = 12; // optional; + reserved 4; reserved "genesis_protocol_version"; reserved 11; reserved "shared_bridge"; } diff --git a/core/node/api_server/src/web3/namespaces/en.rs b/core/node/api_server/src/web3/namespaces/en.rs index 020d4468b84b..229b4b4d0cd3 100644 --- a/core/node/api_server/src/web3/namespaces/en.rs +++ b/core/node/api_server/src/web3/namespaces/en.rs @@ -2,7 +2,8 @@ use anyhow::Context as _; use zksync_config::{configs::EcosystemContracts, GenesisConfig}; use zksync_dal::{CoreDal, DalError}; use zksync_types::{ - api::en, tokens::TokenInfo, Address, L1BatchNumber, L2BlockNumber, ProtocolVersionId, H256, + api::en, protocol_version::ProtocolSemanticVersion, tokens::TokenInfo, Address, L1BatchNumber, + L2BlockNumber, ProtocolVersionId, H256, }; use zksync_web3_decl::error::Web3Error; @@ -113,10 +114,11 @@ impl EnNamespace { .context("Genesis not finished")?; let config = GenesisConfig { - protocol_version: Some( - ProtocolVersionId::try_from(protocol_version) + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::try_from(protocol_version) .context("Malformed protocol version")?, - ), + patch: 0.into(), // TODO: set correct patch + }), genesis_root_hash: Some(H256::from_slice( &genesis_batch.hash.context("Genesis is not finished")?, )), diff --git a/core/node/consistency_checker/src/tests/mod.rs b/core/node/consistency_checker/src/tests/mod.rs index 493db4705289..853090b1907d 100644 --- a/core/node/consistency_checker/src/tests/mod.rs +++ b/core/node/consistency_checker/src/tests/mod.rs @@ -14,8 +14,8 @@ use zksync_node_test_utils::{ create_l1_batch, create_l1_batch_metadata, l1_batch_metadata_to_commitment_artifacts, }; use zksync_types::{ - aggregated_operations::AggregatedActionType, commitment::L1BatchWithMetadata, web3::Log, - ProtocolVersion, ProtocolVersionId, H256, + aggregated_operations::AggregatedActionType, commitment::L1BatchWithMetadata, + protocol_version::ProtocolSemanticVersion, web3::Log, ProtocolVersion, ProtocolVersionId, H256, }; use super::*; @@ -468,7 +468,10 @@ async fn checker_processes_pre_boojum_batches( let pool = ConnectionPool::::test_pool().await; let mut storage = pool.connection().await.unwrap(); let genesis_params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(PRE_BOOJUM_PROTOCOL_VERSION), + protocol_version: Some(ProtocolSemanticVersion { + minor: PRE_BOOJUM_PROTOCOL_VERSION, + patch: 0.into(), + }), ..mock_genesis_config() }) .unwrap(); diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index fcb55b871121..e425ccda748a 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -17,7 +17,7 @@ use zksync_types::{ commitment::{CommitmentInput, L1BatchCommitment}, fee_model::BatchFeeInput, protocol_upgrade::decode_set_chain_id_event, - protocol_version::{L1VerifierConfig, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, system_contracts::get_system_smart_contracts, web3::{BlockNumber, FilterBuilder}, AccountTreeId, Address, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersion, @@ -114,6 +114,7 @@ impl GenesisParams { // if the version doesn't exist let _: ProtocolVersionId = config .protocol_version + .map(|p| p.minor) .ok_or(GenesisError::MalformedConfig("protocol_version"))?; Ok(GenesisParams { base_system_contracts, @@ -141,6 +142,7 @@ impl GenesisParams { self.config .protocol_version .expect("Protocol version must be set") + .minor .try_into() .expect("Protocol version must be correctly initialized for genesis") } @@ -159,7 +161,10 @@ pub fn mock_genesis_config() -> GenesisConfig { let first_l1_verifier_config = L1VerifierConfig::default(); GenesisConfig { - protocol_version: Some(ProtocolVersionId::latest()), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 0.into(), + }), genesis_root_hash: Some(H256::default()), rollup_last_leaf_index: Some(26), genesis_commitment: Some(H256::default()), diff --git a/core/node/genesis/src/tests.rs b/core/node/genesis/src/tests.rs index 5b5cc2d411c7..56b52f5bcc17 100644 --- a/core/node/genesis/src/tests.rs +++ b/core/node/genesis/src/tests.rs @@ -53,7 +53,10 @@ async fn running_genesis_with_non_latest_protocol_version() { let pool = ConnectionPool::::test_pool().await; let mut conn = pool.connection().await.unwrap(); let params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(ProtocolVersionId::Version10), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::Version10, + patch: 0.into(), + }), ..mock_genesis_config() }) .unwrap(); diff --git a/core/node/state_keeper/src/io/common/tests.rs b/core/node/state_keeper/src/io/common/tests.rs index f368ed0b8a64..6a4bea54ee74 100644 --- a/core/node/state_keeper/src/io/common/tests.rs +++ b/core/node/state_keeper/src/io/common/tests.rs @@ -16,8 +16,8 @@ use zksync_node_test_utils::{ prepare_recovery_snapshot, }; use zksync_types::{ - block::L2BlockHasher, fee::TransactionExecutionMetrics, L2ChainId, ProtocolVersion, - ProtocolVersionId, + block::L2BlockHasher, fee::TransactionExecutionMetrics, + protocol_version::ProtocolSemanticVersion, L2ChainId, ProtocolVersion, ProtocolVersionId, }; use super::*; @@ -447,7 +447,10 @@ async fn getting_batch_version_with_genesis() { let pool = ConnectionPool::::test_pool().await; let mut storage = pool.connection().await.unwrap(); let genesis_params = GenesisParams::load_genesis_params(GenesisConfig { - protocol_version: Some(ProtocolVersionId::Version5), + protocol_version: Some(ProtocolSemanticVersion { + minor: ProtocolVersionId::Version5, + patch: 0.into(), + }), ..mock_genesis_config() }) .unwrap(); diff --git a/etc/env/base/contracts.toml b/etc/env/base/contracts.toml index abb6c980b1f7..cc6e83ab86b7 100644 --- a/etc/env/base/contracts.toml +++ b/etc/env/base/contracts.toml @@ -31,7 +31,8 @@ GENESIS_BATCH_COMMITMENT = "0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb676031 PRIORITY_TX_MAX_GAS_LIMIT = 72000000 DEPLOY_L2_BRIDGE_COUNTERPART_GAS_LIMIT = 10000000 GENESIS_ROLLUP_LEAF_INDEX = "54" -GENESIS_PROTOCOL_VERSION = "0.24.0" +GENESIS_PROTOCOL_VERSION = 24 +GENESIS_PROTOCOL_SEMANTIC_VERSION = "0.24.0" L1_WETH_BRIDGE_IMPL_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_BRIDGE_PROXY_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_TOKEN_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" diff --git a/etc/env/file_based/genesis.yaml b/etc/env/file_based/genesis.yaml index 14d09c06805e..0122627bf7f1 100644 --- a/etc/env/file_based/genesis.yaml +++ b/etc/env/file_based/genesis.yaml @@ -1,7 +1,7 @@ genesis_root: 0xabdb766b18a479a5c783a4b80e12686bc8ea3cc2d8a3050491b701d72370ebb5 genesis_rollup_leaf_index: 54 genesis_batch_commitment: 0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb6760319fb0d215d18ffd -genesis_protocol_version: 24 +genesis_protocol_semantic_version: '24.0.0' default_aa_hash: 0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32 bootloader_hash: 0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e l1_chain_id: 9 diff --git a/infrastructure/zk/src/config.ts b/infrastructure/zk/src/config.ts index e22c125b9b4c..cd758ab1dc1d 100644 --- a/infrastructure/zk/src/config.ts +++ b/infrastructure/zk/src/config.ts @@ -5,7 +5,7 @@ import deepExtend from 'deep-extend'; import * as env from './env'; import path from 'path'; import dotenv from 'dotenv'; -import { packSemver, unpackStringSemVer } from './utils'; +import { unpackStringSemVer } from './utils'; function loadConfigFile(configPath: string, stack: string[] = []) { if (stack.includes(configPath)) { @@ -181,10 +181,10 @@ export function pushConfig(environment?: string, diff?: string) { env.modify('DATABASE_MERKLE_TREE_BACKUP_PATH', `./db/${environment}/backups`, l2InitFile, false); if (process.env.CONTRACTS_DEV_PROTOCOL_VERSION) { - const [major, minor, patch] = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION); + const [_major, minor, _patch] = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION); env.modify( 'CONTRACTS_GENESIS_PROTOCOL_VERSION', - packSemver(major, minor + 1, patch).toString(), + `0.${minor + 1}.0`, // The major version is always 0 for now l1InitFile, false ); diff --git a/infrastructure/zk/src/utils.ts b/infrastructure/zk/src/utils.ts index d9bdea075e6c..96fd7674e000 100644 --- a/infrastructure/zk/src/utils.ts +++ b/infrastructure/zk/src/utils.ts @@ -177,14 +177,3 @@ export function unpackStringSemVer(semver: string): [number, number, number] { const [major, minor, patch] = semver.split('.'); return [parseInt(major), parseInt(minor), parseInt(patch)]; } - -const SEMVER_MINOR_VERSION_OFFSET = 32; - -// The major version is always 0 for now -export function packSemver(major: number, minor: number, patch: number) { - if (major !== 0) { - throw new Error('Major version must be 0'); - } - - return (minor << SEMVER_MINOR_VERSION_OFFSET) | patch; -} From 9fb7d6d5ce618af10641f1640c17f74c47bde029 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 11:09:29 +0300 Subject: [PATCH 06/19] Some fixes --- core/lib/basic_types/src/protocol_version.rs | 2 +- core/lib/env_config/src/genesis.rs | 26 ++++++++++---------- core/lib/eth_client/src/clients/mock.rs | 9 +++---- core/node/eth_watch/src/tests.rs | 2 ++ core/node/genesis/src/lib.rs | 2 -- etc/env/base/contracts.toml | 2 +- etc/env/file_based/genesis.yaml | 2 +- prover/Cargo.lock | 1 + 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 63886f4e861d..e824a73ea3f5 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -91,7 +91,7 @@ impl ProtocolVersionId { } pub fn try_from_str_semver(str_semver: String) -> Result { - let parts: Vec<_> = str_semver.split(".").collect(); + let parts: Vec<_> = str_semver.split('.').collect(); if parts.len() != 3 { return Err(format!("unknown protocol version ID: {}", str_semver)); } diff --git a/core/lib/env_config/src/genesis.rs b/core/lib/env_config/src/genesis.rs index 1d01555a7d18..84cdf069b4a4 100644 --- a/core/lib/env_config/src/genesis.rs +++ b/core/lib/env_config/src/genesis.rs @@ -1,9 +1,6 @@ use anyhow::Context; use serde::{Deserialize, Serialize}; -use zksync_basic_types::{ - protocol_version::{ProtocolSemanticVersion, ProtocolVersionId}, - Address, H256, -}; +use zksync_basic_types::{protocol_version::ProtocolSemanticVersion, Address, H256}; use zksync_config::{ configs::chain::{NetworkConfig, StateKeeperConfig}, GenesisConfig, @@ -18,7 +15,7 @@ struct ContractsForGenesis { pub genesis_root: Option, pub genesis_rollup_leaf_index: Option, pub genesis_batch_commitment: Option, - pub genesis_protocol_version: Option, + pub genesis_protocol_version: Option, pub genesis_protocol_semantic_version: Option, pub fri_recursion_scheduler_level_vk_hash: H256, pub fri_recursion_node_level_vk_hash: H256, @@ -49,18 +46,21 @@ impl FromEnv for GenesisConfig { let contracts_config = &ContractsForGenesis::from_env()?; let state_keeper = StateKeeperConfig::from_env()?; + let protocol_version_deprecated = contracts_config + .genesis_protocol_version + .map(|minor| { + minor.try_into().map(|minor| ProtocolSemanticVersion { + minor, + patch: 0.into(), + }) + }) + .transpose()?; + #[allow(deprecated)] Ok(GenesisConfig { protocol_version: contracts_config .genesis_protocol_semantic_version - .or_else(|| { - contracts_config - .genesis_protocol_version - .map(|minor| ProtocolSemanticVersion { - minor, - patch: 0.into(), - }) - }), + .or(protocol_version_deprecated), genesis_root_hash: contracts_config.genesis_root, rollup_last_leaf_index: contracts_config.genesis_rollup_leaf_index, genesis_commitment: contracts_config.genesis_batch_commitment, diff --git a/core/lib/eth_client/src/clients/mock.rs b/core/lib/eth_client/src/clients/mock.rs index 2d6d06e373bd..a6f8f391de73 100644 --- a/core/lib/eth_client/src/clients/mock.rs +++ b/core/lib/eth_client/src/clients/mock.rs @@ -716,7 +716,7 @@ mod tests { }) .build(); - let protocol_version: U256 = CallFunctionArgs::new("getProtocolVersion", ()) + let l1_packed_protocol_version: U256 = CallFunctionArgs::new("getProtocolVersion", ()) .for_contract( client.contract_addr(), &zksync_contracts::hyperchain_contract(), @@ -724,10 +724,9 @@ mod tests { .call(client.as_ref()) .await .unwrap(); - assert_eq!( - protocol_version, - (ProtocolVersionId::latest() as u16).into() - ); + let expected_packed_protocol_version = + ProtocolVersionId::latest().into_packed_semver_with_patch(0); + assert_eq!(l1_packed_protocol_version, expected_packed_protocol_version); let commitment_mode: L1BatchCommitmentMode = CallFunctionArgs::new("getPubdataPricingMode", ()) diff --git a/core/node/eth_watch/src/tests.rs b/core/node/eth_watch/src/tests.rs index a3dfda07bf11..8f291c9829fc 100644 --- a/core/node/eth_watch/src/tests.rs +++ b/core/node/eth_watch/src/tests.rs @@ -242,6 +242,7 @@ async fn test_normal_operation_l1_txs() { assert_eq!(db_tx.common_data.serial_id.0, 2); } +//TODO #[tokio::test] async fn test_gap_in_governance_upgrades() { let connection_pool = ConnectionPool::::test_pool().await; @@ -272,6 +273,7 @@ async fn test_gap_in_governance_upgrades() { assert_eq!(db_ids[1], next_version); } +//TODO #[tokio::test] async fn test_normal_operation_governance_upgrades() { let connection_pool = ConnectionPool::::test_pool().await; diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index e425ccda748a..91d705f213e5 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -143,8 +143,6 @@ impl GenesisParams { .protocol_version .expect("Protocol version must be set") .minor - .try_into() - .expect("Protocol version must be correctly initialized for genesis") } } diff --git a/etc/env/base/contracts.toml b/etc/env/base/contracts.toml index cc6e83ab86b7..65378c076231 100644 --- a/etc/env/base/contracts.toml +++ b/etc/env/base/contracts.toml @@ -31,7 +31,7 @@ GENESIS_BATCH_COMMITMENT = "0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb676031 PRIORITY_TX_MAX_GAS_LIMIT = 72000000 DEPLOY_L2_BRIDGE_COUNTERPART_GAS_LIMIT = 10000000 GENESIS_ROLLUP_LEAF_INDEX = "54" -GENESIS_PROTOCOL_VERSION = 24 +GENESIS_PROTOCOL_VERSION = "24" GENESIS_PROTOCOL_SEMANTIC_VERSION = "0.24.0" L1_WETH_BRIDGE_IMPL_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_BRIDGE_PROXY_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" diff --git a/etc/env/file_based/genesis.yaml b/etc/env/file_based/genesis.yaml index 0122627bf7f1..49197c1f4aa5 100644 --- a/etc/env/file_based/genesis.yaml +++ b/etc/env/file_based/genesis.yaml @@ -1,7 +1,7 @@ genesis_root: 0xabdb766b18a479a5c783a4b80e12686bc8ea3cc2d8a3050491b701d72370ebb5 genesis_rollup_leaf_index: 54 genesis_batch_commitment: 0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb6760319fb0d215d18ffd -genesis_protocol_semantic_version: '24.0.0' +genesis_protocol_semantic_version: '0.24.0' default_aa_hash: 0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32 bootloader_hash: 0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e l1_chain_id: 9 diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 89cb099cfa3c..eb143bac1807 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -7902,6 +7902,7 @@ dependencies = [ "num_enum 0.7.2", "serde", "serde_json", + "serde_with", "strum", "thiserror", "tiny-keccak 2.0.2", From 28d1fef9a1e071ae418c4d435ffe9b5536fa0290 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 14:08:29 +0300 Subject: [PATCH 07/19] Add new table --- core/lib/basic_types/src/protocol_version.rs | 49 +++-- ...9d13a555f824ecf459fa204b86c6c5f9f01d.json} | 32 ++- ...07703b2581dda4fe3c00be6c5422c78980c4b.json | 20 -- ...c68e8e15a831f1a45dc3b2240d5c6809d5ef2.json | 82 -------- ...5d98a3d9f7df162ae22a98c3c7620fcd13bd2.json | 80 -------- ...d1d4794007904fef7a5e837ebfb1b502711a1.json | 22 --- ...f1a855e76b37b6ed36ae612b551f9a6a55633.json | 18 ++ ...722e7ecdefa7f5be7ca44cef26b6104320530.json | 26 +++ ...3d7619f6535e40f189029488b74df401d87e.json} | 5 +- ...13841f05afd0b4cc2b43d9425bc569cf75594.json | 22 +++ ...525aea4f80cce95bbcde3088c9b41af2d5559.json | 19 ++ ...9bdc9efc6b89fc0444caf8271edd7dfe4a3bc.json | 20 -- ...08a48b05a784a68ff00b917be727aff3717d7.json | 26 +++ ...006_add_protocol_vk_patches_table.down.sql | 6 + ...82006_add_protocol_vk_patches_table.up.sql | 20 ++ .../src/models/storage_protocol_version.rs | 16 +- core/lib/dal/src/protocol_versions_dal.rs | 184 +++++++++++------- .../lib/dal/src/protocol_versions_web3_dal.rs | 45 +++-- core/lib/types/src/protocol_upgrade.rs | 14 +- .../node/api_server/src/web3/namespaces/en.rs | 20 +- core/node/eth_sender/src/aggregator.rs | 2 +- .../event_processors/governance_upgrades.rs | 63 +++--- core/node/eth_watch/src/lib.rs | 14 +- core/node/eth_watch/src/tests.rs | 56 ++++-- core/node/genesis/src/lib.rs | 6 +- core/node/node_sync/src/external_io.rs | 12 +- core/node/node_sync/src/tests.rs | 2 +- .../src/request_processor.rs | 2 +- core/node/state_keeper/src/io/common/tests.rs | 5 +- core/node/test_utils/src/lib.rs | 2 +- 30 files changed, 458 insertions(+), 432 deletions(-) rename core/lib/dal/.sqlx/{query-99acb091650478fe0feb367b1d64561347b81f8931cc2addefa907c9aa9355e6.json => query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json} (54%) delete mode 100644 core/lib/dal/.sqlx/query-015350f8d729ef490553550a68f07703b2581dda4fe3c00be6c5422c78980c4b.json delete mode 100644 core/lib/dal/.sqlx/query-136569d7eb4037fd77e0fac2246c68e8e15a831f1a45dc3b2240d5c6809d5ef2.json delete mode 100644 core/lib/dal/.sqlx/query-19545806b8f772075096e69f8665d98a3d9f7df162ae22a98c3c7620fcd13bd2.json delete mode 100644 core/lib/dal/.sqlx/query-1f4c123edaf6faf50e1c07a797cd1d4794007904fef7a5e837ebfb1b502711a1.json create mode 100644 core/lib/dal/.sqlx/query-25fb31277591dd7d5d783bd8777f1a855e76b37b6ed36ae612b551f9a6a55633.json create mode 100644 core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json rename core/lib/dal/.sqlx/{query-966dddc881bfe6fd94b56f587424125a2633ddb6abaa129f2b12389140d83c3f.json => query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json} (81%) create mode 100644 core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json create mode 100644 core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json delete mode 100644 core/lib/dal/.sqlx/query-ac505ae6cfc744b07b52997db789bdc9efc6b89fc0444caf8271edd7dfe4a3bc.json create mode 100644 core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json create mode 100644 core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql create mode 100644 core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index e824a73ea3f5..750f16061488 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -84,25 +84,7 @@ impl ProtocolVersionId { } pub fn try_from_packed_semver(packed_semver: U256) -> Result { - let minor = (packed_semver >> U256::from(PACKED_SEMVER_MINOR_OFFSET)) - & U256::from(PACKED_SEMVER_MINOR_MASK); - - Self::try_from(minor) - } - - pub fn try_from_str_semver(str_semver: String) -> Result { - let parts: Vec<_> = str_semver.split('.').collect(); - if parts.len() != 3 { - return Err(format!("unknown protocol version ID: {}", str_semver)); - } - - let minor = parts[1] - .parse::() - .map_err(|_| format!("unknown protocol version ID: {}", str_semver))?; - - minor - .try_into() - .map_err(|err| format!("unknown protocol version ID: {}", err)) + ProtocolSemanticVersion::try_from_packed(packed_semver).map(|p| p.minor) } pub fn into_packed_semver_with_patch(self, patch: usize) -> U256 { @@ -314,6 +296,26 @@ pub struct ProtocolSemanticVersion { impl ProtocolSemanticVersion { const MAJOR_VERSION: u8 = 0; + + pub fn try_from_packed(packed: U256) -> Result { + let minor = ((packed >> U256::from(PACKED_SEMVER_MINOR_OFFSET)) + & U256::from(PACKED_SEMVER_MINOR_MASK)) + .try_into()?; + let patch = packed.0[0] as u32; + if patch > u16::MAX as u32 { + return Err("Patches greater than u16::MAX are not supported".to_string()); + } + + Ok(Self { + minor, + patch: VkPatch(patch as u16), + }) + } + + pub fn pack(&self) -> U256 { + (U256::from(self.minor as u16) << U256::from(PACKED_SEMVER_MINOR_OFFSET)) + | U256::from(self.patch.0) + } } impl fmt::Display for ProtocolSemanticVersion { @@ -370,3 +372,12 @@ impl FromStr for ProtocolSemanticVersion { }) } } + +impl Default for ProtocolSemanticVersion { + fn default() -> Self { + Self { + minor: Default::default(), + patch: 0.into(), + } + } +} diff --git a/core/lib/dal/.sqlx/query-99acb091650478fe0feb367b1d64561347b81f8931cc2addefa907c9aa9355e6.json b/core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json similarity index 54% rename from core/lib/dal/.sqlx/query-99acb091650478fe0feb367b1d64561347b81f8931cc2addefa907c9aa9355e6.json rename to core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json index 2699d19e9e42..5b915812dcca 100644 --- a/core/lib/dal/.sqlx/query-99acb091650478fe0feb367b1d64561347b81f8931cc2addefa907c9aa9355e6.json +++ b/core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json @@ -1,11 +1,11 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n *\n FROM\n protocol_versions\n WHERE\n id < $1\n ORDER BY\n id DESC\n LIMIT\n 1\n ", + "query": "\n SELECT\n protocol_versions.id AS \"minor!\",\n protocol_versions.timestamp,\n protocol_versions.bootloader_code_hash,\n protocol_versions.default_account_code_hash,\n protocol_versions.upgrade_tx_hash,\n protocol_vk_patches.patch,\n protocol_vk_patches.recursion_scheduler_level_vk_hash,\n protocol_vk_patches.recursion_node_level_vk_hash,\n protocol_vk_patches.recursion_leaf_level_vk_hash,\n protocol_vk_patches.recursion_circuits_set_vks_hash\n FROM\n protocol_versions\n JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id\n WHERE\n id = $1\n ORDER BY\n protocol_vk_patches.patch DESC\n LIMIT\n 1\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "id", + "name": "minor!", "type_info": "Int4" }, { @@ -15,48 +15,43 @@ }, { "ordinal": 2, - "name": "recursion_scheduler_level_vk_hash", + "name": "bootloader_code_hash", "type_info": "Bytea" }, { "ordinal": 3, - "name": "recursion_node_level_vk_hash", + "name": "default_account_code_hash", "type_info": "Bytea" }, { "ordinal": 4, - "name": "recursion_leaf_level_vk_hash", + "name": "upgrade_tx_hash", "type_info": "Bytea" }, { "ordinal": 5, - "name": "recursion_circuits_set_vks_hash", - "type_info": "Bytea" + "name": "patch", + "type_info": "Int4" }, { "ordinal": 6, - "name": "bootloader_code_hash", + "name": "recursion_scheduler_level_vk_hash", "type_info": "Bytea" }, { "ordinal": 7, - "name": "default_account_code_hash", + "name": "recursion_node_level_vk_hash", "type_info": "Bytea" }, { "ordinal": 8, - "name": "verifier_address", + "name": "recursion_leaf_level_vk_hash", "type_info": "Bytea" }, { "ordinal": 9, - "name": "upgrade_tx_hash", + "name": "recursion_circuits_set_vks_hash", "type_info": "Bytea" - }, - { - "ordinal": 10, - "name": "created_at", - "type_info": "Timestamp" } ], "parameters": { @@ -69,14 +64,13 @@ false, false, false, + true, false, false, false, false, - true, - true, false ] }, - "hash": "99acb091650478fe0feb367b1d64561347b81f8931cc2addefa907c9aa9355e6" + "hash": "012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d" } diff --git a/core/lib/dal/.sqlx/query-015350f8d729ef490553550a68f07703b2581dda4fe3c00be6c5422c78980c4b.json b/core/lib/dal/.sqlx/query-015350f8d729ef490553550a68f07703b2581dda4fe3c00be6c5422c78980c4b.json deleted file mode 100644 index d8495583ba97..000000000000 --- a/core/lib/dal/.sqlx/query-015350f8d729ef490553550a68f07703b2581dda4fe3c00be6c5422c78980c4b.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n MAX(id) AS \"max?\"\n FROM\n protocol_versions\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "max?", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - null - ] - }, - "hash": "015350f8d729ef490553550a68f07703b2581dda4fe3c00be6c5422c78980c4b" -} diff --git a/core/lib/dal/.sqlx/query-136569d7eb4037fd77e0fac2246c68e8e15a831f1a45dc3b2240d5c6809d5ef2.json b/core/lib/dal/.sqlx/query-136569d7eb4037fd77e0fac2246c68e8e15a831f1a45dc3b2240d5c6809d5ef2.json deleted file mode 100644 index 22d29f0f4d8e..000000000000 --- a/core/lib/dal/.sqlx/query-136569d7eb4037fd77e0fac2246c68e8e15a831f1a45dc3b2240d5c6809d5ef2.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n *\n FROM\n protocol_versions\n WHERE\n id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "timestamp", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "recursion_scheduler_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "recursion_node_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 4, - "name": "recursion_leaf_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 5, - "name": "recursion_circuits_set_vks_hash", - "type_info": "Bytea" - }, - { - "ordinal": 6, - "name": "bootloader_code_hash", - "type_info": "Bytea" - }, - { - "ordinal": 7, - "name": "default_account_code_hash", - "type_info": "Bytea" - }, - { - "ordinal": 8, - "name": "verifier_address", - "type_info": "Bytea" - }, - { - "ordinal": 9, - "name": "upgrade_tx_hash", - "type_info": "Bytea" - }, - { - "ordinal": 10, - "name": "created_at", - "type_info": "Timestamp" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - false, - false, - false, - true, - true, - false - ] - }, - "hash": "136569d7eb4037fd77e0fac2246c68e8e15a831f1a45dc3b2240d5c6809d5ef2" -} diff --git a/core/lib/dal/.sqlx/query-19545806b8f772075096e69f8665d98a3d9f7df162ae22a98c3c7620fcd13bd2.json b/core/lib/dal/.sqlx/query-19545806b8f772075096e69f8665d98a3d9f7df162ae22a98c3c7620fcd13bd2.json deleted file mode 100644 index fe7af657ba58..000000000000 --- a/core/lib/dal/.sqlx/query-19545806b8f772075096e69f8665d98a3d9f7df162ae22a98c3c7620fcd13bd2.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n *\n FROM\n protocol_versions\n ORDER BY\n id DESC\n LIMIT\n 1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "timestamp", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "recursion_scheduler_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 3, - "name": "recursion_node_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 4, - "name": "recursion_leaf_level_vk_hash", - "type_info": "Bytea" - }, - { - "ordinal": 5, - "name": "recursion_circuits_set_vks_hash", - "type_info": "Bytea" - }, - { - "ordinal": 6, - "name": "bootloader_code_hash", - "type_info": "Bytea" - }, - { - "ordinal": 7, - "name": "default_account_code_hash", - "type_info": "Bytea" - }, - { - "ordinal": 8, - "name": "verifier_address", - "type_info": "Bytea" - }, - { - "ordinal": 9, - "name": "upgrade_tx_hash", - "type_info": "Bytea" - }, - { - "ordinal": 10, - "name": "created_at", - "type_info": "Timestamp" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false, - false, - false, - false, - false, - false, - false, - false, - true, - true, - false - ] - }, - "hash": "19545806b8f772075096e69f8665d98a3d9f7df162ae22a98c3c7620fcd13bd2" -} diff --git a/core/lib/dal/.sqlx/query-1f4c123edaf6faf50e1c07a797cd1d4794007904fef7a5e837ebfb1b502711a1.json b/core/lib/dal/.sqlx/query-1f4c123edaf6faf50e1c07a797cd1d4794007904fef7a5e837ebfb1b502711a1.json deleted file mode 100644 index 58780d59a3b1..000000000000 --- a/core/lib/dal/.sqlx/query-1f4c123edaf6faf50e1c07a797cd1d4794007904fef7a5e837ebfb1b502711a1.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n protocol_versions (\n id,\n timestamp,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n bootloader_code_hash,\n default_account_code_hash,\n upgrade_tx_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW())\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Int8", - "Bytea", - "Bytea", - "Bytea", - "Bytea", - "Bytea", - "Bytea", - "Bytea" - ] - }, - "nullable": [] - }, - "hash": "1f4c123edaf6faf50e1c07a797cd1d4794007904fef7a5e837ebfb1b502711a1" -} diff --git a/core/lib/dal/.sqlx/query-25fb31277591dd7d5d783bd8777f1a855e76b37b6ed36ae612b551f9a6a55633.json b/core/lib/dal/.sqlx/query-25fb31277591dd7d5d783bd8777f1a855e76b37b6ed36ae612b551f9a6a55633.json new file mode 100644 index 000000000000..ee88bcdf39bd --- /dev/null +++ b/core/lib/dal/.sqlx/query-25fb31277591dd7d5d783bd8777f1a855e76b37b6ed36ae612b551f9a6a55633.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO\n protocol_versions (\n id,\n timestamp,\n bootloader_code_hash,\n default_account_code_hash,\n upgrade_tx_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, NOW())\n ON CONFLICT DO NOTHING\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int8", + "Bytea", + "Bytea", + "Bytea" + ] + }, + "nullable": [] + }, + "hash": "25fb31277591dd7d5d783bd8777f1a855e76b37b6ed36ae612b551f9a6a55633" +} diff --git a/core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json b/core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json new file mode 100644 index 000000000000..0b106e1a4450 --- /dev/null +++ b/core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_vk_patches\n ORDER BY\n minor DESC,\n patch DESC\n LIMIT\n 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "minor", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530" +} diff --git a/core/lib/dal/.sqlx/query-966dddc881bfe6fd94b56f587424125a2633ddb6abaa129f2b12389140d83c3f.json b/core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json similarity index 81% rename from core/lib/dal/.sqlx/query-966dddc881bfe6fd94b56f587424125a2633ddb6abaa129f2b12389140d83c3f.json rename to core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json index bf4eb3f9462d..03dd491f1921 100644 --- a/core/lib/dal/.sqlx/query-966dddc881bfe6fd94b56f587424125a2633ddb6abaa129f2b12389140d83c3f.json +++ b/core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n protocol_versions\n WHERE\n id = $1\n ", + "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n AND patch = $2\n ", "describe": { "columns": [ { @@ -26,6 +26,7 @@ ], "parameters": { "Left": [ + "Int4", "Int4" ] }, @@ -36,5 +37,5 @@ false ] }, - "hash": "966dddc881bfe6fd94b56f587424125a2633ddb6abaa129f2b12389140d83c3f" + "hash": "5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e" } diff --git a/core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json b/core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json new file mode 100644 index 000000000000..5dc0aa598337 --- /dev/null +++ b/core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594" +} diff --git a/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json b/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json new file mode 100644 index 000000000000..a4adc1186f35 --- /dev/null +++ b/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO\n protocol_vk_patches (\n minor,\n patch,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, NOW())\n ON CONFLICT DO NOTHING\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4", + "Bytea", + "Bytea", + "Bytea", + "Bytea" + ] + }, + "nullable": [] + }, + "hash": "a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559" +} diff --git a/core/lib/dal/.sqlx/query-ac505ae6cfc744b07b52997db789bdc9efc6b89fc0444caf8271edd7dfe4a3bc.json b/core/lib/dal/.sqlx/query-ac505ae6cfc744b07b52997db789bdc9efc6b89fc0444caf8271edd7dfe4a3bc.json deleted file mode 100644 index 2dad4563cc70..000000000000 --- a/core/lib/dal/.sqlx/query-ac505ae6cfc744b07b52997db789bdc9efc6b89fc0444caf8271edd7dfe4a3bc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n id\n FROM\n protocol_versions\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [] - }, - "nullable": [ - false - ] - }, - "hash": "ac505ae6cfc744b07b52997db789bdc9efc6b89fc0444caf8271edd7dfe4a3bc" -} diff --git a/core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json b/core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json new file mode 100644 index 000000000000..6131e8a1ace5 --- /dev/null +++ b/core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n minor, patch\n FROM\n protocol_vk_patches\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "minor", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7" +} diff --git a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql new file mode 100644 index 000000000000..f9fc902bc732 --- /dev/null +++ b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS protocol_vk_patches; + +ALTER TABLE protocol_versions ALTER COLUMN recursion_scheduler_level_vk_hash SET NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_node_level_vk_hash SET NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_leaf_level_vk_hash SET NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_circuits_set_vks_hash SET NOT NULL; diff --git a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql new file mode 100644 index 000000000000..86ef3fbe8bff --- /dev/null +++ b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql @@ -0,0 +1,20 @@ +CREATE TABLE protocol_vk_patches ( + minor INTEGER NOT NULL REFERENCES protocol_versions(id), + patch INTEGER NOT NULL, + recursion_scheduler_level_vk_hash BYTEA NOT NULL, + recursion_node_level_vk_hash BYTEA NOT NULL, + recursion_leaf_level_vk_hash BYTEA NOT NULL, + recursion_circuits_set_vks_hash BYTEA NOT NULL, + created_at TIMESTAMP NOT NULL, + PRIMARY KEY (minor, patch) +); + +INSERT INTO protocol_vk_patches +SELECT id as "minor", 0 as "patch", recursion_scheduler_level_vk_hash, recursion_node_level_vk_hash, + recursion_leaf_level_vk_hash, recursion_circuits_set_vks_hash, now() as "created_at" +FROM protocol_versions; + +ALTER TABLE protocol_versions ALTER COLUMN recursion_scheduler_level_vk_hash DROP NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_node_level_vk_hash DROP NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_leaf_level_vk_hash DROP NOT NULL; +ALTER TABLE protocol_versions ALTER COLUMN recursion_circuits_set_vks_hash DROP NOT NULL; diff --git a/core/lib/dal/src/models/storage_protocol_version.rs b/core/lib/dal/src/models/storage_protocol_version.rs index 2c8c6760ade8..b6f4c4dd8e1c 100644 --- a/core/lib/dal/src/models/storage_protocol_version.rs +++ b/core/lib/dal/src/models/storage_protocol_version.rs @@ -1,17 +1,17 @@ use std::convert::TryInto; -use sqlx::types::chrono::NaiveDateTime; use zksync_contracts::BaseSystemContractsHashes; use zksync_types::{ api, protocol_upgrade::{self, ProtocolUpgradeTx}, - protocol_version::{L1VerifierConfig, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, H256, }; #[derive(sqlx::FromRow)] pub struct StorageProtocolVersion { - pub id: i32, + pub minor: i32, + pub patch: i32, pub timestamp: i64, pub recursion_scheduler_level_vk_hash: Vec, pub recursion_node_level_vk_hash: Vec, @@ -19,9 +19,6 @@ pub struct StorageProtocolVersion { pub recursion_circuits_set_vks_hash: Vec, pub bootloader_code_hash: Vec, pub default_account_code_hash: Vec, - // deprecated - pub verifier_address: Option>, - pub created_at: NaiveDateTime, pub upgrade_tx_hash: Option>, } @@ -30,7 +27,10 @@ pub(crate) fn protocol_version_from_storage( tx: Option, ) -> protocol_upgrade::ProtocolVersion { protocol_upgrade::ProtocolVersion { - id: (storage_version.id as u16).try_into().unwrap(), + version: ProtocolSemanticVersion { + minor: (storage_version.minor as u16).try_into().unwrap(), + patch: VkPatch(storage_version.patch as u16), + }, timestamp: storage_version.timestamp as u64, l1_verifier_config: L1VerifierConfig { params: VerifierParams { @@ -63,7 +63,7 @@ impl From for api::ProtocolVersion { .as_ref() .map(|hash| H256::from_slice(hash)); api::ProtocolVersion { - version_id: storage_protocol_version.id as u16, + version_id: storage_protocol_version.patch as u16, timestamp: storage_protocol_version.timestamp as u64, verification_keys_hashes: L1VerifierConfig { params: VerifierParams { diff --git a/core/lib/dal/src/protocol_versions_dal.rs b/core/lib/dal/src/protocol_versions_dal.rs index 6e10205884be..d3d52f689722 100644 --- a/core/lib/dal/src/protocol_versions_dal.rs +++ b/core/lib/dal/src/protocol_versions_dal.rs @@ -7,9 +7,10 @@ use zksync_db_connection::{ error::DalResult, instrument::{InstrumentExt, Instrumented}, }; +use zksync_types::protocol_version::VkPatch; use zksync_types::{ protocol_upgrade::{ProtocolUpgradeTx, ProtocolVersion}, - protocol_version::{L1VerifierConfig, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, ProtocolVersionId, H256, }; @@ -29,32 +30,63 @@ pub struct ProtocolVersionsDal<'a, 'c> { impl ProtocolVersionsDal<'_, '_> { pub async fn save_protocol_version( &mut self, - id: ProtocolVersionId, + version: ProtocolSemanticVersion, timestamp: u64, l1_verifier_config: L1VerifierConfig, base_system_contracts_hashes: BaseSystemContractsHashes, tx_hash: Option, ) -> DalResult<()> { + let mut db_transaction = self.storage.start_transaction().await?; + sqlx::query!( r#" INSERT INTO protocol_versions ( id, timestamp, - recursion_scheduler_level_vk_hash, - recursion_node_level_vk_hash, - recursion_leaf_level_vk_hash, - recursion_circuits_set_vks_hash, bootloader_code_hash, default_account_code_hash, upgrade_tx_hash, created_at ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW()) + ($1, $2, $3, $4, $5, NOW()) + ON CONFLICT DO NOTHING "#, - id as i32, + version.minor as i32, timestamp as i64, + base_system_contracts_hashes.bootloader.as_bytes(), + base_system_contracts_hashes.default_aa.as_bytes(), + tx_hash.as_ref().map(H256::as_bytes), + ) + .instrument("save_protocol_version#minor") + .with_arg("minor", &version.minor) + .with_arg( + "base_system_contracts_hashes", + &base_system_contracts_hashes, + ) + .with_arg("tx_hash", &tx_hash) + .execute(&mut db_transaction) + .await?; + + sqlx::query!( + r#" + INSERT INTO + protocol_vk_patches ( + minor, + patch, + recursion_scheduler_level_vk_hash, + recursion_node_level_vk_hash, + recursion_leaf_level_vk_hash, + recursion_circuits_set_vks_hash, + created_at + ) + VALUES + ($1, $2, $3, $4, $5, $6, NOW()) + ON CONFLICT DO NOTHING + "#, + version.minor as i32, + version.patch.0 as i32, l1_verifier_config .recursion_scheduler_level_vk_hash .as_bytes(), @@ -70,19 +102,14 @@ impl ProtocolVersionsDal<'_, '_> { .params .recursion_circuits_set_vks_hash .as_bytes(), - base_system_contracts_hashes.bootloader.as_bytes(), - base_system_contracts_hashes.default_aa.as_bytes(), - tx_hash.as_ref().map(H256::as_bytes), ) - .instrument("save_protocol_version") - .with_arg("id", &id) - .with_arg( - "base_system_contracts_hashes", - &base_system_contracts_hashes, - ) - .with_arg("tx_hash", &tx_hash) - .execute(self.storage) + .instrument("save_protocol_version#patch") + .with_arg("version", &version) + .execute(&mut db_transaction) .await?; + + db_transaction.commit().await?; + Ok(()) } @@ -102,7 +129,7 @@ impl ProtocolVersionsDal<'_, '_> { db_transaction .protocol_versions_dal() .save_protocol_version( - version.id, + version.version, version.timestamp, version.l1_verifier_config, version.base_system_contracts_hashes, @@ -216,56 +243,37 @@ impl ProtocolVersionsDal<'_, '_> { }) } - pub async fn load_previous_version( + pub async fn get_protocol_version_with_latest_patch( &mut self, version_id: ProtocolVersionId, ) -> DalResult> { - let maybe_version = sqlx::query_as!( + let maybe_row = sqlx::query_as!( StorageProtocolVersion, r#" SELECT - * + protocol_versions.id AS "minor!", + protocol_versions.timestamp, + protocol_versions.bootloader_code_hash, + protocol_versions.default_account_code_hash, + protocol_versions.upgrade_tx_hash, + protocol_vk_patches.patch, + protocol_vk_patches.recursion_scheduler_level_vk_hash, + protocol_vk_patches.recursion_node_level_vk_hash, + protocol_vk_patches.recursion_leaf_level_vk_hash, + protocol_vk_patches.recursion_circuits_set_vks_hash FROM protocol_versions + JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id WHERE - id < $1 + id = $1 ORDER BY - id DESC + protocol_vk_patches.patch DESC LIMIT 1 "#, version_id as i32 ) - .try_map(|row| Ok((parse_protocol_version(row.id)?, row))) - .instrument("load_previous_version") - .with_arg("version_id", &version_id) - .fetch_optional(self.storage) - .await?; - - let Some((version_id, row)) = maybe_version else { - return Ok(None); - }; - let tx = self.get_protocol_upgrade_tx(version_id).await?; - Ok(Some(protocol_version_from_storage(row, tx))) - } - - pub async fn get_protocol_version( - &mut self, - version_id: ProtocolVersionId, - ) -> DalResult> { - let maybe_row = sqlx::query_as!( - StorageProtocolVersion, - r#" - SELECT - * - FROM - protocol_versions - WHERE - id = $1 - "#, - version_id as i32 - ) - .instrument("get_protocol_version") + .instrument("get_protocol_version_with_latest_patch") .with_arg("version_id", &version_id) .fetch_optional(self.storage) .await?; @@ -280,7 +288,7 @@ impl ProtocolVersionsDal<'_, '_> { pub async fn l1_verifier_config_for_version( &mut self, - version_id: ProtocolVersionId, + version: ProtocolSemanticVersion, ) -> Option { let row = sqlx::query!( r#" @@ -290,11 +298,13 @@ impl ProtocolVersionsDal<'_, '_> { recursion_leaf_level_vk_hash, recursion_circuits_set_vks_hash FROM - protocol_versions + protocol_vk_patches WHERE - id = $1 + minor = $1 + AND patch = $2 "#, - version_id as i32 + version.minor as i32, + version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await @@ -313,20 +323,51 @@ impl ProtocolVersionsDal<'_, '_> { }) } - pub async fn last_version_id(&mut self) -> DalResult> { + pub async fn first_vk_patch_for_version( + &mut self, + version_id: ProtocolVersionId, + ) -> DalResult> { + let row = sqlx::query!( + r#" + SELECT + patch + FROM + protocol_vk_patches + WHERE + minor = $1 + "#, + version_id as i32, + ) + .instrument("first_vk_patch_for_version") + .fetch_optional(self.storage) + .await?; + Ok(row.map(|row| VkPatch(row.patch as u16))) + } + + pub async fn latest_semantic_version(&mut self) -> DalResult> { Ok(sqlx::query!( r#" SELECT - MAX(id) AS "max?" + minor, + patch FROM - protocol_versions + protocol_vk_patches + ORDER BY + minor DESC, + patch DESC + LIMIT + 1 "# ) - .try_map(|row| row.max.map(parse_protocol_version).transpose()) - .instrument("last_version_id") + .try_map(|row| { + parse_protocol_version(row.minor).map(|minor| ProtocolSemanticVersion { + minor, + patch: (row.patch as u16).into(), + }) + }) + .instrument("latest_semantic_version") .fetch_optional(self.storage) - .await? - .flatten()) + .await?) } pub async fn last_used_version_id(&mut self) -> Option { @@ -350,20 +391,23 @@ impl ProtocolVersionsDal<'_, '_> { Some((id as u16).try_into().unwrap()) } - pub async fn all_version_ids(&mut self) -> Vec { + pub async fn all_versions(&mut self) -> Vec { let rows = sqlx::query!( r#" SELECT - id + minor, patch FROM - protocol_versions + protocol_vk_patches "# ) .fetch_all(self.storage.conn()) .await .unwrap(); rows.into_iter() - .map(|row| (row.id as u16).try_into().unwrap()) + .map(|row| ProtocolSemanticVersion { + minor: (row.minor as u16).try_into().unwrap(), + patch: (row.patch as u16).into(), + }) .collect() } diff --git a/core/lib/dal/src/protocol_versions_web3_dal.rs b/core/lib/dal/src/protocol_versions_web3_dal.rs index 974cdc824dab..048934f08295 100644 --- a/core/lib/dal/src/protocol_versions_web3_dal.rs +++ b/core/lib/dal/src/protocol_versions_web3_dal.rs @@ -1,7 +1,7 @@ use zksync_db_connection::{connection::Connection, error::DalResult, instrument::InstrumentExt}; use zksync_types::api::ProtocolVersion; -use crate::{models::storage_protocol_version::StorageProtocolVersion, Core}; +use crate::{models::storage_protocol_version::StorageProtocolVersion, Core, CoreDal}; #[derive(Debug)] pub struct ProtocolVersionsWeb3Dal<'a, 'c> { @@ -17,11 +17,25 @@ impl ProtocolVersionsWeb3Dal<'_, '_> { StorageProtocolVersion, r#" SELECT - * + protocol_versions.id AS "minor!", + protocol_versions.timestamp, + protocol_versions.bootloader_code_hash, + protocol_versions.default_account_code_hash, + protocol_versions.upgrade_tx_hash, + protocol_vk_patches.patch, + protocol_vk_patches.recursion_scheduler_level_vk_hash, + protocol_vk_patches.recursion_node_level_vk_hash, + protocol_vk_patches.recursion_leaf_level_vk_hash, + protocol_vk_patches.recursion_circuits_set_vks_hash FROM protocol_versions + JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id WHERE id = $1 + ORDER BY + protocol_vk_patches.patch DESC + LIMIT + 1 "#, i32::from(version_id) ) @@ -34,23 +48,14 @@ impl ProtocolVersionsWeb3Dal<'_, '_> { } pub async fn get_latest_protocol_version(&mut self) -> DalResult { - let storage_protocol_version = sqlx::query_as!( - StorageProtocolVersion, - r#" - SELECT - * - FROM - protocol_versions - ORDER BY - id DESC - LIMIT - 1 - "#, - ) - .instrument("get_latest_protocol_version") - .fetch_one(self.storage) - .await?; - - Ok(ProtocolVersion::from(storage_protocol_version)) + let latest_version = self + .storage + .protocol_versions_dal() + .latest_semantic_version() + .await? + .unwrap(); + self.get_protocol_version_by_id(latest_version.minor as u16) + .await + .map(|v| v.unwrap()) } } diff --git a/core/lib/types/src/protocol_upgrade.rs b/core/lib/types/src/protocol_upgrade.rs index 788b2e742e94..ee541dc5f636 100644 --- a/core/lib/types/src/protocol_upgrade.rs +++ b/core/lib/types/src/protocol_upgrade.rs @@ -1,7 +1,9 @@ use std::convert::{TryFrom, TryInto}; use serde::{Deserialize, Serialize}; -use zksync_basic_types::protocol_version::{L1VerifierConfig, ProtocolVersionId, VerifierParams}; +use zksync_basic_types::protocol_version::{ + L1VerifierConfig, ProtocolSemanticVersion, ProtocolVersionId, VerifierParams, +}; use zksync_contracts::BaseSystemContractsHashes; use zksync_utils::{h256_to_u256, u256_to_account_address}; @@ -57,7 +59,7 @@ pub struct GovernanceOperation { #[derive(Debug, Clone, Default)] pub struct ProtocolUpgrade { /// New protocol version ID. - pub id: ProtocolVersionId, + pub version: ProtocolSemanticVersion, /// New bootloader code hash. pub bootloader_code_hash: Option, /// New default account code hash. @@ -179,10 +181,10 @@ impl TryFrom for ProtocolUpgrade { let _l1_custom_data = decoded.remove(0); let _l1_post_upgrade_custom_data = decoded.remove(0); let timestamp = decoded.remove(0).into_uint().unwrap(); - let packed_version_id_semver = decoded.remove(0).into_uint().unwrap(); + let packed_protocol_semver = decoded.remove(0).into_uint().unwrap(); Ok(Self { - id: ProtocolVersionId::try_from_packed_semver(packed_version_id_semver) + version: ProtocolSemanticVersion::try_from_packed(packed_protocol_semver) .expect("Version is not supported"), bootloader_code_hash: (bootloader_code_hash != H256::zero()) .then_some(bootloader_code_hash), @@ -448,7 +450,7 @@ impl TryFrom for GovernanceOperation { #[derive(Debug, Clone, Default)] pub struct ProtocolVersion { /// Protocol version ID - pub id: ProtocolVersionId, + pub version: ProtocolSemanticVersion, /// Timestamp at which upgrade should be performed pub timestamp: u64, /// Verifier configuration @@ -467,7 +469,7 @@ impl ProtocolVersion { new_scheduler_vk_hash: Option, ) -> ProtocolVersion { ProtocolVersion { - id: upgrade.id, + version: upgrade.version, timestamp: upgrade.timestamp, l1_verifier_config: L1VerifierConfig { params: upgrade diff --git a/core/node/api_server/src/web3/namespaces/en.rs b/core/node/api_server/src/web3/namespaces/en.rs index 229b4b4d0cd3..a54fd6162b9f 100644 --- a/core/node/api_server/src/web3/namespaces/en.rs +++ b/core/node/api_server/src/web3/namespaces/en.rs @@ -98,12 +98,21 @@ impl EnNamespace { .map_err(DalError::generalize)? .context("Genesis batch doesn't exist")?; - let protocol_version = genesis_batch + let minor = genesis_batch .protocol_version .context("Genesis is not finished")? as u16; + let minor = ProtocolVersionId::try_from(minor).context("Malformed protocol version")?; + let patch = storage + .protocol_versions_dal() + .first_vk_patch_for_version(minor) + .await + .map_err(DalError::generalize)? + .context("Genesis is not finished")?; + let protocol_version = ProtocolSemanticVersion { minor, patch }; + let verifier_config = storage .protocol_versions_dal() - .l1_verifier_config_for_version(protocol_version.try_into().unwrap()) + .l1_verifier_config_for_version(protocol_version) .await .context("Genesis is not finished")?; let fee_account = storage @@ -114,11 +123,7 @@ impl EnNamespace { .context("Genesis not finished")?; let config = GenesisConfig { - protocol_version: Some(ProtocolSemanticVersion { - minor: ProtocolVersionId::try_from(protocol_version) - .context("Malformed protocol version")?, - patch: 0.into(), // TODO: set correct patch - }), + protocol_version: Some(protocol_version), genesis_root_hash: Some(H256::from_slice( &genesis_batch.hash.context("Genesis is not finished")?, )), @@ -143,7 +148,6 @@ impl EnNamespace { .context("Genesis is not finished")?, )), l1_chain_id: self.state.api_config.l1_chain_id, - l2_chain_id: self.state.api_config.l2_chain_id, recursion_node_level_vk_hash: verifier_config.params.recursion_node_level_vk_hash, recursion_leaf_level_vk_hash: verifier_config.params.recursion_leaf_level_vk_hash, diff --git a/core/node/eth_sender/src/aggregator.rs b/core/node/eth_sender/src/aggregator.rs index aa9b31abd426..2c8d4cb56917 100644 --- a/core/node/eth_sender/src/aggregator.rs +++ b/core/node/eth_sender/src/aggregator.rs @@ -329,7 +329,7 @@ impl Aggregator { { let verifier_config_for_next_batch = storage .protocol_versions_dal() - .l1_verifier_config_for_version(version_id) + .l1_verifier_config_for_version(todo!()) .await .unwrap(); if verifier_config_for_next_batch != l1_verifier_config { diff --git a/core/node/eth_watch/src/event_processors/governance_upgrades.rs b/core/node/eth_watch/src/event_processors/governance_upgrades.rs index b2e06cf6c89e..c4029b0755d7 100644 --- a/core/node/eth_watch/src/event_processors/governance_upgrades.rs +++ b/core/node/eth_watch/src/event_processors/governance_upgrades.rs @@ -1,8 +1,8 @@ use anyhow::Context as _; use zksync_dal::{Connection, Core, CoreDal, DalError}; use zksync_types::{ - ethabi::Contract, protocol_upgrade::GovernanceOperation, web3::Log, Address, ProtocolUpgrade, - ProtocolVersionId, H256, + ethabi::Contract, protocol_upgrade::GovernanceOperation, + protocol_version::ProtocolSemanticVersion, web3::Log, Address, ProtocolUpgrade, H256, }; use crate::{ @@ -17,19 +17,19 @@ pub struct GovernanceUpgradesEventProcessor { // zkSync diamond proxy if pre-shared bridge; state transition manager if post shared bridge. target_contract_address: Address, /// Last protocol version seen. Used to skip events for already known upgrade proposals. - last_seen_version_id: ProtocolVersionId, + last_seen_protocol_version: ProtocolSemanticVersion, upgrade_proposal_signature: H256, } impl GovernanceUpgradesEventProcessor { pub fn new( target_contract_address: Address, - last_seen_version_id: ProtocolVersionId, + last_seen_protocol_version: ProtocolSemanticVersion, governance_contract: &Contract, ) -> Self { Self { target_contract_address, - last_seen_version_id, + last_seen_protocol_version, upgrade_proposal_signature: governance_contract .event("TransparentOperationScheduled") .context("TransparentOperationScheduled event is missing in ABI") @@ -79,39 +79,54 @@ impl EventProcessor for GovernanceUpgradesEventProcessor { let new_upgrades: Vec<_> = upgrades .into_iter() - .skip_while(|(v, _)| v.id as u16 <= self.last_seen_version_id as u16) + .skip_while(|(v, _)| v.version <= self.last_seen_protocol_version) .collect(); let Some((last_upgrade, _)) = new_upgrades.last() else { return Ok(()); }; - let ids: Vec<_> = new_upgrades.iter().map(|(u, _)| u.id as u16).collect(); - tracing::debug!("Received upgrades with ids: {ids:?}"); + let versions: Vec<_> = new_upgrades + .iter() + .map(|(u, _)| u.version.to_string()) + .collect(); + tracing::debug!("Received upgrades with versions: {versions:?}"); - let last_id = last_upgrade.id; + let last_version = last_upgrade.version; let stage_latency = METRICS.poll_eth_node[&PollStage::PersistUpgrades].start(); for (upgrade, scheduler_vk_hash) in new_upgrades { - let previous_version = storage + let latest_semantic_version = storage .protocol_versions_dal() - .load_previous_version(upgrade.id) + .latest_semantic_version() .await .map_err(DalError::generalize)? - .with_context(|| { - format!( - "expected some version preceding {:?} to be present in DB", - upgrade.id - ) - })?; - let new_version = previous_version.apply_upgrade(upgrade, scheduler_vk_hash); - storage - .protocol_versions_dal() - .save_protocol_version_with_tx(&new_version) - .await - .map_err(DalError::generalize)?; + .context("expected some version to be present in DB")?; + + if upgrade.version > latest_semantic_version { + if upgrade.version.minor == latest_semantic_version.minor { + // Only verification parameters may change if only patch is bumped. + assert!(upgrade.bootloader_code_hash.is_none()); + assert!(upgrade.default_account_code_hash.is_none()); + assert!(upgrade.tx.is_none()); + } + + let latest_version = storage + .protocol_versions_dal() + .get_protocol_version_with_latest_patch(latest_semantic_version.minor) + .await + .map_err(DalError::generalize)? + .context("expected version to be present in DB")?; + + let new_version = latest_version.apply_upgrade(upgrade, scheduler_vk_hash); + storage + .protocol_versions_dal() + .save_protocol_version_with_tx(&new_version) + .await + .map_err(DalError::generalize)?; + } } stage_latency.observe(); - self.last_seen_version_id = last_id; + self.last_seen_protocol_version = last_version; Ok(()) } diff --git a/core/node/eth_watch/src/lib.rs b/core/node/eth_watch/src/lib.rs index a8042bb2a92c..cf281d78b392 100644 --- a/core/node/eth_watch/src/lib.rs +++ b/core/node/eth_watch/src/lib.rs @@ -9,8 +9,8 @@ use tokio::sync::watch; use zksync_dal::{Connection, ConnectionPool, Core, CoreDal}; use zksync_system_constants::PRIORITY_EXPIRATION; use zksync_types::{ - ethabi::Contract, web3::BlockNumber as Web3BlockNumber, Address, PriorityOpId, - ProtocolVersionId, + ethabi::Contract, protocol_version::ProtocolSemanticVersion, + web3::BlockNumber as Web3BlockNumber, Address, PriorityOpId, }; pub use self::client::EthHttpQueryClient; @@ -31,7 +31,7 @@ mod tests; #[derive(Debug)] struct EthWatchState { - last_seen_version_id: ProtocolVersionId, + last_seen_protocol_version: ProtocolSemanticVersion, next_expected_priority_id: PriorityOpId, last_processed_ethereum_block: u64, } @@ -64,7 +64,7 @@ impl EthWatch { PriorityOpsEventProcessor::new(state.next_expected_priority_id)?; let governance_upgrades_processor = GovernanceUpgradesEventProcessor::new( state_transition_manager_address.unwrap_or(diamond_proxy_addr), - state.last_seen_version_id, + state.last_seen_protocol_version, governance_contract, ); let event_processors: Vec> = vec![ @@ -97,9 +97,9 @@ impl EthWatch { .await? .map_or(PriorityOpId(0), |e| e + 1); - let last_seen_version_id = storage + let last_seen_protocol_version = storage .protocol_versions_dal() - .last_version_id() + .latest_semantic_version() .await? .context("expected at least one (genesis) version to be present in DB")?; @@ -121,7 +121,7 @@ impl EthWatch { Ok(EthWatchState { next_expected_priority_id, - last_seen_version_id, + last_seen_protocol_version, last_processed_ethereum_block, }) } diff --git a/core/node/eth_watch/src/tests.rs b/core/node/eth_watch/src/tests.rs index 8f291c9829fc..bf6082d6a9a6 100644 --- a/core/node/eth_watch/src/tests.rs +++ b/core/node/eth_watch/src/tests.rs @@ -3,6 +3,7 @@ use std::{collections::HashMap, convert::TryInto, sync::Arc}; use tokio::sync::RwLock; use zksync_contracts::{governance_contract, hyperchain_contract}; use zksync_dal::{Connection, ConnectionPool, Core, CoreDal}; +use zksync_types::protocol_version::ProtocolSemanticVersion; use zksync_types::{ ethabi::{encode, Hash, Token}, l1::{L1Tx, OpProcessingType, PriorityQueueType}, @@ -253,7 +254,10 @@ async fn test_gap_in_governance_upgrades() { client .add_governance_upgrades(&[( ProtocolUpgrade { - id: ProtocolVersionId::next(), + version: ProtocolSemanticVersion { + minor: ProtocolVersionId::next(), + patch: 0.into(), + }, tx: None, ..Default::default() }, @@ -263,14 +267,14 @@ async fn test_gap_in_governance_upgrades() { client.set_last_finalized_block_number(15).await; watcher.loop_iteration(&mut storage).await.unwrap(); - let db_ids = storage.protocol_versions_dal().all_version_ids().await; + let db_versions = storage.protocol_versions_dal().all_versions().await; // there should be genesis version and just added version - assert_eq!(db_ids.len(), 2); + assert_eq!(db_versions.len(), 2); let previous_version = (ProtocolVersionId::latest() as u16 - 1).try_into().unwrap(); let next_version = ProtocolVersionId::next(); - assert_eq!(db_ids[0], previous_version); - assert_eq!(db_ids[1], next_version); + assert_eq!(db_versions[0].minor, previous_version); + assert_eq!(db_versions[1].minor, next_version); } //TODO @@ -296,7 +300,6 @@ async fn test_normal_operation_governance_upgrades() { .add_governance_upgrades(&[ ( ProtocolUpgrade { - id: ProtocolVersionId::latest(), tx: None, ..Default::default() }, @@ -304,29 +307,49 @@ async fn test_normal_operation_governance_upgrades() { ), ( ProtocolUpgrade { - id: ProtocolVersionId::next(), + version: ProtocolSemanticVersion { + minor: ProtocolVersionId::next(), + patch: 0.into(), + }, tx: Some(build_upgrade_tx(ProtocolVersionId::next(), 18)), ..Default::default() }, 18, ), + ( + ProtocolUpgrade { + version: ProtocolSemanticVersion { + minor: ProtocolVersionId::next(), + patch: 1.into(), + }, + tx: None, + ..Default::default() + }, + 19, + ), ]) .await; client.set_last_finalized_block_number(15).await; // second upgrade will not be processed, as it has less than 5 confirmations watcher.loop_iteration(&mut storage).await.unwrap(); - let db_ids = storage.protocol_versions_dal().all_version_ids().await; + let db_versions = storage.protocol_versions_dal().all_versions().await; // there should be genesis version and just added version - assert_eq!(db_ids.len(), 2); - assert_eq!(db_ids[1], ProtocolVersionId::latest()); + assert_eq!(db_versions.len(), 2); + assert_eq!(db_versions[1].minor, ProtocolVersionId::latest()); client.set_last_finalized_block_number(20).await; // now the second upgrade will be processed watcher.loop_iteration(&mut storage).await.unwrap(); - let db_ids = storage.protocol_versions_dal().all_version_ids().await; - assert_eq!(db_ids.len(), 3); - assert_eq!(db_ids[2], ProtocolVersionId::next()); + let db_versions = storage.protocol_versions_dal().all_versions().await; + let mut expected_version = ProtocolSemanticVersion { + minor: ProtocolVersionId::next(), + patch: 0.into(), + }; + assert_eq!(db_versions.len(), 4); + assert_eq!(db_versions[2], expected_version); + expected_version.patch += 1; + assert_eq!(db_versions[3], expected_version); // check that tx was saved with the last upgrade let tx = storage @@ -633,7 +656,7 @@ fn upgrade_into_diamond_cut(upgrade: ProtocolUpgrade) -> Token { Token::Bytes(Default::default()), Token::Bytes(Default::default()), Token::Uint(upgrade.timestamp.into()), - Token::Uint((upgrade.id as u16).into()), + Token::Uint(upgrade.version.pack()), Token::Address(Default::default()), ]); @@ -656,7 +679,10 @@ async fn setup_db(connection_pool: &ConnectionPool) { .unwrap() .protocol_versions_dal() .save_protocol_version_with_tx(&ProtocolVersion { - id: (ProtocolVersionId::latest() as u16 - 1).try_into().unwrap(), + version: ProtocolSemanticVersion { + minor: (ProtocolVersionId::latest() as u16 - 1).try_into().unwrap(), + patch: 0.into(), + }, ..Default::default() }) .await diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index 91d705f213e5..b681d1653b73 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -12,6 +12,7 @@ use zksync_dal::{Connection, ConnectionPool, Core, CoreDal, DalError}; use zksync_eth_client::EthInterface; use zksync_merkle_tree::{domain::ZkSyncTree, TreeInstruction}; use zksync_system_constants::PRIORITY_EXPIRATION; +use zksync_types::protocol_version::VkPatch; use zksync_types::{ block::{BlockGasCount, DeployedContract, L1BatchHeader, L2BlockHasher, L2BlockHeader}, commitment::{CommitmentInput, L1BatchCommitment}, @@ -331,7 +332,10 @@ pub async fn create_genesis_l1_batch( l1_verifier_config: L1VerifierConfig, ) -> Result<(), GenesisError> { let version = ProtocolVersion { - id: protocol_version, + version: ProtocolSemanticVersion { + minor: protocol_version, + patch: VkPatch(0), + }, timestamp: 0, l1_verifier_config, base_system_contracts_hashes: base_system_contracts.hashes(), diff --git a/core/node/node_sync/src/external_io.rs b/core/node/node_sync/src/external_io.rs index 4e868ffb9fdf..638a9956ea3a 100644 --- a/core/node/node_sync/src/external_io.rs +++ b/core/node/node_sync/src/external_io.rs @@ -15,6 +15,7 @@ use zksync_state_keeper::{ seal_criteria::IoSealCriteria, updates::UpdatesManager, }; +use zksync_types::protocol_version::{ProtocolSemanticVersion, VkPatch}; use zksync_types::{ protocol_upgrade::ProtocolUpgradeTx, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersionId, Transaction, H256, @@ -341,10 +342,13 @@ impl StateKeeperIO for ExternalIO { .await? .protocol_versions_dal() .save_protocol_version( - protocol_version - .version_id - .try_into() - .context("cannot convert protocol version")?, + ProtocolSemanticVersion { + minor: protocol_version + .version_id + .try_into() + .context("cannot convert protocol version")?, + patch: VkPatch(0), + }, protocol_version.timestamp, protocol_version.verification_keys_hashes, protocol_version.base_system_contracts, diff --git a/core/node/node_sync/src/tests.rs b/core/node/node_sync/src/tests.rs index c50176bf9e41..a55a2fd62570 100644 --- a/core/node/node_sync/src/tests.rs +++ b/core/node/node_sync/src/tests.rs @@ -324,7 +324,7 @@ async fn external_io_works_without_local_protocol_version(snapshot_recovery: boo // Check that the L2 block and the protocol version for it are persisted. let persisted_protocol_version = storage .protocol_versions_dal() - .get_protocol_version(ProtocolVersionId::next()) + .get_protocol_version_with_latest_patch(ProtocolVersionId::next()) .await .unwrap() .expect("next protocol version not persisted"); diff --git a/core/node/proof_data_handler/src/request_processor.rs b/core/node/proof_data_handler/src/request_processor.rs index cdec88bb0903..465131c54536 100644 --- a/core/node/proof_data_handler/src/request_processor.rs +++ b/core/node/proof_data_handler/src/request_processor.rs @@ -119,7 +119,7 @@ impl RequestProcessor { .await .unwrap() .protocol_versions_dal() - .l1_verifier_config_for_version(protocol_version_id) + .l1_verifier_config_for_version(todo!()) .await .expect(&format!( "Missing l1 verifier info for protocol version {protocol_version_id:?}", diff --git a/core/node/state_keeper/src/io/common/tests.rs b/core/node/state_keeper/src/io/common/tests.rs index 6a4bea54ee74..f4ba9c4500f5 100644 --- a/core/node/state_keeper/src/io/common/tests.rs +++ b/core/node/state_keeper/src/io/common/tests.rs @@ -518,7 +518,10 @@ async fn getting_batch_version_after_snapshot_recovery() { storage .protocol_versions_dal() .save_protocol_version_with_tx(&ProtocolVersion { - id: ProtocolVersionId::next(), + version: ProtocolSemanticVersion { + minor: ProtocolVersionId::next(), + patch: 0.into(), + }, ..ProtocolVersion::default() }) .await diff --git a/core/node/test_utils/src/lib.rs b/core/node/test_utils/src/lib.rs index 8d6265a47132..288f6c75ceed 100644 --- a/core/node/test_utils/src/lib.rs +++ b/core/node/test_utils/src/lib.rs @@ -276,7 +276,7 @@ pub async fn recover( let protocol_version = storage .protocol_versions_dal() - .get_protocol_version(snapshot.l1_batch.protocol_version.unwrap()) + .get_protocol_version_with_latest_patch(snapshot.l1_batch.protocol_version.unwrap()) .await .unwrap(); if let Some(protocol_version) = protocol_version { From fe758cf2dbaffb787ab7f452ab877ea0cd249fbd Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 15:25:53 +0300 Subject: [PATCH 08/19] Update eth-sender, proof-data-handler + fixes --- core/lib/basic_types/src/protocol_version.rs | 2 +- ...eb296384e425675167d48c67fe43f456da6b7.json | 23 ++++++ ...5960c4f0632968b04227343e8600860c2c93.json} | 4 +- ...af686d652a3bc5e2c70ad9ac805badbf9553.json} | 4 +- .../src/models/storage_protocol_version.rs | 2 +- core/lib/dal/src/protocol_versions_dal.rs | 46 ++++++++++-- .../src/i_executor/methods/prove_batches.rs | 1 + core/lib/object_store/src/objects.rs | 14 ++++ core/lib/prover_interface/src/api.rs | 4 +- core/lib/prover_interface/src/outputs.rs | 9 ++- core/node/eth_sender/src/aggregator.rs | 75 ++++++++++++------- core/node/eth_watch/src/tests.rs | 4 +- core/node/genesis/src/lib.rs | 3 +- core/node/node_sync/src/external_io.rs | 6 +- .../src/request_processor.rs | 15 ++-- infrastructure/zk/src/config.ts | 2 +- .../src/proof_gen_data_fetcher.rs | 27 +++---- 17 files changed, 166 insertions(+), 75 deletions(-) create mode 100644 core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json rename core/lib/dal/.sqlx/{query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json => query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json} (60%) rename core/lib/dal/.sqlx/{query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json => query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json} (65%) diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 750f16061488..8b18c47ecf04 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -302,7 +302,7 @@ impl ProtocolSemanticVersion { & U256::from(PACKED_SEMVER_MINOR_MASK)) .try_into()?; let patch = packed.0[0] as u32; - if patch > u16::MAX as u32 { + if patch > u32::from(u16::MAX) { return Err("Patches greater than u16::MAX are not supported".to_string()); } diff --git a/core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json b/core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json new file mode 100644 index 000000000000..60ab165bc285 --- /dev/null +++ b/core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n AND recursion_scheduler_level_vk_hash = $2\n ORDER BY\n patch DESC\n LIMIT\n 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4", + "Bytea" + ] + }, + "nullable": [ + false + ] + }, + "hash": "1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7" +} diff --git a/core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json b/core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json similarity index 60% rename from core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json rename to core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json index 6131e8a1ace5..eca0525a59bd 100644 --- a/core/lib/dal/.sqlx/query-c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7.json +++ b/core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n minor, patch\n FROM\n protocol_vk_patches\n ", + "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_vk_patches\n ", "describe": { "columns": [ { @@ -22,5 +22,5 @@ false ] }, - "hash": "c1a0130a25a960c5f2511badb8708a48b05a784a68ff00b917be727aff3717d7" + "hash": "a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93" } diff --git a/core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json b/core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json similarity index 65% rename from core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json rename to core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json index 5dc0aa598337..39af758bf6d2 100644 --- a/core/lib/dal/.sqlx/query-73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594.json +++ b/core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n ", + "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n ORDER BY\n patch\n LIMIT\n 1\n ", "describe": { "columns": [ { @@ -18,5 +18,5 @@ false ] }, - "hash": "73895917544278b7b3c328b1e2c13841f05afd0b4cc2b43d9425bc569cf75594" + "hash": "d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553" } diff --git a/core/lib/dal/src/models/storage_protocol_version.rs b/core/lib/dal/src/models/storage_protocol_version.rs index b6f4c4dd8e1c..2745799e38f7 100644 --- a/core/lib/dal/src/models/storage_protocol_version.rs +++ b/core/lib/dal/src/models/storage_protocol_version.rs @@ -63,7 +63,7 @@ impl From for api::ProtocolVersion { .as_ref() .map(|hash| H256::from_slice(hash)); api::ProtocolVersion { - version_id: storage_protocol_version.patch as u16, + version_id: storage_protocol_version.minor as u16, timestamp: storage_protocol_version.timestamp as u64, verification_keys_hashes: L1VerifierConfig { params: VerifierParams { diff --git a/core/lib/dal/src/protocol_versions_dal.rs b/core/lib/dal/src/protocol_versions_dal.rs index d3d52f689722..1399483f7109 100644 --- a/core/lib/dal/src/protocol_versions_dal.rs +++ b/core/lib/dal/src/protocol_versions_dal.rs @@ -7,10 +7,9 @@ use zksync_db_connection::{ error::DalResult, instrument::{InstrumentExt, Instrumented}, }; -use zksync_types::protocol_version::VkPatch; use zksync_types::{ protocol_upgrade::{ProtocolUpgradeTx, ProtocolVersion}, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, ProtocolVersionId, H256, }; @@ -86,7 +85,7 @@ impl ProtocolVersionsDal<'_, '_> { ON CONFLICT DO NOTHING "#, version.minor as i32, - version.patch.0 as i32, + i32::from(version.patch.0), l1_verifier_config .recursion_scheduler_level_vk_hash .as_bytes(), @@ -304,7 +303,7 @@ impl ProtocolVersionsDal<'_, '_> { AND patch = $2 "#, version.minor as i32, - version.patch.0 as i32 + i32::from(version.patch.0) ) .fetch_optional(self.storage.conn()) .await @@ -323,6 +322,34 @@ impl ProtocolVersionsDal<'_, '_> { }) } + pub async fn get_patch_version_for_vk( + &mut self, + minor_version: ProtocolVersionId, + recursion_scheduler_level_vk_hash: H256, + ) -> DalResult> { + let row = sqlx::query!( + r#" + SELECT + patch + FROM + protocol_vk_patches + WHERE + minor = $1 + AND recursion_scheduler_level_vk_hash = $2 + ORDER BY + patch DESC + LIMIT + 1 + "#, + minor_version as i32, + recursion_scheduler_level_vk_hash.as_bytes() + ) + .instrument("get_patch_version_for_vk") + .fetch_optional(self.storage) + .await?; + Ok(row.map(|row| VkPatch(row.patch as u16))) + } + pub async fn first_vk_patch_for_version( &mut self, version_id: ProtocolVersionId, @@ -335,6 +362,10 @@ impl ProtocolVersionsDal<'_, '_> { protocol_vk_patches WHERE minor = $1 + ORDER BY + patch + LIMIT + 1 "#, version_id as i32, ) @@ -345,7 +376,7 @@ impl ProtocolVersionsDal<'_, '_> { } pub async fn latest_semantic_version(&mut self) -> DalResult> { - Ok(sqlx::query!( + sqlx::query!( r#" SELECT minor, @@ -367,7 +398,7 @@ impl ProtocolVersionsDal<'_, '_> { }) .instrument("latest_semantic_version") .fetch_optional(self.storage) - .await?) + .await } pub async fn last_used_version_id(&mut self) -> Option { @@ -395,7 +426,8 @@ impl ProtocolVersionsDal<'_, '_> { let rows = sqlx::query!( r#" SELECT - minor, patch + minor, + patch FROM protocol_vk_patches "# diff --git a/core/lib/l1_contract_interface/src/i_executor/methods/prove_batches.rs b/core/lib/l1_contract_interface/src/i_executor/methods/prove_batches.rs index 1217cfe596df..934509d40f4d 100644 --- a/core/lib/l1_contract_interface/src/i_executor/methods/prove_batches.rs +++ b/core/lib/l1_contract_interface/src/i_executor/methods/prove_batches.rs @@ -31,6 +31,7 @@ impl Tokenize for &ProveBatches { let L1BatchProofForL1 { aggregation_result_coords, scheduler_proof, + .. } = self.proofs.first().unwrap(); let (_, proof) = serialize_proof(scheduler_proof); diff --git a/core/lib/object_store/src/objects.rs b/core/lib/object_store/src/objects.rs index 90b19fc52d30..c503db2306b7 100644 --- a/core/lib/object_store/src/objects.rs +++ b/core/lib/object_store/src/objects.rs @@ -130,6 +130,20 @@ impl dyn ObjectStore + '_ { V::deserialize(bytes).map_err(ObjectStoreError::Serialization) } + /// Fetches the value for the given encoded key if it exists. + /// + /// # Errors + /// + /// Returns an error if an object with the `encoded_key` does not exist, cannot be accessed, + /// or cannot be deserialized. + pub async fn get_by_encoded_key( + &self, + encoded_key: String, + ) -> Result { + let bytes = self.get_raw(V::BUCKET, &encoded_key).await?; + V::deserialize(bytes).map_err(ObjectStoreError::Serialization) + } + /// Stores the value associating it with the key. If the key already exists, /// the value is replaced. /// diff --git a/core/lib/prover_interface/src/api.rs b/core/lib/prover_interface/src/api.rs index ff4720c333b0..0353c6f39241 100644 --- a/core/lib/prover_interface/src/api.rs +++ b/core/lib/prover_interface/src/api.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use zksync_types::{ basic_fri_types::Eip4844Blobs, - protocol_version::{L1VerifierConfig, ProtocolVersionId}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion}, L1BatchNumber, }; @@ -14,7 +14,7 @@ use crate::{inputs::PrepareBasicCircuitsJob, outputs::L1BatchProofForL1}; pub struct ProofGenerationData { pub l1_batch_number: L1BatchNumber, pub data: PrepareBasicCircuitsJob, - pub protocol_version_id: ProtocolVersionId, + pub protocol_version: ProtocolSemanticVersion, pub l1_verifier_config: L1VerifierConfig, pub eip_4844_blobs: Eip4844Blobs, } diff --git a/core/lib/prover_interface/src/outputs.rs b/core/lib/prover_interface/src/outputs.rs index 7875d0b67481..1ef9bb4bad29 100644 --- a/core/lib/prover_interface/src/outputs.rs +++ b/core/lib/prover_interface/src/outputs.rs @@ -3,7 +3,7 @@ use core::fmt; use circuit_sequencer_api_1_5_0::proof::FinalProof; use serde::{Deserialize, Serialize}; use zksync_object_store::{serialize_using_bincode, Bucket, StoredObject}; -use zksync_types::L1BatchNumber; +use zksync_types::{protocol_version::ProtocolSemanticVersion, L1BatchNumber}; /// The only type of proof utilized by the core subsystem: a "final" proof that can be sent /// to the L1 contract. @@ -11,6 +11,7 @@ use zksync_types::L1BatchNumber; pub struct L1BatchProofForL1 { pub aggregation_result_coords: [[u8; 32]; 4], pub scheduler_proof: FinalProof, + pub protocol_version: ProtocolSemanticVersion, } impl fmt::Debug for L1BatchProofForL1 { @@ -24,10 +25,12 @@ impl fmt::Debug for L1BatchProofForL1 { impl StoredObject for L1BatchProofForL1 { const BUCKET: Bucket = Bucket::ProofsFri; - type Key<'a> = L1BatchNumber; + type Key<'a> = (L1BatchNumber, ProtocolSemanticVersion); fn encode_key(key: Self::Key<'_>) -> String { - format!("l1_batch_proof_{key}.bin") + let (l1_batch_number, protocol_version) = key; + let semver_suffix = protocol_version.to_string().replace('.', "_"); + format!("l1_batch_proof_{l1_batch_number}_{semver_suffix}.bin") } serialize_using_bincode!(); diff --git a/core/node/eth_sender/src/aggregator.rs b/core/node/eth_sender/src/aggregator.rs index 2c8d4cb56917..cc51e03fabb9 100644 --- a/core/node/eth_sender/src/aggregator.rs +++ b/core/node/eth_sender/src/aggregator.rs @@ -10,7 +10,7 @@ use zksync_types::{ aggregated_operations::AggregatedActionType, commitment::{L1BatchCommitmentMode, L1BatchWithMetadata}, helpers::unix_timestamp_ms, - protocol_version::L1VerifierConfig, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion}, pubdata_da::PubdataDA, L1BatchNumber, ProtocolVersionId, }; @@ -321,35 +321,42 @@ impl Aggregator { return None; } - if let Some(version_id) = storage + let minor_version = storage .blocks_dal() .get_batch_protocol_version_id(batch_to_prove) .await .unwrap() - { - let verifier_config_for_next_batch = storage - .protocol_versions_dal() - .l1_verifier_config_for_version(todo!()) - .await - .unwrap(); - if verifier_config_for_next_batch != l1_verifier_config { - return None; - } - } - let proofs = match proof_loading_mode { + .unwrap(); + let required_patch_version = storage + .protocol_versions_dal() + .get_patch_version_for_vk( + minor_version, + l1_verifier_config.recursion_scheduler_level_vk_hash, + ) + .await + .unwrap(); + let Some(required_patch_version) = required_patch_version else { + tracing::warn!("No patch version corresponds to the verification key on L1"); + return None; + }; + let required_version = ProtocolSemanticVersion { + minor: minor_version, + patch: required_patch_version, + }; + + let proof = match proof_loading_mode { ProofLoadingMode::OldProofFromDb => { unreachable!("OldProofFromDb is not supported anymore") } ProofLoadingMode::FriProofFromGcs => { - load_wrapped_fri_proofs_for_range(batch_to_prove, batch_to_prove, blob_store).await + load_wrapped_fri_proofs_for_range(batch_to_prove, blob_store, required_version) + .await } }; - if proofs.is_empty() { + let Some(proof) = proof else { // The proof for the next L1 batch is not generated yet return None; - } - - assert_eq!(proofs.len(), 1); + }; let previous_proven_batch_metadata = storage .blocks_dal() @@ -377,7 +384,7 @@ impl Aggregator { Some(ProveBatches { prev_l1_batch: previous_proven_batch_metadata, l1_batches: vec![metadata_for_batch_being_proved], - proofs, + proofs: vec![proof], should_verify: true, }) } @@ -505,15 +512,26 @@ async fn extract_ready_subrange( } pub async fn load_wrapped_fri_proofs_for_range( - from: L1BatchNumber, - to: L1BatchNumber, + l1_batch_number: L1BatchNumber, blob_store: &dyn ObjectStore, -) -> Vec { - let mut proofs = Vec::new(); - for l1_batch_number in from.0..=to.0 { - let l1_batch_number = L1BatchNumber(l1_batch_number); - match blob_store.get(l1_batch_number).await { - Ok(proof) => proofs.push(proof), + required_version: ProtocolSemanticVersion, +) -> Option { + match blob_store.get((l1_batch_number, required_version)).await { + Ok(proof) => return Some(proof), + Err(ObjectStoreError::KeyNotFound(_)) => (), // do nothing, proof is not ready yet + Err(err) => panic!( + "Failed to load proof for batch {}: {}", + l1_batch_number.0, err + ), + } + + // We also check file with deprecated name if patch number is 0. + if required_version.patch.0 == 0 { + match blob_store + .get_by_encoded_key(format!("l1_batch_proof_{l1_batch_number}.bin")) + .await + { + Ok(proof) => return Some(proof), Err(ObjectStoreError::KeyNotFound(_)) => (), // do nothing, proof is not ready yet Err(err) => panic!( "Failed to load proof for batch {}: {}", @@ -521,5 +539,6 @@ pub async fn load_wrapped_fri_proofs_for_range( ), } } - proofs + + None } diff --git a/core/node/eth_watch/src/tests.rs b/core/node/eth_watch/src/tests.rs index bf6082d6a9a6..ad637c1677e2 100644 --- a/core/node/eth_watch/src/tests.rs +++ b/core/node/eth_watch/src/tests.rs @@ -3,11 +3,11 @@ use std::{collections::HashMap, convert::TryInto, sync::Arc}; use tokio::sync::RwLock; use zksync_contracts::{governance_contract, hyperchain_contract}; use zksync_dal::{Connection, ConnectionPool, Core, CoreDal}; -use zksync_types::protocol_version::ProtocolSemanticVersion; use zksync_types::{ ethabi::{encode, Hash, Token}, l1::{L1Tx, OpProcessingType, PriorityQueueType}, protocol_upgrade::{ProtocolUpgradeTx, ProtocolUpgradeTxCommonData}, + protocol_version::ProtocolSemanticVersion, web3::{BlockNumber, Log}, Address, Execute, L1TxCommonData, PriorityOpId, ProtocolUpgrade, ProtocolVersion, ProtocolVersionId, Transaction, H256, U256, @@ -243,7 +243,6 @@ async fn test_normal_operation_l1_txs() { assert_eq!(db_tx.common_data.serial_id.0, 2); } -//TODO #[tokio::test] async fn test_gap_in_governance_upgrades() { let connection_pool = ConnectionPool::::test_pool().await; @@ -277,7 +276,6 @@ async fn test_gap_in_governance_upgrades() { assert_eq!(db_versions[1].minor, next_version); } -//TODO #[tokio::test] async fn test_normal_operation_governance_upgrades() { let connection_pool = ConnectionPool::::test_pool().await; diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index b681d1653b73..9147db6fdabf 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -12,13 +12,12 @@ use zksync_dal::{Connection, ConnectionPool, Core, CoreDal, DalError}; use zksync_eth_client::EthInterface; use zksync_merkle_tree::{domain::ZkSyncTree, TreeInstruction}; use zksync_system_constants::PRIORITY_EXPIRATION; -use zksync_types::protocol_version::VkPatch; use zksync_types::{ block::{BlockGasCount, DeployedContract, L1BatchHeader, L2BlockHasher, L2BlockHeader}, commitment::{CommitmentInput, L1BatchCommitment}, fee_model::BatchFeeInput, protocol_upgrade::decode_set_chain_id_event, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, system_contracts::get_system_smart_contracts, web3::{BlockNumber, FilterBuilder}, AccountTreeId, Address, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersion, diff --git a/core/node/node_sync/src/external_io.rs b/core/node/node_sync/src/external_io.rs index 638a9956ea3a..6df9a1d4fabf 100644 --- a/core/node/node_sync/src/external_io.rs +++ b/core/node/node_sync/src/external_io.rs @@ -15,10 +15,10 @@ use zksync_state_keeper::{ seal_criteria::IoSealCriteria, updates::UpdatesManager, }; -use zksync_types::protocol_version::{ProtocolSemanticVersion, VkPatch}; use zksync_types::{ - protocol_upgrade::ProtocolUpgradeTx, L1BatchNumber, L2BlockNumber, L2ChainId, - ProtocolVersionId, Transaction, H256, + protocol_upgrade::ProtocolUpgradeTx, + protocol_version::{ProtocolSemanticVersion, VkPatch}, + L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersionId, Transaction, H256, }; use zksync_utils::bytes_to_be_words; diff --git a/core/node/proof_data_handler/src/request_processor.rs b/core/node/proof_data_handler/src/request_processor.rs index 465131c54536..3016bc7a8a49 100644 --- a/core/node/proof_data_handler/src/request_processor.rs +++ b/core/node/proof_data_handler/src/request_processor.rs @@ -112,17 +112,18 @@ impl RequestProcessor { .unwrap() .expect(&format!("Missing header for {}", l1_batch_number)); - let protocol_version_id = header.protocol_version.unwrap(); - let l1_verifier_config = self + let minor_version = header.protocol_version.unwrap(); + let protocol_version = self .pool .connection() .await .unwrap() .protocol_versions_dal() - .l1_verifier_config_for_version(todo!()) + .get_protocol_version_with_latest_patch(minor_version) .await + .unwrap() .expect(&format!( - "Missing l1 verifier info for protocol version {protocol_version_id:?}", + "Missing l1 verifier info for protocol version {minor_version}", )); let storage_batch = self @@ -151,8 +152,8 @@ impl RequestProcessor { let proof_gen_data = ProofGenerationData { l1_batch_number, data: blob, - protocol_version_id, - l1_verifier_config, + protocol_version: protocol_version.version, + l1_verifier_config: protocol_version.l1_verifier_config, eip_4844_blobs, }; Ok(Json(ProofGenerationDataResponse::Success(Some(Box::new( @@ -171,7 +172,7 @@ impl RequestProcessor { SubmitProofRequest::Proof(proof) => { let blob_url = self .blob_store - .put(l1_batch_number, &*proof) + .put((l1_batch_number, proof.protocol_version), &*proof) .await .map_err(RequestProcessorError::ObjectStore)?; diff --git a/infrastructure/zk/src/config.ts b/infrastructure/zk/src/config.ts index cd758ab1dc1d..e79d8e883fdd 100644 --- a/infrastructure/zk/src/config.ts +++ b/infrastructure/zk/src/config.ts @@ -181,7 +181,7 @@ export function pushConfig(environment?: string, diff?: string) { env.modify('DATABASE_MERKLE_TREE_BACKUP_PATH', `./db/${environment}/backups`, l2InitFile, false); if (process.env.CONTRACTS_DEV_PROTOCOL_VERSION) { - const [_major, minor, _patch] = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION); + const minor = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION)[1]; env.modify( 'CONTRACTS_GENESIS_PROTOCOL_VERSION', `0.${minor + 1}.0`, // The major version is always 0 for now diff --git a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs index cba3c24d862d..3e7cd7c096ab 100644 --- a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs +++ b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs @@ -14,19 +14,20 @@ impl PeriodicApiStruct { .await .expect("Failed to save proof generation data to GCS"); let mut connection = self.pool.connection().await.unwrap(); - connection - .fri_protocol_versions_dal() - .save_prover_protocol_version(data.protocol_version_id, data.l1_verifier_config) - .await; - connection - .fri_witness_generator_dal() - .save_witness_inputs( - data.l1_batch_number, - &blob_url, - data.protocol_version_id, - data.eip_4844_blobs, - ) - .await; + todo!(); // Will be fixed in prover PR. + // connection + // .fri_protocol_versions_dal() + // .save_prover_protocol_version(data.protocol_version_id, data.l1_verifier_config) + // .await; + // connection + // .fri_witness_generator_dal() + // .save_witness_inputs( + // data.l1_batch_number, + // &blob_url, + // data.protocol_version_id, + // data.eip_4844_blobs, + // ) + // .await; } } From 54d55e01025c20c09b7277a5abf8d5322a28bb29 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 16:23:34 +0300 Subject: [PATCH 09/19] Fix `test_final_proof_deserialization` --- checks-config/era.dic | 1 + .../tests/job_serialization.rs | 4 +++- ...roof_1.bin => l1_batch_proof_1_0_24_0.bin} | Bin 1709 -> 1723 bytes .../src/proof_gen_data_fetcher.rs | 15 +-------------- 4 files changed, 5 insertions(+), 15 deletions(-) rename core/lib/prover_interface/tests/{l1_batch_proof_1.bin => l1_batch_proof_1_0_24_0.bin} (97%) diff --git a/checks-config/era.dic b/checks-config/era.dic index 063c129b3e66..6a7e0cf940da 100644 --- a/checks-config/era.dic +++ b/checks-config/era.dic @@ -969,3 +969,4 @@ preloaded e2e upcasting foundryup +semver diff --git a/core/lib/prover_interface/tests/job_serialization.rs b/core/lib/prover_interface/tests/job_serialization.rs index e813c2a02db2..0b37b6cf1283 100644 --- a/core/lib/prover_interface/tests/job_serialization.rs +++ b/core/lib/prover_interface/tests/job_serialization.rs @@ -69,7 +69,9 @@ async fn prepare_basic_circuits_job_compatibility() { /// Simple test to check if we can succesfully parse the proof. #[tokio::test] async fn test_final_proof_deserialization() { - let proof = fs::read("./tests/l1_batch_proof_1.bin").await.unwrap(); + let proof = fs::read("./tests/l1_batch_proof_1_0_24_0.bin") + .await + .unwrap(); let results: L1BatchProofForL1 = bincode::deserialize(&proof).unwrap(); assert_eq!(results.aggregation_result_coords[0][0], 0); diff --git a/core/lib/prover_interface/tests/l1_batch_proof_1.bin b/core/lib/prover_interface/tests/l1_batch_proof_1_0_24_0.bin similarity index 97% rename from core/lib/prover_interface/tests/l1_batch_proof_1.bin rename to core/lib/prover_interface/tests/l1_batch_proof_1_0_24_0.bin index e9e1d69d3240649e79e1b4e41c6f00b985f55583..5fd81784c0bb087029f50ba4c0854363a38915fe 100644 GIT binary patch delta 22 ZcmZ3>yPJ2zS~fm51_&_FGcwUL002Dk1RMYW delta 7 OcmdnZyOwvuS~dU-cLL@B diff --git a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs index 3e7cd7c096ab..0fbd66fc9786 100644 --- a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs +++ b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs @@ -14,20 +14,7 @@ impl PeriodicApiStruct { .await .expect("Failed to save proof generation data to GCS"); let mut connection = self.pool.connection().await.unwrap(); - todo!(); // Will be fixed in prover PR. - // connection - // .fri_protocol_versions_dal() - // .save_prover_protocol_version(data.protocol_version_id, data.l1_verifier_config) - // .await; - // connection - // .fri_witness_generator_dal() - // .save_witness_inputs( - // data.l1_batch_number, - // &blob_url, - // data.protocol_version_id, - // data.eip_4844_blobs, - // ) - // .await; + todo!() // Will be fixed in prover PR. } } From 43af159475579f9e1c45a29b139859c7f7a78e2f Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 16:42:56 +0300 Subject: [PATCH 10/19] Fix upgrade test --- core/tests/upgrade-test/tests/upgrade.test.ts | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/core/tests/upgrade-test/tests/upgrade.test.ts b/core/tests/upgrade-test/tests/upgrade.test.ts index 9e9458394ea3..7fe97e727a64 100644 --- a/core/tests/upgrade-test/tests/upgrade.test.ts +++ b/core/tests/upgrade-test/tests/upgrade.test.ts @@ -175,7 +175,6 @@ describe('Upgrade test', function () { const delegateCalldata = L2_FORCE_DEPLOY_UPGRADER_ABI.encodeFunctionData('forceDeploy', [[forceDeployment]]); const data = COMPLEX_UPGRADER_ABI.encodeFunctionData('upgrade', [delegateTo, delegateCalldata]); - const oldProtocolVersion = await alice._providerL2().send('zks_getProtocolVersion', [null]); const calldata = await prepareUpgradeCalldata(govWallet, alice._providerL2(), { l2ProtocolUpgradeTx: { txType: 254, @@ -196,8 +195,7 @@ describe('Upgrade test', function () { }, factoryDeps: [forceDeployBytecode], bootloaderHash, - upgradeTimestamp: 0, - oldProtocolVersion: oldProtocolVersion.version_id + upgradeTimestamp: 0 }); scheduleTransparentOperation = calldata.scheduleTransparentOperation; executeOperation = calldata.executeOperation; @@ -387,7 +385,6 @@ async function prepareUpgradeCalldata( l1ContractsUpgradeCalldata?: BytesLike; postUpgradeCalldata?: BytesLike; upgradeTimestamp: BigNumberish; - oldProtocolVersion?: BigNumberish; } ) { const upgradeAddress = process.env.CONTRACTS_DEFAULT_UPGRADE_ADDR; @@ -400,9 +397,10 @@ async function prepareUpgradeCalldata( const zksyncContract = new ethers.Contract(zksyncAddress, zksync.utils.ZKSYNC_MAIN_ABI, govWallet); const stmAddress = await zksyncContract.getStateTransitionManager(); - const oldProtocolVersion = params.oldProtocolVersion ?? (await zksyncContract.getProtocolVersion()); - const newProtocolVersion = ethers.BigNumber.from(oldProtocolVersion).add(1); - params.l2ProtocolUpgradeTx.nonce ??= newProtocolVersion; + const oldProtocolVersion = await zksyncContract.getProtocolVersion(); + const newProtocolVersion = addToProtocolVersion(oldProtocolVersion, 1, 1); + + params.l2ProtocolUpgradeTx.nonce ??= unpackNumberSemVer(newProtocolVersion)[1]; const upgradeInitData = L1_DEFAULT_UPGRADE_ABI.encodeFunctionData('upgrade', [ [ params.l2ProtocolUpgradeTx, @@ -476,3 +474,26 @@ async function mintToWallet( const l1Erc20Contract = new ethers.Contract(baseTokenAddress, l1Erc20ABI, ethersWallet); await (await l1Erc20Contract.mint(ethersWallet.address, amountToMint)).wait(); } + +const SEMVER_MINOR_VERSION_MULTIPLIER = 4294967296; + +function unpackNumberSemVer(semver: number): [number, number, number] { + const major = 0; + const minor = Math.floor(semver / SEMVER_MINOR_VERSION_MULTIPLIER); + const patch = semver % SEMVER_MINOR_VERSION_MULTIPLIER; + return [major, minor, patch]; +} + +// The major version is always 0 for now +export function packSemver(major: number, minor: number, patch: number) { + if (major !== 0) { + throw new Error('Major version must be 0'); + } + + return minor * SEMVER_MINOR_VERSION_MULTIPLIER + patch; +} + +export function addToProtocolVersion(packedProtocolVersion: number, minor: number, patch: number) { + const [major, minorVersion, patchVersion] = unpackNumberSemVer(packedProtocolVersion); + return packSemver(major, minorVersion + minor, patchVersion + patch); +} From d2abe46d719b7f343f43160e278fd9264afc5de7 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 27 May 2024 17:09:09 +0300 Subject: [PATCH 11/19] Update comments --- core/node/eth_watch/src/tests.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/node/eth_watch/src/tests.rs b/core/node/eth_watch/src/tests.rs index ad637c1677e2..0a690890e17a 100644 --- a/core/node/eth_watch/src/tests.rs +++ b/core/node/eth_watch/src/tests.rs @@ -328,16 +328,16 @@ async fn test_normal_operation_governance_upgrades() { ]) .await; client.set_last_finalized_block_number(15).await; - // second upgrade will not be processed, as it has less than 5 confirmations + // The second upgrade will not be processed, as it has less than 5 confirmations. watcher.loop_iteration(&mut storage).await.unwrap(); let db_versions = storage.protocol_versions_dal().all_versions().await; - // there should be genesis version and just added version + // There should be genesis version and just added version. assert_eq!(db_versions.len(), 2); assert_eq!(db_versions[1].minor, ProtocolVersionId::latest()); client.set_last_finalized_block_number(20).await; - // now the second upgrade will be processed + // Now the second and the third upgrades will be processed. watcher.loop_iteration(&mut storage).await.unwrap(); let db_versions = storage.protocol_versions_dal().all_versions().await; let mut expected_version = ProtocolSemanticVersion { @@ -349,7 +349,7 @@ async fn test_normal_operation_governance_upgrades() { expected_version.patch += 1; assert_eq!(db_versions[3], expected_version); - // check that tx was saved with the last upgrade + // Check that tx was saved with the second upgrade. let tx = storage .protocol_versions_dal() .get_protocol_upgrade_tx(ProtocolVersionId::next()) From 3736e1c4a1296c79835c3fda897420880327a904 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 28 May 2024 10:40:27 +0300 Subject: [PATCH 12/19] Address comments --- core/bin/genesis_generator/src/main.rs | 2 +- core/lib/basic_types/src/protocol_version.rs | 9 +++------ .../lib/dal/src/models/storage_protocol_version.rs | 2 +- core/lib/dal/src/protocol_versions_dal.rs | 14 ++++++++------ 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/core/bin/genesis_generator/src/main.rs b/core/bin/genesis_generator/src/main.rs index a6db0c115f4d..abdd6091ed73 100644 --- a/core/bin/genesis_generator/src/main.rs +++ b/core/bin/genesis_generator/src/main.rs @@ -84,7 +84,7 @@ async fn generate_new_config( let mut updated_genesis = GenesisConfig { protocol_version: Some(ProtocolSemanticVersion { minor: ProtocolVersionId::latest(), - patch: 0.into(), + patch: 0.into(), // genesis generator proposes some new valid config, so patch 0 works here. }), genesis_root_hash: None, rollup_last_leaf_index: None, diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 8b18c47ecf04..ec5089bf467a 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -282,7 +282,7 @@ impl From for VmVersion { basic_type!( /// Patch part of semantic protocol version. VkPatch, - u16 + u32 ); /// Semantic protocol version. @@ -302,13 +302,10 @@ impl ProtocolSemanticVersion { & U256::from(PACKED_SEMVER_MINOR_MASK)) .try_into()?; let patch = packed.0[0] as u32; - if patch > u32::from(u16::MAX) { - return Err("Patches greater than u16::MAX are not supported".to_string()); - } Ok(Self { minor, - patch: VkPatch(patch as u16), + patch: VkPatch(patch), }) } @@ -363,7 +360,7 @@ impl FromStr for ProtocolSemanticVersion { .map_err(|_| ParseProtocolSemanticVersionError::InvalidFormat)?; let patch = parts[2] - .parse::() + .parse::() .map_err(ParseProtocolSemanticVersionError::ParseIntError)?; Ok(ProtocolSemanticVersion { diff --git a/core/lib/dal/src/models/storage_protocol_version.rs b/core/lib/dal/src/models/storage_protocol_version.rs index 2745799e38f7..8caac6db140b 100644 --- a/core/lib/dal/src/models/storage_protocol_version.rs +++ b/core/lib/dal/src/models/storage_protocol_version.rs @@ -29,7 +29,7 @@ pub(crate) fn protocol_version_from_storage( protocol_upgrade::ProtocolVersion { version: ProtocolSemanticVersion { minor: (storage_version.minor as u16).try_into().unwrap(), - patch: VkPatch(storage_version.patch as u16), + patch: VkPatch(storage_version.patch as u32), }, timestamp: storage_version.timestamp as u64, l1_verifier_config: L1VerifierConfig { diff --git a/core/lib/dal/src/protocol_versions_dal.rs b/core/lib/dal/src/protocol_versions_dal.rs index 1399483f7109..6a7e514bf205 100644 --- a/core/lib/dal/src/protocol_versions_dal.rs +++ b/core/lib/dal/src/protocol_versions_dal.rs @@ -85,7 +85,7 @@ impl ProtocolVersionsDal<'_, '_> { ON CONFLICT DO NOTHING "#, version.minor as i32, - i32::from(version.patch.0), + version.patch.0 as i32, l1_verifier_config .recursion_scheduler_level_vk_hash .as_bytes(), @@ -303,7 +303,7 @@ impl ProtocolVersionsDal<'_, '_> { AND patch = $2 "#, version.minor as i32, - i32::from(version.patch.0) + version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await @@ -347,9 +347,11 @@ impl ProtocolVersionsDal<'_, '_> { .instrument("get_patch_version_for_vk") .fetch_optional(self.storage) .await?; - Ok(row.map(|row| VkPatch(row.patch as u16))) + Ok(row.map(|row| VkPatch(row.patch as u32))) } + /// Returns first patch number for the minor version. + /// Note, that some patch numbers can be skipped, so the result is not always 0. pub async fn first_vk_patch_for_version( &mut self, version_id: ProtocolVersionId, @@ -372,7 +374,7 @@ impl ProtocolVersionsDal<'_, '_> { .instrument("first_vk_patch_for_version") .fetch_optional(self.storage) .await?; - Ok(row.map(|row| VkPatch(row.patch as u16))) + Ok(row.map(|row| VkPatch(row.patch as u32))) } pub async fn latest_semantic_version(&mut self) -> DalResult> { @@ -393,7 +395,7 @@ impl ProtocolVersionsDal<'_, '_> { .try_map(|row| { parse_protocol_version(row.minor).map(|minor| ProtocolSemanticVersion { minor, - patch: (row.patch as u16).into(), + patch: (row.patch as u32).into(), }) }) .instrument("latest_semantic_version") @@ -438,7 +440,7 @@ impl ProtocolVersionsDal<'_, '_> { rows.into_iter() .map(|row| ProtocolSemanticVersion { minor: (row.minor as u16).try_into().unwrap(), - patch: (row.patch as u16).into(), + patch: (row.patch as u32).into(), }) .collect() } From a784643f6c9a2940120ec95b0a474b24530d7483 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 28 May 2024 12:02:01 +0300 Subject: [PATCH 13/19] Address comments --- core/lib/basic_types/src/protocol_version.rs | 24 +++++++-- core/lib/config/src/testonly.rs | 4 +- ...9edd4367018ed40c77d9866899ab15d2abe05.json | 19 +++++++ ...018d301eefed1b713b34129d47932c555b22.json} | 4 +- ...f222083d375221c5a1097f3aa10ccd9094e1.json} | 4 +- ...3572757aba0580637c0ef0e7cc5cdd7396f3.json} | 4 +- ...60b7bd48b48b63d9db071ef94c5fec4660c9.json} | 4 +- ...525aea4f80cce95bbcde3088c9b41af2d5559.json | 19 ------- ...48fdf74448b6a8906d55b68b48320f2b04ba.json} | 4 +- ...45d6bb2b76dbd3b366a177ddfc705500fa31.json} | 4 +- ...006_add_protocol_vk_patches_table.down.sql | 2 +- ...82006_add_protocol_vk_patches_table.up.sql | 4 +- .../src/models/storage_protocol_version.rs | 4 +- core/lib/dal/src/protocol_versions_dal.rs | 53 ++++++++++--------- .../lib/dal/src/protocol_versions_web3_dal.rs | 14 ++--- core/lib/env_config/src/genesis.rs | 2 + core/lib/types/src/protocol_upgrade.rs | 2 +- .../node/api_server/src/web3/namespaces/en.rs | 2 +- core/node/eth_sender/src/aggregator.rs | 49 ++++++++++------- .../event_processors/governance_upgrades.rs | 7 ++- core/node/genesis/src/lib.rs | 4 +- core/node/node_sync/src/external_io.rs | 4 +- infrastructure/zk/src/config.ts | 1 + 23 files changed, 138 insertions(+), 100 deletions(-) create mode 100644 core/lib/dal/.sqlx/query-11eaf115b7409feaf15aaee50839edd4367018ed40c77d9866899ab15d2abe05.json rename core/lib/dal/.sqlx/{query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json => query-127a87a1fa6690944ff1b69c6e28018d301eefed1b713b34129d47932c555b22.json} (55%) rename core/lib/dal/.sqlx/{query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json => query-494aca1d3684d394c0e7b5a7febbf222083d375221c5a1097f3aa10ccd9094e1.json} (59%) rename core/lib/dal/.sqlx/{query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json => query-67852a656494ec8381b253b71e1b3572757aba0580637c0ef0e7cc5cdd7396f3.json} (70%) rename core/lib/dal/.sqlx/{query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json => query-6f05b8ad720f9c1fae9292c16b5960b7bd48b48b63d9db071ef94c5fec4660c9.json} (51%) delete mode 100644 core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json rename core/lib/dal/.sqlx/{query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json => query-d45de6e0add0a94d7f6df10bca0248fdf74448b6a8906d55b68b48320f2b04ba.json} (71%) rename core/lib/dal/.sqlx/{query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json => query-daed1021023a37f01ba5a1207b1745d6bb2b76dbd3b366a177ddfc705500fa31.json} (82%) diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index ec5089bf467a..caa2748ef905 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -281,7 +281,7 @@ impl From for VmVersion { basic_type!( /// Patch part of semantic protocol version. - VkPatch, + VersionPatch, u32 ); @@ -291,7 +291,7 @@ basic_type!( )] pub struct ProtocolSemanticVersion { pub minor: ProtocolVersionId, - pub patch: VkPatch, + pub patch: VersionPatch, } impl ProtocolSemanticVersion { @@ -305,7 +305,7 @@ impl ProtocolSemanticVersion { Ok(Self { minor, - patch: VkPatch(patch), + patch: VersionPatch(patch), }) } @@ -378,3 +378,21 @@ impl Default for ProtocolSemanticVersion { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_protocol_version_packing() { + let version = ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 10.into(), + }; + + let packed = version.pack(); + let unpacked = ProtocolSemanticVersion::try_from_packed(packed).unwrap(); + + assert_eq!(version, unpacked); + } +} diff --git a/core/lib/config/src/testonly.rs b/core/lib/config/src/testonly.rs index db4f3d1c0d6a..55e4d1c82767 100644 --- a/core/lib/config/src/testonly.rs +++ b/core/lib/config/src/testonly.rs @@ -5,7 +5,7 @@ use zksync_basic_types::{ basic_fri_types::CircuitIdRoundTuple, commitment::L1BatchCommitmentMode, network::Network, - protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VkPatch}, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VersionPatch}, L1ChainId, L2ChainId, }; use zksync_consensus_utils::EncodeDist; @@ -667,7 +667,7 @@ impl Distribution for EncodeDist { rng.gen_range(0..(ProtocolVersionId::latest() as u16)), ) .unwrap(), - patch: VkPatch(rng.gen()), + patch: VersionPatch(rng.gen()), }), genesis_root_hash: rng.gen(), rollup_last_leaf_index: self.sample(rng), diff --git a/core/lib/dal/.sqlx/query-11eaf115b7409feaf15aaee50839edd4367018ed40c77d9866899ab15d2abe05.json b/core/lib/dal/.sqlx/query-11eaf115b7409feaf15aaee50839edd4367018ed40c77d9866899ab15d2abe05.json new file mode 100644 index 000000000000..fb1be26d15c4 --- /dev/null +++ b/core/lib/dal/.sqlx/query-11eaf115b7409feaf15aaee50839edd4367018ed40c77d9866899ab15d2abe05.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO\n protocol_patches (\n minor,\n patch,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, NOW())\n ON CONFLICT DO NOTHING\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4", + "Bytea", + "Bytea", + "Bytea", + "Bytea" + ] + }, + "nullable": [] + }, + "hash": "11eaf115b7409feaf15aaee50839edd4367018ed40c77d9866899ab15d2abe05" +} diff --git a/core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json b/core/lib/dal/.sqlx/query-127a87a1fa6690944ff1b69c6e28018d301eefed1b713b34129d47932c555b22.json similarity index 55% rename from core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json rename to core/lib/dal/.sqlx/query-127a87a1fa6690944ff1b69c6e28018d301eefed1b713b34129d47932c555b22.json index 39af758bf6d2..de80e6af8a95 100644 --- a/core/lib/dal/.sqlx/query-d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553.json +++ b/core/lib/dal/.sqlx/query-127a87a1fa6690944ff1b69c6e28018d301eefed1b713b34129d47932c555b22.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n ORDER BY\n patch\n LIMIT\n 1\n ", + "query": "\n SELECT\n patch\n FROM\n protocol_patches\n WHERE\n minor = $1\n ORDER BY\n patch\n LIMIT\n 1\n ", "describe": { "columns": [ { @@ -18,5 +18,5 @@ false ] }, - "hash": "d8be877f8941bcdc7d654d1015c1af686d652a3bc5e2c70ad9ac805badbf9553" + "hash": "127a87a1fa6690944ff1b69c6e28018d301eefed1b713b34129d47932c555b22" } diff --git a/core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json b/core/lib/dal/.sqlx/query-494aca1d3684d394c0e7b5a7febbf222083d375221c5a1097f3aa10ccd9094e1.json similarity index 59% rename from core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json rename to core/lib/dal/.sqlx/query-494aca1d3684d394c0e7b5a7febbf222083d375221c5a1097f3aa10ccd9094e1.json index 0b106e1a4450..5d2691edb3e9 100644 --- a/core/lib/dal/.sqlx/query-32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530.json +++ b/core/lib/dal/.sqlx/query-494aca1d3684d394c0e7b5a7febbf222083d375221c5a1097f3aa10ccd9094e1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_vk_patches\n ORDER BY\n minor DESC,\n patch DESC\n LIMIT\n 1\n ", + "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_patches\n ORDER BY\n minor DESC,\n patch DESC\n LIMIT\n 1\n ", "describe": { "columns": [ { @@ -22,5 +22,5 @@ false ] }, - "hash": "32b463117f80214b14d848b959c722e7ecdefa7f5be7ca44cef26b6104320530" + "hash": "494aca1d3684d394c0e7b5a7febbf222083d375221c5a1097f3aa10ccd9094e1" } diff --git a/core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json b/core/lib/dal/.sqlx/query-67852a656494ec8381b253b71e1b3572757aba0580637c0ef0e7cc5cdd7396f3.json similarity index 70% rename from core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json rename to core/lib/dal/.sqlx/query-67852a656494ec8381b253b71e1b3572757aba0580637c0ef0e7cc5cdd7396f3.json index 5b915812dcca..6defdf7afebc 100644 --- a/core/lib/dal/.sqlx/query-012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d.json +++ b/core/lib/dal/.sqlx/query-67852a656494ec8381b253b71e1b3572757aba0580637c0ef0e7cc5cdd7396f3.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n protocol_versions.id AS \"minor!\",\n protocol_versions.timestamp,\n protocol_versions.bootloader_code_hash,\n protocol_versions.default_account_code_hash,\n protocol_versions.upgrade_tx_hash,\n protocol_vk_patches.patch,\n protocol_vk_patches.recursion_scheduler_level_vk_hash,\n protocol_vk_patches.recursion_node_level_vk_hash,\n protocol_vk_patches.recursion_leaf_level_vk_hash,\n protocol_vk_patches.recursion_circuits_set_vks_hash\n FROM\n protocol_versions\n JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id\n WHERE\n id = $1\n ORDER BY\n protocol_vk_patches.patch DESC\n LIMIT\n 1\n ", + "query": "\n SELECT\n protocol_versions.id AS \"minor!\",\n protocol_versions.timestamp,\n protocol_versions.bootloader_code_hash,\n protocol_versions.default_account_code_hash,\n protocol_versions.upgrade_tx_hash,\n protocol_patches.patch,\n protocol_patches.recursion_scheduler_level_vk_hash,\n protocol_patches.recursion_node_level_vk_hash,\n protocol_patches.recursion_leaf_level_vk_hash,\n protocol_patches.recursion_circuits_set_vks_hash\n FROM\n protocol_versions\n JOIN protocol_patches ON protocol_patches.minor = protocol_versions.id\n WHERE\n id = $1\n ORDER BY\n protocol_patches.patch DESC\n LIMIT\n 1\n ", "describe": { "columns": [ { @@ -72,5 +72,5 @@ false ] }, - "hash": "012b4e69b5f339239524088f11699d13a555f824ecf459fa204b86c6c5f9f01d" + "hash": "67852a656494ec8381b253b71e1b3572757aba0580637c0ef0e7cc5cdd7396f3" } diff --git a/core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json b/core/lib/dal/.sqlx/query-6f05b8ad720f9c1fae9292c16b5960b7bd48b48b63d9db071ef94c5fec4660c9.json similarity index 51% rename from core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json rename to core/lib/dal/.sqlx/query-6f05b8ad720f9c1fae9292c16b5960b7bd48b48b63d9db071ef94c5fec4660c9.json index 60ab165bc285..32a9955cc270 100644 --- a/core/lib/dal/.sqlx/query-1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7.json +++ b/core/lib/dal/.sqlx/query-6f05b8ad720f9c1fae9292c16b5960b7bd48b48b63d9db071ef94c5fec4660c9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n patch\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n AND recursion_scheduler_level_vk_hash = $2\n ORDER BY\n patch DESC\n LIMIT\n 1\n ", + "query": "\n SELECT\n patch\n FROM\n protocol_patches\n WHERE\n minor = $1\n AND recursion_scheduler_level_vk_hash = $2\n ORDER BY\n patch DESC\n ", "describe": { "columns": [ { @@ -19,5 +19,5 @@ false ] }, - "hash": "1bfaa2620b0d95c64dd21d1b172eb296384e425675167d48c67fe43f456da6b7" + "hash": "6f05b8ad720f9c1fae9292c16b5960b7bd48b48b63d9db071ef94c5fec4660c9" } diff --git a/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json b/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json deleted file mode 100644 index a4adc1186f35..000000000000 --- a/core/lib/dal/.sqlx/query-a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n protocol_vk_patches (\n minor,\n patch,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, NOW())\n ON CONFLICT DO NOTHING\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int4", - "Int4", - "Bytea", - "Bytea", - "Bytea", - "Bytea" - ] - }, - "nullable": [] - }, - "hash": "a8895d839cc51395cc6d0110e5e525aea4f80cce95bbcde3088c9b41af2d5559" -} diff --git a/core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json b/core/lib/dal/.sqlx/query-d45de6e0add0a94d7f6df10bca0248fdf74448b6a8906d55b68b48320f2b04ba.json similarity index 71% rename from core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json rename to core/lib/dal/.sqlx/query-d45de6e0add0a94d7f6df10bca0248fdf74448b6a8906d55b68b48320f2b04ba.json index eca0525a59bd..926df40cf9da 100644 --- a/core/lib/dal/.sqlx/query-a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93.json +++ b/core/lib/dal/.sqlx/query-d45de6e0add0a94d7f6df10bca0248fdf74448b6a8906d55b68b48320f2b04ba.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_vk_patches\n ", + "query": "\n SELECT\n minor,\n patch\n FROM\n protocol_patches\n ", "describe": { "columns": [ { @@ -22,5 +22,5 @@ false ] }, - "hash": "a85a9557b3f4485ebea69819e3295960c4f0632968b04227343e8600860c2c93" + "hash": "d45de6e0add0a94d7f6df10bca0248fdf74448b6a8906d55b68b48320f2b04ba" } diff --git a/core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json b/core/lib/dal/.sqlx/query-daed1021023a37f01ba5a1207b1745d6bb2b76dbd3b366a177ddfc705500fa31.json similarity index 82% rename from core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json rename to core/lib/dal/.sqlx/query-daed1021023a37f01ba5a1207b1745d6bb2b76dbd3b366a177ddfc705500fa31.json index 03dd491f1921..00152a612cd9 100644 --- a/core/lib/dal/.sqlx/query-5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e.json +++ b/core/lib/dal/.sqlx/query-daed1021023a37f01ba5a1207b1745d6bb2b76dbd3b366a177ddfc705500fa31.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n protocol_vk_patches\n WHERE\n minor = $1\n AND patch = $2\n ", + "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n protocol_patches\n WHERE\n minor = $1\n AND patch = $2\n ", "describe": { "columns": [ { @@ -37,5 +37,5 @@ false ] }, - "hash": "5b4801c1f2c9f345a98ee73c02913d7619f6535e40f189029488b74df401d87e" + "hash": "daed1021023a37f01ba5a1207b1745d6bb2b76dbd3b366a177ddfc705500fa31" } diff --git a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql index f9fc902bc732..8dfc84a65a10 100644 --- a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql +++ b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.down.sql @@ -1,4 +1,4 @@ -DROP TABLE IF EXISTS protocol_vk_patches; +DROP TABLE IF EXISTS protocol_patches; ALTER TABLE protocol_versions ALTER COLUMN recursion_scheduler_level_vk_hash SET NOT NULL; ALTER TABLE protocol_versions ALTER COLUMN recursion_node_level_vk_hash SET NOT NULL; diff --git a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql index 86ef3fbe8bff..840c1ef9d32e 100644 --- a/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql +++ b/core/lib/dal/migrations/20240527082006_add_protocol_vk_patches_table.up.sql @@ -1,4 +1,4 @@ -CREATE TABLE protocol_vk_patches ( +CREATE TABLE protocol_patches ( minor INTEGER NOT NULL REFERENCES protocol_versions(id), patch INTEGER NOT NULL, recursion_scheduler_level_vk_hash BYTEA NOT NULL, @@ -9,7 +9,7 @@ CREATE TABLE protocol_vk_patches ( PRIMARY KEY (minor, patch) ); -INSERT INTO protocol_vk_patches +INSERT INTO protocol_patches SELECT id as "minor", 0 as "patch", recursion_scheduler_level_vk_hash, recursion_node_level_vk_hash, recursion_leaf_level_vk_hash, recursion_circuits_set_vks_hash, now() as "created_at" FROM protocol_versions; diff --git a/core/lib/dal/src/models/storage_protocol_version.rs b/core/lib/dal/src/models/storage_protocol_version.rs index 8caac6db140b..f21fa594f665 100644 --- a/core/lib/dal/src/models/storage_protocol_version.rs +++ b/core/lib/dal/src/models/storage_protocol_version.rs @@ -4,7 +4,7 @@ use zksync_contracts::BaseSystemContractsHashes; use zksync_types::{ api, protocol_upgrade::{self, ProtocolUpgradeTx}, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VersionPatch}, H256, }; @@ -29,7 +29,7 @@ pub(crate) fn protocol_version_from_storage( protocol_upgrade::ProtocolVersion { version: ProtocolSemanticVersion { minor: (storage_version.minor as u16).try_into().unwrap(), - patch: VkPatch(storage_version.patch as u32), + patch: VersionPatch(storage_version.patch as u32), }, timestamp: storage_version.timestamp as u64, l1_verifier_config: L1VerifierConfig { diff --git a/core/lib/dal/src/protocol_versions_dal.rs b/core/lib/dal/src/protocol_versions_dal.rs index 6a7e514bf205..c395d8cba4ce 100644 --- a/core/lib/dal/src/protocol_versions_dal.rs +++ b/core/lib/dal/src/protocol_versions_dal.rs @@ -9,7 +9,7 @@ use zksync_db_connection::{ }; use zksync_types::{ protocol_upgrade::{ProtocolUpgradeTx, ProtocolVersion}, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VersionPatch}, ProtocolVersionId, H256, }; @@ -71,7 +71,7 @@ impl ProtocolVersionsDal<'_, '_> { sqlx::query!( r#" INSERT INTO - protocol_vk_patches ( + protocol_patches ( minor, patch, recursion_scheduler_level_vk_hash, @@ -255,18 +255,18 @@ impl ProtocolVersionsDal<'_, '_> { protocol_versions.bootloader_code_hash, protocol_versions.default_account_code_hash, protocol_versions.upgrade_tx_hash, - protocol_vk_patches.patch, - protocol_vk_patches.recursion_scheduler_level_vk_hash, - protocol_vk_patches.recursion_node_level_vk_hash, - protocol_vk_patches.recursion_leaf_level_vk_hash, - protocol_vk_patches.recursion_circuits_set_vks_hash + protocol_patches.patch, + protocol_patches.recursion_scheduler_level_vk_hash, + protocol_patches.recursion_node_level_vk_hash, + protocol_patches.recursion_leaf_level_vk_hash, + protocol_patches.recursion_circuits_set_vks_hash FROM protocol_versions - JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id + JOIN protocol_patches ON protocol_patches.minor = protocol_versions.id WHERE id = $1 ORDER BY - protocol_vk_patches.patch DESC + protocol_patches.patch DESC LIMIT 1 "#, @@ -297,7 +297,7 @@ impl ProtocolVersionsDal<'_, '_> { recursion_leaf_level_vk_hash, recursion_circuits_set_vks_hash FROM - protocol_vk_patches + protocol_patches WHERE minor = $1 AND patch = $2 @@ -322,46 +322,47 @@ impl ProtocolVersionsDal<'_, '_> { }) } - pub async fn get_patch_version_for_vk( + pub async fn get_patch_versions_for_vk( &mut self, minor_version: ProtocolVersionId, recursion_scheduler_level_vk_hash: H256, - ) -> DalResult> { - let row = sqlx::query!( + ) -> DalResult> { + let rows = sqlx::query!( r#" SELECT patch FROM - protocol_vk_patches + protocol_patches WHERE minor = $1 AND recursion_scheduler_level_vk_hash = $2 ORDER BY patch DESC - LIMIT - 1 "#, minor_version as i32, recursion_scheduler_level_vk_hash.as_bytes() ) - .instrument("get_patch_version_for_vk") - .fetch_optional(self.storage) + .instrument("get_patch_versions_for_vk") + .fetch_all(self.storage) .await?; - Ok(row.map(|row| VkPatch(row.patch as u32))) + Ok(rows + .into_iter() + .map(|row| VersionPatch(row.patch as u32)) + .collect()) } /// Returns first patch number for the minor version. /// Note, that some patch numbers can be skipped, so the result is not always 0. - pub async fn first_vk_patch_for_version( + pub async fn first_patch_for_version( &mut self, version_id: ProtocolVersionId, - ) -> DalResult> { + ) -> DalResult> { let row = sqlx::query!( r#" SELECT patch FROM - protocol_vk_patches + protocol_patches WHERE minor = $1 ORDER BY @@ -371,10 +372,10 @@ impl ProtocolVersionsDal<'_, '_> { "#, version_id as i32, ) - .instrument("first_vk_patch_for_version") + .instrument("first_patch_for_version") .fetch_optional(self.storage) .await?; - Ok(row.map(|row| VkPatch(row.patch as u32))) + Ok(row.map(|row| VersionPatch(row.patch as u32))) } pub async fn latest_semantic_version(&mut self) -> DalResult> { @@ -384,7 +385,7 @@ impl ProtocolVersionsDal<'_, '_> { minor, patch FROM - protocol_vk_patches + protocol_patches ORDER BY minor DESC, patch DESC @@ -431,7 +432,7 @@ impl ProtocolVersionsDal<'_, '_> { minor, patch FROM - protocol_vk_patches + protocol_patches "# ) .fetch_all(self.storage.conn()) diff --git a/core/lib/dal/src/protocol_versions_web3_dal.rs b/core/lib/dal/src/protocol_versions_web3_dal.rs index 048934f08295..5b5e1e21dca7 100644 --- a/core/lib/dal/src/protocol_versions_web3_dal.rs +++ b/core/lib/dal/src/protocol_versions_web3_dal.rs @@ -22,18 +22,18 @@ impl ProtocolVersionsWeb3Dal<'_, '_> { protocol_versions.bootloader_code_hash, protocol_versions.default_account_code_hash, protocol_versions.upgrade_tx_hash, - protocol_vk_patches.patch, - protocol_vk_patches.recursion_scheduler_level_vk_hash, - protocol_vk_patches.recursion_node_level_vk_hash, - protocol_vk_patches.recursion_leaf_level_vk_hash, - protocol_vk_patches.recursion_circuits_set_vks_hash + protocol_patches.patch, + protocol_patches.recursion_scheduler_level_vk_hash, + protocol_patches.recursion_node_level_vk_hash, + protocol_patches.recursion_leaf_level_vk_hash, + protocol_patches.recursion_circuits_set_vks_hash FROM protocol_versions - JOIN protocol_vk_patches ON protocol_vk_patches.minor = protocol_versions.id + JOIN protocol_patches ON protocol_patches.minor = protocol_versions.id WHERE id = $1 ORDER BY - protocol_vk_patches.patch DESC + protocol_patches.patch DESC LIMIT 1 "#, diff --git a/core/lib/env_config/src/genesis.rs b/core/lib/env_config/src/genesis.rs index 84cdf069b4a4..646ad0dba757 100644 --- a/core/lib/env_config/src/genesis.rs +++ b/core/lib/env_config/src/genesis.rs @@ -46,6 +46,8 @@ impl FromEnv for GenesisConfig { let contracts_config = &ContractsForGenesis::from_env()?; let state_keeper = StateKeeperConfig::from_env()?; + // This is needed for backward compatibility, so if the new variable `genesis_protocol_semantic_version` + // wasn't added yet server could still work. TODO: remove it in the next release. let protocol_version_deprecated = contracts_config .genesis_protocol_version .map(|minor| { diff --git a/core/lib/types/src/protocol_upgrade.rs b/core/lib/types/src/protocol_upgrade.rs index ee541dc5f636..e6861060c000 100644 --- a/core/lib/types/src/protocol_upgrade.rs +++ b/core/lib/types/src/protocol_upgrade.rs @@ -217,7 +217,7 @@ pub fn decode_set_chain_id_event( let full_version_id = h256_to_u256(event.topics[2]); let protocol_version = ProtocolVersionId::try_from_packed_semver(full_version_id) - .expect("Version is not supported"); + .unwrap_or_else(|_| panic!("Version is not supported, packed version: {full_version_id}")); let eth_hash = event .transaction_hash diff --git a/core/node/api_server/src/web3/namespaces/en.rs b/core/node/api_server/src/web3/namespaces/en.rs index a54fd6162b9f..3dcea74a45f6 100644 --- a/core/node/api_server/src/web3/namespaces/en.rs +++ b/core/node/api_server/src/web3/namespaces/en.rs @@ -104,7 +104,7 @@ impl EnNamespace { let minor = ProtocolVersionId::try_from(minor).context("Malformed protocol version")?; let patch = storage .protocol_versions_dal() - .first_vk_patch_for_version(minor) + .first_patch_for_version(minor) .await .map_err(DalError::generalize)? .context("Genesis is not finished")?; diff --git a/core/node/eth_sender/src/aggregator.rs b/core/node/eth_sender/src/aggregator.rs index 8f9204dfc41d..eb0f3d875197 100644 --- a/core/node/eth_sender/src/aggregator.rs +++ b/core/node/eth_sender/src/aggregator.rs @@ -326,25 +326,32 @@ impl Aggregator { .await .unwrap() .unwrap(); - let required_patch_version = storage + let allowed_patch_versions = storage .protocol_versions_dal() - .get_patch_version_for_vk( + .get_patch_versions_for_vk( minor_version, l1_verifier_config.recursion_scheduler_level_vk_hash, ) .await .unwrap(); - let Some(required_patch_version) = required_patch_version else { - tracing::warn!("No patch version corresponds to the verification key on L1"); + if allowed_patch_versions.is_empty() { + tracing::warn!( + "No patch version corresponds to the verification key on L1: {:?}", + l1_verifier_config.recursion_scheduler_level_vk_hash + ); return None; }; - let required_version = ProtocolSemanticVersion { - minor: minor_version, - patch: required_patch_version, - }; + + let allowed_versions: Vec<_> = allowed_patch_versions + .into_iter() + .map(|patch| ProtocolSemanticVersion { + minor: minor_version, + patch, + }) + .collect(); let proof = - load_wrapped_fri_proofs_for_range(batch_to_prove, blob_store, required_version).await; + load_wrapped_fri_proofs_for_range(batch_to_prove, blob_store, &allowed_versions).await; let Some(proof) = proof else { // The proof for the next L1 batch is not generated yet return None; @@ -504,19 +511,23 @@ async fn extract_ready_subrange( pub async fn load_wrapped_fri_proofs_for_range( l1_batch_number: L1BatchNumber, blob_store: &dyn ObjectStore, - required_version: ProtocolSemanticVersion, + allowed_versions: &[ProtocolSemanticVersion], ) -> Option { - match blob_store.get((l1_batch_number, required_version)).await { - Ok(proof) => return Some(proof), - Err(ObjectStoreError::KeyNotFound(_)) => (), // do nothing, proof is not ready yet - Err(err) => panic!( - "Failed to load proof for batch {}: {}", - l1_batch_number.0, err - ), + for version in allowed_versions { + match blob_store.get((l1_batch_number, *version)).await { + Ok(proof) => return Some(proof), + Err(ObjectStoreError::KeyNotFound(_)) => (), // do nothing, proof is not ready yet + Err(err) => panic!( + "Failed to load proof for batch {}: {}", + l1_batch_number.0, err + ), + } } - // We also check file with deprecated name if patch number is 0. - if required_version.patch.0 == 0 { + // We also check file with deprecated name if patch 0 is allowed. + // TODO: remove in the next release. + let is_patch_0_present = allowed_versions.iter().any(|v| v.patch.0 == 0); + if is_patch_0_present { match blob_store .get_by_encoded_key(format!("l1_batch_proof_{l1_batch_number}.bin")) .await diff --git a/core/node/eth_watch/src/event_processors/governance_upgrades.rs b/core/node/eth_watch/src/event_processors/governance_upgrades.rs index c4029b0755d7..12f07669a6d2 100644 --- a/core/node/eth_watch/src/event_processors/governance_upgrades.rs +++ b/core/node/eth_watch/src/event_processors/governance_upgrades.rs @@ -114,7 +114,12 @@ impl EventProcessor for GovernanceUpgradesEventProcessor { .get_protocol_version_with_latest_patch(latest_semantic_version.minor) .await .map_err(DalError::generalize)? - .context("expected version to be present in DB")?; + .with_context(|| { + format!( + "expected minor version {} to be present in DB", + latest_semantic_version.minor as u16 + ) + })?; let new_version = latest_version.apply_upgrade(upgrade, scheduler_vk_hash); storage diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index 9147db6fdabf..098c2bb558f4 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -17,7 +17,7 @@ use zksync_types::{ commitment::{CommitmentInput, L1BatchCommitment}, fee_model::BatchFeeInput, protocol_upgrade::decode_set_chain_id_event, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VkPatch}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VersionPatch}, system_contracts::get_system_smart_contracts, web3::{BlockNumber, FilterBuilder}, AccountTreeId, Address, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersion, @@ -333,7 +333,7 @@ pub async fn create_genesis_l1_batch( let version = ProtocolVersion { version: ProtocolSemanticVersion { minor: protocol_version, - patch: VkPatch(0), + patch: VersionPatch(0), }, timestamp: 0, l1_verifier_config, diff --git a/core/node/node_sync/src/external_io.rs b/core/node/node_sync/src/external_io.rs index 6df9a1d4fabf..630ecc36c416 100644 --- a/core/node/node_sync/src/external_io.rs +++ b/core/node/node_sync/src/external_io.rs @@ -17,7 +17,7 @@ use zksync_state_keeper::{ }; use zksync_types::{ protocol_upgrade::ProtocolUpgradeTx, - protocol_version::{ProtocolSemanticVersion, VkPatch}, + protocol_version::{ProtocolSemanticVersion, VersionPatch}, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersionId, Transaction, H256, }; use zksync_utils::bytes_to_be_words; @@ -347,7 +347,7 @@ impl StateKeeperIO for ExternalIO { .version_id .try_into() .context("cannot convert protocol version")?, - patch: VkPatch(0), + patch: VersionPatch(0), }, protocol_version.timestamp, protocol_version.verification_keys_hashes, diff --git a/infrastructure/zk/src/config.ts b/infrastructure/zk/src/config.ts index e79d8e883fdd..3aa331a752be 100644 --- a/infrastructure/zk/src/config.ts +++ b/infrastructure/zk/src/config.ts @@ -182,6 +182,7 @@ export function pushConfig(environment?: string, diff?: string) { if (process.env.CONTRACTS_DEV_PROTOCOL_VERSION) { const minor = unpackStringSemVer(process.env.CONTRACTS_DEV_PROTOCOL_VERSION)[1]; + // Since we are bumping the minor version the patch is reset to 0. env.modify( 'CONTRACTS_GENESIS_PROTOCOL_VERSION', `0.${minor + 1}.0`, // The major version is always 0 for now From 9dec8bef6aefc88f2d41f8a2b28c28096b601411 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 28 May 2024 12:06:20 +0300 Subject: [PATCH 14/19] Fix genesis --- core/node/genesis/src/lib.rs | 26 ++++++++++--------- .../src/batch_executor/tests/tester.rs | 9 ++++--- core/node/state_keeper/src/io/common/tests.rs | 2 +- core/node/state_keeper/src/io/tests/tester.rs | 7 +++-- core/node/test_utils/src/lib.rs | 6 ++--- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/core/node/genesis/src/lib.rs b/core/node/genesis/src/lib.rs index 098c2bb558f4..12dd6afc68b3 100644 --- a/core/node/genesis/src/lib.rs +++ b/core/node/genesis/src/lib.rs @@ -17,7 +17,7 @@ use zksync_types::{ commitment::{CommitmentInput, L1BatchCommitment}, fee_model::BatchFeeInput, protocol_upgrade::decode_set_chain_id_event, - protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams, VersionPatch}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, system_contracts::get_system_smart_contracts, web3::{BlockNumber, FilterBuilder}, AccountTreeId, Address, L1BatchNumber, L2BlockNumber, L2ChainId, ProtocolVersion, @@ -137,13 +137,18 @@ impl GenesisParams { } } - pub fn protocol_version(&self) -> ProtocolVersionId { - // It's impossible to instantiate Genesis params with wrong protocol version + pub fn minor_protocol_version(&self) -> ProtocolVersionId { self.config .protocol_version .expect("Protocol version must be set") .minor } + + pub fn protocol_version(&self) -> ProtocolSemanticVersion { + self.config + .protocol_version + .expect("Protocol version must be set") + } } pub struct GenesisBatchParams { @@ -245,7 +250,7 @@ pub async fn insert_genesis_batch( genesis_root_hash, rollup_last_leaf_index, base_system_contract_hashes, - genesis_params.protocol_version(), + genesis_params.minor_protocol_version(), ); let block_commitment = L1BatchCommitment::new(commitment_input); @@ -325,16 +330,13 @@ pub async fn ensure_genesis_state( #[allow(clippy::too_many_arguments)] pub async fn create_genesis_l1_batch( storage: &mut Connection<'_, Core>, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, base_system_contracts: &BaseSystemContracts, system_contracts: &[DeployedContract], l1_verifier_config: L1VerifierConfig, ) -> Result<(), GenesisError> { let version = ProtocolVersion { - version: ProtocolSemanticVersion { - minor: protocol_version, - patch: VersionPatch(0), - }, + version: protocol_version, timestamp: 0, l1_verifier_config, base_system_contracts_hashes: base_system_contracts.hashes(), @@ -345,7 +347,7 @@ pub async fn create_genesis_l1_batch( L1BatchNumber(0), 0, base_system_contracts.hashes(), - protocol_version, + protocol_version.minor, ); let genesis_l2_block_header = L2BlockHeader { @@ -356,10 +358,10 @@ pub async fn create_genesis_l1_batch( l2_tx_count: 0, fee_account_address: Default::default(), base_fee_per_gas: 0, - gas_per_pubdata_limit: get_max_gas_per_pubdata_byte(protocol_version.into()), + gas_per_pubdata_limit: get_max_gas_per_pubdata_byte(protocol_version.minor.into()), batch_fee_input: BatchFeeInput::l1_pegged(0, 0), base_system_contracts_hashes: base_system_contracts.hashes(), - protocol_version: Some(protocol_version), + protocol_version: Some(protocol_version.minor), virtual_blocks: 0, gas_limit: 0, }; diff --git a/core/node/state_keeper/src/batch_executor/tests/tester.rs b/core/node/state_keeper/src/batch_executor/tests/tester.rs index 380e34bf29be..0b8459fe6625 100644 --- a/core/node/state_keeper/src/batch_executor/tests/tester.rs +++ b/core/node/state_keeper/src/batch_executor/tests/tester.rs @@ -17,8 +17,8 @@ use zksync_node_test_utils::prepare_recovery_snapshot; use zksync_state::{ReadStorageFactory, RocksdbStorageOptions}; use zksync_test_account::{Account, DeployContractsTx, TxType}; use zksync_types::{ - block::L2BlockHasher, ethabi::Token, fee::Fee, snapshots::SnapshotRecoveryStatus, - storage_writes_deduplicator::StorageWritesDeduplicator, + block::L2BlockHasher, ethabi::Token, fee::Fee, protocol_version::ProtocolSemanticVersion, + snapshots::SnapshotRecoveryStatus, storage_writes_deduplicator::StorageWritesDeduplicator, system_contracts::get_system_smart_contracts, utils::storage_key_for_standard_token_balance, AccountTreeId, Address, Execute, L1BatchNumber, L2BlockNumber, PriorityOpId, ProtocolVersionId, StorageKey, StorageLog, Transaction, H256, L2_BASE_TOKEN_ADDRESS, @@ -244,7 +244,10 @@ impl Tester { if storage.blocks_dal().is_genesis_needed().await.unwrap() { create_genesis_l1_batch( &mut storage, - ProtocolVersionId::latest(), + ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 0.into(), + }, &BASE_SYSTEM_CONTRACTS, &get_system_smart_contracts(), Default::default(), diff --git a/core/node/state_keeper/src/io/common/tests.rs b/core/node/state_keeper/src/io/common/tests.rs index f4ba9c4500f5..5810061af19a 100644 --- a/core/node/state_keeper/src/io/common/tests.rs +++ b/core/node/state_keeper/src/io/common/tests.rs @@ -464,7 +464,7 @@ async fn getting_batch_version_with_genesis() { .load_l1_batch_protocol_version(&mut storage, L1BatchNumber(0)) .await .unwrap(); - assert_eq!(version, Some(genesis_params.protocol_version())); + assert_eq!(version, Some(genesis_params.minor_protocol_version())); assert!(provider .load_l1_batch_protocol_version(&mut storage, L1BatchNumber(1)) diff --git a/core/node/state_keeper/src/io/tests/tester.rs b/core/node/state_keeper/src/io/tests/tester.rs index a1c27078196e..84dfd4354b3c 100644 --- a/core/node/state_keeper/src/io/tests/tester.rs +++ b/core/node/state_keeper/src/io/tests/tester.rs @@ -21,7 +21,7 @@ use zksync_types::{ fee::TransactionExecutionMetrics, fee_model::{BatchFeeInput, FeeModelConfig, FeeModelConfigV1}, l2::L2Tx, - protocol_version::L1VerifierConfig, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion}, system_contracts::get_system_smart_contracts, tx::TransactionExecutionResult, L2BlockNumber, L2ChainId, PriorityOpId, ProtocolVersionId, H256, @@ -134,7 +134,10 @@ impl Tester { if storage.blocks_dal().is_genesis_needed().await.unwrap() { create_genesis_l1_batch( &mut storage, - ProtocolVersionId::latest(), + ProtocolSemanticVersion { + minor: ProtocolVersionId::latest(), + patch: 0.into(), + }, &self.base_system_contracts, &get_system_smart_contracts(), L1VerifierConfig::default(), diff --git a/core/node/test_utils/src/lib.rs b/core/node/test_utils/src/lib.rs index 288f6c75ceed..0070914b0e4b 100644 --- a/core/node/test_utils/src/lib.rs +++ b/core/node/test_utils/src/lib.rs @@ -170,7 +170,7 @@ impl Snapshot { l1_batch, l1_batch.0.into(), contracts.hashes(), - genesis_params.protocol_version(), + genesis_params.minor_protocol_version(), ); let l2_block = L2BlockHeader { number: l2_block, @@ -182,10 +182,10 @@ impl Snapshot { batch_fee_input: BatchFeeInput::l1_pegged(100, 100), fee_account_address: Address::zero(), gas_per_pubdata_limit: get_max_gas_per_pubdata_byte( - genesis_params.protocol_version().into(), + genesis_params.minor_protocol_version().into(), ), base_system_contracts_hashes: contracts.hashes(), - protocol_version: Some(genesis_params.protocol_version()), + protocol_version: Some(genesis_params.minor_protocol_version()), virtual_blocks: 1, gas_limit: 0, }; From 5f9e2da8bc6c5fba73b10135ad64aea29fe9da04 Mon Sep 17 00:00:00 2001 From: Stanislav Bezkorovainyi Date: Wed, 29 May 2024 11:44:34 +0200 Subject: [PATCH 15/19] Make protocol upgrade tool support semver (#2081) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What ❔ We'll store the semantic version of the protocol in the `common.json`. For the upgrade itself we'll have to use packed format, but for the l2 transaction we'll use only the `minor` version (for compatibility with the server). It is expected that the upgrade transaction is only present during at least `minor` upgrades and never present during `patch` ones ## Why ❔ ## Checklist - [ ] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [ ] Tests for the changes have been added / updated. - [ ] Documentation comments have been added / updated. - [ ] Code has been formatted via `zk fmt` and `zk lint`. - [ ] Spellcheck has been run via `zk spellcheck`. --- .../src/l2upgrade/transactions.ts | 6 ++++-- .../src/protocol-upgrade-manager.ts | 2 +- .../protocol-upgrade/src/transaction.ts | 14 +++++++++----- infrastructure/protocol-upgrade/src/utils.ts | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/infrastructure/protocol-upgrade/src/l2upgrade/transactions.ts b/infrastructure/protocol-upgrade/src/l2upgrade/transactions.ts index da5dcecff066..30b3da0c7b98 100644 --- a/infrastructure/protocol-upgrade/src/l2upgrade/transactions.ts +++ b/infrastructure/protocol-upgrade/src/l2upgrade/transactions.ts @@ -3,7 +3,7 @@ import { ComplexUpgraderFactory, ContractDeployerFactory } from 'system-contract import { ForceDeployment, L2CanonicalTransaction } from '../transaction'; import { ForceDeployUpgraderFactory } from 'l2-contracts/typechain'; import { Command } from 'commander'; -import { getCommonDataFileName, getL2UpgradeFileName } from '../utils'; +import { getCommonDataFileName, getL2UpgradeFileName, unpackStringSemVer } from '../utils'; import fs from 'fs'; import { REQUIRED_L1_TO_L2_GAS_PER_PUBDATA_LIMIT } from 'zksync-ethers/build/utils'; @@ -151,7 +151,9 @@ command l2Upgrade.calldata = prepareCallDataForComplexUpgrader(delegatedCalldata, l2UpgraderAddress); } - l2Upgrade.tx = buildL2CanonicalTransaction(l2Upgrade.calldata, commonData.protocolVersion, toAddress); + const protocolVersionSemVer: string = commonData.protocolVersion; + const minorVersion = unpackStringSemVer(protocolVersionSemVer)[1]; + l2Upgrade.tx = buildL2CanonicalTransaction(l2Upgrade.calldata, minorVersion, toAddress); fs.writeFileSync(l2upgradeFileName, JSON.stringify(l2Upgrade, null, 2)); } else { throw new Error(`No l2 upgrade file found at ${l2upgradeFileName}`); diff --git a/infrastructure/protocol-upgrade/src/protocol-upgrade-manager.ts b/infrastructure/protocol-upgrade/src/protocol-upgrade-manager.ts index 563967f9f603..562e28df6cf4 100644 --- a/infrastructure/protocol-upgrade/src/protocol-upgrade-manager.ts +++ b/infrastructure/protocol-upgrade/src/protocol-upgrade-manager.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import { Command } from 'commander'; import { DEFAULT_UPGRADE_PATH, getNameOfTheLastUpgrade, getTimestampInSeconds } from './utils'; -function createNewUpgrade(name, protocolVersion: number) { +function createNewUpgrade(name, protocolVersion: string) { const timestamp = getTimestampInSeconds(); const upgradePath = `${DEFAULT_UPGRADE_PATH}/${timestamp}-${name}`; fs.mkdirSync(upgradePath, { recursive: true }); diff --git a/infrastructure/protocol-upgrade/src/transaction.ts b/infrastructure/protocol-upgrade/src/transaction.ts index b5e8c73c3267..ea9f0ae7611c 100644 --- a/infrastructure/protocol-upgrade/src/transaction.ts +++ b/infrastructure/protocol-upgrade/src/transaction.ts @@ -16,7 +16,9 @@ import { getL2TransactionsFileName, getPostUpgradeCalldataFileName, getL2UpgradeFileName, - VerifierParams + VerifierParams, + unpackStringSemVer, + packSemver } from './utils'; import fs from 'fs'; import { Command } from 'commander'; @@ -254,9 +256,10 @@ export function buildDefaultUpgradeTx( postUpgradeCalldataFlag ) { const commonData = JSON.parse(fs.readFileSync(getCommonDataFileName(), { encoding: 'utf-8' })); - const protocolVersion = commonData.protocolVersion; + const protocolVersionSemVer: string = commonData.protocolVersion; + const packedProtocolVersion = packSemver(...unpackStringSemVer(protocolVersionSemVer)); console.log( - `Building default upgrade tx for ${environment} protocol version ${protocolVersion} upgradeTimestamp ${upgradeTimestamp} ` + `Building default upgrade tx for ${environment} protocol version ${protocolVersionSemVer} upgradeTimestamp ${upgradeTimestamp} ` ); let facetCuts = []; let facetCutsFileName = getFacetCutsFileName(environment); @@ -316,7 +319,7 @@ export function buildDefaultUpgradeTx( let proposeUpgradeTx = buildProposeUpgrade( ethers.BigNumber.from(upgradeTimestamp), - protocolVersion, + packedProtocolVersion, '0x', postUpgradeCalldata, cryptoVerifierParams, @@ -349,7 +352,8 @@ export function buildDefaultUpgradeTx( proposeUpgradeTx, l1upgradeCalldata, upgradeAddress, - protocolVersion, + protocolVersionSemVer, + packedProtocolVersion, diamondUpgradeProposalId, upgradeTimestamp, ...upgradeData diff --git a/infrastructure/protocol-upgrade/src/utils.ts b/infrastructure/protocol-upgrade/src/utils.ts index a81ec7895861..f4174c460903 100644 --- a/infrastructure/protocol-upgrade/src/utils.ts +++ b/infrastructure/protocol-upgrade/src/utils.ts @@ -62,3 +62,20 @@ export interface VerifierParams { recursionLeafLevelVkHash: BytesLike; recursionCircuitsSetVksHash: BytesLike; } + +// Bit shift by 32 does not work in JS, so we have to multiply by 2^32 +export const SEMVER_MINOR_VERSION_MULTIPLIER = 4294967296; + +// The major version is always 0 for now +export function packSemver(major: number, minor: number, patch: number) { + if (major !== 0) { + throw new Error('Major version must be 0'); + } + + return minor * SEMVER_MINOR_VERSION_MULTIPLIER + patch; +} + +export function unpackStringSemVer(semver: string): [number, number, number] { + const [major, minor, patch] = semver.split('.'); + return [parseInt(major), parseInt(minor), parseInt(patch)]; +} From d9672eec21da5a301b60696977b4dbf61da26d86 Mon Sep 17 00:00:00 2001 From: Artem Fomiuk <88630083+Artemka374@users.noreply.github.com> Date: Wed, 29 May 2024 15:43:27 +0300 Subject: [PATCH 16/19] feat: Update provers to use SemVer (#2045) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What ❔ Adjust prover subsystems to take into account patch versions. ## Why ❔ ## Checklist - [x] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [x] Tests for the changes have been added / updated. - [x] Documentation comments have been added / updated. - [x] Code has been formatted via `zk fmt` and `zk lint`. - [x] Spellcheck has been run via `zk spellcheck`. --- core/lib/basic_types/src/protocol_version.rs | 20 +++- prover/proof_fri_compressor/src/compressor.rs | 11 +- prover/proof_fri_compressor/src/main.rs | 4 +- ...ab9b63eee7f21c450a723e4ba011edc8e2bb.json} | 4 +- ...113a19feb73c4cf9876855523499998b99c0.json} | 5 +- ...dbc21cccb9a95e3db1c93da239845a5e9036.json} | 5 +- ...28a20420763a3a22899ad0e5f4b953b615a9e.json | 25 ---- ...5d2832571464e74b5fed92cf54617573c84ec.json | 8 +- ...dd20cd075409082f177bf4278f786e8f869b.json} | 5 +- ...dd8547a1ad20492ec37c3c0be5639e5d49952.json | 8 +- ...8b699386b3c5b4e02d5ce046f0f2e0ddc388.json} | 15 ++- ...f078938074aed4a4f0da24f0338ce2b04154.json} | 5 +- ...a8ea23052f714cd74c1d28ae1203ce8f0eaa9.json | 8 +- ...9d03f894f40d2ec528382b5643c3d51ec8e7.json} | 13 ++- ...f1d4d9a4b83a8b42846d8373ea13b96d612cf.json | 19 ++++ ...c8c049e7e162b09c3d653206a89365446fdf.json} | 5 +- ...9fd5b3d210a117bb0027d58c6cb4debd63f33.json | 28 +++++ ...ad195b0dd2a8ce56b1a9eb531103130b5e3e.json} | 5 +- ...6f870f8bbd15666fec5cc9f398306eeb6136.json} | 7 +- ...f5bc7dfc0043d385d0eadc88cf1c329a26d7.json} | 7 +- ...419667f11d80036cda021ecbf23b0b5f7f42.json} | 5 +- ...f32042dfead8a37401558f5fd3b03480f2dd.json} | 13 ++- ...c39ae8a6e053a0e03afd3fb5e02ee17157067.json | 8 +- ...0b6c018e6a4d279acd24a4ea7d81b5cc5123.json} | 5 +- ...cbb724af0f0216433a70f19d784e3f2afbc9f.json | 22 ---- ...89daacb88fe5aaf368c5f81a885821522b99c.json | 41 +++++++ ...9bfb838c787fc58d7536f9e9976e5e515431a.json | 8 +- ...df42d7ba4d34a1362d471d3528468926c491.json} | 5 +- ...42cb36fcaf1679bf49d7741305e8bc6e5e318.json | 18 --- ...d34a5baece02812f8c950fc84d37eeebd33a4.json | 8 +- ...b6da86d1e693be03936730c340121167341f.json} | 5 +- ...91a43dc8eafc33ee067bd41e20f25f7625f0.json} | 13 ++- ...d8b17597ca636f98f5155b76c9bc7539feb9b.json | 28 +++++ ...813d2b2d411bd5faf8306cd48db500532b711.json | 29 ----- ...8594219903833fc051aac278a3b79e5d58dce.json | 31 +++++ ...e118cabc67b6e507efefb7b69e102f1b43c58.json | 8 +- ...1d14910604ddd7eadc29db3634dc873254569.json | 22 ---- ...ed762158a27449f61d3b1bb80069ca446727.json} | 15 ++- ...83a7526ae38ceb4bf80543cfd3fb60492fb9.json} | 5 +- ...3522_add-patch-columns-for-semver.down.sql | 71 ++++++++++++ ...123522_add-patch-columns-for-semver.up.sql | 73 ++++++++++++ .../src/fri_gpu_prover_queue_dal.rs | 24 ++-- .../src/fri_proof_compressor_dal.rs | 33 ++++-- .../src/fri_protocol_versions_dal.rs | 59 ++-------- prover/prover_dal/src/fri_prover_dal.rs | 46 ++++---- .../src/fri_witness_generator_dal.rs | 107 +++++++++++------- .../src/gpu_prover_job_processor.rs | 7 +- prover/prover_fri/src/main.rs | 6 +- prover/prover_fri/src/prover_job_processor.rs | 8 +- prover/prover_fri/src/socket_listener.rs | 6 +- prover/prover_fri/src/utils.rs | 5 +- .../src/proof_gen_data_fetcher.rs | 14 ++- .../prover_fri_gateway/src/proof_submitter.rs | 6 +- prover/prover_fri_utils/src/lib.rs | 8 +- .../witness_generator/src/basic_circuits.rs | 8 +- .../witness_generator/src/leaf_aggregation.rs | 6 +- prover/witness_generator/src/main.rs | 5 +- .../witness_generator/src/node_aggregation.rs | 6 +- prover/witness_generator/src/recursion_tip.rs | 8 +- prover/witness_generator/src/scheduler.rs | 6 +- .../witness_vector_generator/src/generator.rs | 7 +- prover/witness_vector_generator/src/main.rs | 4 +- 62 files changed, 669 insertions(+), 350 deletions(-) rename prover/prover_dal/.sqlx/{query-d7b6196cfc17182b5280d0a13f873281bc865cc67b824af6ca3a76ae6065f151.json => query-069f04bdfafbe2e3628ac3ded93dab9b63eee7f21c450a723e4ba011edc8e2bb.json} (67%) rename prover/prover_dal/.sqlx/{query-b23ddb16513d69331056b94d466663a9c5ea62ea7c99a77941eb8f05d4454125.json => query-0a1ec4690d6b4a67d6ad16badcbf113a19feb73c4cf9876855523499998b99c0.json} (57%) rename prover/prover_dal/.sqlx/{query-5e4d784a3436335e9995a11f4c761ffb42bb2b325ba9206abbffe0dc74664566.json => query-0b70c98c2edd8370ad09ac553c18dbc21cccb9a95e3db1c93da239845a5e9036.json} (65%) delete mode 100644 prover/prover_dal/.sqlx/query-15858168fea6808c6d59d0e6d8f28a20420763a3a22899ad0e5f4b953b615a9e.json rename prover/prover_dal/.sqlx/{query-83d7409bedec3db527f6179e4baaa1b7d32b51659569fde755218d42da660b2f.json => query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json} (84%) rename prover/prover_dal/.sqlx/{query-058ecac4aa3d2109606738de4bdba2cff712010267460dd28339472b9a7d8c9d.json => query-28f03acf565c4b50fe86f606c18a8b699386b3c5b4e02d5ce046f0f2e0ddc388.json} (76%) rename prover/prover_dal/.sqlx/{query-832a1caa2808f49a5572cb782eca5bfec2a8272906eb1ed195f96c2508b9a3ef.json => query-2934fc4d671a14a08d607a17e1eff078938074aed4a4f0da24f0338ce2b04154.json} (50%) rename prover/prover_dal/.sqlx/{query-7dd14c5f887d6716a8f98414bddd562e556a712ba041237e4cb3dea27e89314e.json => query-2dc6b7bf08cced8791354fc47e319d03f894f40d2ec528382b5643c3d51ec8e7.json} (68%) create mode 100644 prover/prover_dal/.sqlx/query-2e6e2b68efc28114f44616b68fcf1d4d9a4b83a8b42846d8373ea13b96d612cf.json rename prover/prover_dal/.sqlx/{query-c41312e01aa66897552e8be9acc8d43c31ec7441a7f6c5040e120810ebbb72f7.json => query-342831ef46c3792cfddd10f699d1c8c049e7e162b09c3d653206a89365446fdf.json} (57%) create mode 100644 prover/prover_dal/.sqlx/query-3902f6a8e09cd5ad560d23fe0269fd5b3d210a117bb0027d58c6cb4debd63f33.json rename prover/prover_dal/.sqlx/{query-384e70c7f7b302b90a9ce69752fb7f87115848d883ace09ead493637a303cbb2.json => query-3e0a1ebc684810c09ff83784bdd0ad195b0dd2a8ce56b1a9eb531103130b5e3e.json} (60%) rename prover/prover_dal/.sqlx/{query-510bfea2346a8c63e74222e1159de366f88c20d00a8d928b6cf4caae0702b333.json => query-5354ed86960505fe6b159ce859656f870f8bbd15666fec5cc9f398306eeb6136.json} (60%) rename prover/prover_dal/.sqlx/{query-4d92a133a36afd682a84fbfd75aafca34d61347e0e2e29fb07ca3d1b8b1f309c.json => query-602cf56a94d9a1b22f9d62d6c0bdf5bc7dfc0043d385d0eadc88cf1c329a26d7.json} (61%) rename prover/prover_dal/.sqlx/{query-e9ca863d6e77edd39a9fc55700a6686e655206601854799139c22c017a214744.json => query-764693ceeb45f8478a20242b592d419667f11d80036cda021ecbf23b0b5f7f42.json} (58%) rename prover/prover_dal/.sqlx/{query-08dfe2267bf93d164c649e93f5355b403f1438679167ff218489e2c6d0c359a3.json => query-7effbacbdcc4bd762386351755f4f32042dfead8a37401558f5fd3b03480f2dd.json} (76%) rename prover/prover_dal/.sqlx/{query-0e7f17dd9c10b779d62de504a9cc41d3d4edb2d28d2a1fdf919f234a9ab9c43a.json => query-8720d411e0c9640afd61e927a89c0b6c018e6a4d279acd24a4ea7d81b5cc5123.json} (60%) delete mode 100644 prover/prover_dal/.sqlx/query-8f5e89ccadd4ea1da7bfe9793a1cbb724af0f0216433a70f19d784e3f2afbc9f.json create mode 100644 prover/prover_dal/.sqlx/query-8ffb62f6a17c68af701e790044989daacb88fe5aaf368c5f81a885821522b99c.json rename prover/prover_dal/.sqlx/{query-495a71634bcd8828bfaad5c4c542a172d47a65601b92f75da8f62ec2b18b9f4f.json => query-98564dee7e6ffb75e90c4d2c0381df42d7ba4d34a1362d471d3528468926c491.json} (58%) delete mode 100644 prover/prover_dal/.sqlx/query-9da0a96bf42ef7b60ec3e39056942cb36fcaf1679bf49d7741305e8bc6e5e318.json rename prover/prover_dal/.sqlx/{query-1bc6597117db032b87df33040d61610ffa7f169d560e79e89b99eedf681c6773.json => query-caff620ae66d7fbe3caff7505173b6da86d1e693be03936730c340121167341f.json} (53%) rename prover/prover_dal/.sqlx/{query-d286520139c1f5daa90b20efffa515afcaedf541533f218ca6e167bdc7f6ea7f.json => query-d272c91f1209c277189a31c59ee191a43dc8eafc33ee067bd41e20f25f7625f0.json} (77%) create mode 100644 prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json delete mode 100644 prover/prover_dal/.sqlx/query-d7e8eabd7b43ff62838fbc847e4813d2b2d411bd5faf8306cd48db500532b711.json create mode 100644 prover/prover_dal/.sqlx/query-dbdbbac302a5141d7b5872261cf8594219903833fc051aac278a3b79e5d58dce.json delete mode 100644 prover/prover_dal/.sqlx/query-e62407c355594b87c7caee2396f1d14910604ddd7eadc29db3634dc873254569.json rename prover/prover_dal/.sqlx/{query-5e9618d3e1aa40639f2d5ad5cf5564eddf84760477518981c7acffc8bc4acf76.json => query-e8412d5ad1b17269da02f9a5c201ed762158a27449f61d3b1bb80069ca446727.json} (79%) rename prover/prover_dal/.sqlx/{query-8fd6e339bee120a5856c8c49b764624c4778f1ac025c215b043cb7be1ca8890d.json => query-eef1b56e87eff63fcf6ffb98791583a7526ae38ceb4bf80543cfd3fb60492fb9.json} (53%) create mode 100644 prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.down.sql create mode 100644 prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.up.sql diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index caa2748ef905..4f29d936a73f 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -20,6 +20,16 @@ use crate::{ pub const PACKED_SEMVER_MINOR_OFFSET: u32 = 32; pub const PACKED_SEMVER_MINOR_MASK: u32 = 0xFFFF; +// These values should be manually updated for every protocol upgrade +// Otherwise, the prover will not be able to work with new versions. +// TODO(PLA-954): Move to prover workspace +pub const PROVER_PROTOCOL_VERSION: ProtocolVersionId = ProtocolVersionId::Version24; +pub const PROVER_PROTOCOL_PATCH: VersionPatch = VersionPatch(0); +pub const PROVER_PROTOCOL_SEMANTIC_VERSION: ProtocolSemanticVersion = ProtocolSemanticVersion { + minor: PROVER_PROTOCOL_VERSION, + patch: PROVER_PROTOCOL_PATCH, +}; + /// `ProtocolVersionId` is a unique identifier of the protocol version. /// Note, that it is an identifier of the `minor` semver version of the protocol, with /// the `major` version being `0`. Also, the protocol version on the contracts may contain @@ -76,7 +86,7 @@ impl ProtocolVersionId { } pub fn current_prover_version() -> Self { - Self::Version24 + PROVER_PROTOCOL_VERSION } pub fn next() -> Self { @@ -297,6 +307,14 @@ pub struct ProtocolSemanticVersion { impl ProtocolSemanticVersion { const MAJOR_VERSION: u8 = 0; + pub fn new(minor: ProtocolVersionId, patch: VersionPatch) -> Self { + Self { minor, patch } + } + + pub fn current_prover_version() -> Self { + PROVER_PROTOCOL_SEMANTIC_VERSION + } + pub fn try_from_packed(packed: U256) -> Result { let minor = ((packed >> U256::from(PACKED_SEMVER_MINOR_OFFSET)) & U256::from(PACKED_SEMVER_MINOR_MASK)) diff --git a/prover/proof_fri_compressor/src/compressor.rs b/prover/proof_fri_compressor/src/compressor.rs index c85162ccdfe0..aba03a61497b 100644 --- a/prover/proof_fri_compressor/src/compressor.rs +++ b/prover/proof_fri_compressor/src/compressor.rs @@ -35,7 +35,7 @@ use zksync_prover_fri_types::{ }; use zksync_prover_interface::outputs::L1BatchProofForL1; use zksync_queued_job_processor::JobProcessor; -use zksync_types::{L1BatchNumber, ProtocolVersionId}; +use zksync_types::{protocol_version::ProtocolSemanticVersion, L1BatchNumber}; use zksync_vk_setup_data_server_fri::keystore::Keystore; use crate::metrics::METRICS; @@ -46,7 +46,7 @@ pub struct ProofCompressor { compression_mode: u8, verify_wrapper_proof: bool, max_attempts: u32, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl ProofCompressor { @@ -56,7 +56,7 @@ impl ProofCompressor { compression_mode: u8, verify_wrapper_proof: bool, max_attempts: u32, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { blob_store, @@ -166,7 +166,7 @@ impl JobProcessor for ProofCompressor { let pod_name = get_current_pod_name(); let Some(l1_batch_number) = conn .fri_proof_compressor_dal() - .get_next_proof_compression_job(&pod_name, &self.protocol_version) + .get_next_proof_compression_job(&pod_name, self.protocol_version) .await else { return Ok(None); @@ -243,11 +243,12 @@ impl JobProcessor for ProofCompressor { let l1_batch_proof = L1BatchProofForL1 { aggregation_result_coords, scheduler_proof: artifacts, + protocol_version: self.protocol_version, }; let blob_save_started_at = Instant::now(); let blob_url = self .blob_store - .put(job_id, &l1_batch_proof) + .put((job_id, self.protocol_version), &l1_batch_proof) .await .context("Failed to save converted l1_batch_proof")?; METRICS diff --git a/prover/proof_fri_compressor/src/main.rs b/prover/proof_fri_compressor/src/main.rs index 1d261cd6b352..ec66515b6a35 100644 --- a/prover/proof_fri_compressor/src/main.rs +++ b/prover/proof_fri_compressor/src/main.rs @@ -11,7 +11,7 @@ use zksync_config::configs::{DatabaseSecrets, FriProofCompressorConfig, Observab use zksync_env_config::{object_store::ProverObjectStoreConfig, FromEnv}; use zksync_object_store::ObjectStoreFactory; use zksync_queued_job_processor::JobProcessor; -use zksync_types::ProtocolVersionId; +use zksync_types::protocol_version::ProtocolSemanticVersion; use zksync_utils::wait_for_tasks::ManagedTasks; use crate::{ @@ -73,7 +73,7 @@ async fn main() -> anyhow::Result<()> { .create_store() .await; - let protocol_version = ProtocolVersionId::current_prover_version(); + let protocol_version = ProtocolSemanticVersion::current_prover_version(); let proof_compressor = ProofCompressor::new( blob_store, diff --git a/prover/prover_dal/.sqlx/query-d7b6196cfc17182b5280d0a13f873281bc865cc67b824af6ca3a76ae6065f151.json b/prover/prover_dal/.sqlx/query-069f04bdfafbe2e3628ac3ded93dab9b63eee7f21c450a723e4ba011edc8e2bb.json similarity index 67% rename from prover/prover_dal/.sqlx/query-d7b6196cfc17182b5280d0a13f873281bc865cc67b824af6ca3a76ae6065f151.json rename to prover/prover_dal/.sqlx/query-069f04bdfafbe2e3628ac3ded93dab9b63eee7f21c450a723e4ba011edc8e2bb.json index d0e366aee009..cdb38168b8a1 100644 --- a/prover/prover_dal/.sqlx/query-d7b6196cfc17182b5280d0a13f873281bc865cc67b824af6ca3a76ae6065f151.json +++ b/prover/prover_dal/.sqlx/query-069f04bdfafbe2e3628ac3ded93dab9b63eee7f21c450a723e4ba011edc8e2bb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH deleted AS (\n DELETE FROM gpu_prover_queue_fri\n WHERE\n instance_status = 'dead'\n AND updated_at < NOW() - $1::INTERVAL\n RETURNING id,\n instance_host,\n instance_port,\n instance_status,\n specialized_prover_group_id,\n zone,\n created_at,\n updated_at,\n processing_started_at,\n NOW() as archived_at,\n protocol_version\n ),\n inserted_count AS (\n INSERT INTO gpu_prover_queue_fri_archive\n SELECT * FROM deleted\n )\n SELECT COUNT(*) FROM deleted\n ", + "query": "\n WITH deleted AS (\n DELETE FROM gpu_prover_queue_fri\n WHERE\n instance_status = 'dead'\n AND updated_at < NOW() - $1::INTERVAL\n RETURNING id,\n instance_host,\n instance_port,\n instance_status,\n specialized_prover_group_id,\n zone,\n created_at,\n updated_at,\n processing_started_at,\n NOW() as archived_at,\n protocol_version,\n protocol_version_patch\n ),\n inserted_count AS (\n INSERT INTO gpu_prover_queue_fri_archive\n SELECT * FROM deleted\n )\n SELECT COUNT(*) FROM deleted\n ", "describe": { "columns": [ { @@ -18,5 +18,5 @@ null ] }, - "hash": "d7b6196cfc17182b5280d0a13f873281bc865cc67b824af6ca3a76ae6065f151" + "hash": "069f04bdfafbe2e3628ac3ded93dab9b63eee7f21c450a723e4ba011edc8e2bb" } diff --git a/prover/prover_dal/.sqlx/query-b23ddb16513d69331056b94d466663a9c5ea62ea7c99a77941eb8f05d4454125.json b/prover/prover_dal/.sqlx/query-0a1ec4690d6b4a67d6ad16badcbf113a19feb73c4cf9876855523499998b99c0.json similarity index 57% rename from prover/prover_dal/.sqlx/query-b23ddb16513d69331056b94d466663a9c5ea62ea7c99a77941eb8f05d4454125.json rename to prover/prover_dal/.sqlx/query-0a1ec4690d6b4a67d6ad16badcbf113a19feb73c4cf9876855523499998b99c0.json index fd8600d59aaf..b05230e1be44 100644 --- a/prover/prover_dal/.sqlx/query-b23ddb16513d69331056b94d466663a9c5ea62ea7c99a77941eb8f05d4454125.json +++ b/prover/prover_dal/.sqlx/query-0a1ec4690d6b4a67d6ad16badcbf113a19feb73c4cf9876855523499998b99c0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n leaf_aggregation_witness_jobs_fri (\n l1_batch_number,\n circuit_id,\n closed_form_inputs_blob_url,\n number_of_basic_circuits,\n protocol_version,\n status,\n created_at,\n updated_at\n )\n VALUES\n ($1, $2, $3, $4, $5, 'waiting_for_proofs', NOW(), NOW())\n ON CONFLICT (l1_batch_number, circuit_id) DO\n UPDATE\n SET\n updated_at = NOW()\n ", + "query": "\n INSERT INTO\n leaf_aggregation_witness_jobs_fri (\n l1_batch_number,\n circuit_id,\n closed_form_inputs_blob_url,\n number_of_basic_circuits,\n protocol_version,\n status,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, $4, $5, 'waiting_for_proofs', NOW(), NOW(), $6)\n ON CONFLICT (l1_batch_number, circuit_id) DO\n UPDATE\n SET\n updated_at = NOW()\n ", "describe": { "columns": [], "parameters": { @@ -9,10 +9,11 @@ "Int2", "Text", "Int4", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "b23ddb16513d69331056b94d466663a9c5ea62ea7c99a77941eb8f05d4454125" + "hash": "0a1ec4690d6b4a67d6ad16badcbf113a19feb73c4cf9876855523499998b99c0" } diff --git a/prover/prover_dal/.sqlx/query-5e4d784a3436335e9995a11f4c761ffb42bb2b325ba9206abbffe0dc74664566.json b/prover/prover_dal/.sqlx/query-0b70c98c2edd8370ad09ac553c18dbc21cccb9a95e3db1c93da239845a5e9036.json similarity index 65% rename from prover/prover_dal/.sqlx/query-5e4d784a3436335e9995a11f4c761ffb42bb2b325ba9206abbffe0dc74664566.json rename to prover/prover_dal/.sqlx/query-0b70c98c2edd8370ad09ac553c18dbc21cccb9a95e3db1c93da239845a5e9036.json index 6f8252d9998f..8b49fa11e63b 100644 --- a/prover/prover_dal/.sqlx/query-5e4d784a3436335e9995a11f4c761ffb42bb2b325ba9206abbffe0dc74664566.json +++ b/prover/prover_dal/.sqlx/query-0b70c98c2edd8370ad09ac553c18dbc21cccb9a95e3db1c93da239845a5e9036.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE proof_compression_jobs_fri\n SET\n status = $1,\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n proof_compression_jobs_fri\n WHERE\n status = $2\n AND protocol_version = $4\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n proof_compression_jobs_fri.l1_batch_number\n ", + "query": "\n UPDATE proof_compression_jobs_fri\n SET\n status = $1,\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n proof_compression_jobs_fri\n WHERE\n status = $2\n AND protocol_version = $4\n AND protocol_version_patch = $5\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n proof_compression_jobs_fri.l1_batch_number\n ", "describe": { "columns": [ { @@ -14,6 +14,7 @@ "Text", "Text", "Text", + "Int4", "Int4" ] }, @@ -21,5 +22,5 @@ false ] }, - "hash": "5e4d784a3436335e9995a11f4c761ffb42bb2b325ba9206abbffe0dc74664566" + "hash": "0b70c98c2edd8370ad09ac553c18dbc21cccb9a95e3db1c93da239845a5e9036" } diff --git a/prover/prover_dal/.sqlx/query-15858168fea6808c6d59d0e6d8f28a20420763a3a22899ad0e5f4b953b615a9e.json b/prover/prover_dal/.sqlx/query-15858168fea6808c6d59d0e6d8f28a20420763a3a22899ad0e5f4b953b615a9e.json deleted file mode 100644 index ac0e433a9195..000000000000 --- a/prover/prover_dal/.sqlx/query-15858168fea6808c6d59d0e6d8f28a20420763a3a22899ad0e5f4b953b615a9e.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n id\n FROM\n prover_fri_protocol_versions\n WHERE\n recursion_circuits_set_vks_hash = $1\n AND recursion_leaf_level_vk_hash = $2\n AND recursion_node_level_vk_hash = $3\n AND recursion_scheduler_level_vk_hash = $4\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Bytea", - "Bytea", - "Bytea", - "Bytea" - ] - }, - "nullable": [ - false - ] - }, - "hash": "15858168fea6808c6d59d0e6d8f28a20420763a3a22899ad0e5f4b953b615a9e" -} diff --git a/prover/prover_dal/.sqlx/query-21621153e545859d71188e2421f5d2832571464e74b5fed92cf54617573c84ec.json b/prover/prover_dal/.sqlx/query-21621153e545859d71188e2421f5d2832571464e74b5fed92cf54617573c84ec.json index 9e750348decb..e24d2c979a35 100644 --- a/prover/prover_dal/.sqlx/query-21621153e545859d71188e2421f5d2832571464e74b5fed92cf54617573c84ec.json +++ b/prover/prover_dal/.sqlx/query-21621153e545859d71188e2421f5d2832571464e74b5fed92cf54617573c84ec.json @@ -77,6 +77,11 @@ "ordinal": 14, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 15, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -99,7 +104,8 @@ true, true, true, - true + true, + false ] }, "hash": "21621153e545859d71188e2421f5d2832571464e74b5fed92cf54617573c84ec" diff --git a/prover/prover_dal/.sqlx/query-83d7409bedec3db527f6179e4baaa1b7d32b51659569fde755218d42da660b2f.json b/prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json similarity index 84% rename from prover/prover_dal/.sqlx/query-83d7409bedec3db527f6179e4baaa1b7d32b51659569fde755218d42da660b2f.json rename to prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json index f3a919e3d982..656e712f4ce5 100644 --- a/prover/prover_dal/.sqlx/query-83d7409bedec3db527f6179e4baaa1b7d32b51659569fde755218d42da660b2f.json +++ b/prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n prover_fri_protocol_versions\n WHERE\n id = $1\n ", + "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n prover_fri_protocol_versions\n WHERE\n id = $1\n AND\n protocol_version_patch = $2\n ", "describe": { "columns": [ { @@ -26,6 +26,7 @@ ], "parameters": { "Left": [ + "Int4", "Int4" ] }, @@ -36,5 +37,5 @@ false ] }, - "hash": "83d7409bedec3db527f6179e4baaa1b7d32b51659569fde755218d42da660b2f" + "hash": "25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b" } diff --git a/prover/prover_dal/.sqlx/query-285d0ff850fa5c9af36564fcb14dd8547a1ad20492ec37c3c0be5639e5d49952.json b/prover/prover_dal/.sqlx/query-285d0ff850fa5c9af36564fcb14dd8547a1ad20492ec37c3c0be5639e5d49952.json index 415b3e31c798..98a2aed31dfb 100644 --- a/prover/prover_dal/.sqlx/query-285d0ff850fa5c9af36564fcb14dd8547a1ad20492ec37c3c0be5639e5d49952.json +++ b/prover/prover_dal/.sqlx/query-285d0ff850fa5c9af36564fcb14dd8547a1ad20492ec37c3c0be5639e5d49952.json @@ -57,6 +57,11 @@ "ordinal": 10, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 11, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -75,7 +80,8 @@ false, false, true, - true + true, + false ] }, "hash": "285d0ff850fa5c9af36564fcb14dd8547a1ad20492ec37c3c0be5639e5d49952" diff --git a/prover/prover_dal/.sqlx/query-058ecac4aa3d2109606738de4bdba2cff712010267460dd28339472b9a7d8c9d.json b/prover/prover_dal/.sqlx/query-28f03acf565c4b50fe86f606c18a8b699386b3c5b4e02d5ce046f0f2e0ddc388.json similarity index 76% rename from prover/prover_dal/.sqlx/query-058ecac4aa3d2109606738de4bdba2cff712010267460dd28339472b9a7d8c9d.json rename to prover/prover_dal/.sqlx/query-28f03acf565c4b50fe86f606c18a8b699386b3c5b4e02d5ce046f0f2e0ddc388.json index a74d698ff207..89e159989ae6 100644 --- a/prover/prover_dal/.sqlx/query-058ecac4aa3d2109606738de4bdba2cff712010267460dd28339472b9a7d8c9d.json +++ b/prover/prover_dal/.sqlx/query-28f03acf565c4b50fe86f606c18a8b699386b3c5b4e02d5ce046f0f2e0ddc388.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE scheduler_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n scheduler_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n scheduler_witness_jobs_fri.*\n ", + "query": "\n UPDATE scheduler_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n scheduler_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n AND protocol_version_patch = $3\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n scheduler_witness_jobs_fri.*\n ", "describe": { "columns": [ { @@ -57,12 +57,18 @@ "ordinal": 10, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 11, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { "Left": [ "Int4", - "Text" + "Text", + "Int4" ] }, "nullable": [ @@ -76,8 +82,9 @@ false, false, true, - true + true, + false ] }, - "hash": "058ecac4aa3d2109606738de4bdba2cff712010267460dd28339472b9a7d8c9d" + "hash": "28f03acf565c4b50fe86f606c18a8b699386b3c5b4e02d5ce046f0f2e0ddc388" } diff --git a/prover/prover_dal/.sqlx/query-832a1caa2808f49a5572cb782eca5bfec2a8272906eb1ed195f96c2508b9a3ef.json b/prover/prover_dal/.sqlx/query-2934fc4d671a14a08d607a17e1eff078938074aed4a4f0da24f0338ce2b04154.json similarity index 50% rename from prover/prover_dal/.sqlx/query-832a1caa2808f49a5572cb782eca5bfec2a8272906eb1ed195f96c2508b9a3ef.json rename to prover/prover_dal/.sqlx/query-2934fc4d671a14a08d607a17e1eff078938074aed4a4f0da24f0338ce2b04154.json index c5a2a59aa20a..0915faf80f67 100644 --- a/prover/prover_dal/.sqlx/query-832a1caa2808f49a5572cb782eca5bfec2a8272906eb1ed195f96c2508b9a3ef.json +++ b/prover/prover_dal/.sqlx/query-2934fc4d671a14a08d607a17e1eff078938074aed4a4f0da24f0338ce2b04154.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version)\n VALUES\n ($1, $2, $3, NOW(), NOW(), $4)\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", + "query": "\n INSERT INTO\n proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version, protocol_version_patch)\n VALUES\n ($1, $2, $3, NOW(), NOW(), $4, $5)\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", "describe": { "columns": [], "parameters": { @@ -8,10 +8,11 @@ "Int8", "Text", "Text", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "832a1caa2808f49a5572cb782eca5bfec2a8272906eb1ed195f96c2508b9a3ef" + "hash": "2934fc4d671a14a08d607a17e1eff078938074aed4a4f0da24f0338ce2b04154" } diff --git a/prover/prover_dal/.sqlx/query-2ab2f83b273c5aa88c1eefc8f70a8ea23052f714cd74c1d28ae1203ce8f0eaa9.json b/prover/prover_dal/.sqlx/query-2ab2f83b273c5aa88c1eefc8f70a8ea23052f714cd74c1d28ae1203ce8f0eaa9.json index 529709763eb9..7fcd13280279 100644 --- a/prover/prover_dal/.sqlx/query-2ab2f83b273c5aa88c1eefc8f70a8ea23052f714cd74c1d28ae1203ce8f0eaa9.json +++ b/prover/prover_dal/.sqlx/query-2ab2f83b273c5aa88c1eefc8f70a8ea23052f714cd74c1d28ae1203ce8f0eaa9.json @@ -62,6 +62,11 @@ "ordinal": 11, "name": "protocol_version", "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -81,7 +86,8 @@ true, true, true, - true + true, + false ] }, "hash": "2ab2f83b273c5aa88c1eefc8f70a8ea23052f714cd74c1d28ae1203ce8f0eaa9" diff --git a/prover/prover_dal/.sqlx/query-7dd14c5f887d6716a8f98414bddd562e556a712ba041237e4cb3dea27e89314e.json b/prover/prover_dal/.sqlx/query-2dc6b7bf08cced8791354fc47e319d03f894f40d2ec528382b5643c3d51ec8e7.json similarity index 68% rename from prover/prover_dal/.sqlx/query-7dd14c5f887d6716a8f98414bddd562e556a712ba041237e4cb3dea27e89314e.json rename to prover/prover_dal/.sqlx/query-2dc6b7bf08cced8791354fc47e319d03f894f40d2ec528382b5643c3d51ec8e7.json index eb7984cc8e2b..0ad6413e1ec1 100644 --- a/prover/prover_dal/.sqlx/query-7dd14c5f887d6716a8f98414bddd562e556a712ba041237e4cb3dea27e89314e.json +++ b/prover/prover_dal/.sqlx/query-2dc6b7bf08cced8791354fc47e319d03f894f40d2ec528382b5643c3d51ec8e7.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE gpu_prover_queue_fri\n SET\n instance_status = 'reserved',\n updated_at = NOW(),\n processing_started_at = NOW()\n WHERE\n id IN (\n SELECT\n id\n FROM\n gpu_prover_queue_fri\n WHERE\n specialized_prover_group_id = $2\n AND zone = $3\n AND protocol_version = $4\n AND (\n instance_status = 'available'\n OR (\n instance_status = 'reserved'\n AND processing_started_at < NOW() - $1::INTERVAL\n )\n )\n ORDER BY\n updated_at ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n gpu_prover_queue_fri.*\n ", + "query": "\n UPDATE gpu_prover_queue_fri\n SET\n instance_status = 'reserved',\n updated_at = NOW(),\n processing_started_at = NOW()\n WHERE\n id IN (\n SELECT\n id\n FROM\n gpu_prover_queue_fri\n WHERE\n specialized_prover_group_id = $2\n AND zone = $3\n AND protocol_version = $4\n AND protocol_version_patch = $5\n AND (\n instance_status = 'available'\n OR (\n instance_status = 'reserved'\n AND processing_started_at < NOW() - $1::INTERVAL\n )\n )\n ORDER BY\n updated_at ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n gpu_prover_queue_fri.*\n ", "describe": { "columns": [ { @@ -52,6 +52,11 @@ "ordinal": 9, "name": "protocol_version", "type_info": "Int4" + }, + { + "ordinal": 10, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -59,6 +64,7 @@ "Interval", "Int2", "Text", + "Int4", "Int4" ] }, @@ -72,8 +78,9 @@ false, false, true, - true + true, + false ] }, - "hash": "7dd14c5f887d6716a8f98414bddd562e556a712ba041237e4cb3dea27e89314e" + "hash": "2dc6b7bf08cced8791354fc47e319d03f894f40d2ec528382b5643c3d51ec8e7" } diff --git a/prover/prover_dal/.sqlx/query-2e6e2b68efc28114f44616b68fcf1d4d9a4b83a8b42846d8373ea13b96d612cf.json b/prover/prover_dal/.sqlx/query-2e6e2b68efc28114f44616b68fcf1d4d9a4b83a8b42846d8373ea13b96d612cf.json new file mode 100644 index 000000000000..41428e91feeb --- /dev/null +++ b/prover/prover_dal/.sqlx/query-2e6e2b68efc28114f44616b68fcf1d4d9a4b83a8b42846d8373ea13b96d612cf.json @@ -0,0 +1,19 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO\n gpu_prover_queue_fri (\n instance_host,\n instance_port,\n instance_status,\n specialized_prover_group_id,\n zone,\n created_at,\n updated_at,\n protocol_version,\n protocol_version_patch\n )\n VALUES\n (CAST($1::TEXT AS inet), $2, 'available', $3, $4, NOW(), NOW(), $5, $6)\n ON CONFLICT (instance_host, instance_port, zone) DO\n UPDATE\n SET\n instance_status = 'available',\n specialized_prover_group_id = $3,\n zone = $4,\n updated_at = NOW(),\n protocol_version = $5,\n protocol_version_patch = $6\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int4", + "Int2", + "Text", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "2e6e2b68efc28114f44616b68fcf1d4d9a4b83a8b42846d8373ea13b96d612cf" +} diff --git a/prover/prover_dal/.sqlx/query-c41312e01aa66897552e8be9acc8d43c31ec7441a7f6c5040e120810ebbb72f7.json b/prover/prover_dal/.sqlx/query-342831ef46c3792cfddd10f699d1c8c049e7e162b09c3d653206a89365446fdf.json similarity index 57% rename from prover/prover_dal/.sqlx/query-c41312e01aa66897552e8be9acc8d43c31ec7441a7f6c5040e120810ebbb72f7.json rename to prover/prover_dal/.sqlx/query-342831ef46c3792cfddd10f699d1c8c049e7e162b09c3d653206a89365446fdf.json index 4c24afad4f4c..49f8e43e4e5d 100644 --- a/prover/prover_dal/.sqlx/query-c41312e01aa66897552e8be9acc8d43c31ec7441a7f6c5040e120810ebbb72f7.json +++ b/prover/prover_dal/.sqlx/query-342831ef46c3792cfddd10f699d1c8c049e7e162b09c3d653206a89365446fdf.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n prover_jobs_fri (\n l1_batch_number,\n circuit_id,\n circuit_blob_url,\n aggregation_round,\n sequence_number,\n depth,\n is_node_final_proof,\n protocol_version,\n status,\n created_at,\n updated_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, $7, $8, 'queued', NOW(), NOW())\n ON CONFLICT (l1_batch_number, aggregation_round, circuit_id, depth, sequence_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", + "query": "\n INSERT INTO\n prover_jobs_fri (\n l1_batch_number,\n circuit_id,\n circuit_blob_url,\n aggregation_round,\n sequence_number,\n depth,\n is_node_final_proof,\n protocol_version,\n status,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, $7, $8, 'queued', NOW(), NOW(), $9)\n ON CONFLICT (l1_batch_number, aggregation_round, circuit_id, depth, sequence_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", "describe": { "columns": [], "parameters": { @@ -12,10 +12,11 @@ "Int4", "Int4", "Bool", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "c41312e01aa66897552e8be9acc8d43c31ec7441a7f6c5040e120810ebbb72f7" + "hash": "342831ef46c3792cfddd10f699d1c8c049e7e162b09c3d653206a89365446fdf" } diff --git a/prover/prover_dal/.sqlx/query-3902f6a8e09cd5ad560d23fe0269fd5b3d210a117bb0027d58c6cb4debd63f33.json b/prover/prover_dal/.sqlx/query-3902f6a8e09cd5ad560d23fe0269fd5b3d210a117bb0027d58c6cb4debd63f33.json new file mode 100644 index 000000000000..fdbe0f989850 --- /dev/null +++ b/prover/prover_dal/.sqlx/query-3902f6a8e09cd5ad560d23fe0269fd5b3d210a117bb0027d58c6cb4debd63f33.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n protocol_version,\n protocol_version_patch\n FROM\n witness_inputs_fri\n WHERE\n l1_batch_number = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "protocol_version", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "protocol_version_patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + true, + false + ] + }, + "hash": "3902f6a8e09cd5ad560d23fe0269fd5b3d210a117bb0027d58c6cb4debd63f33" +} diff --git a/prover/prover_dal/.sqlx/query-384e70c7f7b302b90a9ce69752fb7f87115848d883ace09ead493637a303cbb2.json b/prover/prover_dal/.sqlx/query-3e0a1ebc684810c09ff83784bdd0ad195b0dd2a8ce56b1a9eb531103130b5e3e.json similarity index 60% rename from prover/prover_dal/.sqlx/query-384e70c7f7b302b90a9ce69752fb7f87115848d883ace09ead493637a303cbb2.json rename to prover/prover_dal/.sqlx/query-3e0a1ebc684810c09ff83784bdd0ad195b0dd2a8ce56b1a9eb531103130b5e3e.json index b7c222927cd7..7646c87b847e 100644 --- a/prover/prover_dal/.sqlx/query-384e70c7f7b302b90a9ce69752fb7f87115848d883ace09ead493637a303cbb2.json +++ b/prover/prover_dal/.sqlx/query-3e0a1ebc684810c09ff83784bdd0ad195b0dd2a8ce56b1a9eb531103130b5e3e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE prover_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n processing_started_at = NOW(),\n updated_at = NOW(),\n picked_by = $4\n WHERE\n id = (\n SELECT\n pj.id\n FROM\n (\n SELECT\n *\n FROM\n UNNEST($1::SMALLINT[], $2::SMALLINT[])\n ) AS tuple (circuit_id, ROUND)\n JOIN LATERAL (\n SELECT\n *\n FROM\n prover_jobs_fri AS pj\n WHERE\n pj.status = 'queued'\n AND pj.protocol_version = $3\n AND pj.circuit_id = tuple.circuit_id\n AND pj.aggregation_round = tuple.round\n ORDER BY\n pj.l1_batch_number ASC,\n pj.id ASC\n LIMIT\n 1\n ) AS pj ON TRUE\n ORDER BY\n pj.l1_batch_number ASC,\n pj.aggregation_round DESC,\n pj.id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n prover_jobs_fri.id,\n prover_jobs_fri.l1_batch_number,\n prover_jobs_fri.circuit_id,\n prover_jobs_fri.aggregation_round,\n prover_jobs_fri.sequence_number,\n prover_jobs_fri.depth,\n prover_jobs_fri.is_node_final_proof\n ", + "query": "\n UPDATE prover_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n processing_started_at = NOW(),\n updated_at = NOW(),\n picked_by = $5\n WHERE\n id = (\n SELECT\n pj.id\n FROM\n (\n SELECT\n *\n FROM\n UNNEST($1::SMALLINT[], $2::SMALLINT[])\n ) AS tuple (circuit_id, ROUND)\n JOIN LATERAL (\n SELECT\n *\n FROM\n prover_jobs_fri AS pj\n WHERE\n pj.status = 'queued'\n AND pj.protocol_version = $3\n AND pj.protocol_version_patch = $4\n AND pj.circuit_id = tuple.circuit_id\n AND pj.aggregation_round = tuple.round\n ORDER BY\n pj.l1_batch_number ASC,\n pj.id ASC\n LIMIT\n 1\n ) AS pj ON TRUE\n ORDER BY\n pj.l1_batch_number ASC,\n pj.aggregation_round DESC,\n pj.id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n prover_jobs_fri.id,\n prover_jobs_fri.l1_batch_number,\n prover_jobs_fri.circuit_id,\n prover_jobs_fri.aggregation_round,\n prover_jobs_fri.sequence_number,\n prover_jobs_fri.depth,\n prover_jobs_fri.is_node_final_proof\n ", "describe": { "columns": [ { @@ -44,6 +44,7 @@ "Int2Array", "Int2Array", "Int4", + "Int4", "Text" ] }, @@ -57,5 +58,5 @@ false ] }, - "hash": "384e70c7f7b302b90a9ce69752fb7f87115848d883ace09ead493637a303cbb2" + "hash": "3e0a1ebc684810c09ff83784bdd0ad195b0dd2a8ce56b1a9eb531103130b5e3e" } diff --git a/prover/prover_dal/.sqlx/query-510bfea2346a8c63e74222e1159de366f88c20d00a8d928b6cf4caae0702b333.json b/prover/prover_dal/.sqlx/query-5354ed86960505fe6b159ce859656f870f8bbd15666fec5cc9f398306eeb6136.json similarity index 60% rename from prover/prover_dal/.sqlx/query-510bfea2346a8c63e74222e1159de366f88c20d00a8d928b6cf4caae0702b333.json rename to prover/prover_dal/.sqlx/query-5354ed86960505fe6b159ce859656f870f8bbd15666fec5cc9f398306eeb6136.json index ef8f865bf983..298f7bb30aa3 100644 --- a/prover/prover_dal/.sqlx/query-510bfea2346a8c63e74222e1159de366f88c20d00a8d928b6cf4caae0702b333.json +++ b/prover/prover_dal/.sqlx/query-5354ed86960505fe6b159ce859656f870f8bbd15666fec5cc9f398306eeb6136.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n witness_inputs_fri (\n l1_batch_number,\n merkle_tree_paths_blob_url,\n protocol_version,\n eip_4844_blobs,\n status,\n created_at,\n updated_at\n )\n VALUES\n ($1, $2, $3, $4, 'queued', NOW(), NOW())\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", + "query": "\n INSERT INTO\n witness_inputs_fri (\n l1_batch_number,\n merkle_tree_paths_blob_url,\n protocol_version,\n eip_4844_blobs,\n status,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, $4, 'queued', NOW(), NOW(), $5)\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", "describe": { "columns": [], "parameters": { @@ -8,10 +8,11 @@ "Int8", "Text", "Int4", - "Bytea" + "Bytea", + "Int4" ] }, "nullable": [] }, - "hash": "510bfea2346a8c63e74222e1159de366f88c20d00a8d928b6cf4caae0702b333" + "hash": "5354ed86960505fe6b159ce859656f870f8bbd15666fec5cc9f398306eeb6136" } diff --git a/prover/prover_dal/.sqlx/query-4d92a133a36afd682a84fbfd75aafca34d61347e0e2e29fb07ca3d1b8b1f309c.json b/prover/prover_dal/.sqlx/query-602cf56a94d9a1b22f9d62d6c0bdf5bc7dfc0043d385d0eadc88cf1c329a26d7.json similarity index 61% rename from prover/prover_dal/.sqlx/query-4d92a133a36afd682a84fbfd75aafca34d61347e0e2e29fb07ca3d1b8b1f309c.json rename to prover/prover_dal/.sqlx/query-602cf56a94d9a1b22f9d62d6c0bdf5bc7dfc0043d385d0eadc88cf1c329a26d7.json index f7ae37f4b7b3..785f42f1a58a 100644 --- a/prover/prover_dal/.sqlx/query-4d92a133a36afd682a84fbfd75aafca34d61347e0e2e29fb07ca3d1b8b1f309c.json +++ b/prover/prover_dal/.sqlx/query-602cf56a94d9a1b22f9d62d6c0bdf5bc7dfc0043d385d0eadc88cf1c329a26d7.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n prover_fri_protocol_versions (\n id,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n created_at\n )\n VALUES\n ($1, $2, $3, $4, $5, NOW())\n ON CONFLICT (id) DO NOTHING\n ", + "query": "\n INSERT INTO\n prover_fri_protocol_versions (\n id,\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash,\n created_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, $4, $5, NOW(), $6)\n ON CONFLICT (id) DO NOTHING\n ", "describe": { "columns": [], "parameters": { @@ -9,10 +9,11 @@ "Bytea", "Bytea", "Bytea", - "Bytea" + "Bytea", + "Int4" ] }, "nullable": [] }, - "hash": "4d92a133a36afd682a84fbfd75aafca34d61347e0e2e29fb07ca3d1b8b1f309c" + "hash": "602cf56a94d9a1b22f9d62d6c0bdf5bc7dfc0043d385d0eadc88cf1c329a26d7" } diff --git a/prover/prover_dal/.sqlx/query-e9ca863d6e77edd39a9fc55700a6686e655206601854799139c22c017a214744.json b/prover/prover_dal/.sqlx/query-764693ceeb45f8478a20242b592d419667f11d80036cda021ecbf23b0b5f7f42.json similarity index 58% rename from prover/prover_dal/.sqlx/query-e9ca863d6e77edd39a9fc55700a6686e655206601854799139c22c017a214744.json rename to prover/prover_dal/.sqlx/query-764693ceeb45f8478a20242b592d419667f11d80036cda021ecbf23b0b5f7f42.json index 0bdcbb99add0..aac0fcd420cd 100644 --- a/prover/prover_dal/.sqlx/query-e9ca863d6e77edd39a9fc55700a6686e655206601854799139c22c017a214744.json +++ b/prover/prover_dal/.sqlx/query-764693ceeb45f8478a20242b592d419667f11d80036cda021ecbf23b0b5f7f42.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n node_aggregation_witness_jobs_fri (\n l1_batch_number,\n circuit_id,\n depth,\n aggregations_url,\n number_of_dependent_jobs,\n protocol_version,\n status,\n created_at,\n updated_at\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, 'waiting_for_proofs', NOW(), NOW())\n ON CONFLICT (l1_batch_number, circuit_id, depth) DO\n UPDATE\n SET\n updated_at = NOW()\n ", + "query": "\n INSERT INTO\n node_aggregation_witness_jobs_fri (\n l1_batch_number,\n circuit_id,\n depth,\n aggregations_url,\n number_of_dependent_jobs,\n protocol_version,\n status,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, $4, $5, $6, 'waiting_for_proofs', NOW(), NOW(), $7)\n ON CONFLICT (l1_batch_number, circuit_id, depth) DO\n UPDATE\n SET\n updated_at = NOW()\n ", "describe": { "columns": [], "parameters": { @@ -10,10 +10,11 @@ "Int4", "Text", "Int4", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "e9ca863d6e77edd39a9fc55700a6686e655206601854799139c22c017a214744" + "hash": "764693ceeb45f8478a20242b592d419667f11d80036cda021ecbf23b0b5f7f42" } diff --git a/prover/prover_dal/.sqlx/query-08dfe2267bf93d164c649e93f5355b403f1438679167ff218489e2c6d0c359a3.json b/prover/prover_dal/.sqlx/query-7effbacbdcc4bd762386351755f4f32042dfead8a37401558f5fd3b03480f2dd.json similarity index 76% rename from prover/prover_dal/.sqlx/query-08dfe2267bf93d164c649e93f5355b403f1438679167ff218489e2c6d0c359a3.json rename to prover/prover_dal/.sqlx/query-7effbacbdcc4bd762386351755f4f32042dfead8a37401558f5fd3b03480f2dd.json index a464eafa683d..3064489830d9 100644 --- a/prover/prover_dal/.sqlx/query-08dfe2267bf93d164c649e93f5355b403f1438679167ff218489e2c6d0c359a3.json +++ b/prover/prover_dal/.sqlx/query-7effbacbdcc4bd762386351755f4f32042dfead8a37401558f5fd3b03480f2dd.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE node_aggregation_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n id = (\n SELECT\n id\n FROM\n node_aggregation_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n ORDER BY\n l1_batch_number ASC,\n depth ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n node_aggregation_witness_jobs_fri.*\n ", + "query": "\n UPDATE node_aggregation_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n id = (\n SELECT\n id\n FROM\n node_aggregation_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n AND protocol_version_patch = $2\n ORDER BY\n l1_batch_number ASC,\n depth ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n node_aggregation_witness_jobs_fri.*\n ", "describe": { "columns": [ { @@ -77,10 +77,16 @@ "ordinal": 14, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 15, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { "Left": [ + "Int4", "Int4", "Text" ] @@ -100,8 +106,9 @@ false, true, true, - true + true, + false ] }, - "hash": "08dfe2267bf93d164c649e93f5355b403f1438679167ff218489e2c6d0c359a3" + "hash": "7effbacbdcc4bd762386351755f4f32042dfead8a37401558f5fd3b03480f2dd" } diff --git a/prover/prover_dal/.sqlx/query-85a69b433c08847876bf6e7af9bc39ae8a6e053a0e03afd3fb5e02ee17157067.json b/prover/prover_dal/.sqlx/query-85a69b433c08847876bf6e7af9bc39ae8a6e053a0e03afd3fb5e02ee17157067.json index 75a600d5b46b..58b9116faaa2 100644 --- a/prover/prover_dal/.sqlx/query-85a69b433c08847876bf6e7af9bc39ae8a6e053a0e03afd3fb5e02ee17157067.json +++ b/prover/prover_dal/.sqlx/query-85a69b433c08847876bf6e7af9bc39ae8a6e053a0e03afd3fb5e02ee17157067.json @@ -57,6 +57,11 @@ "ordinal": 10, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 11, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -75,7 +80,8 @@ false, true, true, - true + true, + false ] }, "hash": "85a69b433c08847876bf6e7af9bc39ae8a6e053a0e03afd3fb5e02ee17157067" diff --git a/prover/prover_dal/.sqlx/query-0e7f17dd9c10b779d62de504a9cc41d3d4edb2d28d2a1fdf919f234a9ab9c43a.json b/prover/prover_dal/.sqlx/query-8720d411e0c9640afd61e927a89c0b6c018e6a4d279acd24a4ea7d81b5cc5123.json similarity index 60% rename from prover/prover_dal/.sqlx/query-0e7f17dd9c10b779d62de504a9cc41d3d4edb2d28d2a1fdf919f234a9ab9c43a.json rename to prover/prover_dal/.sqlx/query-8720d411e0c9640afd61e927a89c0b6c018e6a4d279acd24a4ea7d81b5cc5123.json index 6d967c5e79c4..12146fb75a90 100644 --- a/prover/prover_dal/.sqlx/query-0e7f17dd9c10b779d62de504a9cc41d3d4edb2d28d2a1fdf919f234a9ab9c43a.json +++ b/prover/prover_dal/.sqlx/query-8720d411e0c9640afd61e927a89c0b6c018e6a4d279acd24a4ea7d81b5cc5123.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE prover_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n id = (\n SELECT\n id\n FROM\n prover_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n ORDER BY\n aggregation_round DESC,\n l1_batch_number ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n prover_jobs_fri.id,\n prover_jobs_fri.l1_batch_number,\n prover_jobs_fri.circuit_id,\n prover_jobs_fri.aggregation_round,\n prover_jobs_fri.sequence_number,\n prover_jobs_fri.depth,\n prover_jobs_fri.is_node_final_proof\n ", + "query": "\n UPDATE prover_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n id = (\n SELECT\n id\n FROM\n prover_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n AND protocol_version_patch = $2\n ORDER BY\n aggregation_round DESC,\n l1_batch_number ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n prover_jobs_fri.id,\n prover_jobs_fri.l1_batch_number,\n prover_jobs_fri.circuit_id,\n prover_jobs_fri.aggregation_round,\n prover_jobs_fri.sequence_number,\n prover_jobs_fri.depth,\n prover_jobs_fri.is_node_final_proof\n ", "describe": { "columns": [ { @@ -41,6 +41,7 @@ ], "parameters": { "Left": [ + "Int4", "Int4", "Text" ] @@ -55,5 +56,5 @@ false ] }, - "hash": "0e7f17dd9c10b779d62de504a9cc41d3d4edb2d28d2a1fdf919f234a9ab9c43a" + "hash": "8720d411e0c9640afd61e927a89c0b6c018e6a4d279acd24a4ea7d81b5cc5123" } diff --git a/prover/prover_dal/.sqlx/query-8f5e89ccadd4ea1da7bfe9793a1cbb724af0f0216433a70f19d784e3f2afbc9f.json b/prover/prover_dal/.sqlx/query-8f5e89ccadd4ea1da7bfe9793a1cbb724af0f0216433a70f19d784e3f2afbc9f.json deleted file mode 100644 index cf7822e8ec84..000000000000 --- a/prover/prover_dal/.sqlx/query-8f5e89ccadd4ea1da7bfe9793a1cbb724af0f0216433a70f19d784e3f2afbc9f.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n protocol_version\n FROM\n witness_inputs_fri\n WHERE\n l1_batch_number = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "protocol_version", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - true - ] - }, - "hash": "8f5e89ccadd4ea1da7bfe9793a1cbb724af0f0216433a70f19d784e3f2afbc9f" -} diff --git a/prover/prover_dal/.sqlx/query-8ffb62f6a17c68af701e790044989daacb88fe5aaf368c5f81a885821522b99c.json b/prover/prover_dal/.sqlx/query-8ffb62f6a17c68af701e790044989daacb88fe5aaf368c5f81a885821522b99c.json new file mode 100644 index 000000000000..76a2a54a6a1d --- /dev/null +++ b/prover/prover_dal/.sqlx/query-8ffb62f6a17c68af701e790044989daacb88fe5aaf368c5f81a885821522b99c.json @@ -0,0 +1,41 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n l1_batch_number,\n status,\n protocol_version,\n protocol_version_patch\n FROM\n proof_compression_jobs_fri\n WHERE\n l1_batch_number = (\n SELECT\n MIN(l1_batch_number)\n FROM\n proof_compression_jobs_fri\n WHERE\n status = $1\n OR status = $2\n )\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "l1_batch_number", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "status", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "protocol_version", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "protocol_version_patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [ + false, + false, + true, + false + ] + }, + "hash": "8ffb62f6a17c68af701e790044989daacb88fe5aaf368c5f81a885821522b99c" +} diff --git a/prover/prover_dal/.sqlx/query-94a75b05ecbab75d6ebf39cca029bfb838c787fc58d7536f9e9976e5e515431a.json b/prover/prover_dal/.sqlx/query-94a75b05ecbab75d6ebf39cca029bfb838c787fc58d7536f9e9976e5e515431a.json index 896f10a4ca3a..824d74aef48c 100644 --- a/prover/prover_dal/.sqlx/query-94a75b05ecbab75d6ebf39cca029bfb838c787fc58d7536f9e9976e5e515431a.json +++ b/prover/prover_dal/.sqlx/query-94a75b05ecbab75d6ebf39cca029bfb838c787fc58d7536f9e9976e5e515431a.json @@ -77,6 +77,11 @@ "ordinal": 14, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 15, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -99,7 +104,8 @@ false, true, true, - true + true, + false ] }, "hash": "94a75b05ecbab75d6ebf39cca029bfb838c787fc58d7536f9e9976e5e515431a" diff --git a/prover/prover_dal/.sqlx/query-495a71634bcd8828bfaad5c4c542a172d47a65601b92f75da8f62ec2b18b9f4f.json b/prover/prover_dal/.sqlx/query-98564dee7e6ffb75e90c4d2c0381df42d7ba4d34a1362d471d3528468926c491.json similarity index 58% rename from prover/prover_dal/.sqlx/query-495a71634bcd8828bfaad5c4c542a172d47a65601b92f75da8f62ec2b18b9f4f.json rename to prover/prover_dal/.sqlx/query-98564dee7e6ffb75e90c4d2c0381df42d7ba4d34a1362d471d3528468926c491.json index fb16df5866d1..e1aef7a6adc3 100644 --- a/prover/prover_dal/.sqlx/query-495a71634bcd8828bfaad5c4c542a172d47a65601b92f75da8f62ec2b18b9f4f.json +++ b/prover/prover_dal/.sqlx/query-98564dee7e6ffb75e90c4d2c0381df42d7ba4d34a1362d471d3528468926c491.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE recursion_tip_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n recursion_tip_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n recursion_tip_witness_jobs_fri.l1_batch_number\n ", + "query": "\n UPDATE recursion_tip_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n recursion_tip_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n AND protocol_version_patch = $2\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n recursion_tip_witness_jobs_fri.l1_batch_number\n ", "describe": { "columns": [ { @@ -11,6 +11,7 @@ ], "parameters": { "Left": [ + "Int4", "Int4", "Text" ] @@ -19,5 +20,5 @@ false ] }, - "hash": "495a71634bcd8828bfaad5c4c542a172d47a65601b92f75da8f62ec2b18b9f4f" + "hash": "98564dee7e6ffb75e90c4d2c0381df42d7ba4d34a1362d471d3528468926c491" } diff --git a/prover/prover_dal/.sqlx/query-9da0a96bf42ef7b60ec3e39056942cb36fcaf1679bf49d7741305e8bc6e5e318.json b/prover/prover_dal/.sqlx/query-9da0a96bf42ef7b60ec3e39056942cb36fcaf1679bf49d7741305e8bc6e5e318.json deleted file mode 100644 index 5e2d46033178..000000000000 --- a/prover/prover_dal/.sqlx/query-9da0a96bf42ef7b60ec3e39056942cb36fcaf1679bf49d7741305e8bc6e5e318.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n gpu_prover_queue_fri (\n instance_host,\n instance_port,\n instance_status,\n specialized_prover_group_id,\n zone,\n created_at,\n updated_at,\n protocol_version\n )\n VALUES\n (CAST($1::TEXT AS inet), $2, 'available', $3, $4, NOW(), NOW(), $5)\n ON CONFLICT (instance_host, instance_port, zone) DO\n UPDATE\n SET\n instance_status = 'available',\n specialized_prover_group_id = $3,\n zone = $4,\n updated_at = NOW(),\n protocol_version = $5\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Int4", - "Int2", - "Text", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "9da0a96bf42ef7b60ec3e39056942cb36fcaf1679bf49d7741305e8bc6e5e318" -} diff --git a/prover/prover_dal/.sqlx/query-c2c140d136df5303d7b3a66ccd0d34a5baece02812f8c950fc84d37eeebd33a4.json b/prover/prover_dal/.sqlx/query-c2c140d136df5303d7b3a66ccd0d34a5baece02812f8c950fc84d37eeebd33a4.json index 7ced88426e4d..007525bceaef 100644 --- a/prover/prover_dal/.sqlx/query-c2c140d136df5303d7b3a66ccd0d34a5baece02812f8c950fc84d37eeebd33a4.json +++ b/prover/prover_dal/.sqlx/query-c2c140d136df5303d7b3a66ccd0d34a5baece02812f8c950fc84d37eeebd33a4.json @@ -97,6 +97,11 @@ "ordinal": 18, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 19, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -124,7 +129,8 @@ false, true, true, - true + true, + false ] }, "hash": "c2c140d136df5303d7b3a66ccd0d34a5baece02812f8c950fc84d37eeebd33a4" diff --git a/prover/prover_dal/.sqlx/query-1bc6597117db032b87df33040d61610ffa7f169d560e79e89b99eedf681c6773.json b/prover/prover_dal/.sqlx/query-caff620ae66d7fbe3caff7505173b6da86d1e693be03936730c340121167341f.json similarity index 53% rename from prover/prover_dal/.sqlx/query-1bc6597117db032b87df33040d61610ffa7f169d560e79e89b99eedf681c6773.json rename to prover/prover_dal/.sqlx/query-caff620ae66d7fbe3caff7505173b6da86d1e693be03936730c340121167341f.json index 0351691c3955..403e34bb91cd 100644 --- a/prover/prover_dal/.sqlx/query-1bc6597117db032b87df33040d61610ffa7f169d560e79e89b99eedf681c6773.json +++ b/prover/prover_dal/.sqlx/query-caff620ae66d7fbe3caff7505173b6da86d1e693be03936730c340121167341f.json @@ -1,16 +1,17 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n scheduler_witness_jobs_fri (\n l1_batch_number,\n scheduler_partial_input_blob_url,\n protocol_version,\n status,\n created_at,\n updated_at\n )\n VALUES\n ($1, $2, $3, 'waiting_for_proofs', NOW(), NOW())\n ON CONFLICT (l1_batch_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", + "query": "\n INSERT INTO\n scheduler_witness_jobs_fri (\n l1_batch_number,\n scheduler_partial_input_blob_url,\n protocol_version,\n status,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, 'waiting_for_proofs', NOW(), NOW(), $4)\n ON CONFLICT (l1_batch_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", "describe": { "columns": [], "parameters": { "Left": [ "Int8", "Text", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "1bc6597117db032b87df33040d61610ffa7f169d560e79e89b99eedf681c6773" + "hash": "caff620ae66d7fbe3caff7505173b6da86d1e693be03936730c340121167341f" } diff --git a/prover/prover_dal/.sqlx/query-d286520139c1f5daa90b20efffa515afcaedf541533f218ca6e167bdc7f6ea7f.json b/prover/prover_dal/.sqlx/query-d272c91f1209c277189a31c59ee191a43dc8eafc33ee067bd41e20f25f7625f0.json similarity index 77% rename from prover/prover_dal/.sqlx/query-d286520139c1f5daa90b20efffa515afcaedf541533f218ca6e167bdc7f6ea7f.json rename to prover/prover_dal/.sqlx/query-d272c91f1209c277189a31c59ee191a43dc8eafc33ee067bd41e20f25f7625f0.json index 5024a94f4c30..a90da33a3333 100644 --- a/prover/prover_dal/.sqlx/query-d286520139c1f5daa90b20efffa515afcaedf541533f218ca6e167bdc7f6ea7f.json +++ b/prover/prover_dal/.sqlx/query-d272c91f1209c277189a31c59ee191a43dc8eafc33ee067bd41e20f25f7625f0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE leaf_aggregation_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $2\n WHERE\n id = (\n SELECT\n id\n FROM\n leaf_aggregation_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n ORDER BY\n l1_batch_number ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n leaf_aggregation_witness_jobs_fri.*\n ", + "query": "\n UPDATE leaf_aggregation_witness_jobs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n id = (\n SELECT\n id\n FROM\n leaf_aggregation_witness_jobs_fri\n WHERE\n status = 'queued'\n AND protocol_version = $1\n AND protocol_version_patch = $2\n ORDER BY\n l1_batch_number ASC,\n id ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n leaf_aggregation_witness_jobs_fri.*\n ", "describe": { "columns": [ { @@ -77,10 +77,16 @@ "ordinal": 14, "name": "picked_by", "type_info": "Text" + }, + { + "ordinal": 15, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { "Left": [ + "Int4", "Int4", "Text" ] @@ -100,8 +106,9 @@ true, true, true, - true + true, + false ] }, - "hash": "d286520139c1f5daa90b20efffa515afcaedf541533f218ca6e167bdc7f6ea7f" + "hash": "d272c91f1209c277189a31c59ee191a43dc8eafc33ee067bd41e20f25f7625f0" } diff --git a/prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json b/prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json new file mode 100644 index 000000000000..942b12c25717 --- /dev/null +++ b/prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT protocol_version, protocol_version_patch\n FROM prover_jobs_fri\n WHERE id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "protocol_version", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "protocol_version_patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [ + true, + false + ] + }, + "hash": "d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b" +} diff --git a/prover/prover_dal/.sqlx/query-d7e8eabd7b43ff62838fbc847e4813d2b2d411bd5faf8306cd48db500532b711.json b/prover/prover_dal/.sqlx/query-d7e8eabd7b43ff62838fbc847e4813d2b2d411bd5faf8306cd48db500532b711.json deleted file mode 100644 index a049d76c24b7..000000000000 --- a/prover/prover_dal/.sqlx/query-d7e8eabd7b43ff62838fbc847e4813d2b2d411bd5faf8306cd48db500532b711.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT\n l1_batch_number,\n status\n FROM\n proof_compression_jobs_fri\n WHERE\n l1_batch_number = (\n SELECT\n MIN(l1_batch_number)\n FROM\n proof_compression_jobs_fri\n WHERE\n status = $1\n OR status = $2\n )\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "l1_batch_number", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "status", - "type_info": "Text" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "d7e8eabd7b43ff62838fbc847e4813d2b2d411bd5faf8306cd48db500532b711" -} diff --git a/prover/prover_dal/.sqlx/query-dbdbbac302a5141d7b5872261cf8594219903833fc051aac278a3b79e5d58dce.json b/prover/prover_dal/.sqlx/query-dbdbbac302a5141d7b5872261cf8594219903833fc051aac278a3b79e5d58dce.json new file mode 100644 index 000000000000..b471e5cff51d --- /dev/null +++ b/prover/prover_dal/.sqlx/query-dbdbbac302a5141d7b5872261cf8594219903833fc051aac278a3b79e5d58dce.json @@ -0,0 +1,31 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n id,\n protocol_version_patch\n FROM\n prover_fri_protocol_versions\n WHERE\n recursion_circuits_set_vks_hash = $1\n AND recursion_leaf_level_vk_hash = $2\n AND recursion_node_level_vk_hash = $3\n AND recursion_scheduler_level_vk_hash = $4\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "protocol_version_patch", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Bytea", + "Bytea", + "Bytea", + "Bytea" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "dbdbbac302a5141d7b5872261cf8594219903833fc051aac278a3b79e5d58dce" +} diff --git a/prover/prover_dal/.sqlx/query-e0a6cc885e437aa7ded9def71f3e118cabc67b6e507efefb7b69e102f1b43c58.json b/prover/prover_dal/.sqlx/query-e0a6cc885e437aa7ded9def71f3e118cabc67b6e507efefb7b69e102f1b43c58.json index a7b8d0dc8542..738a8b54a0b3 100644 --- a/prover/prover_dal/.sqlx/query-e0a6cc885e437aa7ded9def71f3e118cabc67b6e507efefb7b69e102f1b43c58.json +++ b/prover/prover_dal/.sqlx/query-e0a6cc885e437aa7ded9def71f3e118cabc67b6e507efefb7b69e102f1b43c58.json @@ -67,6 +67,11 @@ "ordinal": 12, "name": "eip_4844_blobs", "type_info": "Bytea" + }, + { + "ordinal": 13, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { @@ -87,7 +92,8 @@ true, true, true, - true + true, + false ] }, "hash": "e0a6cc885e437aa7ded9def71f3e118cabc67b6e507efefb7b69e102f1b43c58" diff --git a/prover/prover_dal/.sqlx/query-e62407c355594b87c7caee2396f1d14910604ddd7eadc29db3634dc873254569.json b/prover/prover_dal/.sqlx/query-e62407c355594b87c7caee2396f1d14910604ddd7eadc29db3634dc873254569.json deleted file mode 100644 index acd2e7e9c50c..000000000000 --- a/prover/prover_dal/.sqlx/query-e62407c355594b87c7caee2396f1d14910604ddd7eadc29db3634dc873254569.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT protocol_version\n FROM prover_jobs_fri\n WHERE id = $1\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "protocol_version", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [ - true - ] - }, - "hash": "e62407c355594b87c7caee2396f1d14910604ddd7eadc29db3634dc873254569" -} diff --git a/prover/prover_dal/.sqlx/query-5e9618d3e1aa40639f2d5ad5cf5564eddf84760477518981c7acffc8bc4acf76.json b/prover/prover_dal/.sqlx/query-e8412d5ad1b17269da02f9a5c201ed762158a27449f61d3b1bb80069ca446727.json similarity index 79% rename from prover/prover_dal/.sqlx/query-5e9618d3e1aa40639f2d5ad5cf5564eddf84760477518981c7acffc8bc4acf76.json rename to prover/prover_dal/.sqlx/query-e8412d5ad1b17269da02f9a5c201ed762158a27449f61d3b1bb80069ca446727.json index ca90e154456d..4ab8c324ff58 100644 --- a/prover/prover_dal/.sqlx/query-5e9618d3e1aa40639f2d5ad5cf5564eddf84760477518981c7acffc8bc4acf76.json +++ b/prover/prover_dal/.sqlx/query-e8412d5ad1b17269da02f9a5c201ed762158a27449f61d3b1bb80069ca446727.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE witness_inputs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n witness_inputs_fri\n WHERE\n l1_batch_number <= $1\n AND status = 'queued'\n AND protocol_version = $2\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n witness_inputs_fri.*\n ", + "query": "\n UPDATE witness_inputs_fri\n SET\n status = 'in_progress',\n attempts = attempts + 1,\n updated_at = NOW(),\n processing_started_at = NOW(),\n picked_by = $3\n WHERE\n l1_batch_number = (\n SELECT\n l1_batch_number\n FROM\n witness_inputs_fri\n WHERE\n l1_batch_number <= $1\n AND status = 'queued'\n AND protocol_version = $2\n AND protocol_version_patch = $4\n ORDER BY\n l1_batch_number ASC\n LIMIT\n 1\n FOR UPDATE\n SKIP LOCKED\n )\n RETURNING\n witness_inputs_fri.*\n ", "describe": { "columns": [ { @@ -67,13 +67,19 @@ "ordinal": 12, "name": "eip_4844_blobs", "type_info": "Bytea" + }, + { + "ordinal": 13, + "name": "protocol_version_patch", + "type_info": "Int4" } ], "parameters": { "Left": [ "Int8", "Int4", - "Text" + "Text", + "Int4" ] }, "nullable": [ @@ -89,8 +95,9 @@ true, true, true, - true + true, + false ] }, - "hash": "5e9618d3e1aa40639f2d5ad5cf5564eddf84760477518981c7acffc8bc4acf76" + "hash": "e8412d5ad1b17269da02f9a5c201ed762158a27449f61d3b1bb80069ca446727" } diff --git a/prover/prover_dal/.sqlx/query-8fd6e339bee120a5856c8c49b764624c4778f1ac025c215b043cb7be1ca8890d.json b/prover/prover_dal/.sqlx/query-eef1b56e87eff63fcf6ffb98791583a7526ae38ceb4bf80543cfd3fb60492fb9.json similarity index 53% rename from prover/prover_dal/.sqlx/query-8fd6e339bee120a5856c8c49b764624c4778f1ac025c215b043cb7be1ca8890d.json rename to prover/prover_dal/.sqlx/query-eef1b56e87eff63fcf6ffb98791583a7526ae38ceb4bf80543cfd3fb60492fb9.json index 1e92960ee5cf..fe481b4e54db 100644 --- a/prover/prover_dal/.sqlx/query-8fd6e339bee120a5856c8c49b764624c4778f1ac025c215b043cb7be1ca8890d.json +++ b/prover/prover_dal/.sqlx/query-eef1b56e87eff63fcf6ffb98791583a7526ae38ceb4bf80543cfd3fb60492fb9.json @@ -1,16 +1,17 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n recursion_tip_witness_jobs_fri (\n l1_batch_number,\n status,\n number_of_final_node_jobs,\n protocol_version,\n created_at,\n updated_at\n )\n VALUES\n ($1, 'waiting_for_proofs', $2, $3, NOW(), NOW())\n ON CONFLICT (l1_batch_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", + "query": "\n INSERT INTO\n recursion_tip_witness_jobs_fri (\n l1_batch_number,\n status,\n number_of_final_node_jobs,\n protocol_version,\n created_at,\n updated_at,\n protocol_version_patch\n )\n VALUES\n ($1, 'waiting_for_proofs', $2, $3, NOW(), NOW(), $4)\n ON CONFLICT (l1_batch_number) DO\n UPDATE\n SET\n updated_at = NOW()\n ", "describe": { "columns": [], "parameters": { "Left": [ "Int8", "Int4", + "Int4", "Int4" ] }, "nullable": [] }, - "hash": "8fd6e339bee120a5856c8c49b764624c4778f1ac025c215b043cb7be1ca8890d" + "hash": "eef1b56e87eff63fcf6ffb98791583a7526ae38ceb4bf80543cfd3fb60492fb9" } diff --git a/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.down.sql b/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.down.sql new file mode 100644 index 000000000000..2e5e616b70eb --- /dev/null +++ b/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.down.sql @@ -0,0 +1,71 @@ +ALTER TABLE prover_fri_protocol_versions + DROP CONSTRAINT prover_fri_protocol_versions_pkey CASCADE; + +ALTER TABLE witness_inputs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE leaf_aggregation_witness_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE node_aggregation_witness_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE recursion_tip_witness_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE scheduler_witness_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE proof_compression_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE prover_jobs_fri + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE prover_jobs_fri_archive + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE gpu_prover_queue_fri + DROP IF EXISTS protocol_version_patch; + +ALTER TABLE gpu_prover_queue_fri_archive + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE prover_fri_protocol_versions + DROP COLUMN IF EXISTS protocol_version_patch; + +ALTER TABLE prover_fri_protocol_versions + ADD CONSTRAINT prover_fri_protocol_versions_pkey PRIMARY KEY (id); + +ALTER TABLE witness_inputs_fri + ADD CONSTRAINT witness_inputs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) + REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE leaf_aggregation_witness_jobs_fri + ADD CONSTRAINT leaf_aggregation_witness_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) + REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE node_aggregation_witness_jobs_fri + ADD CONSTRAINT node_aggregation_witness_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE recursion_tip_witness_jobs_fri + ADD CONSTRAINT recursion_tip_witness_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE scheduler_witness_jobs_fri + ADD CONSTRAINT scheduler_witness_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) + REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE proof_compression_jobs_fri + ADD CONSTRAINT proof_compression_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) + REFERENCES prover_fri_protocol_versions (id); + +ALTER TABLE prover_jobs_fri + ADD CONSTRAINT prover_jobs_fri_protocol_version_fkey + FOREIGN KEY (protocol_version) + REFERENCES prover_fri_protocol_versions (id); diff --git a/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.up.sql b/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.up.sql new file mode 100644 index 000000000000..49adf01d99e0 --- /dev/null +++ b/prover/prover_dal/migrations/20240524123522_add-patch-columns-for-semver.up.sql @@ -0,0 +1,73 @@ +ALTER TABLE witness_inputs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE leaf_aggregation_witness_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE node_aggregation_witness_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE recursion_tip_witness_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE scheduler_witness_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE proof_compression_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE prover_jobs_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE prover_jobs_fri_archive + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE gpu_prover_queue_fri + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE gpu_prover_queue_fri_archive + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE prover_fri_protocol_versions + ADD COLUMN IF NOT EXISTS protocol_version_patch INT NOT NULL DEFAULT 0; + +ALTER TABLE prover_fri_protocol_versions + DROP CONSTRAINT IF EXISTS prover_fri_protocol_versions_pkey CASCADE; + +ALTER TABLE prover_fri_protocol_versions + ADD CONSTRAINT prover_fri_protocol_versions_pkey PRIMARY KEY (id, protocol_version_patch); + +ALTER TABLE witness_inputs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE leaf_aggregation_witness_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE node_aggregation_witness_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE recursion_tip_witness_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE scheduler_witness_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE proof_compression_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); + +ALTER TABLE prover_jobs_fri + ADD CONSTRAINT protocol_semantic_version_fk + FOREIGN KEY (protocol_version, protocol_version_patch) + REFERENCES prover_fri_protocol_versions (id, protocol_version_patch); diff --git a/prover/prover_dal/src/fri_gpu_prover_queue_dal.rs b/prover/prover_dal/src/fri_gpu_prover_queue_dal.rs index 7052394b7183..d4230d8eaf45 100644 --- a/prover/prover_dal/src/fri_gpu_prover_queue_dal.rs +++ b/prover/prover_dal/src/fri_gpu_prover_queue_dal.rs @@ -1,7 +1,7 @@ use std::{str::FromStr, time::Duration}; use zksync_basic_types::{ - protocol_version::ProtocolVersionId, + protocol_version::ProtocolSemanticVersion, prover_dal::{GpuProverInstanceStatus, SocketAddress}, }; use zksync_db_connection::connection::Connection; @@ -19,7 +19,7 @@ impl FriGpuProverQueueDal<'_, '_> { processing_timeout: Duration, specialized_prover_group_id: u8, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Option { let processing_timeout = pg_interval_from_duration(processing_timeout); let result: Option = sqlx::query!( @@ -39,6 +39,7 @@ impl FriGpuProverQueueDal<'_, '_> { specialized_prover_group_id = $2 AND zone = $3 AND protocol_version = $4 + AND protocol_version_patch = $5 AND ( instance_status = 'available' OR ( @@ -59,7 +60,8 @@ impl FriGpuProverQueueDal<'_, '_> { &processing_timeout, i16::from(specialized_prover_group_id), zone, - protocol_version as i32 + protocol_version.minor as i32, + protocol_version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await @@ -77,7 +79,7 @@ impl FriGpuProverQueueDal<'_, '_> { address: SocketAddress, specialized_prover_group_id: u8, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { sqlx::query!( r#" @@ -90,10 +92,11 @@ impl FriGpuProverQueueDal<'_, '_> { zone, created_at, updated_at, - protocol_version + protocol_version, + protocol_version_patch ) VALUES - (CAST($1::TEXT AS inet), $2, 'available', $3, $4, NOW(), NOW(), $5) + (CAST($1::TEXT AS inet), $2, 'available', $3, $4, NOW(), NOW(), $5, $6) ON CONFLICT (instance_host, instance_port, zone) DO UPDATE SET @@ -101,13 +104,15 @@ impl FriGpuProverQueueDal<'_, '_> { specialized_prover_group_id = $3, zone = $4, updated_at = NOW(), - protocol_version = $5 + protocol_version = $5, + protocol_version_patch = $6 "#, address.host.to_string(), i32::from(address.port), i16::from(specialized_prover_group_id), zone, - protocol_version as i32 + protocol_version.minor as i32, + protocol_version.patch.0 as i32 ) .execute(self.storage.conn()) .await @@ -214,7 +219,8 @@ impl FriGpuProverQueueDal<'_, '_> { updated_at, processing_started_at, NOW() as archived_at, - protocol_version + protocol_version, + protocol_version_patch ), inserted_count AS ( INSERT INTO gpu_prover_queue_fri_archive diff --git a/prover/prover_dal/src/fri_proof_compressor_dal.rs b/prover/prover_dal/src/fri_proof_compressor_dal.rs index e00fe8962ee4..7d4ef1462bc3 100644 --- a/prover/prover_dal/src/fri_proof_compressor_dal.rs +++ b/prover/prover_dal/src/fri_proof_compressor_dal.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, str::FromStr, time::Duration}; use sqlx::Row; use zksync_basic_types::{ - protocol_version::ProtocolVersionId, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VersionPatch}, prover_dal::{ JobCountStatistics, ProofCompressionJobInfo, ProofCompressionJobStatus, StuckJobs, }, @@ -23,20 +23,21 @@ impl FriProofCompressorDal<'_, '_> { &mut self, block_number: L1BatchNumber, fri_proof_blob_url: &str, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { sqlx::query!( r#" INSERT INTO - proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version) + proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version, protocol_version_patch) VALUES - ($1, $2, $3, NOW(), NOW(), $4) + ($1, $2, $3, NOW(), NOW(), $4, $5) ON CONFLICT (l1_batch_number) DO NOTHING "#, i64::from(block_number.0), fri_proof_blob_url, ProofCompressionJobStatus::Queued.to_string(), - protocol_version as i32 + protocol_version.minor as i32, + protocol_version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await @@ -63,7 +64,7 @@ impl FriProofCompressorDal<'_, '_> { pub async fn get_next_proof_compression_job( &mut self, picked_by: &str, - protocol_version: &ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Option { sqlx::query!( r#" @@ -83,6 +84,7 @@ impl FriProofCompressorDal<'_, '_> { WHERE status = $2 AND protocol_version = $4 + AND protocol_version_patch = $5 ORDER BY l1_batch_number ASC LIMIT @@ -96,7 +98,8 @@ impl FriProofCompressorDal<'_, '_> { ProofCompressionJobStatus::InProgress.to_string(), ProofCompressionJobStatus::Queued.to_string(), picked_by, - *protocol_version as i32 + protocol_version.minor as i32, + protocol_version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await @@ -177,14 +180,20 @@ impl FriProofCompressorDal<'_, '_> { .unwrap(); } - pub async fn get_least_proven_block_number_not_sent_to_server( + pub async fn get_least_proven_block_not_sent_to_server( &mut self, - ) -> Option<(L1BatchNumber, ProofCompressionJobStatus)> { + ) -> Option<( + L1BatchNumber, + ProtocolSemanticVersion, + ProofCompressionJobStatus, + )> { let row = sqlx::query!( r#" SELECT l1_batch_number, - status + status, + protocol_version, + protocol_version_patch FROM proof_compression_jobs_fri WHERE @@ -207,6 +216,10 @@ impl FriProofCompressorDal<'_, '_> { match row { Some(row) => Some(( L1BatchNumber(row.l1_batch_number as u32), + ProtocolSemanticVersion::new( + ProtocolVersionId::try_from(row.protocol_version.unwrap() as u16).unwrap(), + VersionPatch(row.protocol_version_patch as u32), + ), ProofCompressionJobStatus::from_str(&row.status).unwrap(), )), None => None, diff --git a/prover/prover_dal/src/fri_protocol_versions_dal.rs b/prover/prover_dal/src/fri_protocol_versions_dal.rs index 97f864c47cf3..1b3030832cac 100644 --- a/prover/prover_dal/src/fri_protocol_versions_dal.rs +++ b/prover/prover_dal/src/fri_protocol_versions_dal.rs @@ -1,7 +1,5 @@ -use std::convert::TryFrom; - use zksync_basic_types::{ - protocol_version::{L1VerifierConfig, ProtocolVersionId, VerifierParams}, + protocol_version::{L1VerifierConfig, ProtocolSemanticVersion, VerifierParams}, H256, }; use zksync_db_connection::connection::Connection; @@ -16,7 +14,7 @@ pub struct FriProtocolVersionsDal<'a, 'c> { impl FriProtocolVersionsDal<'_, '_> { pub async fn save_prover_protocol_version( &mut self, - id: ProtocolVersionId, + id: ProtocolSemanticVersion, l1_verifier_config: L1VerifierConfig, ) { sqlx::query!( @@ -28,13 +26,14 @@ impl FriProtocolVersionsDal<'_, '_> { recursion_node_level_vk_hash, recursion_leaf_level_vk_hash, recursion_circuits_set_vks_hash, - created_at + created_at, + protocol_version_patch ) VALUES - ($1, $2, $3, $4, $5, NOW()) + ($1, $2, $3, $4, $5, NOW(), $6) ON CONFLICT (id) DO NOTHING "#, - id as i32, + id.minor as i32, l1_verifier_config .recursion_scheduler_level_vk_hash .as_bytes(), @@ -50,53 +49,16 @@ impl FriProtocolVersionsDal<'_, '_> { .params .recursion_circuits_set_vks_hash .as_bytes(), + id.patch.0 as i32 ) .execute(self.storage.conn()) .await .unwrap(); } - pub async fn protocol_versions_for( - &mut self, - vk_commitments: &L1VerifierConfig, - ) -> Vec { - sqlx::query!( - r#" - SELECT - id - FROM - prover_fri_protocol_versions - WHERE - recursion_circuits_set_vks_hash = $1 - AND recursion_leaf_level_vk_hash = $2 - AND recursion_node_level_vk_hash = $3 - AND recursion_scheduler_level_vk_hash = $4 - "#, - vk_commitments - .params - .recursion_circuits_set_vks_hash - .as_bytes(), - vk_commitments - .params - .recursion_leaf_level_vk_hash - .as_bytes(), - vk_commitments - .params - .recursion_node_level_vk_hash - .as_bytes(), - vk_commitments.recursion_scheduler_level_vk_hash.as_bytes(), - ) - .fetch_all(self.storage.conn()) - .await - .unwrap() - .into_iter() - .map(|row| ProtocolVersionId::try_from(row.id as u16).unwrap()) - .collect() - } - pub async fn vk_commitments_for( &mut self, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Option { sqlx::query!( r#" @@ -109,8 +71,11 @@ impl FriProtocolVersionsDal<'_, '_> { prover_fri_protocol_versions WHERE id = $1 + AND + protocol_version_patch = $2 "#, - protocol_version as i32 + protocol_version.minor as i32, + protocol_version.patch.0 as i32 ) .fetch_optional(self.storage.conn()) .await diff --git a/prover/prover_dal/src/fri_prover_dal.rs b/prover/prover_dal/src/fri_prover_dal.rs index e1f427d5635c..1a6064d6561e 100644 --- a/prover/prover_dal/src/fri_prover_dal.rs +++ b/prover/prover_dal/src/fri_prover_dal.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, convert::TryFrom, str::FromStr, time::Duration}; use zksync_basic_types::{ basic_fri_types::{AggregationRound, CircuitIdRoundTuple}, - protocol_version::ProtocolVersionId, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VersionPatch}, prover_dal::{ correct_circuit_id, FriProverJobMetadata, JobCountStatistics, ProverJobFriInfo, ProverJobStatus, StuckJobs, @@ -28,7 +28,7 @@ impl FriProverDal<'_, '_> { circuit_ids_and_urls: Vec<(u8, String)>, aggregation_round: AggregationRound, depth: u16, - protocol_version_id: ProtocolVersionId, + protocol_version_id: ProtocolSemanticVersion, ) { let latency = MethodLatency::new("save_fri_prover_jobs"); for (sequence_number, (circuit_id, circuit_blob_url)) in @@ -51,7 +51,7 @@ impl FriProverDal<'_, '_> { pub async fn get_next_job( &mut self, - protocol_version: &ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { sqlx::query!( @@ -62,7 +62,7 @@ impl FriProverDal<'_, '_> { attempts = attempts + 1, updated_at = NOW(), processing_started_at = NOW(), - picked_by = $2 + picked_by = $3 WHERE id = ( SELECT @@ -72,6 +72,7 @@ impl FriProverDal<'_, '_> { WHERE status = 'queued' AND protocol_version = $1 + AND protocol_version_patch = $2 ORDER BY aggregation_round DESC, l1_batch_number ASC, @@ -90,7 +91,8 @@ impl FriProverDal<'_, '_> { prover_jobs_fri.depth, prover_jobs_fri.is_node_final_proof "#, - *protocol_version as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, picked_by, ) .fetch_optional(self.storage.conn()) @@ -111,7 +113,7 @@ impl FriProverDal<'_, '_> { pub async fn get_next_job_for_circuit_id_round( &mut self, circuits_to_pick: &[CircuitIdRoundTuple], - protocol_version: &ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { let circuit_ids: Vec<_> = circuits_to_pick @@ -130,7 +132,7 @@ impl FriProverDal<'_, '_> { attempts = attempts + 1, processing_started_at = NOW(), updated_at = NOW(), - picked_by = $4 + picked_by = $5 WHERE id = ( SELECT @@ -150,6 +152,7 @@ impl FriProverDal<'_, '_> { WHERE pj.status = 'queued' AND pj.protocol_version = $3 + AND pj.protocol_version_patch = $4 AND pj.circuit_id = tuple.circuit_id AND pj.aggregation_round = tuple.round ORDER BY @@ -178,7 +181,8 @@ impl FriProverDal<'_, '_> { "#, &circuit_ids[..], &aggregation_rounds[..], - *protocol_version as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, picked_by, ) .fetch_optional(self.storage.conn()) @@ -355,7 +359,7 @@ impl FriProverDal<'_, '_> { aggregation_round: AggregationRound, circuit_blob_url: &str, is_node_final_proof: bool, - protocol_version_id: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { sqlx::query!( r#" @@ -371,10 +375,11 @@ impl FriProverDal<'_, '_> { protocol_version, status, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, 'queued', NOW(), NOW()) + ($1, $2, $3, $4, $5, $6, $7, $8, 'queued', NOW(), NOW(), $9) ON CONFLICT (l1_batch_number, aggregation_round, circuit_id, depth, sequence_number) DO UPDATE SET @@ -387,7 +392,8 @@ impl FriProverDal<'_, '_> { sequence_number as i64, i32::from(depth), is_node_final_proof, - protocol_version_id as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, ) .execute(self.storage.conn()) .await @@ -695,10 +701,10 @@ impl FriProverDal<'_, '_> { .collect() } - pub async fn protocol_version_for_job(&mut self, job_id: u32) -> ProtocolVersionId { - sqlx::query!( + pub async fn protocol_version_for_job(&mut self, job_id: u32) -> ProtocolSemanticVersion { + let result = sqlx::query!( r#" - SELECT protocol_version + SELECT protocol_version, protocol_version_patch FROM prover_jobs_fri WHERE id = $1 "#, @@ -706,10 +712,12 @@ impl FriProverDal<'_, '_> { ) .fetch_one(self.storage.conn()) .await - .unwrap() - .protocol_version - .map(|id| ProtocolVersionId::try_from(id as u16).unwrap()) - .unwrap() + .unwrap(); + + ProtocolSemanticVersion::new( + ProtocolVersionId::try_from(result.protocol_version.unwrap() as u16).unwrap(), + VersionPatch(result.protocol_version_patch as u32), + ) } pub async fn delete_prover_jobs_fri_batch_data( diff --git a/prover/prover_dal/src/fri_witness_generator_dal.rs b/prover/prover_dal/src/fri_witness_generator_dal.rs index 73b546de4b96..a7704969a936 100644 --- a/prover/prover_dal/src/fri_witness_generator_dal.rs +++ b/prover/prover_dal/src/fri_witness_generator_dal.rs @@ -1,10 +1,10 @@ #![doc = include_str!("../doc/FriWitnessGeneratorDal.md")] -use std::{collections::HashMap, convert::TryFrom, str::FromStr, time::Duration}; +use std::{collections::HashMap, str::FromStr, time::Duration}; use sqlx::Row; use zksync_basic_types::{ basic_fri_types::{AggregationRound, Eip4844Blobs}, - protocol_version::ProtocolVersionId, + protocol_version::{ProtocolSemanticVersion, ProtocolVersionId, VersionPatch}, prover_dal::{ correct_circuit_id, BasicWitnessGeneratorJobInfo, JobCountStatistics, LeafAggregationJobMetadata, LeafWitnessGeneratorJobInfo, NodeAggregationJobMetadata, @@ -41,7 +41,7 @@ impl FriWitnessGeneratorDal<'_, '_> { &mut self, block_number: L1BatchNumber, object_key: &str, - protocol_version_id: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, eip_4844_blobs: Eip4844Blobs, ) { let blobs_raw = eip_4844_blobs.encode(); @@ -55,16 +55,18 @@ impl FriWitnessGeneratorDal<'_, '_> { eip_4844_blobs, status, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, $2, $3, $4, 'queued', NOW(), NOW()) + ($1, $2, $3, $4, 'queued', NOW(), NOW(), $5) ON CONFLICT (l1_batch_number) DO NOTHING "#, i64::from(block_number.0), object_key, - protocol_version_id as i32, + protocol_version.minor as i32, blobs_raw, + protocol_version.patch.0 as i32, ) .fetch_optional(self.storage.conn()) .await @@ -76,7 +78,7 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn get_next_basic_circuit_witness_job( &mut self, last_l1_batch_to_process: u32, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option<(L1BatchNumber, Eip4844Blobs)> { sqlx::query!( @@ -98,6 +100,7 @@ impl FriWitnessGeneratorDal<'_, '_> { l1_batch_number <= $1 AND status = 'queued' AND protocol_version = $2 + AND protocol_version_patch = $4 ORDER BY l1_batch_number ASC LIMIT @@ -109,8 +112,9 @@ impl FriWitnessGeneratorDal<'_, '_> { witness_inputs_fri.* "#, i64::from(last_l1_batch_to_process), - protocol_version as i32, + protocol_version.minor as i32, picked_by, + protocol_version.patch.0 as i32, ) .fetch_optional(self.storage.conn()) .await @@ -319,7 +323,7 @@ impl FriWitnessGeneratorDal<'_, '_> { closed_form_inputs_and_urls: &Vec<(u8, String, usize)>, scheduler_partial_input_blob_url: &str, base_layer_to_recursive_layer_circuit_id: fn(u8) -> u8, - protocol_version_id: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { { let latency = MethodLatency::new("create_aggregation_jobs_fri"); @@ -337,10 +341,11 @@ impl FriWitnessGeneratorDal<'_, '_> { protocol_version, status, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, $2, $3, $4, $5, 'waiting_for_proofs', NOW(), NOW()) + ($1, $2, $3, $4, $5, 'waiting_for_proofs', NOW(), NOW(), $6) ON CONFLICT (l1_batch_number, circuit_id) DO UPDATE SET @@ -350,7 +355,8 @@ impl FriWitnessGeneratorDal<'_, '_> { i16::from(*circuit_id), closed_form_inputs_url, *number_of_basic_circuits as i32, - protocol_version_id as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, ) .execute(self.storage.conn()) .await @@ -362,7 +368,7 @@ impl FriWitnessGeneratorDal<'_, '_> { None, 0, "", - protocol_version_id, + protocol_version, ) .await; } @@ -376,10 +382,11 @@ impl FriWitnessGeneratorDal<'_, '_> { number_of_final_node_jobs, protocol_version, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, 'waiting_for_proofs', $2, $3, NOW(), NOW()) + ($1, 'waiting_for_proofs', $2, $3, NOW(), NOW(), $4) ON CONFLICT (l1_batch_number) DO UPDATE SET @@ -387,7 +394,8 @@ impl FriWitnessGeneratorDal<'_, '_> { "#, block_number.0 as i64, closed_form_inputs_and_urls.len() as i32, - protocol_version_id as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, ) .execute(self.storage.conn()) .await @@ -402,10 +410,11 @@ impl FriWitnessGeneratorDal<'_, '_> { protocol_version, status, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, $2, $3, 'waiting_for_proofs', NOW(), NOW()) + ($1, $2, $3, 'waiting_for_proofs', NOW(), NOW(), $4) ON CONFLICT (l1_batch_number) DO UPDATE SET @@ -413,7 +422,8 @@ impl FriWitnessGeneratorDal<'_, '_> { "#, i64::from(block_number.0), scheduler_partial_input_blob_url, - protocol_version_id as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, ) .execute(self.storage.conn()) .await @@ -425,7 +435,7 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn get_next_leaf_aggregation_job( &mut self, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { let row = sqlx::query!( @@ -436,7 +446,7 @@ impl FriWitnessGeneratorDal<'_, '_> { attempts = attempts + 1, updated_at = NOW(), processing_started_at = NOW(), - picked_by = $2 + picked_by = $3 WHERE id = ( SELECT @@ -446,6 +456,7 @@ impl FriWitnessGeneratorDal<'_, '_> { WHERE status = 'queued' AND protocol_version = $1 + AND protocol_version_patch = $2 ORDER BY l1_batch_number ASC, id ASC @@ -457,7 +468,8 @@ impl FriWitnessGeneratorDal<'_, '_> { RETURNING leaf_aggregation_witness_jobs_fri.* "#, - protocol_version as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, picked_by, ) .fetch_optional(self.storage.conn()) @@ -611,7 +623,7 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn get_next_node_aggregation_job( &mut self, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { let row = sqlx::query!( @@ -622,7 +634,7 @@ impl FriWitnessGeneratorDal<'_, '_> { attempts = attempts + 1, updated_at = NOW(), processing_started_at = NOW(), - picked_by = $2 + picked_by = $3 WHERE id = ( SELECT @@ -632,6 +644,7 @@ impl FriWitnessGeneratorDal<'_, '_> { WHERE status = 'queued' AND protocol_version = $1 + AND protocol_version_patch = $2 ORDER BY l1_batch_number ASC, depth ASC, @@ -644,7 +657,8 @@ impl FriWitnessGeneratorDal<'_, '_> { RETURNING node_aggregation_witness_jobs_fri.* "#, - protocol_version as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, picked_by, ) .fetch_optional(self.storage.conn()) @@ -740,7 +754,7 @@ impl FriWitnessGeneratorDal<'_, '_> { number_of_dependent_jobs: Option, depth: u16, aggregations_url: &str, - protocol_version_id: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { sqlx::query!( r#" @@ -754,10 +768,11 @@ impl FriWitnessGeneratorDal<'_, '_> { protocol_version, status, created_at, - updated_at + updated_at, + protocol_version_patch ) VALUES - ($1, $2, $3, $4, $5, $6, 'waiting_for_proofs', NOW(), NOW()) + ($1, $2, $3, $4, $5, $6, 'waiting_for_proofs', NOW(), NOW(), $7) ON CONFLICT (l1_batch_number, circuit_id, depth) DO UPDATE SET @@ -768,7 +783,8 @@ impl FriWitnessGeneratorDal<'_, '_> { i32::from(depth), aggregations_url, number_of_dependent_jobs, - protocol_version_id as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, ) .fetch_optional(self.storage.conn()) .await @@ -1066,7 +1082,7 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn get_next_recursion_tip_witness_job( &mut self, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { sqlx::query!( @@ -1077,7 +1093,7 @@ impl FriWitnessGeneratorDal<'_, '_> { attempts = attempts + 1, updated_at = NOW(), processing_started_at = NOW(), - picked_by = $2 + picked_by = $3 WHERE l1_batch_number = ( SELECT @@ -1087,6 +1103,7 @@ impl FriWitnessGeneratorDal<'_, '_> { WHERE status = 'queued' AND protocol_version = $1 + AND protocol_version_patch = $2 ORDER BY l1_batch_number ASC LIMIT @@ -1097,7 +1114,8 @@ impl FriWitnessGeneratorDal<'_, '_> { RETURNING recursion_tip_witness_jobs_fri.l1_batch_number "#, - protocol_version as i32, + protocol_version.minor as i32, + protocol_version.patch.0 as i32, picked_by, ) .fetch_optional(self.storage.conn()) @@ -1170,7 +1188,7 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn get_next_scheduler_witness_job( &mut self, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, picked_by: &str, ) -> Option { sqlx::query!( @@ -1191,6 +1209,7 @@ impl FriWitnessGeneratorDal<'_, '_> { WHERE status = 'queued' AND protocol_version = $1 + AND protocol_version_patch = $3 ORDER BY l1_batch_number ASC LIMIT @@ -1201,8 +1220,9 @@ impl FriWitnessGeneratorDal<'_, '_> { RETURNING scheduler_witness_jobs_fri.* "#, - protocol_version as i32, + protocol_version.minor as i32, picked_by, + protocol_version.patch.0 as i32, ) .fetch_optional(self.storage.conn()) .await @@ -1353,7 +1373,7 @@ impl FriWitnessGeneratorDal<'_, '_> { FROM {} GROUP BY status "#, - table_name + table_name, ); let mut results: HashMap = sqlx::query(&sql) .fetch_all(self.storage.conn()) @@ -1384,11 +1404,12 @@ impl FriWitnessGeneratorDal<'_, '_> { pub async fn protocol_version_for_l1_batch( &mut self, l1_batch_number: L1BatchNumber, - ) -> ProtocolVersionId { - sqlx::query!( + ) -> ProtocolSemanticVersion { + let result = sqlx::query!( r#" SELECT - protocol_version + protocol_version, + protocol_version_patch FROM witness_inputs_fri WHERE @@ -1398,10 +1419,12 @@ impl FriWitnessGeneratorDal<'_, '_> { ) .fetch_one(self.storage.conn()) .await - .unwrap() - .protocol_version - .map(|id| ProtocolVersionId::try_from(id as u16).unwrap()) - .unwrap() + .unwrap(); + + ProtocolSemanticVersion::new( + ProtocolVersionId::try_from(result.protocol_version.unwrap() as u16).unwrap(), + VersionPatch(result.protocol_version_patch as u32), + ) } pub async fn get_basic_witness_generator_job_for_batch( diff --git a/prover/prover_fri/src/gpu_prover_job_processor.rs b/prover/prover_fri/src/gpu_prover_job_processor.rs index cdd3c060c347..09493627bca4 100644 --- a/prover/prover_fri/src/gpu_prover_job_processor.rs +++ b/prover/prover_fri/src/gpu_prover_job_processor.rs @@ -30,7 +30,8 @@ pub mod gpu_prover { }; use zksync_queued_job_processor::{async_trait, JobProcessor}; use zksync_types::{ - basic_fri_types::CircuitIdRoundTuple, prover_dal::SocketAddress, ProtocolVersionId, + basic_fri_types::CircuitIdRoundTuple, protocol_version::ProtocolSemanticVersion, + prover_dal::SocketAddress, }; use zksync_vk_setup_data_server_fri::{keystore::Keystore, GoldilocksGpuProverSetupData}; @@ -64,7 +65,7 @@ pub mod gpu_prover { prover_context: ProverContext, address: SocketAddress, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl Prover { @@ -79,7 +80,7 @@ pub mod gpu_prover { witness_vector_queue: SharedWitnessVectorQueue, address: SocketAddress, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Prover { blob_store, diff --git a/prover/prover_fri/src/main.rs b/prover/prover_fri/src/main.rs index c37c1c57fd32..4caceae13e9d 100644 --- a/prover/prover_fri/src/main.rs +++ b/prover/prover_fri/src/main.rs @@ -22,8 +22,8 @@ use zksync_prover_fri_utils::{get_all_circuit_id_round_tuples_for, region_fetche use zksync_queued_job_processor::JobProcessor; use zksync_types::{ basic_fri_types::CircuitIdRoundTuple, + protocol_version::ProtocolSemanticVersion, prover_dal::{GpuProverInstanceStatus, SocketAddress}, - ProtocolVersionId, }; use zksync_utils::wait_for_tasks::ManagedTasks; @@ -195,7 +195,7 @@ async fn get_prover_tasks( ) -> anyhow::Result>>> { use crate::prover_job_processor::{load_setup_data_cache, Prover}; - let protocol_version = ProtocolVersionId::current_prover_version(); + let protocol_version = ProtocolSemanticVersion::current_prover_version(); tracing::info!( "Starting CPU FRI proof generation for with protocol_version: {:?}", @@ -247,7 +247,7 @@ async fn get_prover_tasks( port: prover_config.witness_vector_receiver_port, }; - let protocol_version = ProtocolVersionId::current_prover_version(); + let protocol_version = ProtocolSemanticVersion::current_prover_version(); let prover = gpu_prover::Prover::new( store_factory.create_store().await, diff --git a/prover/prover_fri/src/prover_job_processor.rs b/prover/prover_fri/src/prover_job_processor.rs index 7805d27f55bb..8cdfc91247fa 100644 --- a/prover/prover_fri/src/prover_job_processor.rs +++ b/prover/prover_fri/src/prover_job_processor.rs @@ -21,7 +21,9 @@ use zksync_prover_fri_types::{ }; use zksync_prover_fri_utils::fetch_next_circuit; use zksync_queued_job_processor::{async_trait, JobProcessor}; -use zksync_types::{basic_fri_types::CircuitIdRoundTuple, ProtocolVersionId}; +use zksync_types::{ + basic_fri_types::CircuitIdRoundTuple, protocol_version::ProtocolSemanticVersion, +}; use zksync_vk_setup_data_server_fri::{keystore::Keystore, GoldilocksProverSetupData}; use crate::{ @@ -46,7 +48,7 @@ pub struct Prover { // Only pick jobs for the configured circuit id and aggregation rounds. // Empty means all jobs are picked. circuit_ids_for_round_to_be_proven: Vec, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl Prover { @@ -58,7 +60,7 @@ impl Prover { prover_connection_pool: ConnectionPool, setup_load_mode: SetupLoadMode, circuit_ids_for_round_to_be_proven: Vec, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Prover { blob_store, diff --git a/prover/prover_fri/src/socket_listener.rs b/prover/prover_fri/src/socket_listener.rs index 44e8236308a3..e034b1fd9276 100644 --- a/prover/prover_fri/src/socket_listener.rs +++ b/prover/prover_fri/src/socket_listener.rs @@ -12,8 +12,8 @@ pub mod gpu_socket_listener { use zksync_object_store::bincode; use zksync_prover_fri_types::WitnessVectorArtifacts; use zksync_types::{ + protocol_version::ProtocolSemanticVersion, prover_dal::{GpuProverInstanceStatus, SocketAddress}, - ProtocolVersionId, }; use crate::{ @@ -27,7 +27,7 @@ pub mod gpu_socket_listener { pool: ConnectionPool, specialized_prover_group_id: u8, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl SocketListener { @@ -37,7 +37,7 @@ pub mod gpu_socket_listener { pool: ConnectionPool, specialized_prover_group_id: u8, zone: String, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { address, diff --git a/prover/prover_fri/src/utils.rs b/prover/prover_fri/src/utils.rs index 503f22da6d96..e52b66ed983f 100644 --- a/prover/prover_fri/src/utils.rs +++ b/prover/prover_fri/src/utils.rs @@ -24,7 +24,8 @@ use zksync_prover_fri_types::{ }; use zksync_types::{ basic_fri_types::{AggregationRound, CircuitIdRoundTuple}, - L1BatchNumber, ProtocolVersionId, + protocol_version::ProtocolSemanticVersion, + L1BatchNumber, }; use crate::metrics::METRICS; @@ -64,7 +65,7 @@ pub async fn save_proof( public_blob_store: Option<&dyn ObjectStore>, shall_save_to_public_bucket: bool, connection: &mut Connection<'_, Prover>, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) { tracing::info!( "Successfully proven job: {}, total time taken: {:?}", diff --git a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs index 0fbd66fc9786..3973ff0eea1d 100644 --- a/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs +++ b/prover/prover_fri_gateway/src/proof_gen_data_fetcher.rs @@ -14,7 +14,19 @@ impl PeriodicApiStruct { .await .expect("Failed to save proof generation data to GCS"); let mut connection = self.pool.connection().await.unwrap(); - todo!() // Will be fixed in prover PR. + connection + .fri_protocol_versions_dal() + .save_prover_protocol_version(data.protocol_version, data.l1_verifier_config) + .await; + connection + .fri_witness_generator_dal() + .save_witness_inputs( + data.l1_batch_number, + &blob_url, + data.protocol_version, + data.eip_4844_blobs, + ) + .await; } } diff --git a/prover/prover_fri_gateway/src/proof_submitter.rs b/prover/prover_fri_gateway/src/proof_submitter.rs index 025d79e2f8c3..6ed7b6d5c1db 100644 --- a/prover/prover_fri_gateway/src/proof_submitter.rs +++ b/prover/prover_fri_gateway/src/proof_submitter.rs @@ -7,20 +7,20 @@ use crate::api_data_fetcher::{PeriodicApi, PeriodicApiStruct}; impl PeriodicApiStruct { async fn next_submit_proof_request(&self) -> Option<(L1BatchNumber, SubmitProofRequest)> { - let (l1_batch_number, status) = self + let (l1_batch_number, protocol_version, status) = self .pool .connection() .await .unwrap() .fri_proof_compressor_dal() - .get_least_proven_block_number_not_sent_to_server() + .get_least_proven_block_not_sent_to_server() .await?; let request = match status { ProofCompressionJobStatus::Successful => { let proof = self .blob_store - .get(l1_batch_number) + .get((l1_batch_number, protocol_version)) .await .expect("Failed to get compressed snark proof from blob store"); SubmitProofRequest::Proof(Box::new(proof)) diff --git a/prover/prover_fri_utils/src/lib.rs b/prover/prover_fri_utils/src/lib.rs index 39955fb55973..1a1bfe8bb42d 100644 --- a/prover/prover_fri_utils/src/lib.rs +++ b/prover/prover_fri_utils/src/lib.rs @@ -15,7 +15,7 @@ use zksync_prover_fri_types::{ }; use zksync_types::{ basic_fri_types::{AggregationRound, CircuitIdRoundTuple}, - ProtocolVersionId, + protocol_version::ProtocolSemanticVersion, }; use crate::metrics::{CircuitLabels, PROVER_FRI_UTILS_METRICS}; @@ -28,7 +28,7 @@ pub async fn fetch_next_circuit( storage: &mut Connection<'_, Prover>, blob_store: &dyn ObjectStore, circuit_ids_for_round_to_be_proven: &[CircuitIdRoundTuple], - protocol_version: &ProtocolVersionId, + protocol_version: &ProtocolSemanticVersion, ) -> Option { let pod_name = get_current_pod_name(); let prover_job = match &circuit_ids_for_round_to_be_proven.is_empty() { @@ -38,7 +38,7 @@ pub async fn fetch_next_circuit( .fri_prover_jobs_dal() .get_next_job_for_circuit_id_round( circuit_ids_for_round_to_be_proven, - protocol_version, + *protocol_version, &pod_name, ) .await @@ -47,7 +47,7 @@ pub async fn fetch_next_circuit( // Generalized prover: proving all circuits. storage .fri_prover_jobs_dal() - .get_next_job(protocol_version, &pod_name) + .get_next_job(*protocol_version, &pod_name) .await } }?; diff --git a/prover/witness_generator/src/basic_circuits.rs b/prover/witness_generator/src/basic_circuits.rs index 62c3d913ba21..3c6f8a789965 100644 --- a/prover/witness_generator/src/basic_circuits.rs +++ b/prover/witness_generator/src/basic_circuits.rs @@ -42,8 +42,8 @@ use zksync_state::{PostgresStorage, StorageView}; use zksync_types::{ basic_fri_types::{AggregationRound, Eip4844Blobs}, block::StorageOracleInfo, - protocol_version::ProtocolVersionId, - Address, L1BatchNumber, BOOTLOADER_ADDRESS, H256, + protocol_version::ProtocolSemanticVersion, + Address, L1BatchNumber, ProtocolVersionId, BOOTLOADER_ADDRESS, H256, }; use zksync_utils::{bytes_to_chunks, h256_to_u256, u256_to_h256}; @@ -89,7 +89,7 @@ pub struct BasicWitnessGenerator { public_blob_store: Option>, connection_pool: ConnectionPool, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl BasicWitnessGenerator { @@ -99,7 +99,7 @@ impl BasicWitnessGenerator { public_blob_store: Option>, connection_pool: ConnectionPool, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { config: Arc::new(config), diff --git a/prover/witness_generator/src/leaf_aggregation.rs b/prover/witness_generator/src/leaf_aggregation.rs index 181408c2e114..bf079dbb4ae2 100644 --- a/prover/witness_generator/src/leaf_aggregation.rs +++ b/prover/witness_generator/src/leaf_aggregation.rs @@ -31,7 +31,7 @@ use zksync_prover_fri_types::{ use zksync_prover_fri_utils::get_recursive_layer_circuit_id_for_base_layer; use zksync_queued_job_processor::JobProcessor; use zksync_types::{ - basic_fri_types::AggregationRound, protocol_version::ProtocolVersionId, + basic_fri_types::AggregationRound, protocol_version::ProtocolSemanticVersion, prover_dal::LeafAggregationJobMetadata, L1BatchNumber, }; use zksync_vk_setup_data_server_fri::keystore::Keystore; @@ -76,7 +76,7 @@ pub struct LeafAggregationWitnessGenerator { config: FriWitnessGeneratorConfig, object_store: Arc, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl LeafAggregationWitnessGenerator { @@ -84,7 +84,7 @@ impl LeafAggregationWitnessGenerator { config: FriWitnessGeneratorConfig, store_factory: &ObjectStoreFactory, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { config, diff --git a/prover/witness_generator/src/main.rs b/prover/witness_generator/src/main.rs index 622ade582c79..e176347acafe 100644 --- a/prover/witness_generator/src/main.rs +++ b/prover/witness_generator/src/main.rs @@ -18,7 +18,7 @@ use zksync_config::{ use zksync_env_config::{object_store::ProverObjectStoreConfig, FromEnv}; use zksync_object_store::ObjectStoreFactory; use zksync_queued_job_processor::JobProcessor; -use zksync_types::{basic_fri_types::AggregationRound, ProtocolVersionId}; +use zksync_types::basic_fri_types::AggregationRound; use zksync_utils::wait_for_tasks::ManagedTasks; use zksync_vk_setup_data_server_fri::commitment_utils::get_cached_commitments; @@ -41,6 +41,7 @@ mod utils; #[cfg(not(target_env = "msvc"))] use jemallocator::Jemalloc; use zksync_dal::Core; +use zksync_types::protocol_version::ProtocolSemanticVersion; #[cfg(not(target_env = "msvc"))] #[global_allocator] @@ -125,7 +126,7 @@ async fn main() -> anyhow::Result<()> { .context("failed to build a prover_connection_pool")?; let (stop_sender, stop_receiver) = watch::channel(false); - let protocol_version = ProtocolVersionId::current_prover_version(); + let protocol_version = ProtocolSemanticVersion::current_prover_version(); let vk_commitments_in_db = match prover_connection_pool .connection() .await diff --git a/prover/witness_generator/src/node_aggregation.rs b/prover/witness_generator/src/node_aggregation.rs index 95255f79ece6..f352f9fd9d2a 100644 --- a/prover/witness_generator/src/node_aggregation.rs +++ b/prover/witness_generator/src/node_aggregation.rs @@ -25,7 +25,7 @@ use zksync_prover_fri_types::{ }; use zksync_queued_job_processor::JobProcessor; use zksync_types::{ - basic_fri_types::AggregationRound, protocol_version::ProtocolVersionId, + basic_fri_types::AggregationRound, protocol_version::ProtocolSemanticVersion, prover_dal::NodeAggregationJobMetadata, L1BatchNumber, }; use zksync_vk_setup_data_server_fri::{keystore::Keystore, utils::get_leaf_vk_params}; @@ -76,7 +76,7 @@ pub struct NodeAggregationWitnessGenerator { config: FriWitnessGeneratorConfig, object_store: Arc, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl NodeAggregationWitnessGenerator { @@ -84,7 +84,7 @@ impl NodeAggregationWitnessGenerator { config: FriWitnessGeneratorConfig, store_factory: &ObjectStoreFactory, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { config, diff --git a/prover/witness_generator/src/recursion_tip.rs b/prover/witness_generator/src/recursion_tip.rs index f4681c6e3661..626b1a8ed09c 100644 --- a/prover/witness_generator/src/recursion_tip.rs +++ b/prover/witness_generator/src/recursion_tip.rs @@ -45,7 +45,9 @@ use zksync_prover_fri_types::{ CircuitWrapper, }; use zksync_queued_job_processor::JobProcessor; -use zksync_types::{basic_fri_types::AggregationRound, L1BatchNumber, ProtocolVersionId}; +use zksync_types::{ + basic_fri_types::AggregationRound, protocol_version::ProtocolSemanticVersion, L1BatchNumber, +}; use zksync_vk_setup_data_server_fri::{keystore::Keystore, utils::get_leaf_vk_params}; use crate::{ @@ -73,7 +75,7 @@ pub struct RecursionTipWitnessGenerator { config: FriWitnessGeneratorConfig, object_store: Arc, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl RecursionTipWitnessGenerator { @@ -81,7 +83,7 @@ impl RecursionTipWitnessGenerator { config: FriWitnessGeneratorConfig, store_factory: &ObjectStoreFactory, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { config, diff --git a/prover/witness_generator/src/scheduler.rs b/prover/witness_generator/src/scheduler.rs index 946c8cabaca5..832058e92670 100644 --- a/prover/witness_generator/src/scheduler.rs +++ b/prover/witness_generator/src/scheduler.rs @@ -28,7 +28,7 @@ use zksync_prover_fri_types::{ }; use zksync_queued_job_processor::JobProcessor; use zksync_types::{ - basic_fri_types::AggregationRound, protocol_version::ProtocolVersionId, L1BatchNumber, + basic_fri_types::AggregationRound, protocol_version::ProtocolSemanticVersion, L1BatchNumber, }; use zksync_vk_setup_data_server_fri::{keystore::Keystore, utils::get_leaf_vk_params}; @@ -57,7 +57,7 @@ pub struct SchedulerWitnessGenerator { config: FriWitnessGeneratorConfig, object_store: Arc, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, } impl SchedulerWitnessGenerator { @@ -65,7 +65,7 @@ impl SchedulerWitnessGenerator { config: FriWitnessGeneratorConfig, store_factory: &ObjectStoreFactory, prover_connection_pool: ConnectionPool, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, ) -> Self { Self { config, diff --git a/prover/witness_vector_generator/src/generator.rs b/prover/witness_vector_generator/src/generator.rs index 60d0df587940..baae215e8866 100644 --- a/prover/witness_vector_generator/src/generator.rs +++ b/prover/witness_vector_generator/src/generator.rs @@ -19,7 +19,8 @@ use zksync_prover_fri_utils::{ }; use zksync_queued_job_processor::JobProcessor; use zksync_types::{ - basic_fri_types::CircuitIdRoundTuple, prover_dal::GpuProverInstanceStatus, ProtocolVersionId, + basic_fri_types::CircuitIdRoundTuple, protocol_version::ProtocolSemanticVersion, + prover_dal::GpuProverInstanceStatus, }; use zksync_vk_setup_data_server_fri::keystore::Keystore; @@ -31,7 +32,7 @@ pub struct WitnessVectorGenerator { circuit_ids_for_round_to_be_proven: Vec, zone: String, config: FriWitnessVectorGeneratorConfig, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, max_attempts: u32, } @@ -42,7 +43,7 @@ impl WitnessVectorGenerator { circuit_ids_for_round_to_be_proven: Vec, zone: String, config: FriWitnessVectorGeneratorConfig, - protocol_version: ProtocolVersionId, + protocol_version: ProtocolSemanticVersion, max_attempts: u32, ) -> Self { Self { diff --git a/prover/witness_vector_generator/src/main.rs b/prover/witness_vector_generator/src/main.rs index f318781233da..843ae02530d2 100644 --- a/prover/witness_vector_generator/src/main.rs +++ b/prover/witness_vector_generator/src/main.rs @@ -15,7 +15,7 @@ use zksync_env_config::{object_store::ProverObjectStoreConfig, FromEnv}; use zksync_object_store::ObjectStoreFactory; use zksync_prover_fri_utils::{get_all_circuit_id_round_tuples_for, region_fetcher::get_zone}; use zksync_queued_job_processor::JobProcessor; -use zksync_types::ProtocolVersionId; +use zksync_types::protocol_version::ProtocolSemanticVersion; use zksync_utils::wait_for_tasks::ManagedTasks; use crate::generator::WitnessVectorGenerator; @@ -87,7 +87,7 @@ async fn main() -> anyhow::Result<()> { let zone_url = &fri_prover_config.zone_read_url; let zone = get_zone(zone_url).await.context("get_zone()")?; - let protocol_version = ProtocolVersionId::current_prover_version(); + let protocol_version = ProtocolSemanticVersion::current_prover_version(); let witness_vector_generator = WitnessVectorGenerator::new( blob_store, From 1d4756c29548fed5f5850bae25acf3e7f72a51f8 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 29 May 2024 15:45:24 +0300 Subject: [PATCH 17/19] Update contracts --- contracts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts b/contracts index 5f074a8ed43a..8cc766e6f949 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit 5f074a8ed43a2991113c8b4672a5bd7a374d33ef +Subproject commit 8cc766e6f94906907c331acab012bb24dbb06614 From 49f79783c05f843b0aa638b22f9cce50bd5a5eed Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 29 May 2024 16:24:44 +0300 Subject: [PATCH 18/19] Add comment --- core/node/eth_sender/src/aggregator.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/node/eth_sender/src/aggregator.rs b/core/node/eth_sender/src/aggregator.rs index eb0f3d875197..966c9d1f1907 100644 --- a/core/node/eth_sender/src/aggregator.rs +++ b/core/node/eth_sender/src/aggregator.rs @@ -326,6 +326,10 @@ impl Aggregator { .await .unwrap() .unwrap(); + + // `l1_verifier_config.recursion_scheduler_level_vk_hash` is a VK hash that L1 uses. + // We may have multiple versions with different verification keys, so we check only for proofs that use + // keys that correspond to one on L1. let allowed_patch_versions = storage .protocol_versions_dal() .get_patch_versions_for_vk( From 93d3f7b549a3f6c93c4f7098182e00da2baa5885 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Thu, 30 May 2024 11:48:39 +0300 Subject: [PATCH 19/19] fmt --- ...87def3a97275b66ad33d214054dc9048ddf584.json | 18 ++++++++++++++++++ ...61d048cc0c3e8f549690469d53249925e53e90.json | 18 ------------------ ...6997fcfbc7ad688f2eee3dfab1029344d2382.json} | 4 ++-- ...d6a8a6de1e3a56e2a95963d933c21485c9939.json} | 4 ++-- .../prover_dal/src/fri_proof_compressor_dal.rs | 10 +++++++++- .../src/fri_protocol_versions_dal.rs | 3 +-- prover/prover_dal/src/fri_prover_dal.rs | 10 +++++++--- 7 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 prover/prover_dal/.sqlx/query-29ff260b02f7b955f9fe0b657b87def3a97275b66ad33d214054dc9048ddf584.json delete mode 100644 prover/prover_dal/.sqlx/query-9269eb45936418a37a92ab124161d048cc0c3e8f549690469d53249925e53e90.json rename prover/prover_dal/.sqlx/{query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json => query-c173743af526d8150b6091ea52e6997fcfbc7ad688f2eee3dfab1029344d2382.json} (85%) rename prover/prover_dal/.sqlx/{query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json => query-e78e94239dc10c5560f239a71e4d6a8a6de1e3a56e2a95963d933c21485c9939.json} (57%) diff --git a/prover/prover_dal/.sqlx/query-29ff260b02f7b955f9fe0b657b87def3a97275b66ad33d214054dc9048ddf584.json b/prover/prover_dal/.sqlx/query-29ff260b02f7b955f9fe0b657b87def3a97275b66ad33d214054dc9048ddf584.json new file mode 100644 index 000000000000..85e66ed78248 --- /dev/null +++ b/prover/prover_dal/.sqlx/query-29ff260b02f7b955f9fe0b657b87def3a97275b66ad33d214054dc9048ddf584.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO\n proof_compression_jobs_fri (\n l1_batch_number,\n fri_proof_blob_url,\n status,\n created_at,\n updated_at,\n protocol_version,\n protocol_version_patch\n )\n VALUES\n ($1, $2, $3, NOW(), NOW(), $4, $5)\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Text", + "Text", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "29ff260b02f7b955f9fe0b657b87def3a97275b66ad33d214054dc9048ddf584" +} diff --git a/prover/prover_dal/.sqlx/query-9269eb45936418a37a92ab124161d048cc0c3e8f549690469d53249925e53e90.json b/prover/prover_dal/.sqlx/query-9269eb45936418a37a92ab124161d048cc0c3e8f549690469d53249925e53e90.json deleted file mode 100644 index 425904df82f8..000000000000 --- a/prover/prover_dal/.sqlx/query-9269eb45936418a37a92ab124161d048cc0c3e8f549690469d53249925e53e90.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO\n proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version, protocol_version_patch)\n VALUES\n ($1, $2, $3, NOW(), NOW(), $4, $5)\n ON CONFLICT (l1_batch_number) DO NOTHING\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Text", - "Text", - "Int4", - "Int4" - ] - }, - "nullable": [] - }, - "hash": "9269eb45936418a37a92ab124161d048cc0c3e8f549690469d53249925e53e90" -} diff --git a/prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json b/prover/prover_dal/.sqlx/query-c173743af526d8150b6091ea52e6997fcfbc7ad688f2eee3dfab1029344d2382.json similarity index 85% rename from prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json rename to prover/prover_dal/.sqlx/query-c173743af526d8150b6091ea52e6997fcfbc7ad688f2eee3dfab1029344d2382.json index 656e712f4ce5..4f0e7a0062c0 100644 --- a/prover/prover_dal/.sqlx/query-25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b.json +++ b/prover/prover_dal/.sqlx/query-c173743af526d8150b6091ea52e6997fcfbc7ad688f2eee3dfab1029344d2382.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n prover_fri_protocol_versions\n WHERE\n id = $1\n AND\n protocol_version_patch = $2\n ", + "query": "\n SELECT\n recursion_scheduler_level_vk_hash,\n recursion_node_level_vk_hash,\n recursion_leaf_level_vk_hash,\n recursion_circuits_set_vks_hash\n FROM\n prover_fri_protocol_versions\n WHERE\n id = $1\n AND protocol_version_patch = $2\n ", "describe": { "columns": [ { @@ -37,5 +37,5 @@ false ] }, - "hash": "25b9128db8000198885d01d9b73edd20cd075409082f177bf4278f786e8f869b" + "hash": "c173743af526d8150b6091ea52e6997fcfbc7ad688f2eee3dfab1029344d2382" } diff --git a/prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json b/prover/prover_dal/.sqlx/query-e78e94239dc10c5560f239a71e4d6a8a6de1e3a56e2a95963d933c21485c9939.json similarity index 57% rename from prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json rename to prover/prover_dal/.sqlx/query-e78e94239dc10c5560f239a71e4d6a8a6de1e3a56e2a95963d933c21485c9939.json index 942b12c25717..35cec4af0682 100644 --- a/prover/prover_dal/.sqlx/query-d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b.json +++ b/prover/prover_dal/.sqlx/query-e78e94239dc10c5560f239a71e4d6a8a6de1e3a56e2a95963d933c21485c9939.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT protocol_version, protocol_version_patch\n FROM prover_jobs_fri\n WHERE id = $1\n ", + "query": "\n SELECT\n protocol_version,\n protocol_version_patch\n FROM\n prover_jobs_fri\n WHERE\n id = $1\n ", "describe": { "columns": [ { @@ -24,5 +24,5 @@ false ] }, - "hash": "d78d52337729925e9dc78975255d8b17597ca636f98f5155b76c9bc7539feb9b" + "hash": "e78e94239dc10c5560f239a71e4d6a8a6de1e3a56e2a95963d933c21485c9939" } diff --git a/prover/prover_dal/src/fri_proof_compressor_dal.rs b/prover/prover_dal/src/fri_proof_compressor_dal.rs index bd7e40521c7d..793a15a19dc9 100644 --- a/prover/prover_dal/src/fri_proof_compressor_dal.rs +++ b/prover/prover_dal/src/fri_proof_compressor_dal.rs @@ -27,7 +27,15 @@ impl FriProofCompressorDal<'_, '_> { sqlx::query!( r#" INSERT INTO - proof_compression_jobs_fri (l1_batch_number, fri_proof_blob_url, status, created_at, updated_at, protocol_version, protocol_version_patch) + proof_compression_jobs_fri ( + l1_batch_number, + fri_proof_blob_url, + status, + created_at, + updated_at, + protocol_version, + protocol_version_patch + ) VALUES ($1, $2, $3, NOW(), NOW(), $4, $5) ON CONFLICT (l1_batch_number) DO NOTHING diff --git a/prover/prover_dal/src/fri_protocol_versions_dal.rs b/prover/prover_dal/src/fri_protocol_versions_dal.rs index 07c34a0e53e7..cd963a23531e 100644 --- a/prover/prover_dal/src/fri_protocol_versions_dal.rs +++ b/prover/prover_dal/src/fri_protocol_versions_dal.rs @@ -71,8 +71,7 @@ impl FriProtocolVersionsDal<'_, '_> { prover_fri_protocol_versions WHERE id = $1 - AND - protocol_version_patch = $2 + AND protocol_version_patch = $2 "#, protocol_version.minor as i32, protocol_version.patch.0 as i32 diff --git a/prover/prover_dal/src/fri_prover_dal.rs b/prover/prover_dal/src/fri_prover_dal.rs index c8c414c6c394..f1f7f40b333e 100644 --- a/prover/prover_dal/src/fri_prover_dal.rs +++ b/prover/prover_dal/src/fri_prover_dal.rs @@ -695,9 +695,13 @@ impl FriProverDal<'_, '_> { pub async fn protocol_version_for_job(&mut self, job_id: u32) -> ProtocolSemanticVersion { let result = sqlx::query!( r#" - SELECT protocol_version, protocol_version_patch - FROM prover_jobs_fri - WHERE id = $1 + SELECT + protocol_version, + protocol_version_patch + FROM + prover_jobs_fri + WHERE + id = $1 "#, job_id as i32 )