//go:build !mock_verifier package verifier /* #cgo LDFLAGS: -lzkp -lm -ldl -lzktrie -L${SRCDIR}/lib/ -Wl,-rpath=${SRCDIR}/lib #cgo gpu LDFLAGS: -lzkp -lm -ldl -lgmp -lstdc++ -lprocps -lzktrie -L/usr/local/cuda/lib64/ -lcudart -L${SRCDIR}/lib/ -Wl,-rpath=${SRCDIR}/lib #include #include "./lib/libzkp.h" */ import "C" //nolint:typecheck import ( "encoding/json" "unsafe" "github.com/scroll-tech/go-ethereum/log" "scroll-tech/coordinator/config" "scroll-tech/common/types/message" ) // InvalidTestProof invalid proof used in tests const InvalidTestProof = "this is a invalid proof" // Verifier represents a rust ffi to a halo2 verifier. type Verifier struct { cfg *config.VerifierConfig } // 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)) }() C.init_verifier(paramsPathStr, aggVkPathStr) 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) { if v.cfg.MockMode { log.Info("Mock mode, verifier disabled") if string(proof.Proof) == InvalidTestProof { return false, nil } return true, nil } buf, err := json.Marshal(proof) if err != nil { return false, err } aggProofStr := C.CString(string(buf)) defer func() { C.free(unsafe.Pointer(aggProofStr)) }() log.Info("Start to verify proof ...") verified := C.verify_agg_proof(aggProofStr) return verified != 0, nil }