The MerkleTree provides cryptographic verification of vector collections. The root hash (32 bytes) is posted to Solana, allowing anyone to verify that a specific vector ID is part of a collection without revealing the entire collection.
Returns Some(MerkleProof) if the vector ID exists in the tree, None otherwise.
Example:
let proof = tree.generate_proof("vec_2");if let Some(proof) = proof { println!("Generated proof for vec_2 with {} nodes", proof.proof_nodes.len());} else { println!("vec_2 not found in tree");}
use solvec_core::merkle::MerkleTree;use solvec_core::hnsw::HNSWIndex;use solvec_core::types::{DistanceMetric, Vector};fn main() -> Result<(), Box<dyn std::error::Error>> { // Step 1: Build HNSW index let mut index = HNSWIndex::new(16, 200, DistanceMetric::Cosine); let vector_ids = vec![ "user_alex_intro", "user_alex_startup", "user_bob_intro", "session_summary", ]; let vectors = vec![ vec![0.9, 0.1, 0.0, 0.0], vec![0.8, 0.2, 0.1, 0.0], vec![0.0, 0.0, 0.9, 0.1], vec![0.5, 0.5, 0.0, 0.0], ]; for (id, values) in vector_ids.iter().zip(vectors.iter()) { index.insert(Vector::new(*id, values.clone()))?; } // Step 2: Build Merkle tree from vector IDs let ids: Vec<String> = vector_ids.iter().map(|s| s.to_string()).collect(); let tree = MerkleTree::new(&ids); // Step 3: Get root hash (this goes to Solana) let root = tree.root(); let root_hex = tree.root_hex(); println!("Merkle root: {} (→ Solana)", &root_hex[..16]); // Step 4: Generate proof for a specific vector let proof = tree.generate_proof("user_alex_intro").unwrap(); println!("Generated proof with {} nodes", proof.proof_nodes.len()); // Step 5: Verify proof (anyone can do this with just the root) assert!(proof.verify(&root)); println!("✅ Proof verified: user_alex_intro is in collection"); // Step 6: Try invalid proof let wrong_root = [1u8; 32]; assert!(!proof.verify(&wrong_root)); println!("✅ Invalid root rejected"); // Step 7: Verify all vectors for id in &ids { let proof = tree.generate_proof(id).unwrap(); assert!(proof.verify(&root), "Proof failed for {}", id); } println!("✅ All proofs verified"); Ok(())}
Both MerkleTree and MerkleProof implement Serialize and Deserialize from serde:
use serde_json;// Serialize proof to JSONlet proof_json = serde_json::to_string(&proof)?;// Send proof to client or store in databaselet stored_proof: MerkleProof = serde_json::from_str(&proof_json)?;// Verify after deserializationassert!(stored_proof.verify(&root));