+// This file is Copyright its original authors, visible in version control
+// history.
+//
+// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
+// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
+// You may not use this file except in accordance with one or both of these
+// licenses.
+
//! Test that monitor update failures don't get our channel state out of sync.
//! One of the biggest concern with the monitor update failure handling code is that messages
//! resent after monitor updating is restored are delivered out-of-order, resulting in
struct FuzzEstimator {}
impl FeeEstimator for FuzzEstimator {
- fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u64 {
+ fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u32 {
253
}
}
}
}
}
-impl channelmonitor::ManyChannelMonitor<EnforcingChannelKeys> for TestChannelMonitor {
+impl channelmonitor::ManyChannelMonitor for TestChannelMonitor {
+ type Keys = EnforcingChannelKeys;
+
fn add_monitor(&self, funding_txo: OutPoint, monitor: channelmonitor::ChannelMonitor<EnforcingChannelKeys>) -> Result<(), channelmonitor::ChannelMonitorUpdateErr> {
let mut ser = VecWriter(Vec::new());
monitor.write_for_disk(&mut ser).unwrap();
config.channel_options.fee_proportional_millionths = 0;
config.channel_options.announced_channel = true;
config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
- (Arc::new(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap()),
+ (Arc::new(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0)),
monitor)
} }
}
let tx = Transaction { version: $chan_id, lock_time: 0, input: Vec::new(), output: vec![TxOut {
value: *channel_value_satoshis, script_pubkey: output_script.clone(),
}]};
- funding_output = OutPoint::new(tx.txid(), 0);
+ funding_output = OutPoint { txid: tx.txid(), index: 0 };
$source.funding_transaction_generated(&temporary_channel_id, funding_output);
channel_txn.push(tx);
} else { panic!("Wrong event type"); }
let mut posn = Vec::with_capacity(channel_txn.len());
for i in 0..channel_txn.len() {
txn.push(&channel_txn[i]);
- posn.push(i as u32 + 1);
+ posn.push(i + 1);
}
$node.block_connected(&header, 1, &txn, &posn);
for i in 2..100 {
loop {
macro_rules! send_payment {
- ($source: expr, $dest: expr) => { {
+ ($source: expr, $dest: expr, $amt: expr) => { {
let payment_hash = Sha256::hash(&[payment_id; 1]);
payment_id = payment_id.wrapping_add(1);
if let Err(_) = $source.send_payment(&Route {
node_features: NodeFeatures::empty(),
short_channel_id: $dest.1,
channel_features: ChannelFeatures::empty(),
- fee_msat: 5000000,
+ fee_msat: $amt,
cltv_expiry_delta: 200,
}]],
}, PaymentHash(payment_hash.into_inner()), &None) {
test_return!();
}
} };
- ($source: expr, $middle: expr, $dest: expr) => { {
+ ($source: expr, $middle: expr, $dest: expr, $amt: expr) => { {
let payment_hash = Sha256::hash(&[payment_id; 1]);
payment_id = payment_id.wrapping_add(1);
if let Err(_) = $source.send_payment(&Route {
node_features: NodeFeatures::empty(),
short_channel_id: $dest.1,
channel_features: ChannelFeatures::empty(),
- fee_msat: 5000000,
+ fee_msat: $amt,
cltv_expiry_delta: 200,
}]],
}, PaymentHash(payment_hash.into_inner()), &None) {
});
for event in events.drain(..) {
match event {
- events::Event::PaymentReceived { payment_hash, payment_secret, .. } => {
+ events::Event::PaymentReceived { payment_hash, payment_secret, amt } => {
if claim_set.insert(payment_hash.0) {
if $fail {
assert!(nodes[$node].fail_htlc_backwards(&payment_hash, &payment_secret));
} else {
- assert!(nodes[$node].claim_funds(PaymentPreimage(payment_hash.0), &payment_secret, 5_000_000));
+ assert!(nodes[$node].claim_funds(PaymentPreimage(payment_hash.0), &payment_secret, amt));
}
}
},
nodes[2].channel_monitor_updated(&chan_2_funding, *id);
}
},
- 0x09 => send_payment!(nodes[0], (&nodes[1], chan_a)),
- 0x0a => send_payment!(nodes[1], (&nodes[0], chan_a)),
- 0x0b => send_payment!(nodes[1], (&nodes[2], chan_b)),
- 0x0c => send_payment!(nodes[2], (&nodes[1], chan_b)),
- 0x0d => send_payment!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b)),
- 0x0e => send_payment!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a)),
+ 0x09 => send_payment!(nodes[0], (&nodes[1], chan_a), 5_000_000),
+ 0x0a => send_payment!(nodes[1], (&nodes[0], chan_a), 5_000_000),
+ 0x0b => send_payment!(nodes[1], (&nodes[2], chan_b), 5_000_000),
+ 0x0c => send_payment!(nodes[2], (&nodes[1], chan_b), 5_000_000),
+ 0x0d => send_payment!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b), 5_000_000),
+ 0x0e => send_payment!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a), 5_000_000),
0x0f => {
if !chan_a_disconnected {
nodes[0].peer_disconnected(&nodes[1].get_our_node_id(), false);
},
0x22 => send_payment_with_secret!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b)),
0x23 => send_payment_with_secret!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a)),
+ 0x25 => send_payment!(nodes[0], (&nodes[1], chan_a), 10),
+ 0x26 => send_payment!(nodes[1], (&nodes[0], chan_a), 10),
+ 0x27 => send_payment!(nodes[1], (&nodes[2], chan_b), 10),
+ 0x28 => send_payment!(nodes[2], (&nodes[1], chan_b), 10),
+ 0x29 => send_payment!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b), 10),
+ 0x2a => send_payment!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a), 10),
+ 0x2b => send_payment!(nodes[0], (&nodes[1], chan_a), 1_000),
+ 0x2c => send_payment!(nodes[1], (&nodes[0], chan_a), 1_000),
+ 0x2d => send_payment!(nodes[1], (&nodes[2], chan_b), 1_000),
+ 0x2e => send_payment!(nodes[2], (&nodes[1], chan_b), 1_000),
+ 0x2f => send_payment!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b), 1_000),
+ 0x30 => send_payment!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a), 1_000),
+ 0x31 => send_payment!(nodes[0], (&nodes[1], chan_a), 100_000),
+ 0x32 => send_payment!(nodes[1], (&nodes[0], chan_a), 100_000),
+ 0x33 => send_payment!(nodes[1], (&nodes[2], chan_b), 100_000),
+ 0x34 => send_payment!(nodes[2], (&nodes[1], chan_b), 100_000),
+ 0x35 => send_payment!(nodes[0], (&nodes[1], chan_a), (&nodes[2], chan_b), 100_000),
+ 0x36 => send_payment!(nodes[2], (&nodes[1], chan_b), (&nodes[0], chan_a), 100_000),
// 0x24 defined above
_ => test_return!(),
}