- Bump rust version to `nightly-2025-07-02` because some of the nightly features we were using have been stabilized. - Introduce feature `disk_cache` which enables caching to disk. Each time an artifact is retrieved from the cache it will be read and deserialized. On a cache miss the artifact will be created, serialized and stored to disk. - Introduce feature `mem_cache` which enables caching to memory. All cached artifacts are kept in memory after they are created. The mem cache implementation avoids cloning of artifacts by extending their lifetime to `'static`. This is `unsafe` code, but I argue that this usage is safe. - Add a `build.rs` - When the feature `disk_cache` is enabled, the `build.rs` will inject env variables to the process with the git commit information, which is used to index the cached artifacts - Replace all previous cached artifacts from `LazyStatic` methods that call the cache API - Derive `Serialize, Deserialize` for all `*Target` types so that they can be serialized for caching to disk - Add finer level of caching: now we cache the `CircuitData` and `VerifierData` independently. The reason for this is that `CircuitData` is a very big artifact which is not needed for verification. So by only accessing `VerifierData` in verification we don't pay a big overhead for reading from disk and deserializing - Add missing artifacts to the cache: like the `CircuitData` for the `MainPod` indexed by `Params` - Add helper types to serialize and deserialize `CircuitData`, `CommonData` and `VerifierData` with the set of gates and generators used in the recursive MainPod circuit - Tweak the ids of our custom gates so that they remain unique when their generic parameters change - Bugfix: several tests were using the standard `vd_set` but were using MainPod circuits with non-default parameters. This was working before because there was a bug: the MainPod circuit was reporting that the used verifier data was the standard one instead of picking the one corresponding to it's own Params. Summary of breaking changes: - One and only one of the features `mem_cache` or `disk_cache` need to be enabled. By default it's `mem_cache` - To enable the `disk_cache` you need to disable the default features like this: `--no-default-features --features=backend_plonky2,zk,disk_cache` - Removed `DEFAULT_PARAMS`, instead use `Params::default()` - Removed `STANDARD_REC_MAIN_POD_CIRCUIT_DATA`, instead use `cache_get_standard_rec_main_pod_common_circuit_data` - The library is now using `nightly-2025-07-02`. Some rust language features are unstable in previous versions.
45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
#![allow(clippy::uninlined_format_args)] // TODO: Remove this in another PR
|
|
//! Simple example of building a signed pod and verifying it
|
|
//!
|
|
//! Run: `cargo run --release --example signed_pod`
|
|
use std::collections::HashSet;
|
|
|
|
use pod2::{
|
|
backends::plonky2::{primitives::ec::schnorr::SecretKey, signedpod::Signer},
|
|
frontend::SignedPodBuilder,
|
|
middleware::{containers::Set, Params, Value},
|
|
};
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let params = Params::default();
|
|
|
|
// Create a schnorr key pair to sign the pod
|
|
let sk = SecretKey::new_rand();
|
|
let pk = sk.public_key();
|
|
println!("Public key: {}\n", pk);
|
|
|
|
let signer = Signer(sk);
|
|
|
|
// Build the signed pod
|
|
let mut builder = SignedPodBuilder::new(¶ms);
|
|
// The values can be String, i64, bool, Array, Set, Dictionary, ...
|
|
builder.insert("name", "Alice");
|
|
builder.insert("lucky_number", 42);
|
|
builder.insert("human", true);
|
|
let friends_set: HashSet<Value> = ["Bob", "Charlie", "Dave"]
|
|
.into_iter()
|
|
.map(Value::from)
|
|
.collect();
|
|
builder.insert(
|
|
"friends",
|
|
Set::new(params.max_merkle_proofs_containers, friends_set)?,
|
|
);
|
|
|
|
// Sign the pod and verify it
|
|
let pod = builder.sign(&signer)?;
|
|
pod.verify()?;
|
|
|
|
println!("{}", pod);
|
|
|
|
Ok(())
|
|
}
|