From f0e92861d8f2c0f8b483a14dff801e715b2135d9 Mon Sep 17 00:00:00 2001 From: colinlyguo Date: Tue, 30 Jul 2024 14:59:16 +0800 Subject: [PATCH 1/2] chore: cleanup libzkp interfaces used by coordinator and update da-codec dependency --- bridge-history-api/go.mod | 2 +- bridge-history-api/go.sum | 4 +- common/forks/forks.go | 71 ----------- common/forks/forks_test.go | 102 ---------------- common/go.mod | 2 +- common/go.sum | 4 +- common/libzkp/impl/Cargo.toml | 2 - common/libzkp/impl/src/batch.rs | 201 +------------------------------ common/libzkp/impl/src/chunk.rs | 82 +------------ common/libzkp/impl/src/utils.rs | 37 +----- common/libzkp/interface/libzkp.h | 15 --- coordinator/go.mod | 2 +- coordinator/go.sum | 4 +- rollup/go.mod | 2 +- rollup/go.sum | 4 +- tests/integration-test/go.mod | 2 +- tests/integration-test/go.sum | 4 +- 17 files changed, 24 insertions(+), 516 deletions(-) delete mode 100644 common/forks/forks_test.go diff --git a/bridge-history-api/go.mod b/bridge-history-api/go.mod index efc658fc8d..df8e8bba5c 100644 --- a/bridge-history-api/go.mod +++ b/bridge-history-api/go.mod @@ -89,7 +89,7 @@ require ( github.com/rjeczalik/notify v0.9.1 // indirect github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 // indirect + github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb // indirect github.com/scroll-tech/zktrie v0.8.4 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect diff --git a/bridge-history-api/go.sum b/bridge-history-api/go.sum index 4aaf31843b..5c279d0e60 100644 --- a/bridge-history-api/go.sum +++ b/bridge-history-api/go.sum @@ -308,8 +308,8 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 h1:QKgfS8G0btzg7nmFjSjllaxGkns3yg7g2/tG1nWExEI= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb h1:uOKdmDT0LsuS3gfynEjR4zA3Ooh6p2Z3O+IMRj2r8LA= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 h1:Q8YyvrcPIcXQwE4ucm4bqmPh6TP6IB1GUTXripf2WyQ= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6/go.mod h1:byf/mZ8jLYUCnUePTicjJWn+RvKdxDn7buS6glTnMwQ= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= diff --git a/common/forks/forks.go b/common/forks/forks.go index be4e0deba7..a65a49c1fa 100644 --- a/common/forks/forks.go +++ b/common/forks/forks.go @@ -1,83 +1,12 @@ package forks import ( - "math" "math/big" - "sort" "github.com/scroll-tech/da-codec/encoding" "github.com/scroll-tech/go-ethereum/params" ) -// CollectSortedForkHeights returns a sorted set of block numbers that one or more forks are activated on -func CollectSortedForkHeights(config *params.ChainConfig) ([]uint64, map[uint64]bool, map[string]uint64) { - type nameFork struct { - name string - block *big.Int - } - - forkHeightNameMap := make(map[uint64]string) - - for _, fork := range []nameFork{ - {name: "homestead", block: config.HomesteadBlock}, - {name: "daoFork", block: config.DAOForkBlock}, - {name: "eip150", block: config.EIP150Block}, - {name: "eip155", block: config.EIP155Block}, - {name: "eip158", block: config.EIP158Block}, - {name: "byzantium", block: config.ByzantiumBlock}, - {name: "constantinople", block: config.ConstantinopleBlock}, - {name: "petersburg", block: config.PetersburgBlock}, - {name: "istanbul", block: config.IstanbulBlock}, - {name: "muirGlacier", block: config.MuirGlacierBlock}, - {name: "berlin", block: config.BerlinBlock}, - {name: "london", block: config.LondonBlock}, - {name: "arrowGlacier", block: config.ArrowGlacierBlock}, - {name: "archimedes", block: config.ArchimedesBlock}, - {name: "shanghai", block: config.ShanghaiBlock}, - {name: "bernoulli", block: config.BernoulliBlock}, - {name: "curie", block: config.CurieBlock}, - } { - if fork.block == nil { - continue - } - height := fork.block.Uint64() - - // only keep latest fork for at each height, discard the rest - forkHeightNameMap[height] = fork.name - } - - forkHeightsMap := make(map[uint64]bool) - forkNameHeightMap := make(map[string]uint64) - - for height, name := range forkHeightNameMap { - forkHeightsMap[height] = true - forkNameHeightMap[name] = height - } - - var forkHeights []uint64 - for height := range forkHeightsMap { - forkHeights = append(forkHeights, height) - } - sort.Slice(forkHeights, func(i, j int) bool { - return forkHeights[i] < forkHeights[j] - }) - return forkHeights, forkHeightsMap, forkNameHeightMap -} - -// BlockRange returns the block range of the hard fork -// Need ensure the forkHeights is incremental -func BlockRange(currentForkHeight uint64, forkHeights []uint64) (from, to uint64) { - to = math.MaxInt64 - for _, height := range forkHeights { - if currentForkHeight < height { - to = height - return - } - from = height - } - return -} - // GetHardforkName returns the name of the hardfork active at the given block height and timestamp. // It checks the chain configuration to determine which hardfork is active. func GetHardforkName(config *params.ChainConfig, blockHeight, blockTimestamp uint64) string { diff --git a/common/forks/forks_test.go b/common/forks/forks_test.go deleted file mode 100644 index 44292db389..0000000000 --- a/common/forks/forks_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package forks - -import ( - "math" - "math/big" - "testing" - - "github.com/scroll-tech/go-ethereum/params" - "github.com/stretchr/testify/require" -) - -func TestCollectSortedForkBlocks(t *testing.T) { - l, m, n := CollectSortedForkHeights(¶ms.ChainConfig{ - ArchimedesBlock: big.NewInt(0), - ShanghaiBlock: big.NewInt(3), - BernoulliBlock: big.NewInt(3), - CurieBlock: big.NewInt(4), - }) - require.Equal(t, l, []uint64{ - 0, - 3, - 4, - }) - require.Equal(t, map[uint64]bool{ - 3: true, - 4: true, - 0: true, - }, m) - require.Equal(t, map[string]uint64{ - "archimedes": 0, - "bernoulli": 3, - "curie": 4, - }, n) -} - -func TestBlockRange(t *testing.T) { - tests := []struct { - name string - forkHeight uint64 - forkHeights []uint64 - expectedFrom uint64 - expectedTo uint64 - }{ - { - name: "ToInfinite", - forkHeight: 300, - forkHeights: []uint64{100, 200, 300}, - expectedFrom: 300, - expectedTo: math.MaxInt64, - }, - { - name: "To300", - forkHeight: 200, - forkHeights: []uint64{100, 200, 300}, - expectedFrom: 200, - expectedTo: 300, - }, - { - name: "To200", - forkHeight: 100, - forkHeights: []uint64{100, 200, 300}, - expectedFrom: 100, - expectedTo: 200, - }, - { - name: "To100", - forkHeight: 0, - forkHeights: []uint64{100, 200, 300}, - expectedFrom: 0, - expectedTo: 100, - }, - { - name: "To200-1", - forkHeight: 100, - forkHeights: []uint64{100, 200}, - expectedFrom: 100, - expectedTo: 200, - }, - { - name: "To2", - forkHeight: 1, - forkHeights: []uint64{1, 2}, - expectedFrom: 1, - expectedTo: 2, - }, - { - name: "ToInfinite-1", - forkHeight: 0, - forkHeights: []uint64{0}, - expectedFrom: 0, - expectedTo: math.MaxInt64, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - from, to := BlockRange(test.forkHeight, test.forkHeights) - require.Equal(t, test.expectedFrom, from) - require.Equal(t, test.expectedTo, to) - }) - } -} diff --git a/common/go.mod b/common/go.mod index 9b3396d99f..1b13e8f151 100644 --- a/common/go.mod +++ b/common/go.mod @@ -13,7 +13,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 github.com/orcaman/concurrent-map v1.0.0 github.com/prometheus/client_golang v1.19.0 - github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 + github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 github.com/stretchr/testify v1.9.0 github.com/testcontainers/testcontainers-go v0.30.0 diff --git a/common/go.sum b/common/go.sum index 245f3d443b..961f3625f4 100644 --- a/common/go.sum +++ b/common/go.sum @@ -633,8 +633,8 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 h1:QKgfS8G0btzg7nmFjSjllaxGkns3yg7g2/tG1nWExEI= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb h1:uOKdmDT0LsuS3gfynEjR4zA3Ooh6p2Z3O+IMRj2r8LA= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 h1:Q8YyvrcPIcXQwE4ucm4bqmPh6TP6IB1GUTXripf2WyQ= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6/go.mod h1:byf/mZ8jLYUCnUePTicjJWn+RvKdxDn7buS6glTnMwQ= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= diff --git a/common/libzkp/impl/Cargo.toml b/common/libzkp/impl/Cargo.toml index a06cc85061..99de99359d 100644 --- a/common/libzkp/impl/Cargo.toml +++ b/common/libzkp/impl/Cargo.toml @@ -13,8 +13,6 @@ halo2curves = { git = "https://github.com/scroll-tech/halo2curves", branch = "v0 ethers-core = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } ethers-providers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } ethers-signers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } -#ethers-etherscan = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } -#ethers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } [patch."https://github.com/privacy-scaling-explorations/halo2.git"] halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "v1.1" } [patch."https://github.com/privacy-scaling-explorations/poseidon.git"] diff --git a/common/libzkp/impl/src/batch.rs b/common/libzkp/impl/src/batch.rs index e5fb061b1f..9f1252c2cc 100644 --- a/common/libzkp/impl/src/batch.rs +++ b/common/libzkp/impl/src/batch.rs @@ -1,47 +1,15 @@ -use crate::{ - types::{CheckChunkProofsResponse, ProofResult}, - utils::{ - c_char_to_str, c_char_to_vec, file_exists, panic_catch, string_to_c_char, vec_to_c_char, - OUTPUT_DIR, - }, -}; +use crate::utils::{c_char_to_str, c_char_to_vec, panic_catch}; use libc::c_char; use prover_v3::BatchProof as BatchProofLoVersion; use prover_v4::{ - aggregator::{Prover, Verifier as VerifierHiVersion}, - check_chunk_hashes, - consts::BATCH_VK_FILENAME, - utils::{chunk_trace_to_witness_block, init_env_and_log}, - BatchHeader, BatchProof as BatchProofHiVersion, BatchProvingTask, BlockTrace, BundleProof, - BundleProvingTask, ChunkInfo, ChunkProof, MAX_AGG_SNARKS, + aggregator::Verifier as VerifierHiVersion, utils::init_env_and_log, + BatchProof as BatchProofHiVersion, BundleProof, }; use snark_verifier_sdk::verify_evm_calldata; -use std::{cell::OnceCell, env, ptr::null}; +use std::{cell::OnceCell, env}; -static mut PROVER: OnceCell = OnceCell::new(); static mut VERIFIER: OnceCell = OnceCell::new(); -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn init_batch_prover(params_dir: *const c_char, assets_dir: *const c_char) { - init_env_and_log("ffi_batch_prove"); - - let params_dir = c_char_to_str(params_dir); - let assets_dir = c_char_to_str(assets_dir); - - // TODO: add a settings in scroll-prover. - env::set_var("SCROLL_PROVER_ASSETS_DIR", assets_dir); - - // VK file must exist, it is optional and logged as a warning in prover. - if !file_exists(assets_dir, &BATCH_VK_FILENAME) { - panic!("{} must exist in folder {}", *BATCH_VK_FILENAME, assets_dir); - } - - let prover = Prover::from_dirs(params_dir, assets_dir); - - PROVER.set(prover).unwrap(); -} - /// # Safety #[no_mangle] pub unsafe extern "C" fn init_batch_verifier(params_dir: *const c_char, assets_dir: *const c_char) { @@ -57,119 +25,6 @@ pub unsafe extern "C" fn init_batch_verifier(params_dir: *const c_char, assets_d VERIFIER.set(verifier_hi).unwrap(); } -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn get_batch_vk() -> *const c_char { - let vk_result = panic_catch(|| PROVER.get_mut().unwrap().get_batch_vk()); - - vk_result - .ok() - .flatten() - .map_or(null(), |vk| string_to_c_char(base64::encode(vk))) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn get_bundle_vk() -> *const c_char { - let vk_result = panic_catch(|| PROVER.get_mut().unwrap().get_bundle_vk()); - - vk_result - .ok() - .flatten() - .map_or(null(), |vk| string_to_c_char(base64::encode(vk))) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn check_chunk_proofs(chunk_proofs: *const c_char) -> *const c_char { - let check_result: Result = panic_catch(|| { - let chunk_proofs = c_char_to_vec(chunk_proofs); - let chunk_proofs = serde_json::from_slice::>(&chunk_proofs) - .map_err(|e| format!("failed to deserialize chunk proofs: {e:?}"))?; - - if chunk_proofs.is_empty() { - return Err("provided chunk proofs are empty.".to_string()); - } - - let prover_ref = PROVER.get().expect("failed to get reference to PROVER."); - - let valid = prover_ref.check_protocol_of_chunks(&chunk_proofs); - Ok(valid) - }) - .unwrap_or_else(|e| Err(format!("unwind error: {e:?}"))); - - let r = match check_result { - Ok(valid) => CheckChunkProofsResponse { - ok: valid, - error: None, - }, - Err(err) => CheckChunkProofsResponse { - ok: false, - error: Some(err), - }, - }; - - serde_json::to_vec(&r).map_or(null(), vec_to_c_char) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn gen_batch_proof( - chunk_hashes: *const c_char, - chunk_proofs: *const c_char, - batch_header: *const c_char, -) -> *const c_char { - let proof_result: Result, String> = panic_catch(|| { - let chunk_hashes = c_char_to_vec(chunk_hashes); - let chunk_proofs = c_char_to_vec(chunk_proofs); - let batch_header = c_char_to_vec(batch_header); - - let chunk_hashes = serde_json::from_slice::>(&chunk_hashes) - .map_err(|e| format!("failed to deserialize chunk hashes: {e:?}"))?; - let chunk_proofs = serde_json::from_slice::>(&chunk_proofs) - .map_err(|e| format!("failed to deserialize chunk proofs: {e:?}"))?; - let batch_header = serde_json::from_slice::>(&batch_header) - .map_err(|e| format!("failed to deserialize batch header: {e:?}"))?; - - if chunk_hashes.len() != chunk_proofs.len() { - return Err(format!("chunk hashes and chunk proofs lengths mismatch: chunk_hashes.len() = {}, chunk_proofs.len() = {}", - chunk_hashes.len(), chunk_proofs.len())); - } - - let chunk_hashes_proofs: Vec<(_,_)> = chunk_hashes - .into_iter() - .zip(chunk_proofs.clone()) - .collect(); - check_chunk_hashes("", &chunk_hashes_proofs).map_err(|e| format!("failed to check chunk info: {e:?}"))?; - - let batch = BatchProvingTask { - chunk_proofs, - batch_header, - }; - let proof = PROVER - .get_mut() - .expect("failed to get mutable reference to PROVER.") - .gen_batch_proof(batch, None, OUTPUT_DIR.as_deref()) - .map_err(|e| format!("failed to generate proof: {e:?}"))?; - - serde_json::to_vec(&proof).map_err(|e| format!("failed to serialize the proof: {e:?}")) - }) - .unwrap_or_else(|e| Err(format!("unwind error: {e:?}"))); - - let r = match proof_result { - Ok(proof_bytes) => ProofResult { - message: Some(proof_bytes), - error: None, - }, - Err(err) => ProofResult { - message: None, - error: Some(err), - }, - }; - - serde_json::to_vec(&r).map_or(null(), vec_to_c_char) -} - /// # Safety #[no_mangle] pub unsafe extern "C" fn verify_batch_proof( @@ -204,40 +59,6 @@ pub unsafe extern "C" fn verify_batch_proof( verified.unwrap_or(false) as c_char } -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn gen_bundle_proof(batch_proofs: *const c_char) -> *const c_char { - let proof_result: Result, String> = panic_catch(|| { - let batch_proofs = c_char_to_vec(batch_proofs); - let batch_proofs = serde_json::from_slice::>(&batch_proofs) - .map_err(|e| format!("failed to deserialize batch proofs: {e:?}"))?; - - let bundle = BundleProvingTask { batch_proofs }; - let proof = PROVER - .get_mut() - .expect("failed to get mutable reference to PROVER.") - .gen_bundle_proof(bundle, None, OUTPUT_DIR.as_deref()) - .map_err(|e| format!("failed to generate bundle proof: {e:?}"))?; - - serde_json::to_vec(&proof) - .map_err(|e| format!("failed to serialize the bundle proof: {e:?}")) - }) - .unwrap_or_else(|e| Err(format!("unwind error: {e:?}"))); - - let r = match proof_result { - Ok(proof_bytes) => ProofResult { - message: Some(proof_bytes), - error: None, - }, - Err(err) => ProofResult { - message: None, - error: Some(err), - }, - }; - - serde_json::to_vec(&r).map_or(null(), vec_to_c_char) -} - /// # Safety #[no_mangle] pub unsafe extern "C" fn verify_bundle_proof(proof: *const c_char) -> c_char { @@ -246,17 +67,3 @@ pub unsafe extern "C" fn verify_bundle_proof(proof: *const c_char) -> c_char { let verified = panic_catch(|| VERIFIER.get().unwrap().verify_bundle_proof(proof)); verified.unwrap_or(false) as c_char } - -// This function is only used for debugging on Go side. -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn block_traces_to_chunk_info(block_traces: *const c_char) -> *const c_char { - let block_traces = c_char_to_vec(block_traces); - let block_traces = serde_json::from_slice::>(&block_traces).unwrap(); - - let witness_block = chunk_trace_to_witness_block(block_traces).unwrap(); - let chunk_info = ChunkInfo::from_witness_block(&witness_block, false); - - let chunk_info_bytes = serde_json::to_vec(&chunk_info).unwrap(); - vec_to_c_char(chunk_info_bytes) -} diff --git a/common/libzkp/impl/src/chunk.rs b/common/libzkp/impl/src/chunk.rs index dd8d455751..086b4f03a5 100644 --- a/common/libzkp/impl/src/chunk.rs +++ b/common/libzkp/impl/src/chunk.rs @@ -1,45 +1,15 @@ -use crate::{ - types::ProofResult, - utils::{ - c_char_to_str, c_char_to_vec, file_exists, panic_catch, string_to_c_char, vec_to_c_char, - OUTPUT_DIR, - }, -}; +use crate::utils::{c_char_to_str, c_char_to_vec, panic_catch}; use libc::c_char; use prover_v3::{zkevm::Verifier as VerifierLoVersion, ChunkProof as ChunkProofLoVersion}; use prover_v4::{ - consts::CHUNK_VK_FILENAME, - utils::init_env_and_log, - zkevm::{Prover, Verifier as VerifierHiVersion}, - BlockTrace, ChunkProof as ChunkProofHiVersion, ChunkProvingTask, + utils::init_env_and_log, zkevm::Verifier as VerifierHiVersion, + ChunkProof as ChunkProofHiVersion, }; -use std::{cell::OnceCell, env, ptr::null}; +use std::{cell::OnceCell, env}; -static mut PROVER: OnceCell = OnceCell::new(); static mut VERIFIER_LO_VERSION: OnceCell = OnceCell::new(); static mut VERIFIER_HI_VERSION: OnceCell = OnceCell::new(); -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn init_chunk_prover(params_dir: *const c_char, assets_dir: *const c_char) { - init_env_and_log("ffi_chunk_prove"); - - let params_dir = c_char_to_str(params_dir); - let assets_dir = c_char_to_str(assets_dir); - - // TODO: add a settings in scroll-prover. - env::set_var("SCROLL_PROVER_ASSETS_DIR", assets_dir); - - // VK file must exist, it is optional and logged as a warning in prover. - if !file_exists(assets_dir, &CHUNK_VK_FILENAME) { - panic!("{} must exist in folder {}", *CHUNK_VK_FILENAME, assets_dir); - } - - let prover = Prover::from_dirs(params_dir, assets_dir); - - PROVER.set(prover).unwrap(); -} - /// # Safety #[no_mangle] pub unsafe extern "C" fn init_chunk_verifier( @@ -63,50 +33,6 @@ pub unsafe extern "C" fn init_chunk_verifier( VERIFIER_HI_VERSION.set(verifier_hi).unwrap(); } -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn get_chunk_vk() -> *const c_char { - let vk_result = panic_catch(|| PROVER.get_mut().unwrap().get_vk()); - - vk_result - .ok() - .flatten() - .map_or(null(), |vk| string_to_c_char(base64::encode(vk))) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn gen_chunk_proof(block_traces: *const c_char) -> *const c_char { - let proof_result: Result, String> = panic_catch(|| { - let block_traces = c_char_to_vec(block_traces); - let block_traces = serde_json::from_slice::>(&block_traces) - .map_err(|e| format!("failed to deserialize block traces: {e:?}"))?; - let chunk = ChunkProvingTask::from(block_traces); - - let proof = PROVER - .get_mut() - .expect("failed to get mutable reference to PROVER.") - .gen_chunk_proof(chunk, None, None, OUTPUT_DIR.as_deref()) - .map_err(|e| format!("failed to generate proof: {e:?}"))?; - - serde_json::to_vec(&proof).map_err(|e| format!("failed to serialize the proof: {e:?}")) - }) - .unwrap_or_else(|e| Err(format!("unwind error: {e:?}"))); - - let r = match proof_result { - Ok(proof_bytes) => ProofResult { - message: Some(proof_bytes), - error: None, - }, - Err(err) => ProofResult { - message: None, - error: Some(err), - }, - }; - - serde_json::to_vec(&r).map_or(null(), vec_to_c_char) -} - /// # Safety #[no_mangle] pub unsafe extern "C" fn verify_chunk_proof( diff --git a/common/libzkp/impl/src/utils.rs b/common/libzkp/impl/src/utils.rs index b241555cf6..3091fa316a 100644 --- a/common/libzkp/impl/src/utils.rs +++ b/common/libzkp/impl/src/utils.rs @@ -1,29 +1,9 @@ -use once_cell::sync::Lazy; use std::{ - env, - ffi::{CStr, CString}, + ffi::CStr, os::raw::c_char, panic::{catch_unwind, AssertUnwindSafe}, - path::PathBuf, }; -// Only used for debugging. -pub(crate) static OUTPUT_DIR: Lazy> = - Lazy::new(|| env::var("PROVER_OUTPUT_DIR").ok()); - -/// # Safety -#[no_mangle] -pub extern "C" fn free_c_chars(ptr: *mut c_char) { - if ptr.is_null() { - log::warn!("Try to free an empty pointer!"); - return; - } - - unsafe { - let _ = CString::from_raw(ptr); - } -} - pub(crate) fn c_char_to_str(c: *const c_char) -> &'static str { let cstr = unsafe { CStr::from_ptr(c) }; cstr.to_str().unwrap() @@ -34,21 +14,6 @@ pub(crate) fn c_char_to_vec(c: *const c_char) -> Vec { cstr.to_bytes().to_vec() } -pub(crate) fn string_to_c_char(string: String) -> *const c_char { - CString::new(string).unwrap().into_raw() -} - -pub(crate) fn vec_to_c_char(bytes: Vec) -> *const c_char { - CString::new(bytes).unwrap().into_raw() -} - -pub(crate) fn file_exists(dir: &str, filename: &str) -> bool { - let mut path = PathBuf::from(dir); - path.push(filename); - - path.exists() -} - pub(crate) fn panic_catch R, R>(f: F) -> Result { catch_unwind(AssertUnwindSafe(f)).map_err(|err| { if let Some(s) = err.downcast_ref::() { diff --git a/common/libzkp/interface/libzkp.h b/common/libzkp/interface/libzkp.h index 1c661a7509..3b8c359a60 100644 --- a/common/libzkp/interface/libzkp.h +++ b/common/libzkp/interface/libzkp.h @@ -1,26 +1,11 @@ -// BatchProver is used to: -// - Batch a list of chunk proofs -// - Bundle a list of batch proofs -void init_batch_prover(char* params_dir, char* assets_dir); // BatchVerifier is used to: // - Verify a batch proof // - Verify a bundle proof void init_batch_verifier(char* params_dir, char* assets_dir); -char* get_batch_vk(); -char* check_chunk_proofs(char* chunk_proofs); -char* gen_batch_proof(char* chunk_hashes, char* chunk_proofs, char* batch_header); char verify_batch_proof(char* proof, char* fork_name); -char* get_bundle_vk(); -char* gen_bundle_proof(char* batch_proofs); char verify_bundle_proof(char* proof); -void init_chunk_prover(char* params_dir, char* assets_dir); void init_chunk_verifier(char* params_dir, char* v3_assets_dir, char* v4_assets_dir); -char* get_chunk_vk(); -char* gen_chunk_proof(char* block_traces); char verify_chunk_proof(char* proof, char* fork_name); - -char* block_traces_to_chunk_info(char* block_traces); -void free_c_chars(char* ptr); diff --git a/coordinator/go.mod b/coordinator/go.mod index d6a5eb44a0..72f8a08513 100644 --- a/coordinator/go.mod +++ b/coordinator/go.mod @@ -45,7 +45,7 @@ require ( require ( github.com/google/uuid v1.6.0 github.com/prometheus/client_golang v1.19.0 - github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 + github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb ) require ( diff --git a/coordinator/go.sum b/coordinator/go.sum index 1332b5924d..a1f4d00c88 100644 --- a/coordinator/go.sum +++ b/coordinator/go.sum @@ -173,8 +173,8 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 h1:QKgfS8G0btzg7nmFjSjllaxGkns3yg7g2/tG1nWExEI= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb h1:uOKdmDT0LsuS3gfynEjR4zA3Ooh6p2Z3O+IMRj2r8LA= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 h1:Q8YyvrcPIcXQwE4ucm4bqmPh6TP6IB1GUTXripf2WyQ= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6/go.mod h1:byf/mZ8jLYUCnUePTicjJWn+RvKdxDn7buS6glTnMwQ= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= diff --git a/rollup/go.mod b/rollup/go.mod index 5485730f4a..0f056bf6b4 100644 --- a/rollup/go.mod +++ b/rollup/go.mod @@ -10,7 +10,7 @@ require ( github.com/go-resty/resty/v2 v2.7.0 github.com/holiman/uint256 v1.2.4 github.com/prometheus/client_golang v1.16.0 - github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 + github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 github.com/smartystreets/goconvey v1.8.0 github.com/stretchr/testify v1.9.0 diff --git a/rollup/go.sum b/rollup/go.sum index 5f32b0b38a..b485743b10 100644 --- a/rollup/go.sum +++ b/rollup/go.sum @@ -236,8 +236,8 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 h1:QKgfS8G0btzg7nmFjSjllaxGkns3yg7g2/tG1nWExEI= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb h1:uOKdmDT0LsuS3gfynEjR4zA3Ooh6p2Z3O+IMRj2r8LA= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 h1:Q8YyvrcPIcXQwE4ucm4bqmPh6TP6IB1GUTXripf2WyQ= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6/go.mod h1:byf/mZ8jLYUCnUePTicjJWn+RvKdxDn7buS6glTnMwQ= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= diff --git a/tests/integration-test/go.mod b/tests/integration-test/go.mod index 996a443009..2ba5a8a8c9 100644 --- a/tests/integration-test/go.mod +++ b/tests/integration-test/go.mod @@ -3,7 +3,7 @@ module scroll-tech/integration-test go 1.21 require ( - github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 + github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 github.com/stretchr/testify v1.9.0 gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde diff --git a/tests/integration-test/go.sum b/tests/integration-test/go.sum index afeb715cf4..4a182c7307 100644 --- a/tests/integration-test/go.sum +++ b/tests/integration-test/go.sum @@ -89,8 +89,8 @@ github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeC github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923 h1:QKgfS8G0btzg7nmFjSjllaxGkns3yg7g2/tG1nWExEI= -github.com/scroll-tech/da-codec v0.0.0-20240718144756-1875fd490923/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb h1:uOKdmDT0LsuS3gfynEjR4zA3Ooh6p2Z3O+IMRj2r8LA= +github.com/scroll-tech/da-codec v0.0.0-20240730031611-1b736159d5cb/go.mod h1:D6XEESeNVJkQJlv3eK+FyR+ufPkgVQbJzERylQi53Bs= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6 h1:Q8YyvrcPIcXQwE4ucm4bqmPh6TP6IB1GUTXripf2WyQ= github.com/scroll-tech/go-ethereum v1.10.14-0.20240626125436-418bc6f728b6/go.mod h1:byf/mZ8jLYUCnUePTicjJWn+RvKdxDn7buS6glTnMwQ= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= From 38f926b412016d48b2a57628594d0ad56b22712d Mon Sep 17 00:00:00 2001 From: colinlyguo Date: Tue, 30 Jul 2024 15:37:25 +0800 Subject: [PATCH 2/2] change some fmt.Errorf to errors.New --- coordinator/internal/logic/auth/login.go | 2 +- coordinator/internal/logic/provertask/prover_task.go | 2 +- coordinator/internal/logic/submitproof/proof_receiver.go | 5 ++--- coordinator/test/api_test.go | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/coordinator/internal/logic/auth/login.go b/coordinator/internal/logic/auth/login.go index 0fd13f4211..1d7d5e113a 100644 --- a/coordinator/internal/logic/auth/login.go +++ b/coordinator/internal/logic/auth/login.go @@ -96,7 +96,7 @@ func (l *LoginLogic) Check(login *types.LoginParameter) error { version.Version, login.Message.ProverVersion) } // if the prover reports a same prover version - return fmt.Errorf("incompatible vk. please check your params files or config files") + return errors.New("incompatible vk. please check your params files or config files") } } } diff --git a/coordinator/internal/logic/provertask/prover_task.go b/coordinator/internal/logic/provertask/prover_task.go index 3602ef8d85..de3a6f3552 100644 --- a/coordinator/internal/logic/provertask/prover_task.go +++ b/coordinator/internal/logic/provertask/prover_task.go @@ -18,7 +18,7 @@ import ( var ( // ErrCoordinatorInternalFailure coordinator internal db failure - ErrCoordinatorInternalFailure = fmt.Errorf("coordinator internal error") + ErrCoordinatorInternalFailure = errors.New("coordinator internal error") ) var ( diff --git a/coordinator/internal/logic/submitproof/proof_receiver.go b/coordinator/internal/logic/submitproof/proof_receiver.go index 90cb7a75d4..c8450a7d54 100644 --- a/coordinator/internal/logic/submitproof/proof_receiver.go +++ b/coordinator/internal/logic/submitproof/proof_receiver.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "errors" - "fmt" "strings" "time" @@ -138,11 +137,11 @@ func (m *ProofReceiverLogic) HandleZkProof(ctx *gin.Context, proofParameter coor m.proofReceivedTotal.Inc() pk := ctx.GetString(coordinatorType.PublicKey) if len(pk) == 0 { - return fmt.Errorf("get public key from context failed") + return errors.New("get public key from context failed") } pv := ctx.GetString(coordinatorType.ProverVersion) if len(pv) == 0 { - return fmt.Errorf("get ProverVersion from context failed") + return errors.New("get ProverVersion from context failed") } proverTask, err := m.proverTaskOrm.GetProverTaskByUUIDAndPublicKey(ctx.Copy(), proofParameter.UUID, pk) diff --git a/coordinator/test/api_test.go b/coordinator/test/api_test.go index 1a6ad75c94..58a444ce9f 100644 --- a/coordinator/test/api_test.go +++ b/coordinator/test/api_test.go @@ -291,12 +291,12 @@ func testOutdatedProverVersion(t *testing.T) { expectedErr := fmt.Errorf("check the login parameter failure: incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", minProverVersion, chunkProver.proverVersion) code, errMsg := chunkProver.tryGetProverTask(t, message.ProofTypeChunk) assert.Equal(t, types.ErrJWTCommonErr, code) - assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + assert.Equal(t, expectedErr, errors.New(errMsg)) expectedErr = fmt.Errorf("check the login parameter failure: incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", minProverVersion, batchProver.proverVersion) code, errMsg = batchProver.tryGetProverTask(t, message.ProofTypeBatch) assert.Equal(t, types.ErrJWTCommonErr, code) - assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + assert.Equal(t, expectedErr, errors.New(errMsg)) } func testValidProof(t *testing.T) {