Proof
is library for validating and manipulating merkle proofs
of partial objects.
The library conforms with the evolving Ethereum 2.0
specification
merkle proof partials. Until version 1.0
, expect the API to be unstable.
Add the following to your projects Cargo.toml
under [dependencies]
:
proof = { git = "https://github.com/c-o-l-o-r/proof" }
proof_derive = { git = "https://github.com/c-o-l-o-r/proof" }
If you plan to use ssz_types
, also add:
ssz_types = { git = "https://github.com/sigp/lighthouse" }
// S's merkle tree representation
//
// root(0)
// / \
// a(1) b(2) -----+
// / \
// +-- data(5) --+ len(6)
// / \
// i(11) i(12)
// / \ / \
// b[0,1](23) b[2,3](24) b[4,5](26) b[6,7](27)
use proof::{Proof, Path, SerializedProof, hash_children};
#[derive(Provable)]
struct S {
a: u64,
b: VariableList<u128, U8>,
}
fn main() {
// Build the 32-byte chunks
let one = vec![0u8; 32];
let six = vec![0u8; 32];
let twelve = hash_children(&[0u8; 32], &[0u8; 32]);
let twenty_three = vec![1u8; 32];
let twenty_four = vec![2u8; 32];
// Generate the proof
let serialized_proof = SerializedProof {
indices: vec![1, 6, 12, 23, 24],
chunks: vec![one, six, twelve, twenty_three, twenty_four].into_iter().flatten().collect(),
};
// Load the proof
let mut proof = Proof::<S>::new(serialized_proof.clone());
// Fill in chunks that can be inferred
assert_eq!(proof.fill(), Ok(()));
// Extract a proof to `S.b[2]`
assert_eq!(
proof.extract(vec![Path::Ident("b".to_string()), Path::Index(2)]),
Ok(serialized_proof)
);
}
For additional usage examples, see the tests directory.
Licensed under Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)