lighthouse/eth2/utils/tree_hash
Paul Hauner 88c6d15c32
Padding efficent merkle root algo (#436)
* Add initial work on padding efficent merkle roots

* Improve merklize_padded

* Improve tree_hash crate -- fix bugs, docs

* Update codebase for tree_hash API change

* Remove dbg statements, fix import error

* Fix clippy lints, doc error

* Tidy tree hash comments

* Increase tree_hash max tree height

* Fix PR review comments

* Fix typos

* Fix cache access off-by-one in tree hash

* Set max tree depth to 48 (from 64)
2019-07-16 14:40:56 +10:00
..
src Padding efficent merkle root algo (#436) 2019-07-16 14:40:56 +10:00
Cargo.toml Padding efficent merkle root algo (#436) 2019-07-16 14:40:56 +10:00
README.md Add comma to readme 2019-04-24 18:30:59 +10:00

Tree hashing

Provides both cached and non-cached tree hashing methods.

Standard Tree Hash

use tree_hash_derive::TreeHash;

#[derive(TreeHash)]
struct Foo {
	a: u64,
	b: Vec<u64>,
}

fn main() {
	let foo = Foo {
		a: 42,
		b: vec![1, 2, 3]
	};

	println!("root: {}", foo.tree_hash_root());
}

Cached Tree Hash

use tree_hash_derive::{TreeHash, CachedTreeHash};

#[derive(TreeHash, CachedTreeHash)]
struct Foo {
	a: u64,
	b: Vec<u64>,
}

#[derive(TreeHash, CachedTreeHash)]
struct Bar {
	a: Vec<Foo>,
	b: u64,
}

fn main() {
	let bar = Bar {
		a: vec![
			Foo {
				a: 42,
				b: vec![1, 2, 3]
			}
		],
		b: 42
	};

	let modified_bar = Bar {
		a: vec![
			Foo {
				a: 100,
				b: vec![1, 2, 3, 4, 5, 6]
			},
			Foo {
				a: 42,
				b: vec![]
			}
		],
		b: 99
	};


    let mut hasher = CachedTreeHasher::new(&bar).unwrap();
	hasher.update(&modified_bar).unwrap();

	// Assert that the cached tree hash matches a standard tree hash.
	assert_eq!(hasher.tree_hash_root(), modified_bar.tree_hash_root());
}