Skip to content

Commit 5c89d01

Browse files
authored
Merge pull request #2288 from wpaulino/rust-bitcoin-30-prereqs
2 parents d7f6e34 + 4f63fbc commit 5c89d01

File tree

15 files changed

+92
-171
lines changed

15 files changed

+92
-171
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ Cargo.lock
1010
lightning/target
1111
lightning/ldk-net_graph-*.bin
1212
lightning-custom-message/target
13+
lightning-transaction-sync/target
1314
no-std-check/target

fuzz/src/chanmon_consistency.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
//! send-side handling is correct, other peers. We consider it a failure if any action results in a
1919
//! channel being force-closed.
2020
21-
use bitcoin::TxMerkleNode;
22-
use bitcoin::blockdata::block::BlockHeader;
2321
use bitcoin::blockdata::constants::genesis_block;
2422
use bitcoin::blockdata::transaction::{Transaction, TxOut};
2523
use bitcoin::blockdata::script::{Builder, Script};
@@ -45,6 +43,7 @@ use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelMana
4543
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4644
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
4745
use lightning::ln::script::ShutdownScript;
46+
use lightning::ln::functional_test_utils::*;
4847
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4948
use lightning::util::errors::APIError;
5049
use lightning::util::logger::Logger;
@@ -547,11 +546,11 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
547546
macro_rules! confirm_txn {
548547
($node: expr) => { {
549548
let chain_hash = genesis_block(Network::Bitcoin).block_hash();
550-
let mut header = BlockHeader { version: 0x20000000, prev_blockhash: chain_hash, merkle_root: TxMerkleNode::all_zeros(), time: 42, bits: 42, nonce: 42 };
549+
let mut header = create_dummy_header(chain_hash, 42);
551550
let txdata: Vec<_> = channel_txn.iter().enumerate().map(|(i, tx)| (i + 1, tx)).collect();
552551
$node.transactions_confirmed(&header, &txdata, 1);
553552
for _ in 2..100 {
554-
header = BlockHeader { version: 0x20000000, prev_blockhash: header.block_hash(), merkle_root: TxMerkleNode::all_zeros(), time: 42, bits: 42, nonce: 42 };
553+
header = create_dummy_header(header.block_hash(), 42);
555554
}
556555
$node.best_block_updated(&header, 99);
557556
} }

fuzz/src/full_stack.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
//! or payments to send/ways to handle events generated.
1414
//! This test has been very useful, though due to its complexity good starting inputs are critical.
1515
16-
use bitcoin::TxMerkleNode;
17-
use bitcoin::blockdata::block::BlockHeader;
1816
use bitcoin::blockdata::constants::genesis_block;
1917
use bitcoin::blockdata::transaction::{Transaction, TxOut};
2018
use bitcoin::blockdata::script::{Builder, Script};
@@ -41,6 +39,7 @@ use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelMana
4139
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
4240
use lightning::ln::msgs::{self, DecodeError};
4341
use lightning::ln::script::ShutdownScript;
42+
use lightning::ln::functional_test_utils::*;
4443
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
4544
use lightning::routing::utxo::UtxoLookup;
4645
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
@@ -228,7 +227,7 @@ impl<'a> MoneyLossDetector<'a> {
228227
}
229228

230229
self.blocks_connected += 1;
231-
let header = BlockHeader { version: 0x20000000, prev_blockhash: self.header_hashes[self.height].0, merkle_root: TxMerkleNode::all_zeros(), time: self.blocks_connected, bits: 42, nonce: 42 };
230+
let header = create_dummy_header(self.header_hashes[self.height].0, self.blocks_connected);
232231
self.height += 1;
233232
self.manager.transactions_confirmed(&header, &txdata, self.height as u32);
234233
self.manager.best_block_updated(&header, self.height as u32);
@@ -245,7 +244,7 @@ impl<'a> MoneyLossDetector<'a> {
245244

246245
fn disconnect_block(&mut self) {
247246
if self.height > 0 && (self.max_height < 6 || self.height >= self.max_height - 6) {
248-
let header = BlockHeader { version: 0x20000000, prev_blockhash: self.header_hashes[self.height - 1].0, merkle_root: TxMerkleNode::all_zeros(), time: self.header_hashes[self.height].1, bits: 42, nonce: 42 };
247+
let header = create_dummy_header(self.header_hashes[self.height - 1].0, self.header_hashes[self.height].1);
249248
self.manager.block_disconnected(&header, self.height as u32);
250249
self.monitor.block_disconnected(&header, self.height as u32);
251250
self.height -= 1;

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,6 @@ impl Drop for BackgroundProcessor {
817817

818818
#[cfg(all(feature = "std", test))]
819819
mod tests {
820-
use bitcoin::blockdata::block::BlockHeader;
821820
use bitcoin::blockdata::constants::genesis_block;
822821
use bitcoin::blockdata::locktime::PackedLockTime;
823822
use bitcoin::blockdata::transaction::{Transaction, TxOut};
@@ -833,6 +832,7 @@ mod tests {
833832
use lightning::ln::channelmanager;
834833
use lightning::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChainParameters, MIN_CLTV_EXPIRY_DELTA, PaymentId};
835834
use lightning::ln::features::{ChannelFeatures, NodeFeatures};
835+
use lightning::ln::functional_test_utils::*;
836836
use lightning::ln::msgs::{ChannelMessageHandler, Init};
837837
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
838838
use lightning::routing::gossip::{NetworkGraph, NodeId, P2PGossipSync};
@@ -849,8 +849,6 @@ mod tests {
849849
use std::sync::{Arc, Mutex};
850850
use std::sync::mpsc::SyncSender;
851851
use std::time::Duration;
852-
use bitcoin::hashes::Hash;
853-
use bitcoin::TxMerkleNode;
854852
use lightning_rapid_gossip_sync::RapidGossipSync;
855853
use super::{BackgroundProcessor, GossipSync, FRESHNESS_TIMER};
856854

@@ -1190,7 +1188,7 @@ mod tests {
11901188
for i in 1..=depth {
11911189
let prev_blockhash = node.best_block.block_hash();
11921190
let height = node.best_block.height() + 1;
1193-
let header = BlockHeader { version: 0x20000000, prev_blockhash, merkle_root: TxMerkleNode::all_zeros(), time: height, bits: 42, nonce: 42 };
1191+
let header = create_dummy_header(prev_blockhash, height);
11941192
let txdata = vec![(0, tx)];
11951193
node.best_block = BestBlock::new(header.block_hash(), height);
11961194
match i {

lightning-block-sync/src/poll.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,11 @@ impl ValidatedBlockHeader {
136136

137137
if let Network::Bitcoin = network {
138138
if self.height % 2016 == 0 {
139-
let previous_work = previous_header.header.work();
140-
if work > (previous_work << 2) || work < (previous_work >> 2) {
139+
let target = self.header.target();
140+
let previous_target = previous_header.header.target();
141+
let min_target = previous_target >> 2;
142+
let max_target = previous_target << 2;
143+
if target > max_target || target < min_target {
141144
return Err(BlockSourceError::persistent("invalid difficulty transition"))
142145
}
143146
} else if self.header.bits != previous_header.header.bits {

lightning-persister/src/lib.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,8 @@ mod tests {
136136
extern crate lightning;
137137
extern crate bitcoin;
138138
use crate::FilesystemPersister;
139-
use bitcoin::blockdata::block::{Block, BlockHeader};
140139
use bitcoin::hashes::hex::FromHex;
141-
use bitcoin::{Txid, TxMerkleNode};
140+
use bitcoin::Txid;
142141
use lightning::chain::ChannelMonitorUpdateStatus;
143142
use lightning::chain::chainmonitor::Persist;
144143
use lightning::chain::channelmonitor::CLOSED_CHANNEL_UPDATE_ID;
@@ -148,7 +147,6 @@ mod tests {
148147
use lightning::ln::functional_test_utils::*;
149148
use lightning::util::test_utils;
150149
use std::fs;
151-
use bitcoin::hashes::Hash;
152150
#[cfg(target_os = "windows")]
153151
use {
154152
lightning::get_event_msg,
@@ -247,8 +245,7 @@ mod tests {
247245
let node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
248246
assert_eq!(node_txn.len(), 1);
249247

250-
let header = BlockHeader { version: 0x20000000, prev_blockhash: nodes[0].best_block_hash(), merkle_root: TxMerkleNode::all_zeros(), time: 42, bits: 42, nonce: 42 };
251-
connect_block(&nodes[1], &Block { header, txdata: vec![node_txn[0].clone(), node_txn[0].clone()]});
248+
connect_block(&nodes[1], &create_dummy_block(nodes[0].best_block_hash(), 42, vec![node_txn[0].clone(), node_txn[0].clone()]));
252249
check_closed_broadcast!(nodes[1], true);
253250
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
254251
check_added_monitors!(nodes[1], 1);

lightning/src/chain/chainmonitor.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,6 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner, C: Deref, T: Deref, F: Deref, L
825825

826826
#[cfg(test)]
827827
mod tests {
828-
use bitcoin::{BlockHeader, TxMerkleNode};
829-
use bitcoin::hashes::Hash;
830828
use crate::{check_added_monitors, check_closed_broadcast, check_closed_event};
831829
use crate::{expect_payment_sent, expect_payment_claimed, expect_payment_sent_without_paths, expect_payment_path_successful, get_event_msg};
832830
use crate::{get_htlc_update_msgs, get_local_commitment_txn, get_revoke_commit_msgs, get_route_and_payment_hash, unwrap_send_err};
@@ -972,10 +970,7 @@ mod tests {
972970

973971
// Connect B's commitment transaction, but only to the ChainMonitor/ChannelMonitor. The
974972
// channel is now closed, but the ChannelManager doesn't know that yet.
975-
let new_header = BlockHeader {
976-
version: 2, time: 0, bits: 0, nonce: 0,
977-
prev_blockhash: nodes[0].best_block_info().0,
978-
merkle_root: TxMerkleNode::all_zeros() };
973+
let new_header = create_dummy_header(nodes[0].best_block_info().0, 0);
979974
nodes[0].chain_monitor.chain_monitor.transactions_confirmed(&new_header,
980975
&[(0, &remote_txn[0]), (1, &remote_txn[1])], nodes[0].best_block_info().1 + 1);
981976
assert!(nodes[0].chain_monitor.release_pending_monitor_events().is_empty());
@@ -999,10 +994,7 @@ mod tests {
999994

1000995
if block_timeout {
1001996
// After three blocks, pending MontiorEvents should be released either way.
1002-
let latest_header = BlockHeader {
1003-
version: 2, time: 0, bits: 0, nonce: 0,
1004-
prev_blockhash: nodes[0].best_block_info().0,
1005-
merkle_root: TxMerkleNode::all_zeros() };
997+
let latest_header = create_dummy_header(nodes[0].best_block_info().0, 0);
1006998
nodes[0].chain_monitor.chain_monitor.best_block_updated(&latest_header, nodes[0].best_block_info().1 + LATENCY_GRACE_PERIOD_BLOCKS);
1007999
} else {
10081000
let persistences = chanmon_cfgs[0].persister.chain_sync_monitor_persistences.lock().unwrap().clone();

lightning/src/chain/channelmonitor.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4084,7 +4084,6 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
40844084

40854085
#[cfg(test)]
40864086
mod tests {
4087-
use bitcoin::blockdata::block::BlockHeader;
40884087
use bitcoin::blockdata::script::{Script, Builder};
40894088
use bitcoin::blockdata::opcodes;
40904089
use bitcoin::blockdata::transaction::{Transaction, TxIn, TxOut, EcdsaSighashType};
@@ -4121,7 +4120,7 @@ mod tests {
41214120
use crate::util::ser::{ReadableArgs, Writeable};
41224121
use crate::sync::{Arc, Mutex};
41234122
use crate::io;
4124-
use bitcoin::{PackedLockTime, Sequence, TxMerkleNode, Witness};
4123+
use bitcoin::{PackedLockTime, Sequence, Witness};
41254124
use crate::prelude::*;
41264125

41274126
fn do_test_funding_spend_refuses_updates(use_local_txn: bool) {
@@ -4160,10 +4159,7 @@ mod tests {
41604159

41614160
// Connect a commitment transaction, but only to the ChainMonitor/ChannelMonitor. The
41624161
// channel is now closed, but the ChannelManager doesn't know that yet.
4163-
let new_header = BlockHeader {
4164-
version: 2, time: 0, bits: 0, nonce: 0,
4165-
prev_blockhash: nodes[0].best_block_info().0,
4166-
merkle_root: TxMerkleNode::all_zeros() };
4162+
let new_header = create_dummy_header(nodes[0].best_block_info().0, 0);
41674163
let conf_height = nodes[0].best_block_info().1 + 1;
41684164
nodes[1].chain_monitor.chain_monitor.transactions_confirmed(&new_header,
41694165
&[(0, broadcast_tx)], conf_height);

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
//! There are a bunch of these as their handling is relatively error-prone so they are split out
1313
//! here. See also the chanmon_fail_consistency fuzz test.
1414
15-
use bitcoin::blockdata::block::{Block, BlockHeader};
1615
use bitcoin::blockdata::constants::genesis_block;
1716
use bitcoin::hash_types::BlockHash;
1817
use bitcoin::network::constants::Network;
@@ -35,7 +34,6 @@ use crate::util::test_utils;
3534

3635
use crate::io;
3736
use bitcoin::hashes::Hash;
38-
use bitcoin::TxMerkleNode;
3937
use crate::prelude::*;
4038
use crate::sync::{Arc, Mutex};
4139

@@ -121,15 +119,7 @@ fn test_monitor_and_persister_update_fail() {
121119
assert_eq!(chain_mon.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
122120
chain_mon
123121
};
124-
let header = BlockHeader {
125-
version: 0x20000000,
126-
prev_blockhash: BlockHash::all_zeros(),
127-
merkle_root: TxMerkleNode::all_zeros(),
128-
time: 42,
129-
bits: 42,
130-
nonce: 42
131-
};
132-
chain_mon.chain_monitor.block_connected(&Block { header, txdata: vec![] }, 200);
122+
chain_mon.chain_monitor.block_connected(&create_dummy_block(BlockHash::all_zeros(), 42, Vec::new()), 200);
133123

134124
// Set the persister's return value to be a InProgress.
135125
persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);

lightning/src/ln/channelmanager.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9383,10 +9383,7 @@ pub mod bench {
93839383

93849384
assert_eq!(&tx_broadcaster.txn_broadcasted.lock().unwrap()[..], &[tx.clone()]);
93859385

9386-
let block = Block {
9387-
header: BlockHeader { version: 0x20000000, prev_blockhash: BestBlock::from_network(network).block_hash(), merkle_root: TxMerkleNode::all_zeros(), time: 42, bits: 42, nonce: 42 },
9388-
txdata: vec![tx],
9389-
};
9386+
let block = create_dummy_block(BestBlock::from_network(network).block_hash(), 42, vec![tx]);
93909387
Listen::block_connected(&node_a, &block, 1);
93919388
Listen::block_connected(&node_b, &block, 1);
93929389

lightning/src/ln/functional_test_utils.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,14 @@ pub fn confirm_transactions_at<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, txn:
8585
if conf_height > first_connect_height {
8686
connect_blocks(node, conf_height - first_connect_height);
8787
}
88-
let mut block = Block {
89-
header: BlockHeader { version: 0x20000000, prev_blockhash: node.best_block_hash(), merkle_root: TxMerkleNode::all_zeros(), time: conf_height, bits: 42, nonce: 42 },
90-
txdata: Vec::new(),
91-
};
88+
let mut txdata = Vec::new();
9289
for _ in 0..*node.network_chan_count.borrow() { // Make sure we don't end up with channels at the same short id by offsetting by chan_count
93-
block.txdata.push(Transaction { version: 0, lock_time: PackedLockTime::ZERO, input: Vec::new(), output: Vec::new() });
90+
txdata.push(Transaction { version: 0, lock_time: PackedLockTime::ZERO, input: Vec::new(), output: Vec::new() });
9491
}
9592
for tx in txn {
96-
block.txdata.push((*tx).clone());
93+
txdata.push((*tx).clone());
9794
}
95+
let block = create_dummy_block(node.best_block_hash(), conf_height, txdata);
9896
connect_block(node, &block);
9997
scid_utils::scid_from_parts(conf_height as u64, block.txdata.len() as u64 - 1, 0).unwrap()
10098
}
@@ -191,22 +189,31 @@ impl ConnectStyle {
191189
}
192190
}
193191

192+
pub fn create_dummy_header(prev_blockhash: BlockHash, time: u32) -> BlockHeader {
193+
BlockHeader {
194+
version: 0x2000_0000,
195+
prev_blockhash,
196+
merkle_root: TxMerkleNode::all_zeros(),
197+
time,
198+
bits: 42,
199+
nonce: 42,
200+
}
201+
}
202+
203+
pub fn create_dummy_block(prev_blockhash: BlockHash, time: u32, txdata: Vec<Transaction>) -> Block {
204+
Block { header: create_dummy_header(prev_blockhash, time), txdata }
205+
}
206+
194207
pub fn connect_blocks<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, depth: u32) -> BlockHash {
195208
let skip_intermediaries = node.connect_style.borrow().skips_blocks();
196209

197210
let height = node.best_block_info().1 + 1;
198-
let mut block = Block {
199-
header: BlockHeader { version: 0x2000000, prev_blockhash: node.best_block_hash(), merkle_root: TxMerkleNode::all_zeros(), time: height, bits: 42, nonce: 42 },
200-
txdata: vec![],
201-
};
211+
let mut block = create_dummy_block(node.best_block_hash(), height, Vec::new());
202212
assert!(depth >= 1);
203213
for i in 1..depth {
204214
let prev_blockhash = block.header.block_hash();
205215
do_connect_block(node, block, skip_intermediaries);
206-
block = Block {
207-
header: BlockHeader { version: 0x20000000, prev_blockhash, merkle_root: TxMerkleNode::all_zeros(), time: height + i, bits: 42, nonce: 42 },
208-
txdata: vec![],
209-
};
216+
block = create_dummy_block(prev_blockhash, height + i, Vec::new());
210217
}
211218
let hash = block.header.block_hash();
212219
do_connect_block(node, block, false);

0 commit comments

Comments
 (0)