Files
linea-monorepo/prover/zkevm/checker.go
David Pearce bf71b6b5ca Prover: compatibility check between zkevmbin and lt trace file (#745)
* update `go-corset` to `v0.9.4`

* feat: add binfile / tracefile compatibility check

This adds a compatibility check between the zkevm.bin file and the lt
trace file.  The compatibility check extracts the constraints commit
used to generate the respective asset, and ensures a match.  If not, the
code panics with an error.  Likewise, if the metadata is missing then
code will panic with an error.

* support "relaxed mode"

This intention here is to enable the strong compatibility check to be
disabled.  It seems sensible to have an option to turn it off, and a
flag is added to the `bin/checker` to disable it.

* remove file-based constraints version check

* update to later version of `go-corset`

In order to allow embedded line count information (as requested
separately from this PR), go-corset now uses a structured form of
metadata.  This simply updates this PR to use the revised API.

* rename "RelaxedMode" => "IgnoreCompabitilityCheck"

This simply renames the "relaxed mode" to something more direct, namely
"IgnoreCompatiblityCheck" which does what it says on the tin.

* update `go-corset` to v1.0.0

* add IgnoreCompatibilityCheck option to prover config

* remove unnecessary variable

* Update compatibility check to fail early on incompatibility

* add log when IgnoreCompatibilityCheck is enabled

---------

Co-authored-by: gusiri <dreamerty@postech.ac.kr>
2025-03-07 08:45:54 +09:00

47 lines
1.4 KiB
Go

package zkevm
import (
"sync"
"github.com/consensys/go-corset/pkg/mir"
"github.com/consensys/linea-monorepo/prover/config"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/zkevm/arithmetization"
)
var (
checkerZkEvm *ZkEvm
onceCheckerZkEvm = sync.Once{}
checkerCompilationSuite = compilationSuite{
// The dummy compiler returns the witness as the proof and manually
// checks it as the verifier. It is essentially the trivial proof
// system.
dummy.Compile,
}
)
// The checker is not meant to generate proofs, it is meant to be used to check
// that the provided prover inputs are correct. It typically is used to audit
// the traces of the arithmetization. Currently, it does not include the keccaks
// nor does it include the state-management checks.
func CheckerZkEvm(tl *config.TracesLimits, cfg *config.Config) *ZkEvm {
onceCheckerZkEvm.Do(func() {
settings := Settings{
Arithmetization: arithmetization.Settings{
Limits: tl,
OptimisationLevel: &mir.DEFAULT_OPTIMISATION_LEVEL,
IgnoreCompatibilityCheck: &cfg.Execution.IgnoreCompatibilityCheck,
},
CompilationSuite: checkerCompilationSuite,
Metadata: wizard.VersionMetadata{
Title: "linea/evm-execution/checker",
Version: "beta-v1",
},
}
checkerZkEvm = NewZkEVM(settings)
})
return checkerZkEvm
}