1 个不稳定版本

0.0.0 2019年8月24日

#15 in #ssz

Apache-2.0

48KB
937

证明

Build Status License

Proof 是一个用于验证和操作部分对象梅克尔证明的库。

该库符合不断发展的以太坊2.0 规范 梅克尔证明部分。直到版本 1.0,API 可能是不稳定的。

入门

将以下内容添加到您的项目 Cargo.toml 中的 [dependencies]

proof = { git = "https://github.com/c-o-l-o-r/proof" }
proof_derive = { git = "https://github.com/c-o-l-o-r/proof" }

如果您打算使用 ssz_types,也请添加

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)
    );
}

有关更多使用示例,请参阅 测试 目录。

许可证

Apache License,版本2.0 (http://www.apache.org/licenses/LICENSE-2.0) 许可

依赖项

~3MB
~66K SLoC