@@ -5,6 +5,7 @@ use euclidv2::EuclidV2Verifier;
55use eyre:: Result ;
66use serde:: { Deserialize , Serialize } ;
77use 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 ) ]
4849pub struct VerifierConfig {
49- pub high_version_circuit : CircuitConfig ,
50+ pub circuits : Vec < CircuitConfig > ,
5051}
5152
5253type 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
5758pub 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
7076pub 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!(
0 commit comments