| Crates.io | quilibrium-verkle |
| lib.rs | quilibrium-verkle |
| version | 2.1.0 |
| created_at | 2025-12-17 11:54:21.371352+00 |
| updated_at | 2025-12-17 11:54:21.371352+00 |
| description | Verkle trie implementation with KZG commitments for Quilibrium |
| homepage | |
| repository | https://github.com/quilibriumnetwork/quilibrium-rs-sdk-verkle |
| max_upload_size | |
| id | 1990021 |
| size | 143,591 |
Verkle trie implementation with KZG polynomial commitments for the Quilibrium network.
This crate provides a Verkle trie data structure with KZG (Kate-Zaverucha-Goldberg) polynomial commitments. Verkle tries enable efficient, constant-size cryptographic proofs of inclusion for key-value data.
Add this to your Cargo.toml:
[dependencies]
quilibrium-verkle = "2.1.0"
bls48581 = "2.1.0" # Required for cryptographic operations
use quilibrium_verkle::VectorCommitmentTrie;
// Initialize the BLS library (required once)
bls48581::init();
// Create a new verkle trie
let mut trie = VectorCommitmentTrie::new();
// Insert key-value pairs
trie.insert(vec![1, 2, 3], vec![4, 5, 6]).unwrap();
trie.insert(vec![1, 2, 4], vec![7, 8, 9]).unwrap();
// Get the root commitment (74 bytes)
let commitment = trie.commit().unwrap();
// Retrieve a value
let value = trie.get(&[1, 2, 3]);
assert_eq!(value, Some(vec![4, 5, 6]));
use quilibrium_verkle::VectorCommitmentTrie;
bls48581::init();
let mut trie = VectorCommitmentTrie::new();
trie.insert(vec![1], vec![10]).unwrap();
trie.insert(vec![2], vec![20]).unwrap();
// Generate a proof that key [1] exists with value [10]
let proof = trie.prove(&[1]).unwrap();
let commitment = trie.commit().unwrap();
// Verify the proof
assert!(proof.verify(&commitment).unwrap());
// Extract the proven value
let values = proof.verify_and_extract(&commitment).unwrap();
assert_eq!(values[0], vec![10]);
Prove multiple keys efficiently in a single proof:
use quilibrium_verkle::VectorCommitmentTrie;
bls48581::init();
let mut trie = VectorCommitmentTrie::new();
trie.insert(vec![1], vec![10]).unwrap();
trie.insert(vec![2], vec![20]).unwrap();
trie.insert(vec![3], vec![30]).unwrap();
// Generate a proof for multiple keys at once
let keys = vec![vec![1], vec![2], vec![3]];
let proof = trie.prove_multiple(&keys).unwrap();
// Verify and extract all values
let commitment = trie.commit().unwrap();
let values = proof.verify_and_extract(&commitment).unwrap();
assert_eq!(values, vec![vec![10], vec![20], vec![30]]);
The RDF multiprover allows you to define structured schemas using Turtle RDF format:
use quilibrium_verkle::{VectorCommitmentTrie, RdfMultiprover};
bls48581::init();
// Define an RDF schema for a name record
let schema = r#"
@prefix qcl: <https://types.quilibrium.com/qcl/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix name: <https://types.quilibrium.com/schema-repository/name/> .
name:NameRecord a rdfs:Class ;
rdfs:comment "Quilibrium name service record" .
name:Name a rdfs:Property ;
rdfs:range name:NameRecord ;
rdfs:domain qcl:String ;
qcl:size 32 ;
qcl:order 1 .
name:Owner a rdfs:Property ;
rdfs:range name:NameRecord ;
rdfs:domain qcl:ByteArray ;
qcl:size 57 ;
qcl:order 2 .
"#;
// Create tree and insert data
let mut tree = VectorCommitmentTrie::new();
tree.insert(vec![1 << 2], b"alice".to_vec()).unwrap();
tree.insert(vec![2 << 2], vec![0u8; 57]).unwrap();
// Generate a proof for specific fields
let multiprover = RdfMultiprover::new();
let fields = vec!["Name".to_string(), "Owner".to_string()];
let proof = multiprover.prove(schema, &fields, &mut tree).unwrap();
// Get commitment and proof bytes
let commitment = tree.commit().unwrap();
let proof_bytes = proof.to_bytes().unwrap();
// Verify the proof
let data = vec![b"alice".to_vec(), vec![0u8; 57]];
let valid = multiprover.verify(schema, &fields, None, &commitment, &proof_bytes, &data).unwrap();
assert!(valid);
A Verkle trie is a 64-ary tree where:
Each branch node's 64 children are represented as a degree-63 polynomial, which is committed using KZG commitments on the BLS48-581 elliptic curve. This enables:
The trie provides binding commitments: once data is committed, it cannot be changed without detectably altering the root commitment. Proofs are:
This implementation is byte-for-byte compatible with the Go implementation in Quilibrium's ceremonyclient.
For complete API documentation, run:
cargo doc --open
Or visit docs.rs/quilibrium-verkle.
Run the test suite:
cargo test
The test suite includes:
Licensed under the MIT License. See LICENSE for details.
Contributions are welcome! Please ensure:
cargo test)cargo fmt)cargo clippy)