#[macro_use] extern crate serde_derive; extern crate serde; extern crate serde_json; extern crate bigint; extern crate trie; extern crate block; extern crate sha3; extern crate rlp; extern crate rand; use bigint::{Address, H256, M256, U256}; use trie::{FixedSecureMemoryTrieMut, MemoryTrieMut, TrieMut}; use block::Account; use sha3::{Digest, Keccak256}; use rand::Rng; use std::str::FromStr; use std::collections::HashMap; fn build_db(map: &HashMap) -> MemoryTrieMut { let mut db: HashMap, Vec> = HashMap::new(); for (key, value) in map { db.insert(Keccak256::digest(key.as_ref()).as_slice().into(), rlp::encode(value).to_vec()); } MemoryTrieMut::build(&db) } #[test] pub fn test_genesis_root() { #[derive(Serialize, Deserialize, Debug)] struct JSONAccount { balance: String, } type StorageTrieMut = FixedSecureMemoryTrieMut; let genesis_accounts: HashMap = serde_json::from_str(include_str!("../res/genesis.json")).unwrap(); let accounts: Vec<(&String, &JSONAccount)> = genesis_accounts.iter().collect(); let mut account_trie: FixedSecureMemoryTrieMut = Default::default(); let mut account_db: HashMap = HashMap::new(); let mut addresses: Vec
= Vec::new(); for (key, value) in accounts { let address = Address::from_str(key).unwrap(); let balance = U256::from_dec_str(&value.balance).unwrap(); let account = Account { nonce: U256::zero(), balance: balance, storage_root: StorageTrieMut::default().root(), code_hash: H256::from(Keccak256::digest(&[]).as_slice()), }; account_trie.insert(&address, &account); account_db.insert(address, account); addresses.push(address); } let db_full = build_db(&account_db); assert_eq!(account_trie.root(), H256::from_str("0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544").unwrap()); assert_eq!(db_full.root(), H256::from_str("0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544").unwrap()); let db_full_raw: HashMap> = db_full.into(); let trie_full_raw: HashMap> = account_trie.clone().to_trie().into(); assert_eq!(db_full_raw, trie_full_raw); for _ in 0..(addresses.len() / 2) { let i = rand::thread_rng().gen_range(0, addresses.len()); let addr = addresses[i]; addresses.swap_remove(i); account_trie.delete(&addr); account_db.remove(&addr); } let db_half = build_db(&account_db); let db_half_raw: HashMap> = db_half.into(); let trie_half_raw: HashMap> = account_trie.clone().to_trie().into(); assert_eq!(db_half_raw, trie_half_raw); for addr in addresses { account_trie.delete(&addr); } assert_eq!(account_trie.root(), MemoryTrieMut::default().root()); let trie_empty_raw: HashMap> = account_trie.clone().to_trie().into(); assert_eq!(trie_empty_raw.len(), 0); }