diff --git a/.github/workflows/cherry-pick.yml b/.github/workflows/cherry-pick.yml new file mode 100644 index 000000000..82c0b860e --- /dev/null +++ b/.github/workflows/cherry-pick.yml @@ -0,0 +1,22 @@ +on: + pull_request: + branches: + - main + types: ["closed"] + +jobs: + cherry_pick_release_0_1_x: + runs-on: ubuntu-latest + name: Cherry pick into release/0.1.x + if: ${{ contains(github.event.pull_request.labels.*.name, 'release/0.1.x') && github.event.pull_request.merged == true }} + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Cherry pick into release/0.1.x + uses: carloscastrojumo/github-cherry-pick-action@v1.0.1 + with: + branch: release/0.1.x + labels: | + cherry-pick \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 72279764c..8c471ab00 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "go-ethereum"] path = go-ethereum url = https://github.com/morph-l2/go-ethereum.git - branch = main \ No newline at end of file + branch = release/0.3.x \ No newline at end of file diff --git a/contracts/deploy/018-StakingInit.ts b/contracts/deploy/018-StakingInit.ts index 76ee5a13d..81ad32531 100644 --- a/contracts/deploy/018-StakingInit.ts +++ b/contracts/deploy/018-StakingInit.ts @@ -87,16 +87,18 @@ export const StakingInit = async ( console.log('Upgrading the Staking proxy...') const admin: string = configTmp.contractAdmin const sequencerSize: number = configTmp.stakingSequencerSize + const sequencerWhiteList = configTmp.l2SequencerAddresses const limit: number = configTmp.stakingMinDeposit const lock: number = configTmp.stakingLockNumber if (!ethers.utils.isAddress(admin) || !ethers.utils.isAddress(L1SequencerProxyAddress) || sequencerSize == 0 + || sequencerSize != sequencerWhiteList.length || lock == 0 || limit == 0 ) { - console.error('please check your address') + console.error('please check your address and your sequencer array size') return '' } diff --git a/contracts/src/deploy-config/holesky.ts b/contracts/src/deploy-config/holesky.ts index a629896c2..c8d4e19d8 100644 --- a/contracts/src/deploy-config/holesky.ts +++ b/contracts/src/deploy-config/holesky.ts @@ -29,7 +29,7 @@ const config = { // staking config // staking initialize config - stakingSequencerSize: 4, + stakingSequencerSize: 7, stakingLockNumber: 3, stakingMinDeposit: 1, // limit // register sequencers diff --git a/gas-oracle/.env.dev b/gas-oracle/.env.dev index f8ce298da..e62c927f7 100644 --- a/gas-oracle/.env.dev +++ b/gas-oracle/.env.dev @@ -3,6 +3,7 @@ GAS_ORACLE_L1_BEACON_RPC = https://ethereum-sepolia-beacon-api.publicnode.com GAS_ORACLE_L2_RPC = "http://127.0.0.1:8545/" GAS_THRESHOLD = 5 # 5% INTERVAL = 2000 #2s +OVERHEAD_SWITCH = false OVERHEAD_THRESHOLD = 100 # 100Gas OVERHEAD_INTERVAL = 10 diff --git a/gas-oracle/app/src/gas_price_oracle.rs b/gas-oracle/app/src/gas_price_oracle.rs index fa500c50d..ce2a7762b 100644 --- a/gas-oracle/app/src/gas_price_oracle.rs +++ b/gas-oracle/app/src/gas_price_oracle.rs @@ -96,8 +96,15 @@ pub async fn update() -> Result<(), Box> { l2_oracle.clone(), l1_rollup, config.overhead_threshold, - var("GAS_ORACLE_L1_RPC")?, - var("GAS_ORACLE_L1_BEACON_RPC")?, + var("GAS_ORACLE_L1_RPC") + .expect("Cannot detect GAS_ORACLE_L1_RPC env var") + .parse() + .expect("Cannot parse GAS_ORACLE_L1_RPC env var"), + var("GAS_ORACLE_L1_BEACON_RPC") + .expect("Cannot detect GAS_ORACLE_L1_BEACON_RPC env var") + .parse() + .expect("Cannot parse GAS_ORACLE_L1_BEACON_RPC env var"), + read_env_var("OVERHEAD_SWITCH", false), ); // Register metrics. @@ -196,6 +203,12 @@ async fn handle_metrics() -> String { } } +pub fn read_env_var(var_name: &'static str, default: T) -> T { + std::env::var(var_name) + .map(|s| s.parse::().unwrap_or_else(|_| default.clone())) + .unwrap_or(default) +} + #[tokio::test(flavor = "multi_thread", worker_threads = 4)] async fn test() -> Result<(), Box> { println!("update"); diff --git a/gas-oracle/app/src/overhead.rs b/gas-oracle/app/src/overhead.rs index 0d2024a00..a98e68266 100644 --- a/gas-oracle/app/src/overhead.rs +++ b/gas-oracle/app/src/overhead.rs @@ -22,6 +22,7 @@ pub struct OverHead { overhead_threshold: u128, execution_node: ExecutionNode, beacon_node: BeaconNode, + overhead_switch: bool, } impl OverHead { @@ -32,6 +33,7 @@ impl OverHead { overhead_threshold: u128, l1_rpc: String, l1_beacon_rpc: String, + overhead_switch: bool, ) -> Self { let execution_node = ExecutionNode { rpc_url: l1_rpc }; let beacon_node = BeaconNode { @@ -45,6 +47,7 @@ impl OverHead { overhead_threshold, execution_node, beacon_node, + overhead_switch, } } @@ -132,9 +135,7 @@ impl OverHead { "current overhead on l2 is: {:#?}", current_overhead.as_u128() ); - ORACLE_SERVICE_METRICS - .overhead - .set(i64::try_from(current_overhead).unwrap_or(-1)); + ORACLE_SERVICE_METRICS.overhead.set(latest_overhead as i64); latest_overhead = latest_overhead.min(MAX_OVERHEAD); let abs_diff = U256::from(latest_overhead).abs_diff(current_overhead); @@ -149,14 +150,16 @@ impl OverHead { } // Step3. update overhead - let tx = self - .l2_oracle - .set_overhead(U256::from(latest_overhead)) - .legacy(); - let rt = tx.send().await; - match rt { - Ok(info) => log::info!("tx of set_overhead has been sent: {:?}", info.tx_hash()), - Err(e) => log::error!("update overhead error: {:#?}", e), + if self.overhead_switch { + let tx = self + .l2_oracle + .set_overhead(U256::from(latest_overhead)) + .legacy(); + let rt = tx.send().await; + match rt { + Ok(info) => log::info!("tx of set_overhead has been sent: {:?}", info.tx_hash()), + Err(e) => log::error!("update overhead error: {:#?}", e), + } } *PREV_ROLLUP_L1_BLOCK.lock().await = current_rollup_l1_block; } diff --git a/gas-oracle/docker-compose-app-testnet.yml b/gas-oracle/docker-compose-app-testnet.yml index 9ee2b071a..3c5677f66 100644 --- a/gas-oracle/docker-compose-app-testnet.yml +++ b/gas-oracle/docker-compose-app-testnet.yml @@ -25,4 +25,4 @@ services: - TXN_PER_BLOCK=${TXN_PER_BLOCK} - TXN_PER_BATCH=${TXN_PER_BATCH} - L1_ROLLUP=${L1_ROLLUP} - \ No newline at end of file + - OVERHEAD_SWITCH=${OVERHEAD_SWITCH} #false \ No newline at end of file diff --git a/go-ethereum b/go-ethereum index 279c693c3..5cb3e940d 160000 --- a/go-ethereum +++ b/go-ethereum @@ -1 +1 @@ -Subproject commit 279c693c32bb39234ae77bbdaa09e5d6f220d383 +Subproject commit 5cb3e940d6a3d28ebdbc3a90b99cf87f01e62684 diff --git a/go.work b/go.work index fca7e646f..23379a109 100644 --- a/go.work +++ b/go.work @@ -1,8 +1,8 @@ go 1.20 replace ( - github.com/scroll-tech/go-ethereum => github.com/morph-l2/go-ethereum v1.10.14-0.20240412073703-cd22e09a65c6 - github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.1.0-beta.0.20240417065957-8ff3c98baa2f + github.com/scroll-tech/go-ethereum => github.com/morph-l2/go-ethereum v0.3.0-beta + github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.2.0-beta ) use ( diff --git a/go.work.sum b/go.work.sum index 1f4f3782e..cd2604d30 100644 --- a/go.work.sum +++ b/go.work.sum @@ -465,6 +465,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/morph-l2/go-ethereum v0.3.0-beta h1:cYKV5LJ3ACWb+0DtQcmv/hC+m7yh3s4oaQYOJyIZMT0= +github.com/morph-l2/go-ethereum v0.3.0-beta/go.mod h1:ogSuXMMniSGIzy2nHPIOUWS3MAqOJpLtw9A8ObKuv/Q= github.com/morph-l2/go-ethereum v1.10.14-0.20240314072444-8b0a8e1d2ded/go.mod h1:ogSuXMMniSGIzy2nHPIOUWS3MAqOJpLtw9A8ObKuv/Q= github.com/morph-l2/go-ethereum v1.10.14-0.20240401031312-d068e9853254 h1:YZ4BSWq3vs1WE5F8mpy5DKcdmaWwf4zjIVekJBqk3FY= github.com/morph-l2/go-ethereum v1.10.14-0.20240401031312-d068e9853254/go.mod h1:ogSuXMMniSGIzy2nHPIOUWS3MAqOJpLtw9A8ObKuv/Q= @@ -477,6 +479,8 @@ github.com/morph-l2/tendermint v0.1.0-beta.0.20240401034235-0403d532dbd3 h1:k622 github.com/morph-l2/tendermint v0.1.0-beta.0.20240401034235-0403d532dbd3/go.mod h1:0d9/EvR8QheuLJBOq7mHPunn/7dPW22JGfeOaNEMxhA= github.com/morph-l2/tendermint v0.1.0-beta.0.20240417065957-8ff3c98baa2f h1:xVTUs/fQqXzbyllmRk+gVdZw1m5w3/ldMKCgvOaacT0= github.com/morph-l2/tendermint v0.1.0-beta.0.20240417065957-8ff3c98baa2f/go.mod h1:0d9/EvR8QheuLJBOq7mHPunn/7dPW22JGfeOaNEMxhA= +github.com/morph-l2/tendermint v0.2.0-beta h1:j/6DvfrKt5nT1ZG55Uh6sxzdrtlPgdMbEQ7uE4iZQzo= +github.com/morph-l2/tendermint v0.2.0-beta/go.mod h1:0d9/EvR8QheuLJBOq7mHPunn/7dPW22JGfeOaNEMxhA= github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= diff --git a/ops/L2-genesis/deploy-config/holesky-deploy-config.json b/ops/L2-genesis/deploy-config/holesky-deploy-config.json index 9c9a3a06e..84c7c8ca3 100644 --- a/ops/L2-genesis/deploy-config/holesky-deploy-config.json +++ b/ops/L2-genesis/deploy-config/holesky-deploy-config.json @@ -1,6 +1,7 @@ { "l1ChainID": 17000, "l2ChainID": 2810, + "l2GenesisBlockTimestamp": "0x663050A0", "finalSystemOwner": "0x48442fdDd92F1000861c7A26cdb5c3a73FFF294d", "proxyAdminOwner": "0x48442fdDd92F1000861c7A26cdb5c3a73FFF294d", diff --git a/ops/L2-genesis/op-chain-ops/genesis/setters.go b/ops/L2-genesis/op-chain-ops/genesis/setters.go index be37d0341..cad71d671 100644 --- a/ops/L2-genesis/op-chain-ops/genesis/setters.go +++ b/ops/L2-genesis/op-chain-ops/genesis/setters.go @@ -39,7 +39,7 @@ func FundDevAccounts(db vm.StateDB) { // can be set in state and the ProxyAdmin can be set as the admin of the // Proxy. func SetL2Proxies(db vm.StateDB) error { - return setProxies(db, predeploys.ProxyAdminAddr, bigL2PredeployNamespace_53, 128) + return setProxies(db, predeploys.ProxyAdminAddr, bigL2PredeployNamespace_53, 64) } func setProxies(db vm.StateDB, proxyAdminAddr common.Address, namespace *big.Int, count uint64) error { @@ -171,7 +171,7 @@ func setupPredeploy(db vm.StateDB, deployResults immutables.DeploymentResults, s } } - if name == "L2Sequencer" { + if name == "L2Sequencer" || name == "L2WETH" { // set slots directly if slots, ok := slotResults[name]; ok { for slotK, slotV := range slots { diff --git a/ops/L2-genesis/op-chain-ops/immutables/immutables.go b/ops/L2-genesis/op-chain-ops/immutables/immutables.go index 73e34e2b5..dcffdd4b6 100644 --- a/ops/L2-genesis/op-chain-ops/immutables/immutables.go +++ b/ops/L2-genesis/op-chain-ops/immutables/immutables.go @@ -123,7 +123,6 @@ func BuildL2(constructors []deployer.Constructor, config *Config) (DeploymentRes var lastTx *types.Transaction for _, dep := range deployments { results[dep.Name] = dep.Bytecode - switch dep.Name { case "L2Sequencer": if config == nil || len(config.L2SequencerAddresses) == 0 { diff --git a/ops/docker/docker-compose-4nodes.yml b/ops/docker/docker-compose-4nodes.yml index 2924629ed..30dc925eb 100644 --- a/ops/docker/docker-compose-4nodes.yml +++ b/ops/docker/docker-compose-4nodes.yml @@ -671,3 +671,4 @@ services: - TXN_PER_BLOCK=1 - TXN_PER_BATCH=50 - L1_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} + - OVERHEAD_SWITCH=${OVERHEAD_SWITCH} \ No newline at end of file diff --git a/prover/challenge-handler/src/bin/auto_challenge.rs b/prover/challenge-handler/src/bin/auto_challenge.rs index da18c2c8a..6de4fff48 100644 --- a/prover/challenge-handler/src/bin/auto_challenge.rs +++ b/prover/challenge-handler/src/bin/auto_challenge.rs @@ -178,30 +178,32 @@ async fn auto_challenge( } }; - let check_receipt = || async { - let receipt = l1_provider.get_transaction_receipt(pending_tx.tx_hash()).await.unwrap(); - match receipt { - Some(tr) => { - // Either 1 (success) or 0 (failure). - match tr.status.unwrap_or_default().as_u64() { - 1 => log::info!("challenge_state receipt success: {:#?}", pending_tx.tx_hash()), - _ => log::error!("challenge_state receipt fail: {:#?}", tr), - }; - return true; - } - // Maybe still pending. - None => { - log::info!("challenge_state receipt pending"); - return false; + match pending_tx.await { + Ok(receipt) => { + match receipt { + Some(receipt) => { + // Check the status of the tx receipt + if receipt.status == Some(1.into()) { + log::info!( + "tx of challenge_state success, batch_index: {:?}, gasUsed: {:?}, txHash: {:?}", + batch_index, + receipt.gas_used, + receipt.transaction_hash + ); + } else { + log::error!( + "tx of challenge_state failed, batch_index: {:?}, txHash: {:?}", + batch_index, + receipt.transaction_hash + ); + } + } + None => { + log::error!("No challenge_state tx receipt found, may still be in pending status or has been dropped"); + } } } - }; - - for _ in 1..5 { - std::thread::sleep(Duration::from_secs(12)); - if check_receipt().await { - break; - }; + Err(error) => log::error!("provider error: {:?}", error), } Ok(()) @@ -239,13 +241,13 @@ async fn detecte_challenge(latest: U64, l1_rollup: &RollupType, l1_provider: &Pr return None; } }; - let is_batch_finalized: bool = l1_rollup.is_batch_finalized(U256::from(batch_index)).await.unwrap(); + let _is_batch_finalized: bool = l1_rollup.is_batch_finalized(U256::from(batch_index)).await.unwrap(); if batch_in_challenge { log::info!("prev challenge not finalized, batch index = {:#?}", batch_index); return Some(true); } - log::info!("batch status not in challenge, batch index = {:#?}", batch_index); + log::debug!("batch status not in challenge, batch index = {:#?}", batch_index); } log::info!("all batch's status not in challenge now"); Some(false) diff --git a/prover/challenge-handler/src/bin/batch_query.rs b/prover/challenge-handler/src/bin/batch_query.rs index e03c2e99f..8d3c09452 100644 --- a/prover/challenge-handler/src/bin/batch_query.rs +++ b/prover/challenge-handler/src/bin/batch_query.rs @@ -3,8 +3,7 @@ use dotenv::dotenv; use env_logger::Env; use ethers::prelude::*; use ethers::signers::Wallet; -use ethers::{abi::AbiDecode, prelude::*}; -use serde::{Deserialize, Serialize}; +use ethers::abi::AbiDecode; use std::env::var; use std::error::Error; use std::ops::Mul; diff --git a/prover/challenge-handler/src/bin/block_query.rs b/prover/challenge-handler/src/bin/block_query.rs index 1781de3b5..7b7b1fabf 100644 --- a/prover/challenge-handler/src/bin/block_query.rs +++ b/prover/challenge-handler/src/bin/block_query.rs @@ -3,8 +3,7 @@ use dotenv::dotenv; use env_logger::Env; use ethers::prelude::*; use ethers::signers::Wallet; -use ethers::{abi::AbiDecode, prelude::*}; -use serde::{Deserialize, Serialize}; +use ethers::abi::AbiDecode; use std::env::var; use std::error::Error; use std::ops::Mul; diff --git a/prover/challenge-handler/src/handler.rs b/prover/challenge-handler/src/handler.rs index 9ad022c6c..7102016e7 100644 --- a/prover/challenge-handler/src/handler.rs +++ b/prover/challenge-handler/src/handler.rs @@ -237,9 +237,19 @@ async fn prove_state(wallet_address: Address, batch_index: u64, l1_rollup: &Roll Some(receipt) => { // Check the status of the tx receipt if receipt.status == Some(1.into()) { - log::error!("tx of prove_state success, tx hash: {:?}", receipt.transaction_hash); + log::info!( + "tx of prove_state success, batch_index: {:?}, gasUsed: {:?}, txHash: {:?}", + batch_index, + receipt.gas_used, + receipt.transaction_hash + ); + return true; } else { - log::error!("tx of prove_state failed, tx hash: {:?}", receipt.transaction_hash); + log::error!( + "tx of prove_state failed, batch_index: {:?}, txHash: {:?}", + batch_index, + receipt.transaction_hash + ); } } None => { diff --git a/prover/shadow-proving/shadow-rollup-contract/contracts/ShadowRollup.sol b/prover/shadow-proving/shadow-rollup-contract/contracts/ShadowRollup.sol index ea6596c95..d2d5b88e3 100644 --- a/prover/shadow-proving/shadow-rollup-contract/contracts/ShadowRollup.sol +++ b/prover/shadow-proving/shadow-rollup-contract/contracts/ShadowRollup.sol @@ -1,6 +1,6 @@ -// contracts/GLDToken.sol // SPDX-License-Identifier: MIT pragma solidity =0.8.24; + import "@openzeppelin/contracts/access/Ownable.sol"; import {IZkEvmVerifier} from "./libs/IZkEvmVerifier.sol"; diff --git a/prover/shadow-proving/src/shadow_prove.rs b/prover/shadow-proving/src/shadow_prove.rs index d811d5a52..4e02f8832 100644 --- a/prover/shadow-proving/src/shadow_prove.rs +++ b/prover/shadow-proving/src/shadow_prove.rs @@ -113,7 +113,7 @@ async fn handle_with_prover(batch_info: &BatchInfo, l1_shadow_rollup: &ShadowRol log::info!("query proof and prove state: {:?}", batch_index); if !prove_result.proof_data.is_empty() { prove_state(batch_index, &l1_shadow_rollup).await; - continue; + break; } } None => (),