diff --git a/Cargo.lock b/Cargo.lock index 5dd2da12950..9aa29002ff2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2782,6 +2782,7 @@ dependencies = [ "solana-bpf-loader-program 0.17.0", "solana-logger 0.17.0", "solana-measure 0.17.0", + "solana-merkle-tree 0.17.0", "solana-metrics 0.17.0", "solana-noop-program 0.17.0", "solana-sdk 0.17.0", diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 4a2d6449a71..6f82bb28b30 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -27,6 +27,7 @@ serde_derive = "1.0.94" serde_json = "1.0.40" solana-logger = { path = "../logger", version = "0.17.0" } solana-measure = { path = "../measure", version = "0.17.0" } +solana-merkle-tree = { path = "../merkle-tree", version = "0.17.0" } solana-metrics = { path = "../metrics", version = "0.17.0" } solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.17.0" } solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.17.0" } diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index dc39fba24e9..80f293403e4 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -9,6 +9,7 @@ use crate::message_processor::has_duplicates; use bincode::serialize; use log::*; use rayon::slice::ParallelSliceMut; +use solana_merkle_tree::MerkleTree; use solana_metrics::inc_new_counter_error; use solana_sdk::account::Account; use solana_sdk::hash::{Hash, Hasher}; @@ -502,7 +503,7 @@ impl Accounts { pub fn hash_internal_state(&self, fork_id: Fork) -> Option { let account_hashes = self.scan_fork(fork_id, |stored_account| { if !sysvar::check_id(&stored_account.balance.owner) { - Some(Self::hash_account(stored_account)) + Some([&serialize(&stored_account.balance).unwrap(), stored_account.data].concat()) } else { None } @@ -511,11 +512,8 @@ impl Accounts { if account_hashes.is_empty() { None } else { - let mut hasher = Hasher::default(); - for hash in account_hashes { - hasher.hash(hash.as_ref()); - } - Some(hasher.result()) + let merkle_tree = MerkleTree::new(&account_hashes); + merkle_tree.get_root().and_then(|h| Some(*h)) } }