From 8481a35579e6aacc91b15cfddee6b79077fc72c4 Mon Sep 17 00:00:00 2001 From: Arnau Bennassar Date: Thu, 31 Oct 2024 18:28:13 +0100 Subject: [PATCH 01/13] minor improvements on the config (#149) --- config/default.go | 12 +++++------- logerror | 1 + test/config/kurtosis-cdk-node-config.toml.template | 2 -- 3 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 logerror diff --git a/config/default.go b/config/default.go index 7f2ae8b60..096d98deb 100644 --- a/config/default.go +++ b/config/default.go @@ -5,8 +5,6 @@ package config const DefaultMandatoryVars = ` L1URL = "http://localhost:8545" L2URL = "http://localhost:8123" -L1AggOracleURL = "http://test-aggoracle-l1:8545" -L2AggOracleURL = "http://test-aggoracle-l2:8545" AggLayerURL = "https://agglayer-dev.polygon.technology" ForkId = 9 @@ -219,18 +217,18 @@ GlobalExitRootAddr="{{NetworkConfig.L1.GlobalExitRootManagerAddr}}" RollupManagerAddr = "{{NetworkConfig.L1.RollupManagerAddr}}" SyncBlockChunkSize=10 BlockFinality="LatestBlock" -URLRPCL1="{{L1AggOracleURL}}" +URLRPCL1="{{L1URL}}" WaitForNewBlocksPeriod="100ms" InitialBlock=0 [AggOracle] TargetChainType="EVM" -URLRPCL1="{{L1AggOracleURL}}" +URLRPCL1="{{L1URL}}" BlockFinality="FinalizedBlock" WaitPeriodNextGER="100ms" [AggOracle.EVMSender] GlobalExitRootL2="{{L2Config.GlobalExitRootAddr}}" - URLRPCL2="{{L2AggOracleURL}}" + URLRPCL2="{{L2URL}}" ChainIDL2=1337 GasOffset=0 WaitPeriodMonitorTx="100ms" @@ -251,7 +249,7 @@ WaitPeriodNextGER="100ms" SafeStatusL1NumberOfBlocks = 5 FinalizedStatusL1NumberOfBlocks = 10 [AggOracle.EVMSender.EthTxManager.Etherman] - URL = "{{L2AggOracleURL}}" + URL = "{{L2URL}}" MultiGasProvider = false L1ChainID = {{NetworkConfig.L1.L1ChainID}} HTTPHeaders = [] @@ -290,7 +288,7 @@ GasOffset = 0 SafeStatusL1NumberOfBlocks = 5 FinalizedStatusL1NumberOfBlocks = 10 [ClaimSponsor.EthTxManager.Etherman] - URL = "{{L2AggOracleURL}}" + URL = "{{L2URL}}" MultiGasProvider = false L1ChainID = {{NetworkConfig.L1.L1ChainID}} HTTPHeaders = [] diff --git a/logerror b/logerror new file mode 100644 index 000000000..cf3e44c15 --- /dev/null +++ b/logerror @@ -0,0 +1 @@ +ok github.com/0xPolygon/cdk/l1infotreesync 2.438s diff --git a/test/config/kurtosis-cdk-node-config.toml.template b/test/config/kurtosis-cdk-node-config.toml.template index 68f6ec978..1d70226dc 100644 --- a/test/config/kurtosis-cdk-node-config.toml.template +++ b/test/config/kurtosis-cdk-node-config.toml.template @@ -1,8 +1,6 @@ PathRWData = "{{.path_rw_data}}/" L1URL="{{.l1_rpc_url}}" L2URL="http://{{.l2_rpc_name}}{{.deployment_suffix}}:{{.zkevm_rpc_http_port}}" -L1AggOracleURL = "http://test-aggoracle-l1:8545" -L2AggOracleURL = "http://test-aggoracle-l2:8545" AggLayerURL="{{.agglayer_url}}" ForkId = {{.zkevm_rollup_fork_id}} From faa2a749675c528ee77c96e56700aceb426a372e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= <58293609+ToniRamirezM@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:17:20 +0100 Subject: [PATCH 02/13] feat: update zkevm-ethtx-manager to v0.2.1 (#153) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ae03382e6..4a3a983e4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20240826154954-f6182d2b17a2 github.com/0xPolygon/cdk-data-availability v0.0.10 github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 - github.com/0xPolygon/zkevm-ethtx-manager v0.2.0 + github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5 github.com/ethereum/go-ethereum v1.14.8 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 diff --git a/go.sum b/go.sum index 96f2dc932..28771a515 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/0xPolygon/cdk-data-availability v0.0.10 h1:pVcke2I7GuPH7JeRLKokEOHffP github.com/0xPolygon/cdk-data-availability v0.0.10/go.mod h1:nn5RmnkzOiugAxizSbaYnA+em79YLLLoR25i0UlKc5Q= github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 h1:FXL/rcO7/GtZ3kRFw+C7J6vmGnl8gcazg+Gh/NVmnas= github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6/go.mod h1:2scWqMMufrQXu7TikDgQ3BsyaKoX8qP26D6E262vSOg= -github.com/0xPolygon/zkevm-ethtx-manager v0.2.0 h1:QWE6nKBBHkMEiza723hJk0+oZbLSdQZTX4I48jWw15I= -github.com/0xPolygon/zkevm-ethtx-manager v0.2.0/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 h1:2Yb+KdJFMpVrS9LIkd658XiWuN+MCTs7SgeWaopXScg= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5 h1:YmnhuCl349MoNASN0fMeGKU1o9HqJhiZkfMsA/1cTRA= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5/go.mod h1:X4Su/M/+hSISqdl9yomKlRsbTyuZHsRohporyHsP8gg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= From 34e2887a2d1d1be09c57809f8b6e197e190b0dbb Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Tue, 5 Nov 2024 15:11:21 +0000 Subject: [PATCH 03/13] refactor: retrieve and parse versions at buildtime Use input_parser.star from kurtosis --- Cargo.lock | 58 +++++++++++++++++++++++------------ crates/cdk/Cargo.toml | 14 +++++---- crates/cdk/build.rs | 62 ++++++++++++++++++++++++++++++++++++++ crates/cdk/src/versions.rs | 30 +++++++----------- crates/cdk/versions.json | 15 +++++++++ 5 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 crates/cdk/versions.json diff --git a/Cargo.lock b/Cargo.lock index b99568400..07f6da60c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.4.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fa8a1a3c4cbd221f2b8e3693aeb328fca79a757fe556ed08e47bbbc2a70db7" +checksum = "af5979e0d5a7bf9c7eb79749121e8256e59021af611322aee56e77e20776b4b3" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.4.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370143ed581aace6e663342d21d209c6b2e34ee6142f7d6675adb518deeaf0dc" +checksum = "7fc2bd1e7403463a5f2c61e955bcc9d3072b63aa177442b0f9aa6a6d22a941e3" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -130,6 +130,7 @@ dependencies = [ "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] @@ -192,9 +193,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.4.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac3e97dad3d31770db0fc89bd6a63b789fbae78963086733f960cf32c483904" +checksum = "be77579633ebbc1266ae6fd7694f75c408beb1aeb6865d0b18f22893c265a061" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -207,13 +208,14 @@ dependencies = [ "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-transport-http" -version = "0.4.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b367dcccada5b28987c2296717ee04b9a5637aacd78eacb1726ef211678b5212" +checksum = "91fd1a5d0827939847983b46f2f79510361f901dc82f8e3c38ac7397af142c6e" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -691,6 +693,7 @@ dependencies = [ "colored", "dotenvy", "execute", + "regex", "reqwest 0.12.8", "serde", "serde_json", @@ -2685,7 +2688,7 @@ dependencies = [ "lalrpop-util", "petgraph", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "string_cache", "term", "tiny-keccak", @@ -2699,7 +2702,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.7", + "regex-automata 0.4.8", ] [[package]] @@ -3334,7 +3337,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -3443,14 +3446,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -3464,13 +3467,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3481,9 +3484,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -3535,6 +3538,7 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2 0.4.5", @@ -5066,6 +5070,20 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "wasmtimer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ed9d8b15c7fb594d72bfb4b5a276f3d2029333cd93a932f376f5937f6f80ee" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.69" diff --git a/crates/cdk/Cargo.toml b/crates/cdk/Cargo.toml index 0c1f8274e..e6e9723b7 100644 --- a/crates/cdk/Cargo.toml +++ b/crates/cdk/Cargo.toml @@ -15,14 +15,16 @@ tracing.workspace = true tracing-subscriber = { workspace = true, features = ["env-filter", "json"] } url = { workspace = true, features = ["serde"] } colored = "2.0" - - cdk-config = { path = "../cdk-config" } serde.workspace = true serde_json.workspace = true tempfile = "3.12.0" -alloy-rpc-client = "0.4.2" -alloy-transport-http = "0.4.2" +alloy-rpc-client = "0.5.4" +alloy-transport-http = "0.5.4" tokio = "1.40.0" -reqwest = "0.12.8" -alloy-json-rpc = "0.4.2" +alloy-json-rpc = "0.5.4" + +[build-dependencies] +reqwest = {version = "0.12.8", features = ["blocking"]} +serde_json.workspace = true +regex = "1.11.1" diff --git a/crates/cdk/build.rs b/crates/cdk/build.rs index 59fffda7e..802b68c0a 100644 --- a/crates/cdk/build.rs +++ b/crates/cdk/build.rs @@ -1,8 +1,15 @@ +use regex::Regex; +use reqwest::blocking::get; use std::env; +use std::fs::File; +use std::io::Write; +use std::path::Path; use std::path::PathBuf; use std::process::Command; fn main() { + let _ = build_versions(); + let build_script_disabled = env::var("BUILD_SCRIPT_DISABLED") .map(|v| v == "1") .unwrap_or(false); // run by default @@ -46,3 +53,58 @@ fn main() { // only when a specific file changes: // println!("cargo:rerun-if-changed=path/to/file"); } + +// build_versions retrieves the versions from the Starlark file and embeds them in the binary. +fn build_versions() -> std::io::Result<()> { + // Retrieve the contents of the file from the URL + let url = "https://raw.githubusercontent.com/0xPolygon/kurtosis-cdk/refs/heads/main/input_parser.star"; + let response = get(url).expect("Failed to send request"); + let content = response.text().expect("Failed to read response text"); + + // Write the contents to a file + let out_dir = std::env::var("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("input_parser.star"); + let mut file = File::create(&dest_path)?; + file.write_all(content.as_bytes())?; + + // Get lines 28 to 40 from the contents of the starlark file + let versions = content + .lines() + .skip(30) + .take(15) + .collect::>() + .join("\n"); + + // Replace the string DEFAULT_IMAGES = from the versions string + let versions = versions.replace("DEFAULT_IMAGES = ", ""); + + // Remove all comments to the end of the line using a regexp + let re = Regex::new(r"\s#\s.*\n").unwrap(); + let versions = re.replace_all(&versions, ""); + // Replace the trailing comma on the last line + let versions = versions.replace(", }", " }"); + + print!("{}", versions); + + // The versions string is a JSON object we can parse + let versions_json: serde_json::Value = serde_json::from_str(&versions).unwrap(); + + // Write the versions to a file + let dest_path = Path::new(".").join("versions.json"); + let mut file = File::create(&dest_path)?; + file.write_all( + serde_json::to_string_pretty(&versions_json) + .unwrap() + .as_bytes(), + )?; + + // Optionally, print the output of the make command + println!("cargo:rerun-if-changed=build.rs"); + + // Here you can also add additional commands to inform Cargo about + // how to rerun the build script. For example, to rerun this script + // only when a specific file changes: + // println!("cargo:rerun-if-changed=path/to/file"); + + Ok(()) +} diff --git a/crates/cdk/src/versions.rs b/crates/cdk/src/versions.rs index 77581452e..3b148787d 100644 --- a/crates/cdk/src/versions.rs +++ b/crates/cdk/src/versions.rs @@ -14,34 +14,26 @@ fn version() -> Result { } pub(crate) fn versions() { + // Load the versions from the versions.json file in the crate directory + // and parse it using serde_json. + let versions = include_str!("../versions.json"); + let versions_json: serde_json::Value = serde_json::from_str(versions).unwrap(); + + // Convert the JSON object to a HashMap. + let versions_map = versions_json.as_object().unwrap(); + // Get the version of the cdk-node binary. let output = version().unwrap(); let version = String::from_utf8(output.stdout).unwrap(); println!("{}", format!("{}", version.trim()).green()); - let versions = vec![ - ( - "zkEVM Contracts", - "https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.0.0-rc.4-fork.12", - ), - ("zkEVM Prover", "v8.0.0-RC12"), - ("CDK Erigon", "hermeznetwork/cdk-erigon:0948e33"), - ( - "zkEVM Pool Manager", - "hermeznetwork/zkevm-pool-manager:v0.1.1", - ), - ( - "CDK Data Availability Node", - "0xpolygon/cdk-data-availability:0.0.10", - ), - ]; - // Multi-line string to print the versions with colors. - let formatted_versions: Vec = versions + let formatted_versions: Vec = versions_map .iter() - .map(|(key, value)| format!("{}: {}", key.green(), value.blue())) + .map(|(key, value)| format!("{}: {}", key.green(), value.to_string().blue())) .collect(); + println!("{}", "Supported up to fork12".yellow()); println!("{}", formatted_versions.join("\n")); } diff --git a/crates/cdk/versions.json b/crates/cdk/versions.json new file mode 100644 index 000000000..7cbe12dd8 --- /dev/null +++ b/crates/cdk/versions.json @@ -0,0 +1,15 @@ +{ + "agglayer_image": "ghcr.io/agglayer/agglayer:feature-storage-adding-epoch-packing", + "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.1.1", + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.4.0-beta1", + "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", + "zkevm_bridge_proxy_image": "haproxy:3.0-bookworm", + "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC1", + "zkevm_bridge_ui_image": "leovct/zkevm-bridge-ui:multi-network-2", + "zkevm_contracts_image": "leovct/zkevm-contracts:v8.0.0-rc.4-fork.12", + "zkevm_da_image": "0xpolygon/cdk-data-availability:0.0.10", + "zkevm_node_image": "hermeznetwork/zkevm-node:v0.7.3", + "zkevm_pool_manager_image": "hermeznetwork/zkevm-pool-manager:v0.1.1", + "zkevm_prover_image": "hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12", + "zkevm_sequence_sender_image": "hermeznetwork/zkevm-sequence-sender:v0.2.4" +} \ No newline at end of file From 6d8dd74342278a31d2611e4c50e33c107e80643f Mon Sep 17 00:00:00 2001 From: Arnau Bennassar Date: Tue, 5 Nov 2024 12:42:17 -0600 Subject: [PATCH 04/13] feat: use sqlite on lastgersync (#150) * feat use sqlite on lastgersync * apply requests * rm tree migrations * Update lastgersync/processor.go Co-authored-by: Goran Rojovic <100121253+goran-ethernal@users.noreply.github.com> --------- Co-authored-by: Goran Rojovic <100121253+goran-ethernal@users.noreply.github.com> --- lastgersync/e2e_test.go | 9 +- lastgersync/evmdownloader.go | 18 +- lastgersync/lastgersync.go | 4 +- lastgersync/migrations/lastgersync0001.sql | 14 + lastgersync/migrations/migrations.go | 21 ++ lastgersync/processor.go | 300 +++++---------------- rpc/bridge.go | 4 +- rpc/bridge_interfaces.go | 3 +- rpc/mocks/last_ge_rer.go | 36 +-- 9 files changed, 141 insertions(+), 268 deletions(-) create mode 100644 lastgersync/migrations/lastgersync0001.sql create mode 100644 lastgersync/migrations/migrations.go diff --git a/lastgersync/e2e_test.go b/lastgersync/e2e_test.go index e4d5e4076..9b9a6f36a 100644 --- a/lastgersync/e2e_test.go +++ b/lastgersync/e2e_test.go @@ -3,6 +3,7 @@ package lastgersync_test import ( "context" "fmt" + "path" "strconv" "testing" "time" @@ -18,7 +19,7 @@ import ( func TestE2E(t *testing.T) { ctx := context.Background() env := aggoraclehelpers.SetupAggoracleWithEVMChain(t) - dbPathSyncer := t.TempDir() + dbPathSyncer := path.Join(t.TempDir(), "file::memory:?cache=shared") syncer, err := lastgersync.New( ctx, dbPathSyncer, @@ -65,8 +66,8 @@ func TestE2E(t *testing.T) { } require.True(t, syncerUpToDate, errMsg) - _, actualGER, err := syncer.GetFirstGERAfterL1InfoTreeIndex(ctx, uint32(i)) - require.NoError(t, err) - require.Equal(t, common.Hash(expectedGER), actualGER) + e, err := syncer.GetFirstGERAfterL1InfoTreeIndex(ctx, uint32(i)) + require.NoError(t, err, fmt.Sprint("iteration: ", i)) + require.Equal(t, common.Hash(expectedGER), e.GlobalExitRoot, fmt.Sprint("iteration: ", i)) } } diff --git a/lastgersync/evmdownloader.go b/lastgersync/evmdownloader.go index e76bb5788..bf9a236f2 100644 --- a/lastgersync/evmdownloader.go +++ b/lastgersync/evmdownloader.go @@ -62,13 +62,13 @@ func newDownloader( func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedCh chan sync.EVMBlock) { var ( attempts int - lastIndex uint32 + nextIndex uint32 err error ) for { - lastIndex, err = d.processor.getLastIndex(ctx) + lastIndex, err := d.processor.getLastIndex() if errors.Is(err, db.ErrNotFound) { - lastIndex = 0 + nextIndex = 0 } else if err != nil { log.Errorf("error getting last indes: %v", err) attempts++ @@ -76,7 +76,9 @@ func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedC continue } - + if lastIndex > 0 { + nextIndex = lastIndex + 1 + } break } for { @@ -88,12 +90,12 @@ func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedC return default: } - lastBlock := d.WaitForNewBlocks(ctx, fromBlock) + fromBlock = d.WaitForNewBlocks(ctx, fromBlock) attempts = 0 var gers []Event for { - gers, err = d.getGERsFromIndex(ctx, lastIndex) + gers, err = d.getGERsFromIndex(ctx, nextIndex) if err != nil { log.Errorf("error getting GERs: %v", err) attempts++ @@ -105,7 +107,7 @@ func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedC break } - blockHeader, isCanceled := d.GetBlockHeader(ctx, lastBlock) + blockHeader, isCanceled := d.GetBlockHeader(ctx, fromBlock) if isCanceled { return } @@ -126,7 +128,7 @@ func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedC if !ok { log.Errorf("unexpected type %T in events", block.Events[0]) } - lastIndex = event.L1InfoTreeIndex + nextIndex = event.L1InfoTreeIndex + 1 } } } diff --git a/lastgersync/lastgersync.go b/lastgersync/lastgersync.go index 1b40bfcf7..c66892932 100644 --- a/lastgersync/lastgersync.go +++ b/lastgersync/lastgersync.go @@ -32,7 +32,7 @@ func New( waitForNewBlocksPeriod time.Duration, downloadBufferSize int, ) (*LastGERSync, error) { - processor, err := newProcessor(dbPath) + processor, err := newProcessor(dbPath, "lastGERSync") if err != nil { return nil, err } @@ -75,7 +75,7 @@ func (s *LastGERSync) Start(ctx context.Context) { func (s *LastGERSync) GetFirstGERAfterL1InfoTreeIndex( ctx context.Context, atOrAfterL1InfoTreeIndex uint32, -) (injectedL1InfoTreeIndex uint32, ger common.Hash, err error) { +) (Event, error) { return s.processor.GetFirstGERAfterL1InfoTreeIndex(ctx, atOrAfterL1InfoTreeIndex) } diff --git a/lastgersync/migrations/lastgersync0001.sql b/lastgersync/migrations/lastgersync0001.sql new file mode 100644 index 000000000..88021fa10 --- /dev/null +++ b/lastgersync/migrations/lastgersync0001.sql @@ -0,0 +1,14 @@ +-- +migrate Down +DROP TABLE IF EXISTS block; +DROP TABLE IF EXISTS global_exit_root; + +-- +migrate Up +CREATE TABLE block ( + num BIGINT PRIMARY KEY +); + +CREATE TABLE imported_global_exit_root ( + block_num INTEGER PRIMARY KEY REFERENCES block(num) ON DELETE CASCADE, + global_exit_root VARCHAR NOT NULL, + l1_info_tree_index INTEGER NOT NULL +); \ No newline at end of file diff --git a/lastgersync/migrations/migrations.go b/lastgersync/migrations/migrations.go new file mode 100644 index 000000000..d55dd4498 --- /dev/null +++ b/lastgersync/migrations/migrations.go @@ -0,0 +1,21 @@ +package migrations + +import ( + _ "embed" + + "github.com/0xPolygon/cdk/db" + "github.com/0xPolygon/cdk/db/types" +) + +//go:embed lastgersync0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "lastgersync0001", + SQL: mig001, + }, + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/lastgersync/processor.go b/lastgersync/processor.go index 45104f09e..dd86482f2 100644 --- a/lastgersync/processor.go +++ b/lastgersync/processor.go @@ -2,292 +2,136 @@ package lastgersync import ( "context" + "database/sql" "errors" - "fmt" - "math" - "github.com/0xPolygon/cdk/common" "github.com/0xPolygon/cdk/db" + "github.com/0xPolygon/cdk/lastgersync/migrations" "github.com/0xPolygon/cdk/log" "github.com/0xPolygon/cdk/sync" ethCommon "github.com/ethereum/go-ethereum/common" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" -) - -const ( - lastProcessedTable = "lastgersync-lastProcessed" - gerTable = "lastgersync-ger" - blockTable = "lastgersync-block" -) - -var ( - lastProcessedKey = []byte("lp") + "github.com/russross/meddler" ) type Event struct { - GlobalExitRoot ethCommon.Hash - L1InfoTreeIndex uint32 + GlobalExitRoot ethCommon.Hash `meddler:"global_exit_root,hash"` + L1InfoTreeIndex uint32 `meddler:"l1_info_tree_index"` } -type blockWithGERs struct { - // inclusive - FirstIndex uint32 - // not inclusive - LastIndex uint32 -} - -func (b *blockWithGERs) MarshalBinary() ([]byte, error) { - return append(common.Uint32ToBytes(b.FirstIndex), common.Uint32ToBytes(b.LastIndex)...), nil -} - -func (b *blockWithGERs) UnmarshalBinary(data []byte) error { - const expectedDataLength = 8 - if len(data) != expectedDataLength { - return fmt.Errorf("expected len %d, actual len %d", expectedDataLength, len(data)) - } - b.FirstIndex = common.BytesToUint32(data[:4]) - b.LastIndex = common.BytesToUint32(data[4:]) - - return nil +type eventWithBlockNum struct { + GlobalExitRoot ethCommon.Hash `meddler:"global_exit_root,hash"` + L1InfoTreeIndex uint32 `meddler:"l1_info_tree_index"` + BlockNum uint64 `meddler:"block_num"` } type processor struct { - db kv.RwDB + db *sql.DB + log *log.Logger } -func newProcessor(dbPath string) (*processor, error) { - tableCfgFunc := func(defaultBuckets kv.TableCfg) kv.TableCfg { - cfg := kv.TableCfg{ - lastProcessedTable: {}, - gerTable: {}, - blockTable: {}, - } - - return cfg +func newProcessor(dbPath string, loggerPrefix string) (*processor, error) { + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err } - db, err := mdbx.NewMDBX(nil). - Path(dbPath). - WithTableCfg(tableCfgFunc). - Open() + db, err := db.NewSQLiteDB(dbPath) if err != nil { return nil, err } - + logger := log.WithFields("lastger-syncer", loggerPrefix) return &processor{ - db: db, + db: db, + log: logger, }, nil } -// GetLastProcessedBlockAndL1InfoTreeIndex returns the last processed block oby the processor, including blocks +// GetLastProcessedBlock returns the last processed block by the processor, including blocks // that don't have events func (p *processor) GetLastProcessedBlock(ctx context.Context) (uint64, error) { - tx, err := p.db.BeginRo(ctx) - if err != nil { - return 0, err - } - defer tx.Rollback() - - return p.getLastProcessedBlockWithTx(tx) -} - -func (p *processor) getLastIndex(ctx context.Context) (uint32, error) { - tx, err := p.db.BeginRo(ctx) - if err != nil { - return 0, err - } - defer tx.Rollback() - - return p.getLastIndexWithTx(tx) -} - -func (p *processor) getLastIndexWithTx(tx kv.Tx) (uint32, error) { - iter, err := tx.RangeDescend(gerTable, common.Uint32ToBytes(math.MaxUint32), common.Uint32ToBytes(0), 1) - if err != nil { - return 0, err - } - k, _, err := iter.Next() - if err != nil { - return 0, err - } - if k == nil { - return 0, db.ErrNotFound + var lastProcessedBlock uint64 + row := p.db.QueryRow("SELECT num FROM BLOCK ORDER BY num DESC LIMIT 1;") + err := row.Scan(&lastProcessedBlock) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil } - - return common.BytesToUint32(k), nil + return lastProcessedBlock, err } -func (p *processor) getLastProcessedBlockWithTx(tx kv.Tx) (uint64, error) { - if lastProcessedBytes, err := tx.GetOne(lastProcessedTable, lastProcessedKey); err != nil { - return 0, err - } else if lastProcessedBytes == nil { +func (p *processor) getLastIndex() (uint32, error) { + var lastIndex uint32 + row := p.db.QueryRow(` + SELECT l1_info_tree_index + FROM imported_global_exit_root + ORDER BY l1_info_tree_index DESC LIMIT 1; + `) + err := row.Scan(&lastIndex) + if errors.Is(err, sql.ErrNoRows) { return 0, nil - } else { - return common.BytesToUint64(lastProcessedBytes), nil } -} - -func (p *processor) updateLastProcessedBlockWithTx(tx kv.RwTx, blockNum uint64) error { - return tx.Put(lastProcessedTable, lastProcessedKey, common.Uint64ToBytes(blockNum)) + return lastIndex, err } func (p *processor) ProcessBlock(ctx context.Context, block sync.Block) error { - tx, err := p.db.BeginRw(ctx) + tx, err := db.NewTx(ctx, p.db) if err != nil { return err } - - lenEvents := len(block.Events) - var lastIndex int64 - if lenEvents > 0 { - li, err := p.getLastIndexWithTx(tx) - switch { - case errors.Is(err, db.ErrNotFound): - lastIndex = -1 - - case err != nil: - tx.Rollback() - return err - - default: - lastIndex = int64(li) + shouldRollback := true + defer func() { + if shouldRollback { + if errRollback := tx.Rollback(); errRollback != nil { + log.Errorf("error while rolling back tx %v", errRollback) + } } - } + }() + if _, err := tx.Exec(`INSERT INTO block (num) VALUES ($1)`, block.Num); err != nil { + return err + } for _, e := range block.Events { event, ok := e.(Event) if !ok { - log.Errorf("unexpected type %T in events", e) - } - if int64(event.L1InfoTreeIndex) < lastIndex { - continue - } - lastIndex = int64(event.L1InfoTreeIndex) - if err := tx.Put( - gerTable, - common.Uint32ToBytes(event.L1InfoTreeIndex), - event.GlobalExitRoot[:], - ); err != nil { - tx.Rollback() - - return err - } - } - - if lenEvents > 0 { - firstEvent, ok := block.Events[0].(Event) - if !ok { - log.Errorf("unexpected type %T in events", block.Events[0]) - tx.Rollback() - - return fmt.Errorf("unexpected type %T in events", block.Events[0]) - } - - lastEvent, ok := block.Events[lenEvents-1].(Event) - if !ok { - log.Errorf("unexpected type %T in events", block.Events[lenEvents-1]) - tx.Rollback() - - return fmt.Errorf("unexpected type %T in events", block.Events[lenEvents-1]) - } - - bwg := blockWithGERs{ - FirstIndex: firstEvent.L1InfoTreeIndex, - LastIndex: lastEvent.L1InfoTreeIndex + 1, + return errors.New("failed to convert sync.Block.Event to Event") } - - data, err := bwg.MarshalBinary() - if err != nil { - tx.Rollback() - - return err - } - if err = tx.Put(blockTable, common.Uint64ToBytes(block.Num), data); err != nil { - tx.Rollback() - + if err = meddler.Insert(tx, "imported_global_exit_root", &eventWithBlockNum{ + GlobalExitRoot: event.GlobalExitRoot, + L1InfoTreeIndex: event.L1InfoTreeIndex, + BlockNum: block.Num, + }); err != nil { return err } } - if err := p.updateLastProcessedBlockWithTx(tx, block.Num); err != nil { - tx.Rollback() - + if err := tx.Commit(); err != nil { return err } - - return tx.Commit() + shouldRollback = false + p.log.Debugf("processed %d events until block %d", len(block.Events), block.Num) + return nil } func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error { - tx, err := p.db.BeginRw(ctx) - if err != nil { - return err - } - - iter, err := tx.Range(blockTable, common.Uint64ToBytes(firstReorgedBlock), nil) - if err != nil { - tx.Rollback() - - return err - } - for bNumBytes, bWithGERBytes, err := iter.Next(); bNumBytes != nil; bNumBytes, bWithGERBytes, err = iter.Next() { - if err != nil { - tx.Rollback() - - return err - } - if err := tx.Delete(blockTable, bNumBytes); err != nil { - tx.Rollback() - - return err - } - - bWithGER := &blockWithGERs{} - if err := bWithGER.UnmarshalBinary(bWithGERBytes); err != nil { - tx.Rollback() - - return err - } - for i := bWithGER.FirstIndex; i < bWithGER.LastIndex; i++ { - if err := tx.Delete(gerTable, common.Uint32ToBytes(i)); err != nil { - tx.Rollback() - - return err - } - } - } - - if err := p.updateLastProcessedBlockWithTx(tx, firstReorgedBlock-1); err != nil { - tx.Rollback() - - return err - } - - return tx.Commit() + _, err := p.db.Exec(`DELETE FROM block WHERE num >= $1;`, firstReorgedBlock) + return err } // GetFirstGERAfterL1InfoTreeIndex returns the first GER injected on the chain that is related to l1InfoTreeIndex // or greater func (p *processor) GetFirstGERAfterL1InfoTreeIndex( ctx context.Context, l1InfoTreeIndex uint32, -) (uint32, ethCommon.Hash, error) { - tx, err := p.db.BeginRo(ctx) - if err != nil { - return 0, ethCommon.Hash{}, err - } - defer tx.Rollback() - - iter, err := tx.Range(gerTable, common.Uint32ToBytes(l1InfoTreeIndex), nil) - if err != nil { - return 0, ethCommon.Hash{}, err - } - l1InfoIndexBytes, ger, err := iter.Next() +) (Event, error) { + e := Event{} + err := meddler.QueryRow(p.db, &e, ` + SELECT l1_info_tree_index, global_exit_root + FROM imported_global_exit_root + WHERE l1_info_tree_index >= $1 + ORDER BY l1_info_tree_index ASC LIMIT 1; + `, l1InfoTreeIndex) if err != nil { - return 0, ethCommon.Hash{}, err - } - if l1InfoIndexBytes == nil { - return 0, ethCommon.Hash{}, db.ErrNotFound + if errors.Is(err, sql.ErrNoRows) { + return e, db.ErrNotFound + } + return e, err } - - return common.BytesToUint32(l1InfoIndexBytes), ethCommon.BytesToHash(ger), nil + return e, nil } diff --git a/rpc/bridge.go b/rpc/bridge.go index 96394a4f6..e98651084 100644 --- a/rpc/bridge.go +++ b/rpc/bridge.go @@ -132,11 +132,11 @@ func (b *BridgeEndpoints) InjectedInfoAfterIndex(networkID uint32, l1InfoTreeInd return info, nil } if networkID == b.networkID { - injectedL1InfoTreeIndex, _, err := b.injectedGERs.GetFirstGERAfterL1InfoTreeIndex(ctx, l1InfoTreeIndex) + e, err := b.injectedGERs.GetFirstGERAfterL1InfoTreeIndex(ctx, l1InfoTreeIndex) if err != nil { return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get global exit root, error: %s", err)) } - info, err := b.l1InfoTree.GetInfoByIndex(ctx, injectedL1InfoTreeIndex) + info, err := b.l1InfoTree.GetInfoByIndex(ctx, e.L1InfoTreeIndex) if err != nil { return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get global exit root, error: %s", err)) } diff --git a/rpc/bridge_interfaces.go b/rpc/bridge_interfaces.go index 84292e22f..89929531a 100644 --- a/rpc/bridge_interfaces.go +++ b/rpc/bridge_interfaces.go @@ -6,6 +6,7 @@ import ( "github.com/0xPolygon/cdk/claimsponsor" "github.com/0xPolygon/cdk/l1infotreesync" + "github.com/0xPolygon/cdk/lastgersync" tree "github.com/0xPolygon/cdk/tree/types" "github.com/ethereum/go-ethereum/common" ) @@ -18,7 +19,7 @@ type Bridger interface { type LastGERer interface { GetFirstGERAfterL1InfoTreeIndex( ctx context.Context, atOrAfterL1InfoTreeIndex uint32, - ) (injectedL1InfoTreeIndex uint32, ger common.Hash, err error) + ) (lastgersync.Event, error) } type L1InfoTreer interface { diff --git a/rpc/mocks/last_ge_rer.go b/rpc/mocks/last_ge_rer.go index d2e3068a9..7b338e2e7 100644 --- a/rpc/mocks/last_ge_rer.go +++ b/rpc/mocks/last_ge_rer.go @@ -5,8 +5,7 @@ package mocks import ( context "context" - common "github.com/ethereum/go-ethereum/common" - + lastgersync "github.com/0xPolygon/cdk/lastgersync" mock "github.com/stretchr/testify/mock" ) @@ -24,40 +23,31 @@ func (_m *LastGERer) EXPECT() *LastGERer_Expecter { } // GetFirstGERAfterL1InfoTreeIndex provides a mock function with given fields: ctx, atOrAfterL1InfoTreeIndex -func (_m *LastGERer) GetFirstGERAfterL1InfoTreeIndex(ctx context.Context, atOrAfterL1InfoTreeIndex uint32) (uint32, common.Hash, error) { +func (_m *LastGERer) GetFirstGERAfterL1InfoTreeIndex(ctx context.Context, atOrAfterL1InfoTreeIndex uint32) (lastgersync.Event, error) { ret := _m.Called(ctx, atOrAfterL1InfoTreeIndex) if len(ret) == 0 { panic("no return value specified for GetFirstGERAfterL1InfoTreeIndex") } - var r0 uint32 - var r1 common.Hash - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, uint32) (uint32, common.Hash, error)); ok { + var r0 lastgersync.Event + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (lastgersync.Event, error)); ok { return rf(ctx, atOrAfterL1InfoTreeIndex) } - if rf, ok := ret.Get(0).(func(context.Context, uint32) uint32); ok { + if rf, ok := ret.Get(0).(func(context.Context, uint32) lastgersync.Event); ok { r0 = rf(ctx, atOrAfterL1InfoTreeIndex) } else { - r0 = ret.Get(0).(uint32) + r0 = ret.Get(0).(lastgersync.Event) } - if rf, ok := ret.Get(1).(func(context.Context, uint32) common.Hash); ok { + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { r1 = rf(ctx, atOrAfterL1InfoTreeIndex) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(common.Hash) - } - } - - if rf, ok := ret.Get(2).(func(context.Context, uint32) error); ok { - r2 = rf(ctx, atOrAfterL1InfoTreeIndex) - } else { - r2 = ret.Error(2) + r1 = ret.Error(1) } - return r0, r1, r2 + return r0, r1 } // LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstGERAfterL1InfoTreeIndex' @@ -79,12 +69,12 @@ func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) Run(run func(ctx conte return _c } -func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) Return(injectedL1InfoTreeIndex uint32, ger common.Hash, err error) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { - _c.Call.Return(injectedL1InfoTreeIndex, ger, err) +func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) Return(_a0 lastgersync.Event, _a1 error) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { + _c.Call.Return(_a0, _a1) return _c } -func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) RunAndReturn(run func(context.Context, uint32) (uint32, common.Hash, error)) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { +func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) RunAndReturn(run func(context.Context, uint32) (lastgersync.Event, error)) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { _c.Call.Return(run) return _c } From 0f3f691dbebb37556887681171ce04048b530f90 Mon Sep 17 00:00:00 2001 From: Arnau Bennassar Date: Tue, 5 Nov 2024 12:42:35 -0600 Subject: [PATCH 05/13] feat: use sqlite on claimsponsor (#157) * feat use sqlite on claimsponsor * wip * pass UTs * fix identation * fix identation * rm cover.out * rm tree migrations * make err a var --- claimsponsor/claimsponsor.go | 378 ++++++------------- claimsponsor/e2e_test.go | 6 +- claimsponsor/evmclaimsponsor.go | 2 +- claimsponsor/migrations/claimsponsor0001.sql | 20 + claimsponsor/migrations/migrations.go | 21 ++ rpc/bridge.go | 4 +- rpc/bridge_interfaces.go | 4 +- rpc/mocks/claim_sponsorer.go | 52 ++- 8 files changed, 192 insertions(+), 295 deletions(-) create mode 100644 claimsponsor/migrations/claimsponsor0001.sql create mode 100644 claimsponsor/migrations/migrations.go diff --git a/claimsponsor/claimsponsor.go b/claimsponsor/claimsponsor.go index c9df65613..32483789e 100644 --- a/claimsponsor/claimsponsor.go +++ b/claimsponsor/claimsponsor.go @@ -2,56 +2,51 @@ package claimsponsor import ( "context" - "encoding/json" + "database/sql" "errors" - "math" + "fmt" "math/big" "time" - dbCommon "github.com/0xPolygon/cdk/common" + "github.com/0xPolygon/cdk/claimsponsor/migrations" "github.com/0xPolygon/cdk/db" "github.com/0xPolygon/cdk/log" "github.com/0xPolygon/cdk/sync" tree "github.com/0xPolygon/cdk/tree/types" "github.com/ethereum/go-ethereum/common" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/iter" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/russross/meddler" ) type ClaimStatus string const ( - PendingClaimStatus = "pending" - WIPStatus = "work in progress" - SuccessClaimStatus = "success" - FailedClaimStatus = "failed" - - claimTable = "claimsponsor-tx" - queueTable = "claimsponsor-queue" + PendingClaimStatus ClaimStatus = "pending" + WIPClaimStatus ClaimStatus = "work in progress" + SuccessClaimStatus ClaimStatus = "success" + FailedClaimStatus ClaimStatus = "failed" ) var ( - ErrInvalidClaim = errors.New("invalid claim") + ErrInvalidClaim = errors.New("invalid claim") + ErrClaimDoesntExist = errors.New("the claim requested to be updated does not exist") ) // Claim representation of a claim event type Claim struct { - LeafType uint8 - ProofLocalExitRoot tree.Proof - ProofRollupExitRoot tree.Proof - GlobalIndex *big.Int - MainnetExitRoot common.Hash - RollupExitRoot common.Hash - OriginNetwork uint32 - OriginTokenAddress common.Address - DestinationNetwork uint32 - DestinationAddress common.Address - Amount *big.Int - Metadata []byte - - Status ClaimStatus - TxID string + LeafType uint8 `meddler:"leaf_type"` + ProofLocalExitRoot tree.Proof `meddler:"proof_local_exit_root,merkleproof"` + ProofRollupExitRoot tree.Proof `meddler:"proof_rollup_exit_root,merkleproof"` + GlobalIndex *big.Int `meddler:"global_index,bigint"` + MainnetExitRoot common.Hash `meddler:"mainnet_exit_root,hash"` + RollupExitRoot common.Hash `meddler:"rollup_exit_root,hash"` + OriginNetwork uint32 `meddler:"origin_network"` + OriginTokenAddress common.Address `meddler:"origin_token_address,address"` + DestinationNetwork uint32 `meddler:"destination_network"` + DestinationAddress common.Address `meddler:"destination_address,address"` + Amount *big.Int `meddler:"amount,bigint"` + Metadata []byte `meddler:"metadata"` + Status ClaimStatus `meddler:"status"` + TxID string `meddler:"tx_id"` } func (c *Claim) Key() []byte { @@ -66,7 +61,7 @@ type ClaimSender interface { type ClaimSponsor struct { logger *log.Logger - db kv.RwDB + db *sql.DB sender ClaimSender rh *sync.RetryHandler waitTxToBeMinedPeriod time.Duration @@ -82,18 +77,11 @@ func newClaimSponsor( waitTxToBeMinedPeriod time.Duration, waitOnEmptyQueue time.Duration, ) (*ClaimSponsor, error) { - tableCfgFunc := func(defaultBuckets kv.TableCfg) kv.TableCfg { - cfg := kv.TableCfg{ - claimTable: {}, - queueTable: {}, - } - - return cfg + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err } - db, err := mdbx.NewMDBX(nil). - Path(dbPath). - WithTableCfg(tableCfgFunc). - Open() + db, err := db.NewSQLiteDB(dbPath) if err != nil { return nil, err } @@ -115,264 +103,136 @@ func newClaimSponsor( func (c *ClaimSponsor) Start(ctx context.Context) { var ( attempts int - err error ) for { + err := c.claim(ctx) if err != nil { attempts++ + c.logger.Error(err) c.rh.Handle("claimsponsor main loop", attempts) + } else { + attempts = 0 } - tx, err2 := c.db.BeginRw(ctx) - if err2 != nil { - err = err2 - c.logger.Errorf("error calling BeginRw: %v", err) - continue - } - queueIndex, globalIndex, err2 := getFirstQueueIndex(tx) - if err2 != nil { - err = err2 - tx.Rollback() - if errors.Is(err, db.ErrNotFound) { - c.logger.Debugf("queue is empty") - err = nil - time.Sleep(c.waitOnEmptyQueue) - - continue - } - c.logger.Errorf("error calling getFirstQueueIndex: %v", err) - continue - } - claim, err2 := getClaim(tx, globalIndex) - if err2 != nil { - err = err2 - tx.Rollback() - c.logger.Errorf("error calling getClaim with globalIndex %s: %v", globalIndex.String(), err) - continue - } - if claim.TxID == "" { - txID, err2 := c.sender.sendClaim(ctx, claim) - if err2 != nil { - err = err2 - tx.Rollback() - c.logger.Errorf("error calling sendClaim with globalIndex %s: %v", globalIndex.String(), err) - continue - } - claim.TxID = txID - claim.Status = WIPStatus - err2 = putClaim(tx, claim) - if err2 != nil { - err = err2 - tx.Rollback() - c.logger.Errorf("error calling putClaim with globalIndex %s: %v", globalIndex.String(), err) - continue - } - } - err2 = tx.Commit() - if err2 != nil { - err = err2 - c.logger.Errorf("error calling tx.Commit after putting claim: %v", err) - continue - } - - c.logger.Infof("waiting for tx %s with global index %s to succeed or fail", claim.TxID, globalIndex.String()) - status, err2 := c.waitTxToBeSuccessOrFail(ctx, claim.TxID) - if err2 != nil { - err = err2 - c.logger.Errorf("error calling waitTxToBeSuccessOrFail for tx %s: %v", claim.TxID, err) - continue - } - c.logger.Infof("tx %s with global index %s concluded with status: %s", claim.TxID, globalIndex.String(), status) - tx, err2 = c.db.BeginRw(ctx) - if err2 != nil { - err = err2 - c.logger.Errorf("error calling BeginRw: %v", err) - continue - } - claim.Status = status - err2 = putClaim(tx, claim) - if err2 != nil { - err = err2 - tx.Rollback() - c.logger.Errorf("error calling putClaim with globalIndex %s: %v", globalIndex.String(), err) - continue - } - err2 = tx.Delete(queueTable, dbCommon.Uint64ToBytes(queueIndex)) - if err2 != nil { - err = err2 - tx.Rollback() - c.logger.Errorf("error calling delete on the queue table with index %d: %v", queueIndex, err) - continue - } - err2 = tx.Commit() - if err2 != nil { - err = err2 - c.logger.Errorf("error calling tx.Commit after putting claim: %v", err) - continue - } - - attempts = 0 } } -func (c *ClaimSponsor) waitTxToBeSuccessOrFail(ctx context.Context, txID string) (ClaimStatus, error) { - t := time.NewTicker(c.waitTxToBeMinedPeriod) - for { - select { - case <-ctx.Done(): - return "", errors.New("context cancelled") - case <-t.C: - status, err := c.sender.claimStatus(ctx, txID) - if err != nil { - return "", err - } - if status == FailedClaimStatus || status == SuccessClaimStatus { - return status, nil +func (c *ClaimSponsor) claim(ctx context.Context) error { + claim, err := c.getWIPClaim() + if err != nil && !errors.Is(err, db.ErrNotFound) { + return fmt.Errorf("error getting WIP claim: %w", err) + } + if errors.Is(err, db.ErrNotFound) || claim == nil { + // there is no WIP claim, go for the next pending claim + claim, err = c.getFirstPendingClaim() + if err != nil { + if errors.Is(err, db.ErrNotFound) { + c.logger.Debugf("queue is empty") + time.Sleep(c.waitOnEmptyQueue) + return nil } + return fmt.Errorf("error calling getClaim with globalIndex %s: %w", claim.GlobalIndex.String(), err) } - } -} - -func (c *ClaimSponsor) AddClaimToQueue(ctx context.Context, claim *Claim) error { - if claim.GlobalIndex == nil { - return ErrInvalidClaim - } - claim.Status = PendingClaimStatus - tx, err := c.db.BeginRw(ctx) - if err != nil { - return err - } - - _, err = getClaim(tx, claim.GlobalIndex) - if !errors.Is(err, db.ErrNotFound) { + txID, err := c.sender.sendClaim(ctx, claim) if err != nil { - tx.Rollback() - - return err - } else { - tx.Rollback() - - return errors.New("claim already added") + return fmt.Errorf("error getting sending claim: %w", err) + } + if err := c.updateClaimTxID(claim.GlobalIndex, txID); err != nil { + return fmt.Errorf("error updating claim txID: %w", err) } } - err = putClaim(tx, claim) - if err != nil { - tx.Rollback() - - return err - } - - var queuePosition uint64 - lastQueuePosition, _, err := getLastQueueIndex(tx) - switch { - case errors.Is(err, db.ErrNotFound): - queuePosition = 0 - - case err != nil: - tx.Rollback() - - return err - - default: - queuePosition = lastQueuePosition + 1 - } - - err = tx.Put(queueTable, dbCommon.Uint64ToBytes(queuePosition), claim.Key()) + c.logger.Infof("waiting for tx %s with global index %s to succeed or fail", claim.TxID, claim.GlobalIndex.String()) + status, err := c.waitTxToBeSuccessOrFail(ctx, claim.TxID) if err != nil { - tx.Rollback() - - return err + return fmt.Errorf("error calling waitTxToBeSuccessOrFail for tx %s: %w", claim.TxID, err) } - - return tx.Commit() + c.logger.Infof("tx %s with global index %s concluded with status: %s", claim.TxID, claim.GlobalIndex.String(), status) + return c.updateClaimStatus(claim.GlobalIndex, status) } -func putClaim(tx kv.RwTx, claim *Claim) error { - value, err := json.Marshal(claim) - if err != nil { - return err - } +func (c *ClaimSponsor) getWIPClaim() (*Claim, error) { + claim := &Claim{} + err := meddler.QueryRow( + c.db, claim, + `SELECT * FROM claim WHERE status = $1 ORDER BY rowid ASC LIMIT 1;`, + WIPClaimStatus, + ) + return claim, db.ReturnErrNotFound(err) +} - return tx.Put(claimTable, claim.Key(), value) +func (c *ClaimSponsor) getFirstPendingClaim() (*Claim, error) { + claim := &Claim{} + err := meddler.QueryRow( + c.db, claim, + `SELECT * FROM claim WHERE status = $1 ORDER BY rowid ASC LIMIT 1;`, + PendingClaimStatus, + ) + return claim, db.ReturnErrNotFound(err) } -func (c *ClaimSponsor) getClaimByQueueIndex(ctx context.Context, queueIndex uint64) (*Claim, error) { - tx, err := c.db.BeginRo(ctx) +func (c *ClaimSponsor) updateClaimTxID(globalIndex *big.Int, txID string) error { + res, err := c.db.Exec( + `UPDATE claim SET tx_id = $1 WHERE global_index = $2`, + txID, globalIndex.String(), + ) if err != nil { - return nil, err + return fmt.Errorf("error updating claim status: %w", err) } - defer tx.Rollback() - - globalIndexBytes, err := tx.GetOne(queueTable, dbCommon.Uint64ToBytes(queueIndex)) + rowsAff, err := res.RowsAffected() if err != nil { - return nil, err + return fmt.Errorf("error getting rows affected: %w", err) } - if globalIndexBytes == nil { - return nil, db.ErrNotFound + if rowsAff == 0 { + return ErrClaimDoesntExist } - - return getClaim(tx, new(big.Int).SetBytes(globalIndexBytes)) + return nil } -func getLastQueueIndex(tx kv.Tx) (uint64, *big.Int, error) { - iter, err := tx.RangeDescend( - queueTable, - dbCommon.Uint64ToBytes(math.MaxUint64), - dbCommon.Uint64ToBytes(0), 1, +func (c *ClaimSponsor) updateClaimStatus(globalIndex *big.Int, status ClaimStatus) error { + res, err := c.db.Exec( + `UPDATE claim SET status = $1 WHERE global_index = $2`, + status, globalIndex.String(), ) if err != nil { - return 0, nil, err + return fmt.Errorf("error updating claim status: %w", err) } - - return getIndex(iter) -} - -func getFirstQueueIndex(tx kv.Tx) (uint64, *big.Int, error) { - iter, err := tx.RangeAscend( - queueTable, - dbCommon.Uint64ToBytes(0), - nil, 1, - ) + rowsAff, err := res.RowsAffected() if err != nil { - return 0, nil, err + return fmt.Errorf("error getting rows affected: %w", err) } - - return getIndex(iter) -} - -func getIndex(iter iter.KV) (uint64, *big.Int, error) { - k, v, err := iter.Next() - if err != nil { - return 0, nil, err - } - if k == nil { - return 0, nil, db.ErrNotFound + if rowsAff == 0 { + return ErrClaimDoesntExist } - globalIndex := new(big.Int).SetBytes(v) - - return dbCommon.BytesToUint64(k), globalIndex, nil + return nil } -func (c *ClaimSponsor) GetClaim(ctx context.Context, globalIndex *big.Int) (*Claim, error) { - tx, err := c.db.BeginRo(ctx) - if err != nil { - return nil, err +func (c *ClaimSponsor) waitTxToBeSuccessOrFail(ctx context.Context, txID string) (ClaimStatus, error) { + t := time.NewTicker(c.waitTxToBeMinedPeriod) + for { + select { + case <-ctx.Done(): + return "", errors.New("context cancelled") + case <-t.C: + status, err := c.sender.claimStatus(ctx, txID) + if err != nil { + return "", err + } + if status == FailedClaimStatus || status == SuccessClaimStatus { + return status, nil + } + } } - defer tx.Rollback() +} - return getClaim(tx, globalIndex) +func (c *ClaimSponsor) AddClaimToQueue(claim *Claim) error { + claim.Status = PendingClaimStatus + return meddler.Insert(c.db, "claim", claim) } -func getClaim(tx kv.Tx, globalIndex *big.Int) (*Claim, error) { - claimBytes, err := tx.GetOne(claimTable, globalIndex.Bytes()) - if err != nil { - return nil, err - } - if claimBytes == nil { - return nil, db.ErrNotFound - } +func (c *ClaimSponsor) GetClaim(globalIndex *big.Int) (*Claim, error) { claim := &Claim{} - err = json.Unmarshal(claimBytes, claim) - - return claim, err + err := meddler.QueryRow( + c.db, claim, `SELECT * FROM claim WHERE global_index = $1`, globalIndex.String(), + ) + return claim, db.ReturnErrNotFound(err) } diff --git a/claimsponsor/e2e_test.go b/claimsponsor/e2e_test.go index 426d7b3ed..dc61416e4 100644 --- a/claimsponsor/e2e_test.go +++ b/claimsponsor/e2e_test.go @@ -31,7 +31,7 @@ func TestE2EL1toEVML2(t *testing.T) { go bridgeSyncL1.Start(ctx) // start claim sponsor - dbPathClaimSponsor := t.TempDir() + dbPathClaimSponsor := path.Join(t.TempDir(), "file::memory:?cache=shared") claimer, err := claimsponsor.NewEVMClaimSponsor( log.GetDefaultLogger(), dbPathClaimSponsor, @@ -71,7 +71,7 @@ func TestE2EL1toEVML2(t *testing.T) { // Request to sponsor claim globalIndex := bridgesync.GenerateGlobalIndex(true, 0, uint32(i)) - err = claimer.AddClaimToQueue(ctx, &claimsponsor.Claim{ + err = claimer.AddClaimToQueue(&claimsponsor.Claim{ LeafType: 0, ProofLocalExitRoot: localProof, ProofRollupExitRoot: rollupProof, @@ -90,7 +90,7 @@ func TestE2EL1toEVML2(t *testing.T) { // Wait until success succeed := false for i := 0; i < 10; i++ { - claim, err := claimer.GetClaim(ctx, globalIndex) + claim, err := claimer.GetClaim(globalIndex) require.NoError(t, err) if claim.Status == claimsponsor.FailedClaimStatus { require.NoError(t, errors.New("claim failed")) diff --git a/claimsponsor/evmclaimsponsor.go b/claimsponsor/evmclaimsponsor.go index 12d0c4ca8..6f315d940 100644 --- a/claimsponsor/evmclaimsponsor.go +++ b/claimsponsor/evmclaimsponsor.go @@ -168,7 +168,7 @@ func (c *EVMClaimSponsor) claimStatus(ctx context.Context, id string) (ClaimStat switch res.Status { case ethtxtypes.MonitoredTxStatusCreated, ethtxtypes.MonitoredTxStatusSent: - return WIPStatus, nil + return WIPClaimStatus, nil case ethtxtypes.MonitoredTxStatusFailed: return FailedClaimStatus, nil case ethtxtypes.MonitoredTxStatusMined, diff --git a/claimsponsor/migrations/claimsponsor0001.sql b/claimsponsor/migrations/claimsponsor0001.sql new file mode 100644 index 000000000..9e4586ea3 --- /dev/null +++ b/claimsponsor/migrations/claimsponsor0001.sql @@ -0,0 +1,20 @@ +-- +migrate Down +DROP TABLE IF EXISTS claim; + +-- +migrate Up +CREATE TABLE claim ( + leaf_type INT NOT NULL, + proof_local_exit_root VARCHAR NOT NULL, + proof_rollup_exit_root VARCHAR NOT NULL, + global_index VARCHAR NOT NULL, + mainnet_exit_root VARCHAR NOT NULL, + rollup_exit_root VARCHAR NOT NULL, + origin_network INT NOT NULL, + origin_token_address VARCHAR NOT NULL, + destination_network INT NOT NULL, + destination_address VARCHAR NOT NULL, + amount VARCHAR NOT NULL, + metadata VARCHAR, + status VARCHAR NOT NULL, + tx_id VARCHAR NOT NULL +); \ No newline at end of file diff --git a/claimsponsor/migrations/migrations.go b/claimsponsor/migrations/migrations.go new file mode 100644 index 000000000..9166b5b3a --- /dev/null +++ b/claimsponsor/migrations/migrations.go @@ -0,0 +1,21 @@ +package migrations + +import ( + _ "embed" + + "github.com/0xPolygon/cdk/db" + "github.com/0xPolygon/cdk/db/types" +) + +//go:embed claimsponsor0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "claimsponsor0001", + SQL: mig001, + }, + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/rpc/bridge.go b/rpc/bridge.go index e98651084..7b52ed736 100644 --- a/rpc/bridge.go +++ b/rpc/bridge.go @@ -229,7 +229,7 @@ func (b *BridgeEndpoints) SponsorClaim(claim claimsponsor.Claim) (interface{}, r fmt.Sprintf("this client only sponsors claims for network %d", b.networkID), ) } - if err := b.sponsor.AddClaimToQueue(ctx, &claim); err != nil { + if err := b.sponsor.AddClaimToQueue(&claim); err != nil { return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("error adding claim to the queue %s", err)) } return nil, nil @@ -250,7 +250,7 @@ func (b *BridgeEndpoints) GetSponsoredClaimStatus(globalIndex *big.Int) (interfa if b.sponsor == nil { return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, "this client does not support claim sponsoring") } - claim, err := b.sponsor.GetClaim(ctx, globalIndex) + claim, err := b.sponsor.GetClaim(globalIndex) if err != nil { return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get claim status, error: %s", err)) } diff --git a/rpc/bridge_interfaces.go b/rpc/bridge_interfaces.go index 89929531a..bf6721ea7 100644 --- a/rpc/bridge_interfaces.go +++ b/rpc/bridge_interfaces.go @@ -36,6 +36,6 @@ type L1InfoTreer interface { } type ClaimSponsorer interface { - AddClaimToQueue(ctx context.Context, claim *claimsponsor.Claim) error - GetClaim(ctx context.Context, globalIndex *big.Int) (*claimsponsor.Claim, error) + AddClaimToQueue(claim *claimsponsor.Claim) error + GetClaim(globalIndex *big.Int) (*claimsponsor.Claim, error) } diff --git a/rpc/mocks/claim_sponsorer.go b/rpc/mocks/claim_sponsorer.go index 595309556..9a9ef9b5e 100644 --- a/rpc/mocks/claim_sponsorer.go +++ b/rpc/mocks/claim_sponsorer.go @@ -3,11 +3,9 @@ package mocks import ( - context "context" big "math/big" claimsponsor "github.com/0xPolygon/cdk/claimsponsor" - mock "github.com/stretchr/testify/mock" ) @@ -24,17 +22,17 @@ func (_m *ClaimSponsorer) EXPECT() *ClaimSponsorer_Expecter { return &ClaimSponsorer_Expecter{mock: &_m.Mock} } -// AddClaimToQueue provides a mock function with given fields: ctx, claim -func (_m *ClaimSponsorer) AddClaimToQueue(ctx context.Context, claim *claimsponsor.Claim) error { - ret := _m.Called(ctx, claim) +// AddClaimToQueue provides a mock function with given fields: claim +func (_m *ClaimSponsorer) AddClaimToQueue(claim *claimsponsor.Claim) error { + ret := _m.Called(claim) if len(ret) == 0 { panic("no return value specified for AddClaimToQueue") } var r0 error - if rf, ok := ret.Get(0).(func(context.Context, *claimsponsor.Claim) error); ok { - r0 = rf(ctx, claim) + if rf, ok := ret.Get(0).(func(*claimsponsor.Claim) error); ok { + r0 = rf(claim) } else { r0 = ret.Error(0) } @@ -48,15 +46,14 @@ type ClaimSponsorer_AddClaimToQueue_Call struct { } // AddClaimToQueue is a helper method to define mock.On call -// - ctx context.Context // - claim *claimsponsor.Claim -func (_e *ClaimSponsorer_Expecter) AddClaimToQueue(ctx interface{}, claim interface{}) *ClaimSponsorer_AddClaimToQueue_Call { - return &ClaimSponsorer_AddClaimToQueue_Call{Call: _e.mock.On("AddClaimToQueue", ctx, claim)} +func (_e *ClaimSponsorer_Expecter) AddClaimToQueue(claim interface{}) *ClaimSponsorer_AddClaimToQueue_Call { + return &ClaimSponsorer_AddClaimToQueue_Call{Call: _e.mock.On("AddClaimToQueue", claim)} } -func (_c *ClaimSponsorer_AddClaimToQueue_Call) Run(run func(ctx context.Context, claim *claimsponsor.Claim)) *ClaimSponsorer_AddClaimToQueue_Call { +func (_c *ClaimSponsorer_AddClaimToQueue_Call) Run(run func(claim *claimsponsor.Claim)) *ClaimSponsorer_AddClaimToQueue_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*claimsponsor.Claim)) + run(args[0].(*claimsponsor.Claim)) }) return _c } @@ -66,14 +63,14 @@ func (_c *ClaimSponsorer_AddClaimToQueue_Call) Return(_a0 error) *ClaimSponsorer return _c } -func (_c *ClaimSponsorer_AddClaimToQueue_Call) RunAndReturn(run func(context.Context, *claimsponsor.Claim) error) *ClaimSponsorer_AddClaimToQueue_Call { +func (_c *ClaimSponsorer_AddClaimToQueue_Call) RunAndReturn(run func(*claimsponsor.Claim) error) *ClaimSponsorer_AddClaimToQueue_Call { _c.Call.Return(run) return _c } -// GetClaim provides a mock function with given fields: ctx, globalIndex -func (_m *ClaimSponsorer) GetClaim(ctx context.Context, globalIndex *big.Int) (*claimsponsor.Claim, error) { - ret := _m.Called(ctx, globalIndex) +// GetClaim provides a mock function with given fields: globalIndex +func (_m *ClaimSponsorer) GetClaim(globalIndex *big.Int) (*claimsponsor.Claim, error) { + ret := _m.Called(globalIndex) if len(ret) == 0 { panic("no return value specified for GetClaim") @@ -81,19 +78,19 @@ func (_m *ClaimSponsorer) GetClaim(ctx context.Context, globalIndex *big.Int) (* var r0 *claimsponsor.Claim var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*claimsponsor.Claim, error)); ok { - return rf(ctx, globalIndex) + if rf, ok := ret.Get(0).(func(*big.Int) (*claimsponsor.Claim, error)); ok { + return rf(globalIndex) } - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *claimsponsor.Claim); ok { - r0 = rf(ctx, globalIndex) + if rf, ok := ret.Get(0).(func(*big.Int) *claimsponsor.Claim); ok { + r0 = rf(globalIndex) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*claimsponsor.Claim) } } - if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { - r1 = rf(ctx, globalIndex) + if rf, ok := ret.Get(1).(func(*big.Int) error); ok { + r1 = rf(globalIndex) } else { r1 = ret.Error(1) } @@ -107,15 +104,14 @@ type ClaimSponsorer_GetClaim_Call struct { } // GetClaim is a helper method to define mock.On call -// - ctx context.Context // - globalIndex *big.Int -func (_e *ClaimSponsorer_Expecter) GetClaim(ctx interface{}, globalIndex interface{}) *ClaimSponsorer_GetClaim_Call { - return &ClaimSponsorer_GetClaim_Call{Call: _e.mock.On("GetClaim", ctx, globalIndex)} +func (_e *ClaimSponsorer_Expecter) GetClaim(globalIndex interface{}) *ClaimSponsorer_GetClaim_Call { + return &ClaimSponsorer_GetClaim_Call{Call: _e.mock.On("GetClaim", globalIndex)} } -func (_c *ClaimSponsorer_GetClaim_Call) Run(run func(ctx context.Context, globalIndex *big.Int)) *ClaimSponsorer_GetClaim_Call { +func (_c *ClaimSponsorer_GetClaim_Call) Run(run func(globalIndex *big.Int)) *ClaimSponsorer_GetClaim_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*big.Int)) + run(args[0].(*big.Int)) }) return _c } @@ -125,7 +121,7 @@ func (_c *ClaimSponsorer_GetClaim_Call) Return(_a0 *claimsponsor.Claim, _a1 erro return _c } -func (_c *ClaimSponsorer_GetClaim_Call) RunAndReturn(run func(context.Context, *big.Int) (*claimsponsor.Claim, error)) *ClaimSponsorer_GetClaim_Call { +func (_c *ClaimSponsorer_GetClaim_Call) RunAndReturn(run func(*big.Int) (*claimsponsor.Claim, error)) *ClaimSponsorer_GetClaim_Call { _c.Call.Return(run) return _c } From effc267b047ab814f1a4a0e32c4f48a7fe01a5f8 Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Wed, 6 Nov 2024 07:37:41 +0000 Subject: [PATCH 06/13] chore: update versions --- crates/cdk/versions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cdk/versions.json b/crates/cdk/versions.json index 7cbe12dd8..0ee843615 100644 --- a/crates/cdk/versions.json +++ b/crates/cdk/versions.json @@ -1,5 +1,5 @@ { - "agglayer_image": "ghcr.io/agglayer/agglayer:feature-storage-adding-epoch-packing", + "agglayer_image": "ghcr.io/agglayer/agglayer:0.2.0", "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.1.1", "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.4.0-beta1", "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", From a5422d2de3afc45de6f933208fa72162f98387ac Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Wed, 6 Nov 2024 07:42:54 +0000 Subject: [PATCH 07/13] chore: bump cdk-erigon to v2.1.2 --- test/combinations/fork11-rollup.yml | 2 +- test/combinations/fork12-cdk-validium.yml | 2 +- test/combinations/fork12-rollup.yml | 2 +- test/combinations/fork9-cdk-validium.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/combinations/fork11-rollup.yml b/test/combinations/fork11-rollup.yml index 1afd8f793..fb9417603 100644 --- a/test/combinations/fork11-rollup.yml +++ b/test/combinations/fork11-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.2-fork.11 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11-RC1 cdk_node_image: cdk zkevm_use_gas_token_contract: true diff --git a/test/combinations/fork12-cdk-validium.yml b/test/combinations/fork12-cdk-validium.yml index ed6187546..9619b0f91 100644 --- a/test/combinations/fork12-cdk-validium.yml +++ b/test/combinations/fork12-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: cdk-validium diff --git a/test/combinations/fork12-rollup.yml b/test/combinations/fork12-rollup.yml index c97a25cff..95a5111a8 100644 --- a/test/combinations/fork12-rollup.yml +++ b/test/combinations/fork12-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: rollup diff --git a/test/combinations/fork9-cdk-validium.yml b/test/combinations/fork9-cdk-validium.yml index c28b2c492..e05436546 100644 --- a/test/combinations/fork9-cdk-validium.yml +++ b/test/combinations/fork9-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.6 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3-RC1 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk cdk_node_image: cdk From 910b23bbac1c45002eaeaae8ef51f13f00e49a20 Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Wed, 6 Nov 2024 07:45:55 +0000 Subject: [PATCH 08/13] Revert "chore: bump cdk-erigon to v2.1.2" This reverts commit a5422d2de3afc45de6f933208fa72162f98387ac. --- test/combinations/fork11-rollup.yml | 2 +- test/combinations/fork12-cdk-validium.yml | 2 +- test/combinations/fork12-rollup.yml | 2 +- test/combinations/fork9-cdk-validium.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/combinations/fork11-rollup.yml b/test/combinations/fork11-rollup.yml index fb9417603..1afd8f793 100644 --- a/test/combinations/fork11-rollup.yml +++ b/test/combinations/fork11-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.2-fork.11 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11-RC1 cdk_node_image: cdk zkevm_use_gas_token_contract: true diff --git a/test/combinations/fork12-cdk-validium.yml b/test/combinations/fork12-cdk-validium.yml index 9619b0f91..ed6187546 100644 --- a/test/combinations/fork12-cdk-validium.yml +++ b/test/combinations/fork12-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: cdk-validium diff --git a/test/combinations/fork12-rollup.yml b/test/combinations/fork12-rollup.yml index 95a5111a8..c97a25cff 100644 --- a/test/combinations/fork12-rollup.yml +++ b/test/combinations/fork12-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: rollup diff --git a/test/combinations/fork9-cdk-validium.yml b/test/combinations/fork9-cdk-validium.yml index e05436546..c28b2c492 100644 --- a/test/combinations/fork9-cdk-validium.yml +++ b/test/combinations/fork9-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.6 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3-RC1 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk cdk_node_image: cdk From 02026144d8aa1e90176fd568d23089b6f17f5866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20Ram=C3=ADrez?= <58293609+ToniRamirezM@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:17:20 +0100 Subject: [PATCH 09/13] feat: update zkevm-ethtx-manager to v0.2.1 (#153) --- go.mod | 3 +-- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 631e54b7c..4a3a983e4 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,7 @@ require ( github.com/0xPolygon/cdk-contracts-tooling v0.0.0-20240826154954-f6182d2b17a2 github.com/0xPolygon/cdk-data-availability v0.0.10 github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 - github.com/0xPolygon/zkevm-ethtx-manager v0.2.0 - github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7 + github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5 github.com/ethereum/go-ethereum v1.14.8 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 diff --git a/go.sum b/go.sum index 4a0095c83..28771a515 100644 --- a/go.sum +++ b/go.sum @@ -4,12 +4,8 @@ github.com/0xPolygon/cdk-data-availability v0.0.10 h1:pVcke2I7GuPH7JeRLKokEOHffP github.com/0xPolygon/cdk-data-availability v0.0.10/go.mod h1:nn5RmnkzOiugAxizSbaYnA+em79YLLLoR25i0UlKc5Q= github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 h1:FXL/rcO7/GtZ3kRFw+C7J6vmGnl8gcazg+Gh/NVmnas= github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6/go.mod h1:2scWqMMufrQXu7TikDgQ3BsyaKoX8qP26D6E262vSOg= -github.com/0xPolygon/zkevm-ethtx-manager v0.2.0 h1:QWE6nKBBHkMEiza723hJk0+oZbLSdQZTX4I48jWw15I= -github.com/0xPolygon/zkevm-ethtx-manager v0.2.0/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= -github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7 h1:73sYxRQ9cOmtYBEyHePgEwrVULR+YruSQxVXCt/SmzU= -github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7/go.mod h1:7nM7Ihk+fTG1TQPwdZoGOYd3wprqqyIyjtS514uHzWE= -github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.4 h1:+ZbyEpaBZu88jWtov/7iBWvwgBMu5cxlvAFDxsPrnGQ= -github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.4/go.mod h1:X4Su/M/+hSISqdl9yomKlRsbTyuZHsRohporyHsP8gg= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 h1:2Yb+KdJFMpVrS9LIkd658XiWuN+MCTs7SgeWaopXScg= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5 h1:YmnhuCl349MoNASN0fMeGKU1o9HqJhiZkfMsA/1cTRA= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5/go.mod h1:X4Su/M/+hSISqdl9yomKlRsbTyuZHsRohporyHsP8gg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= From 36255b30230b3b4d7d8dfcd135ccad3b035a5f2a Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Wed, 6 Nov 2024 11:24:26 +0000 Subject: [PATCH 10/13] hotfix: bad merge --- go.mod | 1 + go.sum | 2 ++ 2 files changed, 3 insertions(+) diff --git a/go.mod b/go.mod index 4a3a983e4..c51772c17 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( ) require ( + github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7 // indirect github.com/DataDog/zstd v1.5.6 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect diff --git a/go.sum b/go.sum index 28771a515..b010c905e 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 h1:FXL/rcO7/GtZ3 github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6/go.mod h1:2scWqMMufrQXu7TikDgQ3BsyaKoX8qP26D6E262vSOg= github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 h1:2Yb+KdJFMpVrS9LIkd658XiWuN+MCTs7SgeWaopXScg= github.com/0xPolygon/zkevm-ethtx-manager v0.2.1/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= +github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7 h1:73sYxRQ9cOmtYBEyHePgEwrVULR+YruSQxVXCt/SmzU= +github.com/0xPolygonHermez/zkevm-data-streamer v0.2.7/go.mod h1:7nM7Ihk+fTG1TQPwdZoGOYd3wprqqyIyjtS514uHzWE= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5 h1:YmnhuCl349MoNASN0fMeGKU1o9HqJhiZkfMsA/1cTRA= github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.5/go.mod h1:X4Su/M/+hSISqdl9yomKlRsbTyuZHsRohporyHsP8gg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= From 85c5735ee0ca0b873725b63c957ded958228187f Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Wed, 6 Nov 2024 15:35:04 +0000 Subject: [PATCH 11/13] apply feedback --- crates/cdk/build.rs | 20 ++++++-------------- crates/cdk/versions.json | 2 +- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/crates/cdk/build.rs b/crates/cdk/build.rs index 802b68c0a..cceff95c9 100644 --- a/crates/cdk/build.rs +++ b/crates/cdk/build.rs @@ -67,7 +67,7 @@ fn build_versions() -> std::io::Result<()> { let mut file = File::create(&dest_path)?; file.write_all(content.as_bytes())?; - // Get lines 28 to 40 from the contents of the starlark file + // Get the corresponding lines from the contents of the starlark file let versions = content .lines() .skip(30) @@ -84,8 +84,6 @@ fn build_versions() -> std::io::Result<()> { // Replace the trailing comma on the last line let versions = versions.replace(", }", " }"); - print!("{}", versions); - // The versions string is a JSON object we can parse let versions_json: serde_json::Value = serde_json::from_str(&versions).unwrap(); @@ -93,18 +91,12 @@ fn build_versions() -> std::io::Result<()> { let dest_path = Path::new(".").join("versions.json"); let mut file = File::create(&dest_path)?; file.write_all( - serde_json::to_string_pretty(&versions_json) - .unwrap() - .as_bytes(), + format!( + "{}\n", + serde_json::to_string_pretty(&versions_json).unwrap() + ) + .as_bytes(), )?; - // Optionally, print the output of the make command - println!("cargo:rerun-if-changed=build.rs"); - - // Here you can also add additional commands to inform Cargo about - // how to rerun the build script. For example, to rerun this script - // only when a specific file changes: - // println!("cargo:rerun-if-changed=path/to/file"); - Ok(()) } diff --git a/crates/cdk/versions.json b/crates/cdk/versions.json index 0ee843615..13e1c4302 100644 --- a/crates/cdk/versions.json +++ b/crates/cdk/versions.json @@ -12,4 +12,4 @@ "zkevm_pool_manager_image": "hermeznetwork/zkevm-pool-manager:v0.1.1", "zkevm_prover_image": "hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12", "zkevm_sequence_sender_image": "hermeznetwork/zkevm-sequence-sender:v0.2.4" -} \ No newline at end of file +} From 5bee873df5d06971d1c7c9545dfc2649b140bc5d Mon Sep 17 00:00:00 2001 From: Victor Castell Date: Wed, 6 Nov 2024 16:36:58 +0100 Subject: [PATCH 12/13] Reapply "chore: bump cdk-erigon to v2.1.2" (#162) This reverts commit 910b23bbac1c45002eaeaae8ef51f13f00e49a20. --- test/combinations/fork11-rollup.yml | 2 +- test/combinations/fork12-cdk-validium.yml | 2 +- test/combinations/fork12-rollup.yml | 2 +- test/combinations/fork9-cdk-validium.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/combinations/fork11-rollup.yml b/test/combinations/fork11-rollup.yml index 1afd8f793..fb9417603 100644 --- a/test/combinations/fork11-rollup.yml +++ b/test/combinations/fork11-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.2-fork.11 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11-RC1 cdk_node_image: cdk zkevm_use_gas_token_contract: true diff --git a/test/combinations/fork12-cdk-validium.yml b/test/combinations/fork12-cdk-validium.yml index ed6187546..9619b0f91 100644 --- a/test/combinations/fork12-cdk-validium.yml +++ b/test/combinations/fork12-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: cdk-validium diff --git a/test/combinations/fork12-rollup.yml b/test/combinations/fork12-rollup.yml index c97a25cff..95a5111a8 100644 --- a/test/combinations/fork12-rollup.yml +++ b/test/combinations/fork12-rollup.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 cdk_node_image: cdk zkevm_use_gas_token_contract: true data_availability_mode: rollup diff --git a/test/combinations/fork9-cdk-validium.yml b/test/combinations/fork9-cdk-validium.yml index c28b2c492..e05436546 100644 --- a/test/combinations/fork9-cdk-validium.yml +++ b/test/combinations/fork9-cdk-validium.yml @@ -1,7 +1,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.6 - cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.0 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3-RC1 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk cdk_node_image: cdk From c0724a0aa8365e2e87a9741301dcbf28b1ef7889 Mon Sep 17 00:00:00 2001 From: Victor Castell <0x@vcastellm.xyz> Date: Thu, 7 Nov 2024 07:50:55 +0000 Subject: [PATCH 13/13] bump versions --- crates/cdk/versions.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/cdk/versions.json b/crates/cdk/versions.json index 13e1c4302..36f2af1f7 100644 --- a/crates/cdk/versions.json +++ b/crates/cdk/versions.json @@ -1,7 +1,7 @@ { - "agglayer_image": "ghcr.io/agglayer/agglayer:0.2.0", - "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.1.1", - "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.4.0-beta1", + "agglayer_image": "ghcr.io/agglayer/agglayer:0.2.0-rc.5", + "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.1.2", + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.4.0-beta4", "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", "zkevm_bridge_proxy_image": "haproxy:3.0-bookworm", "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC1",