Skip to content

Commit f19e3b1

Browse files
committed
update configuration of verifier@coordinator
1 parent b73aaf5 commit f19e3b1

File tree

9 files changed

+79
-53
lines changed

9 files changed

+79
-53
lines changed

coordinator/cmd/api/app/mock_app.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ func (c *CoordinatorApp) MockConfig(store bool) error {
9090
cfg.ProverManager = &coordinatorConfig.ProverManager{
9191
ProversPerSession: 1,
9292
Verifier: &coordinatorConfig.VerifierConfig{
93-
HighVersionCircuit: &coordinatorConfig.CircuitConfig{
94-
AssetsPath: "",
95-
ForkName: "euclidV2",
96-
MinProverVersion: "v4.4.89",
93+
MinProverVersion: "v4.4.89",
94+
Verifiers: []coordinatorConfig.AssetConfig{{
95+
AssetsPath: "",
96+
ForkName: "euclidV2",
9797
},
98-
},
98+
}},
9999
BatchCollectionTimeSec: 60,
100100
ChunkCollectionTimeSec: 60,
101101
SessionAttempts: 10,

coordinator/cmd/tool/verify.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,22 @@ import (
1313

1414
"scroll-tech/common/types/message"
1515

16+
"github.com/scroll-tech/go-ethereum/log"
1617
"github.com/urfave/cli/v2"
1718
)
1819

1920
func verify(cCtx *cli.Context) error {
2021
var forkName, proofType, proofPath string
2122
if cCtx.Args().Len() <= 2 {
22-
forkName = cfg.ProverManager.Verifier.HighVersionCircuit.ForkName
23+
forkName = cfg.ProverManager.Verifier.Verifiers[0].ForkName
2324
proofType = cCtx.Args().First()
2425
proofPath = cCtx.Args().Get(1)
2526
} else {
2627
forkName = cCtx.Args().First()
2728
proofType = cCtx.Args().Get(1)
2829
proofPath = cCtx.Args().Get(2)
2930
}
30-
fmt.Println("verify proof in: ", proofPath, "type", proofType, "forkName", forkName)
31+
log.Info("verify proof in: ", proofPath, "type", proofType, "forkName", forkName)
3132

3233
// Load the content of the proof file
3334
data, err := os.ReadFile(filepath.Clean(proofPath))

coordinator/conf/config.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
"batch_collection_time_sec": 180,
88
"chunk_collection_time_sec": 180,
99
"verifier": {
10-
"high_version_circuit": {
11-
"assets_path": "assets",
12-
"fork_name": "euclidV2",
13-
"min_prover_version": "v4.4.45"
14-
}
10+
"assets_path": "assets",
11+
"min_prover_version": "v4.4.45",
12+
"accept_vks": [{
13+
"file": "euclidvk.json",
14+
"fork_name": "euclidV2"
15+
}]
1516
}
1617
},
1718
"db": {

coordinator/internal/config/config.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,17 @@ type Config struct {
5555
Auth *Auth `json:"auth"`
5656
}
5757

58-
// CircuitConfig circuit items.
59-
type CircuitConfig struct {
60-
AssetsPath string `json:"assets_path"`
61-
ForkName string `json:"fork_name"`
62-
MinProverVersion string `json:"min_prover_version"`
58+
// AssetConfig contain assets configurated for each fork, the defaul vkfile name is "OpenVmVk.json".
59+
type AssetConfig struct {
60+
AssetsPath string `json:"assets_path"`
61+
ForkName string `json:"fork_name"`
62+
Vkfile string `json:"vk_file,omitempty"`
6363
}
6464

6565
// VerifierConfig load zk verifier config.
6666
type VerifierConfig struct {
67-
HighVersionCircuit *CircuitConfig `json:"high_version_circuit"`
67+
MinProverVersion string `json:"min_prover_version"`
68+
Verifiers []AssetConfig `json:"verifiers"`
6869
}
6970

7071
// NewConfig returns a new instance of Config.

coordinator/internal/logic/auth/login.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ type LoginLogic struct {
3131
func NewLoginLogic(db *gorm.DB, cfg *config.Config, vf *verifier.Verifier) *LoginLogic {
3232
proverVersionHardForkMap := make(map[string][]string)
3333

34-
var highHardForks []string
35-
highHardForks = append(highHardForks, cfg.ProverManager.Verifier.HighVersionCircuit.ForkName)
36-
proverVersionHardForkMap[cfg.ProverManager.Verifier.HighVersionCircuit.MinProverVersion] = highHardForks
34+
var hardForks []string
35+
for _, cfg := range cfg.ProverManager.Verifier.Verifiers {
36+
hardForks = append(hardForks, cfg.ForkName)
37+
}
38+
proverVersionHardForkMap[cfg.ProverManager.Verifier.MinProverVersion] = hardForks
3739

3840
return &LoginLogic{
3941
cfg: cfg,
@@ -56,8 +58,8 @@ func (l *LoginLogic) Check(login *types.LoginParameter) error {
5658
return errors.New("auth message verify failure")
5759
}
5860

59-
if !version.CheckScrollRepoVersion(login.Message.ProverVersion, l.cfg.ProverManager.Verifier.HighVersionCircuit.MinProverVersion) {
60-
return fmt.Errorf("incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", l.cfg.ProverManager.Verifier.HighVersionCircuit.MinProverVersion, login.Message.ProverVersion)
61+
if !version.CheckScrollRepoVersion(login.Message.ProverVersion, l.cfg.ProverManager.Verifier.MinProverVersion) {
62+
return fmt.Errorf("incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", l.cfg.ProverManager.Verifier.MinProverVersion, login.Message.ProverVersion)
6163
}
6264

6365
vks := make(map[string]struct{})

coordinator/internal/logic/verifier/verifier.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type rustCircuitConfig struct {
2626
AssetsPath string `json:"assets_path"`
2727
}
2828

29-
func newRustCircuitConfig(cfg *config.CircuitConfig) *rustCircuitConfig {
29+
func newRustCircuitConfig(cfg config.AssetConfig) *rustCircuitConfig {
3030
return &rustCircuitConfig{
3131
ForkName: cfg.ForkName,
3232
AssetsPath: cfg.AssetsPath,
@@ -37,13 +37,17 @@ func newRustCircuitConfig(cfg *config.CircuitConfig) *rustCircuitConfig {
3737
// Define a brand new struct here is to eliminate side effects in case fields
3838
// in `*config.VerifierConfig` being changed
3939
type rustVerifierConfig struct {
40-
HighVersionCircuit *rustCircuitConfig `json:"high_version_circuit"`
40+
Circuits []*rustCircuitConfig `json:"circuits"`
4141
}
4242

4343
func newRustVerifierConfig(cfg *config.VerifierConfig) *rustVerifierConfig {
44-
return &rustVerifierConfig{
45-
HighVersionCircuit: newRustCircuitConfig(cfg.HighVersionCircuit),
44+
45+
out := &rustVerifierConfig{}
46+
47+
for _, cfg := range cfg.Verifiers {
48+
out.Circuits = append(out.Circuits, newRustCircuitConfig(cfg))
4649
}
50+
return out
4751
}
4852

4953
type rustVkDump struct {
@@ -70,8 +74,10 @@ func NewVerifier(cfg *config.VerifierConfig) (*Verifier, error) {
7074
BundleVk: make(map[string][]byte),
7175
}
7276

73-
if err := v.loadOpenVMVks(cfg.HighVersionCircuit); err != nil {
74-
return nil, err
77+
for _, cfg := range cfg.Verifiers {
78+
if err := v.loadOpenVMVks(cfg); err != nil {
79+
return nil, err
80+
}
7581
}
7682

7783
return v, nil
@@ -124,9 +130,13 @@ func (v *Verifier) VerifyBundleProof(proof *message.OpenVMBundleProof, forkName
124130
// return base64.StdEncoding.EncodeToString(byt), nil
125131
// }
126132

127-
func (v *Verifier) loadOpenVMVks(cfg *config.CircuitConfig) error {
133+
func (v *Verifier) loadOpenVMVks(cfg config.AssetConfig) error {
128134

129-
vkFile := path.Join(cfg.AssetsPath, "openVmVk.json")
135+
vkFileName := cfg.Vkfile
136+
if vkFileName == "" {
137+
vkFileName = "openVmVk.json"
138+
}
139+
vkFile := path.Join(cfg.AssetsPath, vkFileName)
130140

131141
f, err := os.Open(filepath.Clean(vkFile))
132142
if err != nil {

coordinator/test/api_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL stri
8585
ProverManager: &config.ProverManager{
8686
ProversPerSession: proversPerSession,
8787
Verifier: &config.VerifierConfig{
88-
HighVersionCircuit: &config.CircuitConfig{
89-
AssetsPath: "",
90-
ForkName: "euclidV2",
91-
MinProverVersion: "v4.4.89",
92-
},
88+
MinProverVersion: "v4.4.89",
89+
Verifiers: []config.AssetConfig{{
90+
AssetsPath: "",
91+
ForkName: "euclidV2",
92+
}},
9393
},
9494
BatchCollectionTimeSec: 10,
9595
ChunkCollectionTimeSec: 10,

crates/libzkp/src/verifier.rs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use euclidv2::EuclidV2Verifier;
55
use eyre::Result;
66
use serde::{Deserialize, Serialize};
77
use std::{
8+
collections::HashMap,
89
path::Path,
910
sync::{Arc, Mutex, OnceLock},
1011
};
@@ -46,36 +47,42 @@ pub struct CircuitConfig {
4647

4748
#[derive(Debug, Serialize, Deserialize)]
4849
pub struct VerifierConfig {
49-
pub high_version_circuit: CircuitConfig,
50+
pub circuits: Vec<CircuitConfig>,
5051
}
5152

5253
type HardForkName = String;
5354

54-
struct VerifierPair(HardForkName, Arc<Mutex<dyn ProofVerifier + Send>>);
55-
static VERIFIER_HIGH: OnceLock<VerifierPair> = OnceLock::new();
55+
type VerifierType = Arc<Mutex<dyn ProofVerifier + Send>>;
56+
static VERIFIERS: OnceLock<HashMap<HardForkName, VerifierType>> = OnceLock::new();
5657

5758
pub fn init(config: VerifierConfig) {
58-
let verifier = EuclidV2Verifier::new(&config.high_version_circuit.assets_path);
59+
let mut verifiers: HashMap<HardForkName, VerifierType> = Default::default();
5960

60-
let ret = VERIFIER_HIGH
61-
.set(VerifierPair(
62-
config.high_version_circuit.fork_name.to_lowercase(),
63-
Arc::new(Mutex::new(verifier)),
64-
))
65-
.is_ok();
61+
for cfg in &config.circuits {
62+
let verifier = EuclidV2Verifier::new(&cfg.assets_path);
63+
let ret = verifiers.insert(cfg.fork_name.to_lowercase(), Arc::new(Mutex::new(verifier)));
64+
assert!(
65+
ret.is_none(),
66+
"DO NOT init the same fork {} twice",
67+
cfg.fork_name
68+
);
69+
tracing::info!("load verifier config for fork {}", cfg.fork_name);
70+
}
6671

72+
let ret = VERIFIERS.set(verifiers).is_ok();
6773
assert!(ret);
6874
}
6975

7076
pub fn get_verifier(fork_name: &str) -> Result<Arc<Mutex<dyn ProofVerifier>>> {
71-
if let Some(verifier) = VERIFIER_HIGH.get() {
72-
if verifier.0 == fork_name {
73-
return Ok(verifier.1.clone());
77+
if let Some(verifiers) = VERIFIERS.get() {
78+
if let Some(verifier) = verifiers.get(fork_name) {
79+
return Ok(verifier.clone());
7480
}
81+
7582
Err(eyre::eyre!(
76-
"failed to get verifier, key not found: {}, expected {}",
83+
"failed to get verifier, key not found: {}, has {:?}",
7784
fork_name,
78-
verifier.0,
85+
verifiers.keys().collect::<Vec<_>>(),
7986
))
8087
} else {
8188
Err(eyre::eyre!(

zkvm-prover/config.json.template

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@
2626
"circuits": {
2727
"euclidV2": {
2828
"hard_fork_name": "euclidV2",
29-
"workspace_path": ".work"
30-
}
29+
"workspace_path": ".work/euclid"
30+
},
31+
"feynman": {
32+
"hard_fork_name": "feynman",
33+
"workspace_path": ".work/feynman1"
34+
},
3135
}
3236
}

0 commit comments

Comments
 (0)