diff --git a/Cargo.lock b/Cargo.lock index cf54ebbe58..7e2f39154b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,6 +2201,7 @@ dependencies = [ "solana-exchange-program 0.17.0", "solana-kvstore 0.17.0", "solana-logger 0.17.0", + "solana-merkle-tree 0.17.0", "solana-metrics 0.17.0", "solana-netutil 0.17.0", "solana-runtime 0.17.0", diff --git a/core/Cargo.toml b/core/Cargo.toml index 9b31a85aae..aed84f8ab8 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -55,6 +55,7 @@ solana-ed25519-dalek = "0.2.0" solana-exchange-program = { path = "../programs/exchange_program", version = "0.17.0" } solana-kvstore = { path = "../kvstore", version = "0.17.0", optional = true } solana-logger = { path = "../logger", version = "0.17.0" } +solana-merkle-tree = { path = "../merkle-tree", version = "0.17.0" } solana-metrics = { path = "../metrics", version = "0.17.0" } solana-netutil = { path = "../netutil", version = "0.17.0" } solana-runtime = { path = "../runtime", version = "0.17.0" } diff --git a/core/src/entry.rs b/core/src/entry.rs index 42d20b0b53..91cb582327 100644 --- a/core/src/entry.rs +++ b/core/src/entry.rs @@ -10,8 +10,9 @@ use chrono::prelude::Utc; use rayon::prelude::*; use rayon::ThreadPool; use solana_budget_api::budget_instruction; +use solana_merkle_tree::MerkleTree; use solana_metrics::inc_new_counter_warn; -use solana_sdk::hash::{Hash, Hasher}; +use solana_sdk::hash::Hash; use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::transaction::Transaction; use std::borrow::Borrow; @@ -172,13 +173,16 @@ impl Entry { pub fn hash_transactions(transactions: &[Transaction]) -> Hash { // a hash of a slice of transactions only needs to hash the signatures - let mut hasher = Hasher::default(); - transactions.iter().for_each(|tx| { - if !tx.signatures.is_empty() { - hasher.hash(&tx.signatures[0].as_ref()); - } - }); - hasher.result() + let signatures: Vec<_> = transactions + .iter() + .flat_map(|tx| tx.signatures.iter().map(|sig| sig.as_ref())) + .collect(); + let merkle_tree = MerkleTree::new(&signatures); + if let Some(root_hash) = merkle_tree.get_root() { + *root_hash + } else { + Hash::default() + } } /// Creates the hash `num_hashes` after `start_hash`. If the transaction contains