Skip to content

Commit b5d88a5

Browse files
authored
Merge pull request #823 from jkczyz/2021-03-birthday-hash
Replace default hash with birthday hash
2 parents 1a8b9be + 8730148 commit b5d88a5

File tree

14 files changed

+188
-165
lines changed

14 files changed

+188
-165
lines changed

background-processor/src/lib.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ mod tests {
106106
use lightning::chain::keysinterface::{Sign, InMemorySigner, KeysInterface, KeysManager};
107107
use lightning::chain::transaction::OutPoint;
108108
use lightning::get_event_msg;
109-
use lightning::ln::channelmanager::{ChannelManager, SimpleArcChannelManager};
109+
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, SimpleArcChannelManager};
110110
use lightning::ln::features::InitFeatures;
111111
use lightning::ln::msgs::ChannelMessageHandler;
112112
use lightning::util::config::UserConfig;
@@ -155,10 +155,16 @@ mod tests {
155155
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
156156
let seed = [i as u8; 32];
157157
let network = Network::Testnet;
158-
let now = Duration::from_secs(genesis_block(network).header.time as u64);
158+
let genesis_block = genesis_block(network);
159+
let now = Duration::from_secs(genesis_block.header.time as u64);
159160
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
160161
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
161-
let manager = Arc::new(ChannelManager::new(Network::Testnet, fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster, logger.clone(), keys_manager.clone(), UserConfig::default(), i));
162+
let params = ChainParameters {
163+
network,
164+
latest_hash: genesis_block.block_hash(),
165+
latest_height: 0,
166+
};
167+
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster, logger.clone(), keys_manager.clone(), UserConfig::default(), params));
162168
let node = Node { node: manager, persister, logger };
163169
nodes.push(node);
164170
}

fuzz/src/chanmon_consistency.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
//! channel being force-closed.
2020
2121
use bitcoin::blockdata::block::BlockHeader;
22+
use bitcoin::blockdata::constants::genesis_block;
2223
use bitcoin::blockdata::transaction::{Transaction, TxOut};
2324
use bitcoin::blockdata::script::{Builder, Script};
2425
use bitcoin::blockdata::opcodes;
@@ -35,7 +36,7 @@ use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdateErr,
3536
use lightning::chain::transaction::OutPoint;
3637
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
3738
use lightning::chain::keysinterface::{KeysInterface, InMemorySigner};
38-
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret, PaymentSendFailure, ChannelManagerReadArgs};
39+
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret, PaymentSendFailure, ChannelManagerReadArgs};
3940
use lightning::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
4041
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, ErrorAction, UpdateAddHTLC, Init};
4142
use lightning::util::enforcing_trait_impls::{EnforcingSigner, INITIAL_REVOKED_COMMITMENT_NUMBER};
@@ -126,7 +127,7 @@ impl chain::Watch<EnforcingSigner> for TestChainMonitor {
126127
hash_map::Entry::Occupied(entry) => entry,
127128
hash_map::Entry::Vacant(_) => panic!("Didn't have monitor on update call"),
128129
};
129-
let deserialized_monitor = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::
130+
let deserialized_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::
130131
read(&mut Cursor::new(&map_entry.get().1), &OnlyReadsKeysInterface {}).unwrap().1;
131132
deserialized_monitor.update_monitor(&update, &&TestBroadcaster{}, &&FuzzEstimator{}, &self.logger).unwrap();
132133
let mut ser = VecWriter(Vec::new());
@@ -318,7 +319,13 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
318319
config.channel_options.fee_proportional_millionths = 0;
319320
config.channel_options.announced_channel = true;
320321
config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
321-
(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0),
322+
let network = Network::Bitcoin;
323+
let params = ChainParameters {
324+
network,
325+
latest_hash: genesis_block(network).block_hash(),
326+
latest_height: 0,
327+
};
328+
(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params),
322329
monitor, keys_manager)
323330
} }
324331
}
@@ -337,7 +344,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
337344
let mut monitors = HashMap::new();
338345
let mut old_monitors = $old_monitors.latest_monitors.lock().unwrap();
339346
for (outpoint, (update_id, monitor_ser)) in old_monitors.drain() {
340-
monitors.insert(outpoint, <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&monitor_ser), &OnlyReadsKeysInterface {}).expect("Failed to read monitor").1);
347+
monitors.insert(outpoint, <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&monitor_ser), &OnlyReadsKeysInterface {}).expect("Failed to read monitor").1);
341348
chain_monitor.latest_monitors.lock().unwrap().insert(outpoint, (update_id, monitor_ser));
342349
}
343350
let mut monitor_refs = HashMap::new();
@@ -355,7 +362,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
355362
channel_monitors: monitor_refs,
356363
};
357364

358-
(<(Option<BlockHash>, ChanMan)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, chain_monitor)
365+
(<(BlockHash, ChanMan)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, chain_monitor)
359366
} }
360367
}
361368

fuzz/src/chanmon_deser.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,11 @@ impl Writer for VecWriter {
2525

2626
#[inline]
2727
pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
28-
if let Ok((Some(latest_block_hash), monitor)) = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(data), &OnlyReadsKeysInterface {}) {
28+
if let Ok((latest_block_hash, monitor)) = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(data), &OnlyReadsKeysInterface {}) {
2929
let mut w = VecWriter(Vec::new());
3030
monitor.write(&mut w).unwrap();
31-
let deserialized_copy = <(Option<BlockHash>, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
32-
if let Some(deserialized) = deserialized_copy.0 {
33-
assert!(latest_block_hash == deserialized);
34-
}
31+
let deserialized_copy = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(&mut Cursor::new(&w.0), &OnlyReadsKeysInterface {}).unwrap();
32+
assert!(latest_block_hash == deserialized_copy.0);
3533
assert!(monitor == deserialized_copy.1);
3634
}
3735
}

fuzz/src/full_stack.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
3131
use lightning::chain::chainmonitor;
3232
use lightning::chain::transaction::OutPoint;
3333
use lightning::chain::keysinterface::{InMemorySigner, KeysInterface};
34-
use lightning::ln::channelmanager::{ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret};
34+
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentHash, PaymentPreimage, PaymentSecret};
3535
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
3636
use lightning::ln::msgs::DecodeError;
3737
use lightning::routing::router::get_route;
@@ -348,9 +348,16 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
348348
config.channel_options.fee_proportional_millionths = slice_to_be32(get_slice!(4));
349349
config.channel_options.announced_channel = get_slice!(1)[0] != 0;
350350
config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
351-
let channelmanager = Arc::new(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0));
351+
let network = Network::Bitcoin;
352+
let genesis_hash = genesis_block(network).block_hash();
353+
let params = ChainParameters {
354+
network,
355+
latest_hash: genesis_hash,
356+
latest_height: 0,
357+
};
358+
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
352359
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
353-
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(genesis_block(Network::Bitcoin).header.block_hash(), None, Arc::clone(&logger)));
360+
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(genesis_hash, None, Arc::clone(&logger)));
354361

355362
let peers = RefCell::new([false; 256]);
356363
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {

lightning-block-sync/src/init.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ BlockSourceResult<ValidatedBlockHeader> {
7373
/// ) {
7474
/// // Read a serialized channel monitor paired with the block hash when it was persisted.
7575
/// let serialized_monitor = "...";
76-
/// let (monitor_block_hash_option, mut monitor) = <(Option<BlockHash>, ChannelMonitor<S>)>::read(
76+
/// let (monitor_block_hash, mut monitor) = <(BlockHash, ChannelMonitor<S>)>::read(
7777
/// &mut Cursor::new(&serialized_monitor), keys_manager).unwrap();
7878
///
7979
/// // Read the channel manager paired with the block hash when it was persisted.
8080
/// let serialized_manager = "...";
81-
/// let (manager_block_hash_option, mut manager) = {
81+
/// let (manager_block_hash, mut manager) = {
8282
/// let read_args = ChannelManagerReadArgs::new(
8383
/// keys_manager,
8484
/// fee_estimator,
@@ -88,20 +88,17 @@ BlockSourceResult<ValidatedBlockHeader> {
8888
/// config,
8989
/// vec![&mut monitor],
9090
/// );
91-
/// <(Option<BlockHash>, ChannelManager<S, &ChainMonitor<S, &C, &T, &F, &L, &P>, &T, &K, &F, &L>)>::read(
91+
/// <(BlockHash, ChannelManager<S, &ChainMonitor<S, &C, &T, &F, &L, &P>, &T, &K, &F, &L>)>::read(
9292
/// &mut Cursor::new(&serialized_manager), read_args).unwrap()
9393
/// };
9494
///
9595
/// // Synchronize any channel monitors and the channel manager to be on the best block.
9696
/// let mut cache = UnboundedCache::new();
9797
/// let mut monitor_listener = (monitor, &*tx_broadcaster, &*fee_estimator, &*logger);
98-
/// let mut listeners = vec![];
99-
/// if let Some(monitor_block_hash) = monitor_block_hash_option {
100-
/// listeners.push((monitor_block_hash, &mut monitor_listener as &mut dyn chain::Listen))
101-
/// }
102-
/// if let Some(manager_block_hash) = manager_block_hash_option {
103-
/// listeners.push((manager_block_hash, &mut manager as &mut dyn chain::Listen))
104-
/// }
98+
/// let listeners = vec![
99+
/// (monitor_block_hash, &mut monitor_listener as &mut dyn chain::Listen),
100+
/// (manager_block_hash, &mut manager as &mut dyn chain::Listen),
101+
/// ];
105102
/// let chain_tip = init::synchronize_listeners(
106103
/// block_source, Network::Bitcoin, &mut cache, listeners).await.unwrap();
107104
///

lightning-persister/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl FilesystemPersister {
124124
if contents.is_err() { return Err(ChannelMonitorUpdateErr::PermanentFailure); }
125125

126126
if let Ok((_, loaded_monitor)) =
127-
<(Option<BlockHash>, ChannelMonitor<Keys::Signer>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
127+
<(BlockHash, ChannelMonitor<Keys::Signer>)>::read(&mut Cursor::new(&contents.unwrap()), keys) {
128128
res.insert(OutPoint { txid: txid.unwrap(), index: index.unwrap() }, loaded_monitor);
129129
} else {
130130
return Err(ChannelMonitorUpdateErr::PermanentFailure);

lightning/src/chain/channelmonitor.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ impl Readable for ChannelMonitorUpdateStep {
620620
/// reloaded at deserialize-time. Thus, you must ensure that, when handling events, all events
621621
/// gotten are fully handled before re-serializing the new state.
622622
///
623-
/// Note that the deserializer is only implemented for (Option<BlockHash>, ChannelMonitor), which
623+
/// Note that the deserializer is only implemented for (BlockHash, ChannelMonitor), which
624624
/// tells you the last block hash which was block_connect()ed. You MUST rescan any blocks along
625625
/// the "reorg path" (ie disconnecting blocks until you find a common ancestor from both the
626626
/// returned block hash and the the current chain and then reconnecting blocks to get to the
@@ -980,7 +980,8 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
980980
channel_parameters: &ChannelTransactionParameters,
981981
funding_redeemscript: Script, channel_value_satoshis: u64,
982982
commitment_transaction_number_obscure_factor: u64,
983-
initial_holder_commitment_tx: HolderCommitmentTransaction) -> ChannelMonitor<Signer> {
983+
initial_holder_commitment_tx: HolderCommitmentTransaction,
984+
last_block_hash: BlockHash) -> ChannelMonitor<Signer> {
984985

985986
assert!(commitment_transaction_number_obscure_factor <= (1 << 48));
986987
let our_channel_close_key_hash = WPubkeyHash::hash(&shutdown_pubkey.serialize());
@@ -1067,7 +1068,7 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
10671068
lockdown_from_offchain: false,
10681069
holder_tx_signed: false,
10691070

1070-
last_block_hash: Default::default(),
1071+
last_block_hash,
10711072
secp_ctx,
10721073
}),
10731074
}
@@ -2089,8 +2090,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
20892090
F::Target: FeeEstimator,
20902091
L::Target: Logger,
20912092
{
2092-
let block_hash = header.block_hash();
2093-
log_trace!(logger, "Block {} at height {} disconnected", block_hash, height);
2093+
log_trace!(logger, "Block {} at height {} disconnected", header.block_hash(), height);
20942094

20952095
if let Some(_) = self.onchain_events_waiting_threshold_conf.remove(&(height + ANTI_REORG_DELAY - 1)) {
20962096
//We may discard:
@@ -2100,7 +2100,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
21002100

21012101
self.onchain_tx_handler.block_disconnected(height, broadcaster, fee_estimator, logger);
21022102

2103-
self.last_block_hash = block_hash;
2103+
self.last_block_hash = header.prev_blockhash;
21042104
}
21052105

21062106
/// Filters a block's `txdata` for transactions spending watched outputs or for any child
@@ -2492,7 +2492,7 @@ where
24922492
const MAX_ALLOC_SIZE: usize = 64*1024;
24932493

24942494
impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2495-
for (Option<BlockHash>, ChannelMonitor<Signer>) {
2495+
for (BlockHash, ChannelMonitor<Signer>) {
24962496
fn read<R: ::std::io::Read>(reader: &mut R, keys_manager: &'a K) -> Result<Self, DecodeError> {
24972497
macro_rules! unwrap_obj {
24982498
($key: expr) => {
@@ -2735,13 +2735,7 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
27352735
let mut secp_ctx = Secp256k1::new();
27362736
secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
27372737

2738-
let last_seen_block_hash = if last_block_hash == Default::default() {
2739-
None
2740-
} else {
2741-
Some(last_block_hash)
2742-
};
2743-
2744-
Ok((last_seen_block_hash, ChannelMonitor {
2738+
Ok((last_block_hash.clone(), ChannelMonitor {
27452739
inner: Mutex::new(ChannelMonitorImpl {
27462740
latest_update_id,
27472741
commitment_transaction_number_obscure_factor,
@@ -2795,6 +2789,7 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
27952789

27962790
#[cfg(test)]
27972791
mod tests {
2792+
use bitcoin::blockdata::constants::genesis_block;
27982793
use bitcoin::blockdata::script::{Script, Builder};
27992794
use bitcoin::blockdata::opcodes;
28002795
use bitcoin::blockdata::transaction::{Transaction, TxIn, TxOut, SigHashType};
@@ -2804,6 +2799,7 @@ mod tests {
28042799
use bitcoin::hashes::sha256::Hash as Sha256;
28052800
use bitcoin::hashes::hex::FromHex;
28062801
use bitcoin::hash_types::Txid;
2802+
use bitcoin::network::constants::Network;
28072803
use hex;
28082804
use chain::channelmonitor::ChannelMonitor;
28092805
use chain::transaction::OutPoint;
@@ -2903,12 +2899,13 @@ mod tests {
29032899
};
29042900
// Prune with one old state and a holder commitment tx holding a few overlaps with the
29052901
// old state.
2902+
let last_block_hash = genesis_block(Network::Testnet).block_hash();
29062903
let monitor = ChannelMonitor::new(Secp256k1::new(), keys,
29072904
&PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap()), 0, &Script::new(),
29082905
(OutPoint { txid: Txid::from_slice(&[43; 32]).unwrap(), index: 0 }, Script::new()),
29092906
&channel_parameters,
29102907
Script::new(), 46, 0,
2911-
HolderCommitmentTransaction::dummy());
2908+
HolderCommitmentTransaction::dummy(), last_block_hash);
29122909

29132910
monitor.provide_latest_holder_commitment_tx(HolderCommitmentTransaction::dummy(), preimages_to_holder_htlcs!(preimages[0..10])).unwrap();
29142911
let dummy_txid = dummy_tx.txid();

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ fn test_monitor_and_persister_update_fail() {
106106
let monitor = monitors.get(&outpoint).unwrap();
107107
let mut w = test_utils::TestVecWriter(Vec::new());
108108
monitor.write(&mut w).unwrap();
109-
let new_monitor = <(Option<BlockHash>, ChannelMonitor<EnforcingSigner>)>::read(
109+
let new_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
110110
&mut ::std::io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
111111
assert!(new_monitor == *monitor);
112112
let chain_mon = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);

0 commit comments

Comments
 (0)