Skip to content

Commit 161c40f

Browse files
authored
Merge pull request #3180 from tnull/2024-07-use-upstreamed-merkle-validation
Electrum: Use upstreamed `validate_merkle_proof`
2 parents 3dedbd5 + b3a58e6 commit 161c40f

File tree

1 file changed

+2
-28
lines changed

1 file changed

+2
-28
lines changed

lightning-transaction-sync/src/electrum.rs

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
use crate::common::{ConfirmedTx, FilterQueue, SyncState};
22
use crate::error::{InternalError, TxSyncError};
33

4+
use electrum_client::utils::validate_merkle_proof;
45
use electrum_client::Client as ElectrumClient;
56
use electrum_client::ElectrumApi;
6-
use electrum_client::GetMerkleRes;
77

88
use lightning::chain::WatchedOutput;
99
use lightning::chain::{Confirm, Filter};
1010
use lightning::util::logger::Logger;
1111
use lightning::{log_debug, log_error, log_trace};
1212

1313
use bitcoin::block::Header;
14-
use bitcoin::hash_types::TxMerkleNode;
15-
use bitcoin::hashes::sha256d::Hash as Sha256d;
16-
use bitcoin::hashes::Hash;
1714
use bitcoin::{BlockHash, Script, Transaction, Txid};
1815

1916
use std::collections::HashSet;
@@ -430,11 +427,7 @@ where
430427
match self.client.block_header(prob_conf_height as usize) {
431428
Ok(block_header) => {
432429
let pos = merkle_res.pos;
433-
if !self.validate_merkle_proof(
434-
&txid,
435-
&block_header.merkle_root,
436-
merkle_res,
437-
)? {
430+
if !validate_merkle_proof(&txid, &block_header.merkle_root, &merkle_res) {
438431
log_trace!(
439432
self.logger,
440433
"Inconsistency: Block {} was unconfirmed during syncing.",
@@ -480,25 +473,6 @@ where
480473
pub fn client(&self) -> &ElectrumClient {
481474
&self.client
482475
}
483-
484-
fn validate_merkle_proof(
485-
&self, txid: &Txid, merkle_root: &TxMerkleNode, merkle_res: GetMerkleRes,
486-
) -> Result<bool, InternalError> {
487-
let mut index = merkle_res.pos;
488-
let mut cur = txid.to_raw_hash();
489-
for mut bytes in merkle_res.merkle {
490-
bytes.reverse();
491-
// unwrap() safety: `bytes` has len 32 so `from_slice` can never fail.
492-
let next_hash = Sha256d::from_slice(&bytes).unwrap();
493-
let (left, right) = if index % 2 == 0 { (cur, next_hash) } else { (next_hash, cur) };
494-
495-
let data = [&left[..], &right[..]].concat();
496-
cur = Sha256d::hash(&data);
497-
index /= 2;
498-
}
499-
500-
Ok(cur == merkle_root.to_raw_hash())
501-
}
502476
}
503477

504478
impl<L: Deref> Filter for ElectrumSyncClient<L>

0 commit comments

Comments
 (0)