From 2bc951f6226e219215168d34afd87ccfda504852 Mon Sep 17 00:00:00 2001 From: Lawliet-Chan <1576710154@qq.com> Date: Sat, 10 Dec 2022 18:46:18 +0800 Subject: [PATCH] feat: use common lib for verifier & roller (#74) Co-authored-by: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Co-authored-by: colinlyguo <102356659+colinlyguo@users.noreply.github.com> Co-authored-by: colinlyguo Co-authored-by: HAOYUatHZ --- .github/workflows/common.yml | 20 +++++ .github/workflows/coordinator.yml | 20 +++++ .github/workflows/roller.yml | 8 +- .gitignore | 3 + Jenkinsfile | 6 +- build/dockerfiles/coordinator.Dockerfile | 21 +++-- build/dockerfiles/intermediate/Makefile | 10 ++- .../intermediate/full-builder.Dockerfile | 25 ++++++ .../intermediate/go-rust-builder.Dockerfile | 3 + common/.gitignore | 2 + common/Makefile | 1 + .../rust => common/libzkp/impl}/Cargo.lock | 28 +++--- .../rust => common/libzkp/impl}/Cargo.toml | 6 +- .../libzkp/impl}/rust-toolchain | 0 .../rust => common/libzkp/impl}/src/lib.rs | 1 + .../rust => common/libzkp/impl}/src/prove.rs | 0 common/libzkp/impl/src/verify.rs | 42 +++++++++ common/libzkp/interface/libzkp.h | 5 ++ common/message/message.go | 12 --- common/version/version.go | 2 +- coordinator/.gitignore | 1 + coordinator/Makefile | 12 +++ coordinator/assets/agg_proof | 6 ++ coordinator/assets/agg_vk | Bin 0 -> 736 bytes coordinator/cmd/flags.go | 8 +- coordinator/cmd/main.go | 6 +- coordinator/config.json | 7 +- coordinator/config/config.go | 11 ++- coordinator/manager.go | 46 ++++------ coordinator/manager_test.go | 9 +- coordinator/verifier/verifier.go | 67 +++++++++------ coordinator/verifier/verifier_test.go | 80 ++++++------------ roller/.gitignore | 3 +- roller/Makefile | 25 +++--- roller/config/config.go | 2 +- roller/core/prover/lib/prover.h | 3 - roller/core/prover/prover.go | 8 +- roller/core/prover/prover_test.go | 6 +- 38 files changed, 322 insertions(+), 193 deletions(-) create mode 100644 build/dockerfiles/intermediate/full-builder.Dockerfile rename {roller/core/prover/rust => common/libzkp/impl}/Cargo.lock (99%) rename {roller/core/prover/rust => common/libzkp/impl}/Cargo.toml (86%) rename {roller/core/prover/rust => common/libzkp/impl}/rust-toolchain (100%) rename {roller/core/prover/rust => common/libzkp/impl}/src/lib.rs (97%) rename {roller/core/prover/rust => common/libzkp/impl}/src/prove.rs (100%) create mode 100644 common/libzkp/impl/src/verify.rs create mode 100644 common/libzkp/interface/libzkp.h create mode 100644 coordinator/assets/agg_proof create mode 100644 coordinator/assets/agg_vk delete mode 100644 roller/core/prover/lib/prover.h diff --git a/.github/workflows/common.yml b/.github/workflows/common.yml index 66ba7d7aa..eaaed7d2b 100644 --- a/.github/workflows/common.yml +++ b/.github/workflows/common.yml @@ -24,12 +24,32 @@ jobs: check: runs-on: ubuntu-latest steps: + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2022-08-23 + override: true + components: rustfmt, clippy - name: Install Go uses: actions/setup-go@v2 with: go-version: 1.18.x - name: Checkout code uses: actions/checkout@v2 + - name: Cache cargo registry + uses: actions/cache@v2 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-roller-cargo-registry-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} + - name: Cache cargo index + uses: actions/cache@v2 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-roller-cargo-index-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} + - name: Cache cargo target + uses: actions/cache@v2 + with: + path: /home/runner/work/scroll/scroll/common/libzkp/impl/target + key: ${{ runner.os }}-roller-cargo-build-target-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} - name: Lint run: | rm -rf $HOME/.cache/golangci-lint diff --git a/.github/workflows/coordinator.yml b/.github/workflows/coordinator.yml index 31001ffd8..9b12d1d5a 100644 --- a/.github/workflows/coordinator.yml +++ b/.github/workflows/coordinator.yml @@ -24,12 +24,32 @@ jobs: check: runs-on: ubuntu-latest steps: + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2022-08-23 + override: true + components: rustfmt, clippy - name: Install Go uses: actions/setup-go@v2 with: go-version: 1.18.x - name: Checkout code uses: actions/checkout@v2 + - name: Cache cargo registry + uses: actions/cache@v2 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-roller-cargo-registry-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} + - name: Cache cargo index + uses: actions/cache@v2 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-roller-cargo-index-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} + - name: Cache cargo target + uses: actions/cache@v2 + with: + path: /home/runner/work/scroll/scroll/common/libzkp/impl/target + key: ${{ runner.os }}-roller-cargo-build-target-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} - name: Lint run: | rm -rf $HOME/.cache/golangci-lint diff --git a/.github/workflows/roller.yml b/.github/workflows/roller.yml index 3b0b29c54..bb0370a46 100644 --- a/.github/workflows/roller.yml +++ b/.github/workflows/roller.yml @@ -39,17 +39,17 @@ jobs: uses: actions/cache@v2 with: path: ~/.cargo/registry - key: ${{ runner.os }}-roller-cargo-registry-${{ hashFiles('roller/core/prover/rust/Cargo.lock') }} + key: ${{ runner.os }}-roller-cargo-registry-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v2 with: path: ~/.cargo/git - key: ${{ runner.os }}-roller-cargo-index-${{ hashFiles('roller/core/prover/rust/Cargo.lock') }} + key: ${{ runner.os }}-roller-cargo-index-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} - name: Cache cargo target uses: actions/cache@v2 with: - path: /home/runner/work/scroll/scroll/roller/core/prover/rust/target - key: ${{ runner.os }}-roller-cargo-build-target-${{ hashFiles('roller/core/prover/rust/Cargo.lock') }} + path: /home/runner/work/scroll/scroll/common/libzkp/impl/target + key: ${{ runner.os }}-roller-cargo-build-target-${{ hashFiles('common/libzkp/impl/Cargo.lock') }} - name: Test run: | make roller diff --git a/.gitignore b/.gitignore index 1e2d05c84..6bc7c240b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ assets/params* assets/seed coverage.txt build/bin + +# misc +sftp-config.json diff --git a/Jenkinsfile b/Jenkinsfile index 6e5122367..fd2be9b34 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,8 +1,6 @@ imagePrefix = 'scrolltech' credentialDocker = 'dockerhub' -def boolean test_result = false - pipeline { agent any options { @@ -13,6 +11,7 @@ pipeline { } environment { GO111MODULE = 'on' + PATH="/home/ubuntu/.cargo/bin:$PATH" // LOG_DOCKER = 'true' } stages { @@ -31,6 +30,7 @@ pipeline { steps { // start to build project sh '''#!/bin/bash + set -e export PATH=/home/ubuntu/go/bin:$PATH make dev_docker make -C bridge mock_abi @@ -73,8 +73,6 @@ pipeline { sh "cd $i && go test -v -race -coverprofile=coverage.txt -covermode=atomic \$(go list ./... | grep -v 'database\\|l2\\|l1\\|common\\|coordinator')" } } - - script { test_result = true } } } } diff --git a/build/dockerfiles/coordinator.Dockerfile b/build/dockerfiles/coordinator.Dockerfile index 3452143e5..39d9f21bf 100644 --- a/build/dockerfiles/coordinator.Dockerfile +++ b/build/dockerfiles/coordinator.Dockerfile @@ -1,5 +1,14 @@ +# Build scroll in a stock Go builder container +FROM scrolltech/full-builder:go-1.17-rust-nightly-2022-08-23 as zkp-builder + +COPY ./ /src/ + +RUN cd /src/common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ +RUN cp -r /src/common/libzkp/interface /src/coordinator/verifier/lib + + # Download Go dependencies -FROM scrolltech/go-builder:1.18 as base +FROM scrolltech/full-builder:go-1.18-rust-nightly-2022-08-23 as base WORKDIR /src COPY go.work* ./ @@ -10,17 +19,19 @@ COPY ./database/go.* ./database/ COPY ./roller/go.* ./roller/ RUN go mod download -x + # Build coordinator FROM base as builder +COPY --from=zkp-builder /src/ / + RUN --mount=target=. \ --mount=type=cache,target=/root/.cache/go-build \ - cd /src/coordinator/cmd && go build -v -p 4 -o /bin/coordinator + cd /coordinator && go build -v -p 4 -o /bin/coordinator ./cmd # Pull coordinator into a second stage deploy alpine container -FROM alpine:latest +FROM ubuntu:20.04 COPY --from=builder /bin/coordinator /bin/ -ENTRYPOINT ["coordinator"] - +ENTRYPOINT ["/bin/coordinator"] diff --git a/build/dockerfiles/intermediate/Makefile b/build/dockerfiles/intermediate/Makefile index 3410b362a..053acc82f 100644 --- a/build/dockerfiles/intermediate/Makefile +++ b/build/dockerfiles/intermediate/Makefile @@ -2,7 +2,11 @@ GO_VERSION := 1.18 PYTHON_VERSION := 3.10 RUST_VERSION := nightly-2022-08-23 -.PHONY: all go-builder rust-builder rust-alpine-builder go-rust-builder py-runner +.PHONY: all go-builder rust-builder rust-alpine-builder go-rust-builder full-builder py-runner + +full-builder: + docker build -t scrolltech/full-builder:latest -f full-builder.Dockerfile ./ + docker image tag scrolltech/full-builder:latest scrolltech/full-builder:go-$(GO_VERSION)-rust-$(RUST_VERSION) go-builder: docker build -t scrolltech/go-builder:latest -f go-builder.Dockerfile ./ @@ -24,7 +28,7 @@ py-runner: docker build -t scrolltech/py-runner:latest -f py-runner.Dockerfile ./ docker image tag scrolltech/py-runner:latest scrolltech/py-runner:$(PYTHON_VERSION) -all: go-builder rust-builder rust-alpine-builder go-rust-builder py-runner +all: go-builder rust-builder rust-alpine-builder go-rust-builder full-builder py-runner publish: docker push scrolltech/go-builder:latest @@ -35,5 +39,7 @@ publish: docker push scrolltech/rust-alpine-builder:$(RUST_VERSION) docker push scrolltech/go-rust-builder:latest docker push scrolltech/go-rust-builder:go-$(GO_VERSION)-rust-$(RUST_VERSION) + docker push scrolltech/full-builder:latest + docker push scrolltech/full-builder:go-$(GO_VERSION)-rust-$(RUST_VERSION) docker push scrolltech/py-runner:latest docker push scrolltech/py-runner:$(PYTHON_VERSION) diff --git a/build/dockerfiles/intermediate/full-builder.Dockerfile b/build/dockerfiles/intermediate/full-builder.Dockerfile new file mode 100644 index 000000000..1b17f8e15 --- /dev/null +++ b/build/dockerfiles/intermediate/full-builder.Dockerfile @@ -0,0 +1,25 @@ +FROM ubuntu:20.04 + +RUN apt-get update && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime + +# Install basic packages +RUN apt-get install build-essential curl git pkg-config -y + +# Install dev-packages +RUN apt-get install libclang-dev libssl-dev llvm -y + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" + +# Add Toolchain +RUN rustup toolchain install nightly-2022-08-23 + +# Install Go +RUN rm -rf /usr/local/go +# RUN curl -O https://dl.google.com/go/go1.17.13.linux-amd64.tar.gz +RUN curl -O https://dl.google.com/go/go1.18.9.linux-amd64.tar.gz +# RUN tar -C /usr/local -xzf go1.17.13.linux-amd64.tar.gz +RUN tar -C /usr/local -xzf go1.18.9.linux-amd64.tar.gz + +ENV PATH="/usr/local/go/bin:${PATH}" diff --git a/build/dockerfiles/intermediate/go-rust-builder.Dockerfile b/build/dockerfiles/intermediate/go-rust-builder.Dockerfile index 685cc93ad..2c46056ba 100644 --- a/build/dockerfiles/intermediate/go-rust-builder.Dockerfile +++ b/build/dockerfiles/intermediate/go-rust-builder.Dockerfile @@ -4,6 +4,9 @@ ARG DEFAULT_RUST_TOOLCHAIN=nightly-2022-08-23 RUN apk add --no-cache gcc musl-dev linux-headers git ca-certificates +# RUN apk add --no-cache libc6-compat +# RUN apk add --no-cache gcompat + ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ diff --git a/common/.gitignore b/common/.gitignore index 0460e1887..db236fbd2 100644 --- a/common/.gitignore +++ b/common/.gitignore @@ -1,2 +1,4 @@ /build/bin .idea +libzkp/impl/target +libzkp/interface/*.a \ No newline at end of file diff --git a/common/Makefile b/common/Makefile index a0cc94796..37360e42e 100644 --- a/common/Makefile +++ b/common/Makefile @@ -5,3 +5,4 @@ test: lint: ## Lint the files - used for CI GOBIN=$(PWD)/build/bin go run ../build/lint.go + cd libzkp/impl && cargo fmt --all -- --check && cargo clippy --release -- -D warnings \ No newline at end of file diff --git a/roller/core/prover/rust/Cargo.lock b/common/libzkp/impl/Cargo.lock similarity index 99% rename from roller/core/prover/rust/Cargo.lock rename to common/libzkp/impl/Cargo.lock index 706f1e357..2a8896d47 100644 --- a/roller/core/prover/rust/Cargo.lock +++ b/common/libzkp/impl/Cargo.lock @@ -2492,20 +2492,6 @@ dependencies = [ "rustix", ] -[[package]] -name = "prover" -version = "0.1.0" -dependencies = [ - "libc", - "log", - "once_cell", - "serde", - "serde_derive", - "serde_json", - "types", - "zkevm", -] - [[package]] name = "quote" version = "1.0.21" @@ -3895,3 +3881,17 @@ dependencies = [ "strum_macros", "subtle", ] + +[[package]] +name = "zkp" +version = "0.1.0" +dependencies = [ + "libc", + "log", + "once_cell", + "serde", + "serde_derive", + "serde_json", + "types", + "zkevm", +] diff --git a/roller/core/prover/rust/Cargo.toml b/common/libzkp/impl/Cargo.toml similarity index 86% rename from roller/core/prover/rust/Cargo.toml rename to common/libzkp/impl/Cargo.toml index 3ff8ac7c7..7445c6bf9 100644 --- a/roller/core/prover/rust/Cargo.toml +++ b/common/libzkp/impl/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "prover" +name = "zkp" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] -crate-type = ["staticlib", "cdylib"] +crate-type = ["staticlib"] [dependencies] zkevm = { git = "https://github.com/scroll-tech/common-rs" } @@ -25,4 +25,4 @@ debug-assertions = true [profile.release] opt-level = 3 -debug-assertions = true +debug-assertions = true \ No newline at end of file diff --git a/roller/core/prover/rust/rust-toolchain b/common/libzkp/impl/rust-toolchain similarity index 100% rename from roller/core/prover/rust/rust-toolchain rename to common/libzkp/impl/rust-toolchain diff --git a/roller/core/prover/rust/src/lib.rs b/common/libzkp/impl/src/lib.rs similarity index 97% rename from roller/core/prover/rust/src/lib.rs rename to common/libzkp/impl/src/lib.rs index 0275e56e2..8abc2ec9d 100644 --- a/roller/core/prover/rust/src/lib.rs +++ b/common/libzkp/impl/src/lib.rs @@ -1,6 +1,7 @@ #![feature(once_cell)] pub mod prove; +pub mod verify; pub(crate) mod utils { use std::ffi::{CStr, CString}; diff --git a/roller/core/prover/rust/src/prove.rs b/common/libzkp/impl/src/prove.rs similarity index 100% rename from roller/core/prover/rust/src/prove.rs rename to common/libzkp/impl/src/prove.rs diff --git a/common/libzkp/impl/src/verify.rs b/common/libzkp/impl/src/verify.rs new file mode 100644 index 000000000..8a584af40 --- /dev/null +++ b/common/libzkp/impl/src/verify.rs @@ -0,0 +1,42 @@ +use crate::utils::{c_char_to_str, c_char_to_vec}; +use libc::c_char; +use log::info; +use std::fs::File; +use std::io::Read; +use zkevm::circuit::{AGG_DEGREE, DEGREE}; +use zkevm::prover::AggCircuitProof; +use zkevm::utils::load_or_create_params; +use zkevm::verifier::Verifier; + +static mut VERIFIER: Option<&Verifier> = None; + +/// # Safety +#[no_mangle] +pub unsafe extern "C" fn init_verifier(params_path: *const c_char, agg_vk_path: *const c_char) { + let params_path = c_char_to_str(params_path); + let agg_vk_path = c_char_to_str(agg_vk_path); + let mut f = File::open(agg_vk_path).unwrap(); + let mut agg_vk = vec![]; + f.read_to_end(&mut agg_vk).unwrap(); + + info!("load params"); + let params = load_or_create_params(params_path, *DEGREE).unwrap(); + let agg_params = load_or_create_params(params_path, *AGG_DEGREE).unwrap(); + + let v = Box::new(Verifier::from_params(params, agg_params, Some(agg_vk))); + VERIFIER = Some(Box::leak(v)) +} + +/// # Safety +#[no_mangle] +pub unsafe extern "C" fn verify_agg_proof(proof: *const c_char) -> c_char { + info!("start to verify agg-proof"); + let proof_vec = c_char_to_vec(proof); + let agg_proof = serde_json::from_slice::(proof_vec.as_slice()).unwrap(); + let verified = VERIFIER + .unwrap() + .verify_agg_circuit_proof(agg_proof) + .is_ok(); + info!("verify agg-proof result: {}", verified); + verified as c_char +} diff --git a/common/libzkp/interface/libzkp.h b/common/libzkp/interface/libzkp.h new file mode 100644 index 000000000..b8173df62 --- /dev/null +++ b/common/libzkp/interface/libzkp.h @@ -0,0 +1,5 @@ +init_prover(char *params_path, char *seed_path); +char* create_agg_proof(char *trace); +char* create_agg_proof_multi(char *trace); +init_verifier(char *params_path, char *agg_vk_path); +char verify_agg_proof(char *proof); \ No newline at end of file diff --git a/common/message/message.go b/common/message/message.go index 1867922d6..e94b03a0e 100644 --- a/common/message/message.go +++ b/common/message/message.go @@ -2,7 +2,6 @@ package message import ( "crypto/ecdsa" - "encoding/binary" "encoding/json" "github.com/scroll-tech/go-ethereum/common" @@ -208,14 +207,3 @@ type AggProof struct { FinalPair []byte `json:"final_pair"` Vk []byte `json:"vk"` } - -// Marshal marshals the TraceProof as bytes -func (proof *AggProof) Marshal() ([]byte, error) { - jsonByt, err := json.Marshal(proof) - if err != nil { - return nil, err - } - buf := make([]byte, 4) - binary.BigEndian.PutUint32(buf, uint32(len(jsonByt))) - return append(buf, jsonByt...), nil -} diff --git a/common/version/version.go b/common/version/version.go index cb409f605..0cb986637 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -5,7 +5,7 @@ import ( "runtime/debug" ) -var tag = "prealpha-v6.7" +var tag = "prealpha-v7.0" var commit = func() string { if info, ok := debug.ReadBuildInfo(); ok { diff --git a/coordinator/.gitignore b/coordinator/.gitignore index 0460e1887..6f9b94429 100644 --- a/coordinator/.gitignore +++ b/coordinator/.gitignore @@ -1,2 +1,3 @@ /build/bin .idea +verifier/lib \ No newline at end of file diff --git a/coordinator/Makefile b/coordinator/Makefile index 6c22d1745..9133b6dce 100644 --- a/coordinator/Makefile +++ b/coordinator/Makefile @@ -7,9 +7,21 @@ REPO_ROOT_DIR=./.. test: go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 $(PWD)/... +libzkp: + cd ../common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ + cp -r ../common/libzkp/interface ./verifier/lib + coordinator: ## Builds the Coordinator instance. + cd ../common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ + cp -r ../common/libzkp/interface ./verifier/lib go build -o $(PWD)/build/bin/coordinator ./cmd +test-verifier: + go test -tags ffi -timeout 0 -v ./verifier + +test-gpu-verifier: + go test -tags="gpu ffi" -timeout 0 -v ./verifier + lint: ## Lint the files - used for CI GOBIN=$(PWD)/build/bin go run ../build/lint.go diff --git a/coordinator/assets/agg_proof b/coordinator/assets/agg_proof new file mode 100644 index 000000000..d5f343a50 --- /dev/null +++ b/coordinator/assets/agg_proof @@ -0,0 +1,6 @@ +{ + "proof": "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", + "instance": "W1tbWzE1LDMxLDU1LDczLDEzNyw5NCwxMzYsMTk4LDg3LDU4LDEzNSwyMTMsMTk4LDI0MCwyMzEsMTk1LDEwOCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0sWzI0OCwxOSwxMSw0NCwxODUsMTY3LDE3NiwyNDEsMTAsMjA4LDExNSwxMTgsMTUzLDI0OSwyNiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLFs0Miw5OSwzNiw0OCwxNSwxMDYsMjE4LDI3LDE2OSwxMDAsMjM5LDEwLDQwLDIzOSwzLDIwNSwxNDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLFsxMDMsMTA5LDExNSwxMjgsMTgwLDEwMywyMzksMTAxLDI0NCw2MSwyMjgsMjExLDMwLDEwNywzNSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdXV1d", + "final_pair": "Dx83SYleiMZXOofVxvDnw2z4Ewssuaew8QrQc3aZ+RrzmbRxizBqic/3Ug58ddfJm4pUXlbZHSdWQrCwNfaRASpjJDAPatobqWTvCijvA82PZ21zgLRn72X0PeTTHmsjW2IwLM6PYlmA0n9gl9yfk5dKN+SVmgq8tjvinwHHMxM=", + "vk": "1O6mZBc42nYXGGFQWrI7+j/rrsrUtTdEAwP9ERsE2SWH//kb55sMI5L/Mt0TQOcEgShyEOG519UfHL/V37FhGeeU1DUCQYjytr4I0T6YwzpcXrfEVpRyY4e9ep3be6mOm158YzyRfOUryh3qyHsjiYBzoAoEc8MZlxlAm5nX9gSYrjDIHslf/Zs2bMMejQn4Kr7alJ1OBaFwFw+RaWTWk1rZk6CWRdrX77RTDDGrbSwgXuGkM+1FdJLw7Xfw0zCv+G8TB4cXUb4ukE4hCoIBfFFwQm+ELHnDFMpi6NcXWqoxnpMyF2mOO3qs0OlCSLSVmeYDV8DPPY43nJxlSnqvik/S95sIObBngVUk8+ww7gMhZDZs81A7kSUFmQoiiDupuC7VX+rMj6sgEzIRBrRGn0HlZ4OJg89NC6+JIPTwIhCopp4mbS3dSOaeNSaViaHfZ7nc2+fv+gmcsWD+gV/LmSJBTC/QYQ1X0gUHj5qGFebNdBntoNlfZcTqtA9gh+CKWfy9ZVrZcP8xcjXd0w/Cj/FHmSMTxVHHgV/j8+eBeZPru1ihrTOblWKbRs/2+GOqBmIHQ4D9IG2y4pWE1FEoovupoZIFQucxHecdy/0zyalHowJSKcVKBYY+HJ2mk4isn8EPm6Kl9XCsd7AIbaeUhZlIz2+JYrLU4bI4YPFWHAtZ/L1lWtlw/zFyNd3TD8KP8UeZIxPFUceBX+Pz54F5k6ZrlQ4OTBOg7+FnNqdRJiPJNZ0GE6sYTCK2nHtP8QwfJpmuetjQRpHjjzlY4I6xVh7op7ha42GCsPMJcboDLAsaJry9dp7Ic0BIoFZu1jPjyjXqLnunVKb4m+m8CwSuEj9lzVSjepm1t0XQVPUo1cstzq2/kgo1yEk3NR3B1r4DFPnKPXQxJjUaUACnzHGrk+yXMB9qd4/DLMp6Onl6+RYuQkD1CdV0Ldtz+s6rKPgagAmHJz4Wc9zsQwAoVLxYqQ==" +} \ No newline at end of file diff --git a/coordinator/assets/agg_vk b/coordinator/assets/agg_vk new file mode 100644 index 0000000000000000000000000000000000000000..113c848cf446b420f2600e017a2834f9a10303f7 GIT binary patch literal 736 zcmV<60w4X7-3LavOD@e>#oYwwKqfq1N{*j1lc8r|M?r|n+zk8|1#YZ zK<5O3C~^?tx!2Vn9KY4yv0)kKl+-l>L5T9Uz6jAin8P|;Ubnz89a-7Fhv14?{Jmvb*>L|cay8x455kY}N0}oN#ZkwB zU*q%Vfq9ebyI7&EGnL|cay8x455kY}N0}oN#ZkwBU*q%Vfq9drYn2WTOcS8*;b%6dQ6?kFHJt_% zs~Aioww!xU@eCg(nXY=+&_*Vr&Ol+o9Vm@1g;W4WzAHhdYQGiMbK3BDAmg?&aJ z*1iK2`N}>7IWO}LjWjLyjZEDYifT0 literal 0 HcmV?d00001 diff --git a/coordinator/cmd/flags.go b/coordinator/cmd/flags.go index b0c5b2236..c49f350b2 100644 --- a/coordinator/cmd/flags.go +++ b/coordinator/cmd/flags.go @@ -3,10 +3,10 @@ package main import "github.com/urfave/cli/v2" var ( - verifierFlag = cli.StringFlag{ - Name: "verifier-socket-file", - Usage: "The path of ipc-verifier socket file", - Value: "/tmp/verifier.sock", + verifierMockFlag = cli.BoolFlag{ + Name: "verifier.mock", + Usage: "Mock the verifier", + Value: false, } apiFlags = []cli.Flag{ // http flags diff --git a/coordinator/cmd/main.go b/coordinator/cmd/main.go index fbe36bcaf..abc0cf587 100644 --- a/coordinator/cmd/main.go +++ b/coordinator/cmd/main.go @@ -26,8 +26,8 @@ func main() { app.Usage = "The Scroll L2 Coordinator" app.Version = version.Version app.Flags = append(app.Flags, utils.CommonFlags...) - app.Flags = append(app.Flags, []cli.Flag{&verifierFlag}...) app.Flags = append(app.Flags, apiFlags...) + app.Flags = append(app.Flags, &verifierMockFlag) app.Before = func(ctx *cli.Context) error { return utils.LogSetup(ctx) @@ -41,8 +41,8 @@ func main() { } func applyConfig(ctx *cli.Context, cfg *config.Config) { - if ctx.IsSet(verifierFlag.Name) { - cfg.RollerManagerConfig.VerifierEndpoint = ctx.String(verifierFlag.Name) + if ctx.IsSet(verifierMockFlag.Name) { + cfg.RollerManagerConfig.Verifier = &config.VerifierConfig{MockMode: ctx.Bool(verifierMockFlag.Name)} } } diff --git a/coordinator/config.json b/coordinator/config.json index d6b55ec78..870fbaeb7 100644 --- a/coordinator/config.json +++ b/coordinator/config.json @@ -2,7 +2,12 @@ "roller_manager_config": { "rollers_per_session": 1, "verifier_endpoint": "/tmp/verifier.sock", - "collection_time": 180 + "collection_time": 180, + "verifier": { + "mock_mode": true, + "params_path": "", + "agg_vk_path": "" + } }, "db_config": { "driver_name": "postgres", diff --git a/coordinator/config/config.go b/coordinator/config/config.go index 340ef8bbf..03d07d997 100644 --- a/coordinator/config/config.go +++ b/coordinator/config/config.go @@ -18,8 +18,8 @@ type RollerManagerConfig struct { OrderSession string `json:"order_session,omitempty"` // The amount of rollers to pick per proof generation session. RollersPerSession uint8 `json:"rollers_per_session"` - // Unix socket endpoint to which we send proofs to be verified. - VerifierEndpoint string `json:"verifier_endpoint,omitempty"` + // Zk verifier config. + Verifier *VerifierConfig `json:"verifier,omitempty"` // Proof collection time (in minutes). CollectionTime int `json:"collection_time"` } @@ -30,6 +30,13 @@ type Config struct { DBConfig *db_config.DBConfig `json:"db_config"` } +// VerifierConfig load zk verifier config. +type VerifierConfig struct { + MockMode bool `json:"mock_mode"` + ParamsPath string `json:"params_path"` + AggVkPath string `json:"agg_vk_path"` +} + // NewConfig returns a new instance of Config. func NewConfig(file string) (*Config, error) { buf, err := os.ReadFile(filepath.Clean(file)) diff --git a/coordinator/manager.go b/coordinator/manager.go index 6f1f81043..df2542483 100644 --- a/coordinator/manager.go +++ b/coordinator/manager.go @@ -74,13 +74,9 @@ type Manager struct { // New returns a new instance of Manager. The instance will be not fully prepared, // and still needs to be finalized and ran by calling `manager.Start`. func New(ctx context.Context, cfg *config.RollerManagerConfig, orm database.OrmFactory) (*Manager, error) { - var v *verifier.Verifier - if cfg.VerifierEndpoint != "" { - var err error - v, err = verifier.NewVerifier(cfg.VerifierEndpoint) - if err != nil { - return nil, err - } + v, err := verifier.NewVerifier(cfg.Verifier) + if err != nil { + return nil, err } log.Info("Start coordinator successfully.") @@ -259,30 +255,24 @@ func (m *Manager) handleZkProof(pk string, msg *message.ProofDetail) error { return dbErr } - if m.verifier != nil { - var err error - tasks, err := m.orm.GetBlockBatches(map[string]interface{}{"id": msg.ID}) - if len(tasks) == 0 { - if err != nil { - log.Error("failed to get tasks", "error", err) - } - return err - } - - success, err = m.verifier.VerifyProof(msg.Proof) + var err error + tasks, err := m.orm.GetBlockBatches(map[string]interface{}{"id": msg.ID}) + if len(tasks) == 0 { if err != nil { - // record failed session. - m.addFailedSession(sess, err.Error()) - // TODO: this is only a temp workaround for testnet, we should return err in real cases - success = false - log.Error("Failed to verify zk proof", "proof id", msg.ID, "error", err) - // TODO: Roller needs to be slashed if proof is invalid. - } else { - log.Info("Verify zk proof successfully", "verification result", success, "proof id", msg.ID) + log.Error("failed to get tasks", "error", err) } + return err + } + + success, err = m.verifier.VerifyProof(msg.Proof) + if err != nil { + // record failed session. + m.addFailedSession(sess, err.Error()) + // TODO: this is only a temp workaround for testnet, we should return err in real cases + success = false + log.Error("Failed to verify zk proof", "proof id", msg.ID, "error", err) + // TODO: Roller needs to be slashed if proof is invalid. } else { - success = true - log.Info("Verifier disabled, VerifyProof skipped") log.Info("Verify zk proof successfully", "verification result", success, "proof id", msg.ID) } diff --git a/coordinator/manager_test.go b/coordinator/manager_test.go index 51914c538..2b6967fc9 100644 --- a/coordinator/manager_test.go +++ b/coordinator/manager_test.go @@ -48,9 +48,8 @@ func setEnv(t *testing.T) error { // Create db container. dbImg = docker.NewTestDBDocker(t, cfg.DBConfig.DriverName) cfg.DBConfig.DSN = dbImg.Endpoint() - // start roller manager - rollerManager = setupRollerManager(t, "", cfg.DBConfig) + rollerManager = setupRollerManager(t, cfg.DBConfig) // start ws service handle, _, err = utils.StartWSEndpoint(managerURL, rollerManager.APIs()) @@ -258,7 +257,7 @@ func testGracefulRestart(t *testing.T) { roller.close() // start new roller manager && ws service - newRollerManager := setupRollerManager(t, "", cfg.DBConfig) + newRollerManager := setupRollerManager(t, cfg.DBConfig) handle, _, err = utils.StartWSEndpoint(newManagerURL, newRollerManager.APIs()) assert.NoError(t, err) defer func() { @@ -303,14 +302,14 @@ func testGracefulRestart(t *testing.T) { } } -func setupRollerManager(t *testing.T, verifierEndpoint string, dbCfg *database.DBConfig) *coordinator.Manager { +func setupRollerManager(t *testing.T, dbCfg *database.DBConfig) *coordinator.Manager { // Get db handler. db, err := database.NewOrmFactory(dbCfg) assert.True(t, assert.NoError(t, err), "failed to get db handler.") rollerManager, err := coordinator.New(context.Background(), &coordinator_config.RollerManagerConfig{ RollersPerSession: 1, - VerifierEndpoint: verifierEndpoint, + Verifier: &coordinator_config.VerifierConfig{MockMode: true}, CollectionTime: 1, }, db) assert.NoError(t, err) diff --git a/coordinator/verifier/verifier.go b/coordinator/verifier/verifier.go index 1a4c36c73..4a10d993f 100644 --- a/coordinator/verifier/verifier.go +++ b/coordinator/verifier/verifier.go @@ -1,49 +1,62 @@ package verifier +/* +#cgo LDFLAGS: ${SRCDIR}/lib/libzkp.a -lm -ldl +#cgo gpu LDFLAGS: ${SRCDIR}/lib/libzkp.a -lm -ldl -lgmp -lstdc++ -lprocps -L/usr/local/cuda/lib64/ -lcudart +#include +#include "./lib/libzkp.h" +*/ +import "C" //nolint:typecheck + import ( - "net" + "encoding/json" + "unsafe" + + "github.com/scroll-tech/go-ethereum/log" + + "scroll-tech/coordinator/config" "scroll-tech/common/message" ) -// Verifier represents a socket connection to a halo2 verifier. +// Verifier represents a rust ffi to a halo2 verifier. type Verifier struct { - conn net.Conn + cfg *config.VerifierConfig } -// NewVerifier Sets up a connection with the Unix socket at `path`. -func NewVerifier(path string) (*Verifier, error) { - conn, err := net.Dial("unix", path) - if err != nil { - return nil, err +// NewVerifier Sets up a rust ffi to call verify. +func NewVerifier(cfg *config.VerifierConfig) (*Verifier, error) { + if cfg.MockMode { + return &Verifier{cfg: cfg}, nil } + paramsPathStr := C.CString(cfg.ParamsPath) + aggVkPathStr := C.CString(cfg.AggVkPath) + defer func() { + C.free(unsafe.Pointer(paramsPathStr)) + C.free(unsafe.Pointer(aggVkPathStr)) + }() - return &Verifier{ - conn: conn, - }, nil -} + C.init_verifier(paramsPathStr, aggVkPathStr) -// Stop stops the verifier and close the socket connection -func (v *Verifier) Stop() error { - return v.conn.Close() + return &Verifier{cfg: cfg}, nil } // VerifyProof Verify a ZkProof by marshaling it and sending it to the Halo2 Verifier. func (v *Verifier) VerifyProof(proof *message.AggProof) (bool, error) { - buf, err := proof.Marshal() + if v.cfg.MockMode { + log.Info("Verifier disabled, VerifyProof skipped") + return true, nil + + } + buf, err := json.Marshal(proof) if err != nil { return false, err } - if _, err := v.conn.Write(buf); err != nil { - return false, err - } - - // Read verified byte - bs := make([]byte, 1) - if _, err := v.conn.Read(bs); err != nil { - return false, err - } - - return bs[0] != 0, nil + aggProofStr := C.CString(string(buf)) + defer func() { + C.free(unsafe.Pointer(aggProofStr)) + }() + verified := C.verify_agg_proof(aggProofStr) + return verified != 0, nil } diff --git a/coordinator/verifier/verifier_test.go b/coordinator/verifier/verifier_test.go index ac54a3f6e..4f5622d00 100644 --- a/coordinator/verifier/verifier_test.go +++ b/coordinator/verifier/verifier_test.go @@ -1,65 +1,39 @@ +//go:build ffi + package verifier_test import ( + "encoding/json" + "io" + "os" "testing" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/crypto" - "github.com/stretchr/testify/assert" - "scroll-tech/common/message" + + "scroll-tech/coordinator/config" + "scroll-tech/coordinator/verifier" + + "github.com/stretchr/testify/assert" ) -// skipped due to verifier upgrade -/* -// This test assumes the IPC Verifier is running. -func TestIPCComm(t *testing.T) { - if os.Getenv("TEST_IPC") != "true" { - return +func TestFFI(t *testing.T) { + as := assert.New(t) + cfg := &config.VerifierConfig{ + MockMode: false, + ParamsPath: "../assets/test_params", + AggVkPath: "../assets/agg_vk", } + v, err := verifier.NewVerifier(cfg) + as.NoError(err) - assert := assert.New(t) - verifier, err := verifier.NewVerifier("/tmp/Verifier.sock") - assert.NoError(err) + f, err := os.Open("../assets/agg_proof") + as.NoError(err) + byt, err := io.ReadAll(f) + as.NoError(err) + aggProof := &message.AggProof{} + as.NoError(json.Unmarshal(byt, aggProof)) - // Retrieve pre-generated proofs - evmProof, err := ioutil.ReadFile("../assets/evm_proof") - assert.NoError(err) - stateProof, err := ioutil.ReadFile("../assets/state_proof") - assert.NoError(err) - - proof := &message.ZkProof{ - ID: 1, - EvmProof: evmProof, - StateProof: stateProof, - } - - traces := &types.BlockTrace{} - - verified, err := verifier.VerifyProof(proof) - assert.NoError(err) - assert.True(verified) -} -*/ - -func TestVerifier(t *testing.T) { - privkey, err := crypto.HexToECDSA("dcf2cbdd171a21c480aa7f53d77f31bb102282b3ff099c78e3118b37348c72f7") - assert.NoError(t, err) - - pubkey := crypto.CompressPubkey(&privkey.PublicKey) - - msg := &message.Identity{ - Name: "scroll_roller", - Timestamp: 1649663001, - PublicKey: common.Bytes2Hex(pubkey), - Version: "some_version", - } - hash, err := msg.Hash() - assert.NoError(t, err) - - sig, err := crypto.Sign(hash, privkey) - assert.NoError(t, err) - - ok := crypto.VerifySignature(pubkey, hash, sig[:64]) - assert.Equal(t, true, ok) + ok, err := v.VerifyProof(aggProof) + as.NoError(err) + as.True(ok) } diff --git a/roller/.gitignore b/roller/.gitignore index 395b8a088..427373ff4 100644 --- a/roller/.gitignore +++ b/roller/.gitignore @@ -7,8 +7,7 @@ build/bin/ bbolt_db # ignore cgo in macOS -core/prover/lib/libprover.a -core/prover/rust/target +core/prover/lib params/ seed diff --git a/roller/Makefile b/roller/Makefile index fc4e69e12..dd5f5b17a 100644 --- a/roller/Makefile +++ b/roller/Makefile @@ -4,30 +4,33 @@ IMAGE_NAME=go-roller IMAGE_VERSION=latest ifeq (4.3,$(firstword $(sort $(MAKE_VERSION) 4.3))) - ZK_VERSION=$(shell grep -m 1 "common-rs" core/prover/rust/Cargo.lock | cut -d "#" -f2 | cut -c-7) + ZK_VERSION=$(shell grep -m 1 "common-rs" ../common/libzkp/impl/Cargo.lock | cut -d "#" -f2 | cut -c-7) else - ZK_VERSION=$(shell grep -m 1 "common-rs" core/prover/rust/Cargo.lock | cut -d "\#" -f2 | cut -c-7) + ZK_VERSION=$(shell grep -m 1 "common-rs" ../common/libzkp/impl/Cargo.lock | cut -d "\#" -f2 | cut -c-7) endif -libprover: - cd core/prover/rust && cargo build --release && cp target/release/libprover.a ../lib/ +libzkp: + cd ../common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ + cp -r ../common/libzkp/interface ./core/prover/lib roller: ## Build the Roller instance. - cd core/prover/rust && cargo build --release && cp target/release/libprover.a ../lib/ + cd ../common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ + cp -r ../common/libzkp/interface ./core/prover/lib GOBIN=$(PWD)/build/bin go build -ldflags "-X scroll-tech/roller/core.ZK_VERSION=${ZK_VERSION}" -o $(PWD)/build/bin/roller ./cmd +gpu-roller: ## Build the GPU Roller instance. + cd ../common/libzkp/impl && cargo build --release && cp ./target/release/libzkp.a ../interface/ + cp -r ../common/libzkp/interface ./core/prover/lib + GOBIN=$(PWD)/build/bin go build -ldflags "-X scroll-tech/roller/core.ZK_VERSION=${ZK_VERSION}" -tags gpu -o $(PWD)/build/bin/roller ./cmd + mock_roller: GOBIN=$(PWD)/build/bin go build -tags mock_prover -o $(PWD)/build/bin/roller $(PWD)/cmd -gpu-roller: ## Builds the GPU Roller instance. - cd core/prover/rust && cargo build --release && cp target/release/libprover.a ../lib/ - GOBIN=$(PWD)/build/bin go build -ldflags "-X scroll-tech/roller/core.ZK_VERSION=${ZK_VERSION}" -tags gpu -o $(PWD)/build/bin/roller ./cmd - test-prover: - go test -timeout 0 -v ./core/prover + go test -tags ffi -timeout 0 -v ./core/prover test-gpu-prover: - go test -tags gpu -timeout 0 -v ./core/prover + go test -tags="gpu ffi" -timeout 0 -v ./core/prover lastest-zk-version: curl -sL https://api.github.com/repos/scroll-tech/common-rs/commits | jq -r ".[0].sha" diff --git a/roller/config/config.go b/roller/config/config.go index 09c59cab4..e498fc7aa 100644 --- a/roller/config/config.go +++ b/roller/config/config.go @@ -18,7 +18,7 @@ type Config struct { DBPath string `json:"db_path"` } -// ProverConfig loads zk roller configuration items. +// ProverConfig load zk prover config. type ProverConfig struct { ParamsPath string `json:"params_path"` SeedPath string `json:"seed_path"` diff --git a/roller/core/prover/lib/prover.h b/roller/core/prover/lib/prover.h deleted file mode 100644 index 028e55dc5..000000000 --- a/roller/core/prover/lib/prover.h +++ /dev/null @@ -1,3 +0,0 @@ -int init_prover(char *params_path, char *seed_path); -char* create_agg_proof(char *trace); -char* create_agg_proof_multi(char *trace); diff --git a/roller/core/prover/prover.go b/roller/core/prover/prover.go index 14f551aef..e9274c069 100644 --- a/roller/core/prover/prover.go +++ b/roller/core/prover/prover.go @@ -4,10 +4,10 @@ package prover /* -#cgo LDFLAGS: ./core/prover/lib/libprover.a -lm -ldl -#cgo gpu LDFLAGS: ./core/prover/lib/libprover.a -lm -ldl -lgmp -lstdc++ -lprocps -L/usr/local/cuda/lib64/ -lcudart +#cgo LDFLAGS: ${SRCDIR}/lib/libzkp.a -lm -ldl +#cgo gpu LDFLAGS: ${SRCDIR}/lib/libzkp.a -lm -ldl -lgmp -lstdc++ -lprocps -L/usr/local/cuda/lib64/ -lcudart #include -#include "./lib/prover.h" +#include "./lib/libzkp.h" */ import "C" //nolint:typecheck @@ -22,7 +22,7 @@ import ( "scroll-tech/roller/config" ) -// Prover sends block-traces to rust-prover through socket and get back the zk-proof. +// Prover sends block-traces to rust-prover through ffi and get back the zk-proof. type Prover struct { cfg *config.ProverConfig } diff --git a/roller/core/prover/prover_test.go b/roller/core/prover/prover_test.go index d6d364c01..2d4ea04f1 100644 --- a/roller/core/prover/prover_test.go +++ b/roller/core/prover/prover_test.go @@ -1,3 +1,5 @@ +//go:build ffi + package prover_test import ( @@ -27,10 +29,6 @@ type RPCTrace struct { } func TestFFI(t *testing.T) { - if os.Getenv("TEST_FFI") != "true" { - t.Skip("Skipping testing FFI") - } - as := assert.New(t) cfg := &config.ProverConfig{ ParamsPath: paramsPath,