From b9de02f082624ad8ca1ac1761cbd0e36fc06312f Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Thu, 4 Apr 2024 18:11:20 +0200 Subject: [PATCH 1/5] feat(block-reverter): only require private key for sending revert transactions --- core/bin/block_reverter/src/main.rs | 20 ++++++++--- .../lib/zksync_core/src/block_reverter/mod.rs | 35 +++++++++++-------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/core/bin/block_reverter/src/main.rs b/core/bin/block_reverter/src/main.rs index 75ea089e72f..61b83f8e171 100644 --- a/core/bin/block_reverter/src/main.rs +++ b/core/bin/block_reverter/src/main.rs @@ -9,7 +9,7 @@ use zksync_core::block_reverter::{ }; use zksync_dal::{ConnectionPool, Core}; use zksync_env_config::FromEnv; -use zksync_types::{L1BatchNumber, U256}; +use zksync_types::{Address, L1BatchNumber, U256}; #[derive(Debug, Parser)] #[command(author = "Matter Labs", version, about = "Block revert utility", long_about = None)] @@ -26,6 +26,9 @@ enum Command { /// Displays the values as a JSON object, so that they are machine-readable. #[arg(long)] json: bool, + /// Operator address. + #[arg(long = "operator-address")] + operator_address: Address, }, /// Sends revert transaction to L1. #[command(name = "send-eth-transaction")] @@ -96,7 +99,16 @@ async fn main() -> anyhow::Result<()> { ); let contracts = ContractsConfig::from_env().context("ContractsConfig::from_env()")?; let postgres_config = PostgresConfig::from_env().context("PostgresConfig::from_env()")?; - let config = BlockReverterEthConfig::new(eth_sender, contracts); + let command = Cli::parse().command; + let operator_address = if let Command::Display { + operator_address, .. + } = &command + { + Some(operator_address) + } else { + None + }; + let config = BlockReverterEthConfig::new(eth_sender, contracts, operator_address.copied()); let connection_pool = ConnectionPool::::builder( postgres_config.master_url()?, @@ -114,8 +126,8 @@ async fn main() -> anyhow::Result<()> { L1ExecutedBatchesRevert::Disallowed, ); - match Cli::parse().command { - Command::Display { json } => { + match command { + Command::Display { json, .. } => { let suggested_values = block_reverter.suggested_values().await; if json { println!("{}", serde_json::to_string(&suggested_values).unwrap()); diff --git a/core/lib/zksync_core/src/block_reverter/mod.rs b/core/lib/zksync_core/src/block_reverter/mod.rs index 4738e28b153..6ce1d104895 100644 --- a/core/lib/zksync_core/src/block_reverter/mod.rs +++ b/core/lib/zksync_core/src/block_reverter/mod.rs @@ -19,7 +19,7 @@ use zksync_types::{ types::{BlockId, BlockNumber}, Web3, }, - L1BatchNumber, PackedEthSignature, H160, H256, U256, + Address, L1BatchNumber, H160, H256, U256, }; bitflags! { @@ -45,29 +45,27 @@ pub enum L1ExecutedBatchesRevert { #[derive(Debug)] pub struct BlockReverterEthConfig { eth_client_url: String, - reverter_private_key: H256, - reverter_address: H160, + reverter_private_key: Option, + reverter_address: Option
, diamond_proxy_addr: H160, validator_timelock_addr: H160, default_priority_fee_per_gas: u64, } impl BlockReverterEthConfig { - pub fn new(eth_config: ETHConfig, contract: ContractsConfig) -> Self { + pub fn new( + eth_config: ETHConfig, + contract: ContractsConfig, + reverter_address: Option
, + ) -> Self { #[allow(deprecated)] // `BlockReverter` doesn't support non env configs yet - let pk = eth_config - .sender - .expect("eth_sender_config") - .private_key() - .expect("Private key is required for block reversion"); - let operator_address = PackedEthSignature::address_from_private_key(&pk) - .expect("Failed to get address from private key"); + let pk = eth_config.sender.expect("eth_sender_config").private_key(); Self { eth_client_url: eth_config.web3_url, reverter_private_key: pk, - reverter_address: operator_address, + reverter_address, diamond_proxy_addr: contract.diamond_proxy_addr, validator_timelock_addr: contract.validator_timelock_addr, default_priority_fee_per_gas: eth_config @@ -339,7 +337,11 @@ impl BlockReverter { let web3 = Web3::new(Http::new(ð_config.eth_client_url).unwrap()); let contract = zksync_contract(); - let signer = PrivateKeySigner::new(eth_config.reverter_private_key); + let signer = PrivateKeySigner::new( + eth_config + .reverter_private_key + .expect("Private key is required to send revert transaction"), + ); let chain_id = web3.eth().chain_id().await.unwrap().as_u64(); let revert_function = contract @@ -453,7 +455,12 @@ impl BlockReverter { let web3 = Web3::new(Http::new(ð_config.eth_client_url).unwrap()); let nonce = web3 .eth() - .transaction_count(eth_config.reverter_address, Some(BlockNumber::Pending)) + .transaction_count( + eth_config + .reverter_address + .expect("Need to provide operator address to suggest revertion values"), + Some(BlockNumber::Pending), + ) .await .unwrap() .as_u64(); From 4815e08a8947442a7308053d8763e1712cf34604 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Thu, 4 Apr 2024 18:12:52 +0200 Subject: [PATCH 2/5] first parse cmdline arguments --- core/bin/block_reverter/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/bin/block_reverter/src/main.rs b/core/bin/block_reverter/src/main.rs index 61b83f8e171..c9d0bb756b2 100644 --- a/core/bin/block_reverter/src/main.rs +++ b/core/bin/block_reverter/src/main.rs @@ -73,6 +73,7 @@ enum Command { #[tokio::main] async fn main() -> anyhow::Result<()> { + let command = Cli::parse().command; let observability_config = ObservabilityConfig::from_env().context("ObservabilityConfig::from_env()")?; let log_format: vlog::LogFormat = observability_config @@ -99,7 +100,6 @@ async fn main() -> anyhow::Result<()> { ); let contracts = ContractsConfig::from_env().context("ContractsConfig::from_env()")?; let postgres_config = PostgresConfig::from_env().context("PostgresConfig::from_env()")?; - let command = Cli::parse().command; let operator_address = if let Command::Display { operator_address, .. } = &command From f38c5e546d63bd2789db0a8e0905f1f1c9f3d51f Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Fri, 5 Apr 2024 09:50:38 +0200 Subject: [PATCH 3/5] fix tests --- core/tests/revert-test/tests/revert-and-restart-en.test.ts | 7 ++++++- core/tests/revert-test/tests/revert-and-restart.test.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/tests/revert-test/tests/revert-and-restart-en.test.ts b/core/tests/revert-test/tests/revert-and-restart-en.test.ts index d478116b91f..1fdda86739c 100644 --- a/core/tests/revert-test/tests/revert-and-restart-en.test.ts +++ b/core/tests/revert-test/tests/revert-and-restart-en.test.ts @@ -283,7 +283,12 @@ describe('Block reverting test', function () { await mainNode.terminate(); console.log('Ask block_reverter to suggest to which L1 batch we should revert'); - const values_json = runBlockReverter(['print-suggested-values', '--json']); + const values_json = runBlockReverter([ + 'print-suggested-values', + '--json', + '--operator-address', + '0xde03a0B5963f75f1C8485B355fF6D30f3093BDE7' + ]); console.log(`values = ${values_json}`); const values = parseSuggestedValues(values_json); assert(lastExecuted.eq(values.lastExecutedL1BatchNumber)); diff --git a/core/tests/revert-test/tests/revert-and-restart.test.ts b/core/tests/revert-test/tests/revert-and-restart.test.ts index 6b7c399da22..7f4477e46fb 100644 --- a/core/tests/revert-test/tests/revert-and-restart.test.ts +++ b/core/tests/revert-test/tests/revert-and-restart.test.ts @@ -150,7 +150,7 @@ describe('Block reverting test', function () { step('revert blocks', async () => { const executedProcess = await utils.exec( 'cd $ZKSYNC_HOME && ' + - 'RUST_LOG=off cargo run --bin block_reverter --release -- print-suggested-values --json' + 'RUST_LOG=off cargo run --bin block_reverter --release -- print-suggested-values --json --operator-address 0xde03a0B5963f75f1C8485B355fF6D30f3093BDE7' // ^ Switch off logs to not pollute the output JSON ); const suggestedValuesOutput = executedProcess.stdout; From 6a2cd5107a551208986f4fef6b1c40927ac4fc3f Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 9 Apr 2024 10:03:58 +0200 Subject: [PATCH 4/5] take operator addr from config --- core/tests/revert-test/tests/revert-and-restart.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/tests/revert-test/tests/revert-and-restart.test.ts b/core/tests/revert-test/tests/revert-and-restart.test.ts index 7e82bc40519..c8a153ef984 100644 --- a/core/tests/revert-test/tests/revert-and-restart.test.ts +++ b/core/tests/revert-test/tests/revert-and-restart.test.ts @@ -59,6 +59,7 @@ describe('Block reverting test', function () { let mainContract: Contract; let blocksCommittedBeforeRevert: number; let logs: fs.WriteStream; + let operator_address = process.env.ETH_SENDER_SENDER_OPERATOR_COMMIT_ETH_ADDR; let enable_consensus = process.env.ENABLE_CONSENSUS == 'true'; let components = 'api,tree,eth,state_keeper,commitment_generator'; @@ -150,7 +151,7 @@ describe('Block reverting test', function () { step('revert blocks', async () => { const executedProcess = await utils.exec( 'cd $ZKSYNC_HOME && ' + - 'RUST_LOG=off cargo run --bin block_reverter --release -- print-suggested-values --json --operator-address 0xde03a0B5963f75f1C8485B355fF6D30f3093BDE7' + `RUST_LOG=off cargo run --bin block_reverter --release -- print-suggested-values --json --operator-address ${operatorAddress}` // ^ Switch off logs to not pollute the output JSON ); const suggestedValuesOutput = executedProcess.stdout; From 6f6f378aa11c3dbd3b8806b15d78d19d0abad003 Mon Sep 17 00:00:00 2001 From: Fedor Sakharov Date: Tue, 9 Apr 2024 10:57:55 +0200 Subject: [PATCH 5/5] fix variable name --- core/tests/revert-test/tests/revert-and-restart.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/tests/revert-test/tests/revert-and-restart.test.ts b/core/tests/revert-test/tests/revert-and-restart.test.ts index c8a153ef984..4ee724bf6f0 100644 --- a/core/tests/revert-test/tests/revert-and-restart.test.ts +++ b/core/tests/revert-test/tests/revert-and-restart.test.ts @@ -59,7 +59,7 @@ describe('Block reverting test', function () { let mainContract: Contract; let blocksCommittedBeforeRevert: number; let logs: fs.WriteStream; - let operator_address = process.env.ETH_SENDER_SENDER_OPERATOR_COMMIT_ETH_ADDR; + let operatorAddress = process.env.ETH_SENDER_SENDER_OPERATOR_COMMIT_ETH_ADDR; let enable_consensus = process.env.ENABLE_CONSENSUS == 'true'; let components = 'api,tree,eth,state_keeper,commitment_generator';