From e33d11ddc73ee4cdcd57734986c8acc4e3a1bbab Mon Sep 17 00:00:00 2001 From: Ho Date: Fri, 12 Sep 2025 15:35:48 +0900 Subject: [PATCH] apply features in configuration --- coordinator/internal/config/config.go | 1 + coordinator/internal/logic/verifier/verifier.go | 3 +++ crates/libzkp/src/lib.rs | 16 +++++++++++++++- crates/libzkp/src/tasks/batch.rs | 2 +- crates/libzkp/src/tasks/bundle.rs | 2 +- crates/libzkp/src/tasks/chunk.rs | 3 ++- 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/coordinator/internal/config/config.go b/coordinator/internal/config/config.go index 1156230f2..20ce94e22 100644 --- a/coordinator/internal/config/config.go +++ b/coordinator/internal/config/config.go @@ -66,6 +66,7 @@ type AssetConfig struct { // VerifierConfig load zk verifier config. type VerifierConfig struct { MinProverVersion string `json:"min_prover_version"` + Features string `json:"features,omitempty"` Verifiers []AssetConfig `json:"verifiers"` } diff --git a/coordinator/internal/logic/verifier/verifier.go b/coordinator/internal/logic/verifier/verifier.go index 05800fb53..c2e4cb823 100644 --- a/coordinator/internal/logic/verifier/verifier.go +++ b/coordinator/internal/logic/verifier/verifier.go @@ -67,6 +67,9 @@ func NewVerifier(cfg *config.VerifierConfig) (*Verifier, error) { return nil, err } + if cfg.Features != "" { + libzkp.SetDynamicFeature(cfg.Features) + } libzkp.InitVerifier(string(configBytes)) v := &Verifier{ diff --git a/crates/libzkp/src/lib.rs b/crates/libzkp/src/lib.rs index 20c16a1fb..4675bab6a 100644 --- a/crates/libzkp/src/lib.rs +++ b/crates/libzkp/src/lib.rs @@ -12,10 +12,24 @@ use std::path::Path; use tasks::chunk_interpreter::{ChunkInterpreter, TryFromWithInterpreter}; /// global features: use legacy encoding for witness -pub(crate) static LEGACY_WITNESS_ENCODING: bool = false; +static mut LEGACY_WITNESS_ENCODING: bool = false; +pub(crate) fn witness_use_legacy_mode() -> bool {unsafe{LEGACY_WITNESS_ENCODING}} + pub fn set_dynamic_feature(feats: &str){ + for feat_s in feats.split(':') { + match feat_s.trim().to_lowercase().as_str() { + "legacy_witness" => { + tracing::info!("set witness encoding for legacy mode"); + unsafe { + // the function is only called while initialize step + LEGACY_WITNESS_ENCODING = true; + } + } + s => tracing::warn!("unrecognized dynamic feature: {s}"), + } + } } diff --git a/crates/libzkp/src/tasks/batch.rs b/crates/libzkp/src/tasks/batch.rs index 30634255f..8e061fdae 100644 --- a/crates/libzkp/src/tasks/batch.rs +++ b/crates/libzkp/src/tasks/batch.rs @@ -84,7 +84,7 @@ impl TryFrom for ProvingTask { fn try_from(value: BatchProvingTask) -> Result { let witness = value.build_guest_input(); - let serialized_witness = if crate::LEGACY_WITNESS_ENCODING { + let serialized_witness = if crate::witness_use_legacy_mode() { let legacy_witness = LegacyBatchWitness::from(witness); to_rkyv_bytes::(&legacy_witness)?.into_vec() } else { diff --git a/crates/libzkp/src/tasks/bundle.rs b/crates/libzkp/src/tasks/bundle.rs index d5f968ce7..6ca8645b0 100644 --- a/crates/libzkp/src/tasks/bundle.rs +++ b/crates/libzkp/src/tasks/bundle.rs @@ -70,7 +70,7 @@ impl TryFrom for ProvingTask { fn try_from(value: BundleProvingTask) -> Result { let witness = value.build_guest_input(); - let serialized_witness = if crate::LEGACY_WITNESS_ENCODING { + let serialized_witness = if crate::witness_use_legacy_mode() { to_rkyv_bytes::(&witness)?.into_vec() } else { super::encode_task_to_witness(&witness)? diff --git a/crates/libzkp/src/tasks/chunk.rs b/crates/libzkp/src/tasks/chunk.rs index 37041239c..6eefeda93 100644 --- a/crates/libzkp/src/tasks/chunk.rs +++ b/crates/libzkp/src/tasks/chunk.rs @@ -68,7 +68,7 @@ impl TryFrom for ProvingTask { fn try_from(value: ChunkProvingTask) -> Result { let witness = value.build_guest_input(); - let serialized_witness = if crate::LEGACY_WITNESS_ENCODING { + let serialized_witness = if crate::witness_use_legacy_mode() { let legacy_witness = LegacyChunkWitness::from(witness); to_rkyv_bytes::(&legacy_witness)?.into_vec() } else { @@ -146,6 +146,7 @@ impl ChunkProvingTask { /// this method check the validate of current task (there may be missing storage node) /// and try fixing it until everything is ok + #[deprecated] pub fn prepare_task_via_interpret( &mut self, interpreter: impl ChunkInterpreter,