|
1 | 1 | use crate::common::{ConfirmedTx, FilterQueue, SyncState};
|
2 | 2 | use crate::error::{InternalError, TxSyncError};
|
3 | 3 |
|
| 4 | +use electrum_client::utils::validate_merkle_proof; |
4 | 5 | use electrum_client::Client as ElectrumClient;
|
5 | 6 | use electrum_client::ElectrumApi;
|
6 | 7 | use electrum_client::GetMerkleRes;
|
@@ -430,11 +431,7 @@ where
|
430 | 431 | match self.client.block_header(prob_conf_height as usize) {
|
431 | 432 | Ok(block_header) => {
|
432 | 433 | let pos = merkle_res.pos;
|
433 |
| - if !self.validate_merkle_proof( |
434 |
| - &txid, |
435 |
| - &block_header.merkle_root, |
436 |
| - merkle_res, |
437 |
| - )? { |
| 434 | + if !validate_merkle_proof(&txid, &block_header.merkle_root, &merkle_res) { |
438 | 435 | log_trace!(
|
439 | 436 | self.logger,
|
440 | 437 | "Inconsistency: Block {} was unconfirmed during syncing.",
|
@@ -480,25 +477,6 @@ where
|
480 | 477 | pub fn client(&self) -> &ElectrumClient {
|
481 | 478 | &self.client
|
482 | 479 | }
|
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 |
| - } |
502 | 480 | }
|
503 | 481 |
|
504 | 482 | impl<L: Deref> Filter for ElectrumSyncClient<L>
|
|
0 commit comments