2020-08-10 15:00:09 -04:00
// 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.
2019-01-08 12:53:12 -05:00
//! Test that no series of bytes received over the wire/connections created/payments sent can
//! result in a crash. We do this by standing up a node and then reading bytes from input to denote
//! actions such as creating new inbound/outbound connections, bytes to be read from a connection,
//! or payments to send/ways to handle events generated.
//! This test has been very useful, though due to its complexity good starting inputs are critical.
2022-08-09 17:39:51 +02:00
use bitcoin ::TxMerkleNode ;
2018-03-27 11:34:22 -04:00
use bitcoin ::blockdata ::block ::BlockHeader ;
2022-08-09 17:39:51 +02:00
use bitcoin ::blockdata ::constants ::genesis_block ;
2018-03-27 11:34:22 -04:00
use bitcoin ::blockdata ::transaction ::{ Transaction , TxOut } ;
2018-10-26 11:40:01 -04:00
use bitcoin ::blockdata ::script ::{ Builder , Script } ;
use bitcoin ::blockdata ::opcodes ;
2022-08-09 17:39:51 +02:00
use bitcoin ::blockdata ::locktime ::PackedLockTime ;
2018-12-03 13:30:18 -05:00
use bitcoin ::consensus ::encode ::deserialize ;
2018-03-19 17:45:58 -04:00
use bitcoin ::network ::constants ::Network ;
2020-04-27 16:41:54 +02:00
use bitcoin ::hashes ::Hash as TraitImport ;
use bitcoin ::hashes ::HashEngine as TraitImportEngine ;
2020-04-27 17:53:13 +02:00
use bitcoin ::hashes ::sha256 ::Hash as Sha256 ;
2023-01-18 13:03:06 -08:00
use bitcoin ::hashes ::sha256d ::Hash as Sha256dHash ;
2020-04-27 18:13:27 +02:00
use bitcoin ::hash_types ::{ Txid , BlockHash , WPubkeyHash } ;
2018-03-27 11:34:22 -04:00
2020-07-17 22:08:34 -07:00
use lightning ::chain ;
2022-07-18 01:32:27 +00:00
use lightning ::chain ::{ BestBlock , ChannelMonitorUpdateStatus , Confirm , Listen } ;
2020-07-29 13:02:29 -07:00
use lightning ::chain ::chaininterface ::{ BroadcasterInterface , ConfirmationTarget , FeeEstimator } ;
2020-10-01 09:35:05 -07:00
use lightning ::chain ::chainmonitor ;
2018-06-27 09:11:58 -04:00
use lightning ::chain ::transaction ::OutPoint ;
2022-12-20 14:46:08 -08:00
use lightning ::chain ::keysinterface ::{ InMemorySigner , Recipient , KeyMaterial , EntropySource , NodeSigner , SignerProvider } ;
2021-04-28 17:28:10 -04:00
use lightning ::ln ::{ PaymentHash , PaymentPreimage , PaymentSecret } ;
2022-10-28 11:31:24 -04:00
use lightning ::ln ::channelmanager ::{ ChainParameters , ChannelDetails , ChannelManager , PaymentId } ;
2021-08-05 14:51:17 +09:00
use lightning ::ln ::peer_handler ::{ MessageHandler , PeerManager , SocketDescriptor , IgnoringMessageHandler } ;
2022-10-28 11:31:24 -04:00
use lightning ::ln ::msgs ::{ self , DecodeError } ;
2021-07-26 12:31:24 -04:00
use lightning ::ln ::script ::ShutdownScript ;
2022-06-02 12:53:34 -07:00
use lightning ::routing ::gossip ::{ P2PGossipSync , NetworkGraph } ;
2022-10-28 11:31:24 -04:00
use lightning ::routing ::router ::{ find_route , InFlightHtlcs , PaymentParameters , Route , RouteHop , RouteParameters , Router } ;
2022-01-16 22:12:58 -06:00
use lightning ::routing ::scoring ::FixedPenaltyScorer ;
2020-11-25 12:23:47 -05:00
use lightning ::util ::config ::UserConfig ;
2021-04-21 00:35:23 +00:00
use lightning ::util ::errors ::APIError ;
2021-05-12 00:34:30 -07:00
use lightning ::util ::events ::Event ;
2021-08-17 13:04:29 +02:00
use lightning ::util ::enforcing_trait_impls ::{ EnforcingSigner , EnforcementState } ;
2018-07-25 02:34:51 +00:00
use lightning ::util ::logger ::Logger ;
2023-01-18 13:43:32 -08:00
use lightning ::util ::ser ::{ Readable , Writeable } ;
2018-07-25 02:34:51 +00:00
2022-10-13 02:35:48 -04:00
use crate ::utils ::test_logger ;
use crate ::utils ::test_persister ::TestPersister ;
2018-03-19 17:45:58 -04:00
2023-01-18 13:03:06 -08:00
use bitcoin ::secp256k1 ::{ Message , PublicKey , SecretKey , Scalar , Secp256k1 } ;
2022-07-11 16:27:10 -04:00
use bitcoin ::secp256k1 ::ecdh ::SharedSecret ;
2023-01-18 13:03:06 -08:00
use bitcoin ::secp256k1 ::ecdsa ::{ RecoverableSignature , Signature } ;
2018-03-19 17:45:58 -04:00
2018-07-23 01:06:45 +00:00
use std ::cell ::RefCell ;
2023-01-06 19:53:47 +00:00
use hashbrown ::{ HashMap , hash_map } ;
2021-11-29 12:50:47 -05:00
use std ::convert ::TryInto ;
2018-08-17 17:38:43 -04:00
use std ::cmp ;
2021-03-26 18:07:24 -04:00
use std ::sync ::{ Arc , Mutex } ;
2019-07-29 12:40:43 -04:00
use std ::sync ::atomic ::{ AtomicU64 , AtomicUsize , Ordering } ;
2022-01-21 11:33:39 +01:00
use bitcoin ::bech32 ::u5 ;
2018-03-19 17:45:58 -04:00
#[ inline ]
pub fn slice_to_be16 ( v : & [ u8 ] ) -> u16 {
( ( v [ 0 ] as u16 ) < < 8 * 1 ) |
( ( v [ 1 ] as u16 ) < < 8 * 0 )
}
2018-03-27 11:34:22 -04:00
#[ inline ]
pub fn slice_to_be24 ( v : & [ u8 ] ) -> u32 {
( ( v [ 0 ] as u32 ) < < 8 * 2 ) |
( ( v [ 1 ] as u32 ) < < 8 * 1 ) |
( ( v [ 2 ] as u32 ) < < 8 * 0 )
}
2018-03-19 17:45:58 -04:00
#[ inline ]
pub fn slice_to_be32 ( v : & [ u8 ] ) -> u32 {
( ( v [ 0 ] as u32 ) < < 8 * 3 ) |
( ( v [ 1 ] as u32 ) < < 8 * 2 ) |
( ( v [ 2 ] as u32 ) < < 8 * 1 ) |
( ( v [ 3 ] as u32 ) < < 8 * 0 )
}
2018-03-27 11:34:22 -04:00
#[ inline ]
pub fn be64_to_array ( u : u64 ) -> [ u8 ; 8 ] {
let mut v = [ 0 ; 8 ] ;
v [ 0 ] = ( ( u > > 8 * 7 ) & 0xff ) as u8 ;
v [ 1 ] = ( ( u > > 8 * 6 ) & 0xff ) as u8 ;
v [ 2 ] = ( ( u > > 8 * 5 ) & 0xff ) as u8 ;
v [ 3 ] = ( ( u > > 8 * 4 ) & 0xff ) as u8 ;
v [ 4 ] = ( ( u > > 8 * 3 ) & 0xff ) as u8 ;
v [ 5 ] = ( ( u > > 8 * 2 ) & 0xff ) as u8 ;
v [ 6 ] = ( ( u > > 8 * 1 ) & 0xff ) as u8 ;
v [ 7 ] = ( ( u > > 8 * 0 ) & 0xff ) as u8 ;
v
}
2018-03-19 17:45:58 -04:00
struct InputData {
data : Vec < u8 > ,
read_pos : AtomicUsize ,
}
impl InputData {
fn get_slice ( & self , len : usize ) -> Option < & [ u8 ] > {
let old_pos = self . read_pos . fetch_add ( len , Ordering ::AcqRel ) ;
if self . data . len ( ) < old_pos + len {
return None ;
}
Some ( & self . data [ old_pos .. old_pos + len ] )
}
}
struct FuzzEstimator {
input : Arc < InputData > ,
}
impl FeeEstimator for FuzzEstimator {
2020-06-15 17:28:01 -04:00
fn get_est_sat_per_1000_weight ( & self , _ : ConfirmationTarget ) -> u32 {
2018-03-19 17:45:58 -04:00
//TODO: We should actually be testing at least much more than 64k...
match self . input . get_slice ( 2 ) {
2020-06-15 17:28:01 -04:00
Some ( slice ) = > cmp ::max ( slice_to_be16 ( slice ) as u32 , 253 ) ,
2020-03-16 22:05:57 -04:00
None = > 253
2018-03-19 17:45:58 -04:00
}
}
}
2022-10-28 11:31:24 -04:00
struct FuzzRouter { }
impl Router for FuzzRouter {
fn find_route (
& self , _payer : & PublicKey , _params : & RouteParameters , _first_hops : Option < & [ & ChannelDetails ] > ,
2022-12-19 00:26:58 -05:00
_inflight_htlcs : & InFlightHtlcs
2022-10-28 11:31:24 -04:00
) -> Result < Route , msgs ::LightningError > {
Err ( msgs ::LightningError {
err : String ::from ( " Not implemented " ) ,
action : msgs ::ErrorAction ::IgnoreError
} )
}
fn notify_payment_path_failed ( & self , _path : & [ & RouteHop ] , _short_channel_id : u64 ) { }
fn notify_payment_path_successful ( & self , _path : & [ & RouteHop ] ) { }
fn notify_payment_probe_successful ( & self , _path : & [ & RouteHop ] ) { }
fn notify_payment_probe_failed ( & self , _path : & [ & RouteHop ] , _short_channel_id : u64 ) { }
}
2021-03-26 18:07:24 -04:00
struct TestBroadcaster {
txn_broadcasted : Mutex < Vec < Transaction > > ,
}
2018-03-26 16:48:18 -04:00
impl BroadcasterInterface for TestBroadcaster {
2021-03-26 18:07:24 -04:00
fn broadcast_transaction ( & self , tx : & Transaction ) {
self . txn_broadcasted . lock ( ) . unwrap ( ) . push ( tx . clone ( ) ) ;
}
2018-03-26 16:48:18 -04:00
}
2018-07-23 01:06:45 +00:00
#[ derive(Clone) ]
struct Peer < ' a > {
2018-03-19 17:45:58 -04:00
id : u8 ,
2018-07-23 01:06:45 +00:00
peers_connected : & ' a RefCell < [ bool ; 256 ] > ,
2018-03-19 17:45:58 -04:00
}
2018-07-23 01:06:45 +00:00
impl < ' a > SocketDescriptor for Peer < ' a > {
2019-07-31 02:57:08 +00:00
fn send_data ( & mut self , data : & [ u8 ] , _resume_read : bool ) -> usize {
data . len ( )
2018-03-19 17:45:58 -04:00
}
2018-07-23 01:06:45 +00:00
fn disconnect_socket ( & mut self ) {
assert! ( self . peers_connected . borrow ( ) [ self . id as usize ] ) ;
self . peers_connected . borrow_mut ( ) [ self . id as usize ] = false ;
}
}
impl < ' a > PartialEq for Peer < ' a > {
fn eq ( & self , other : & Self ) -> bool {
self . id = = other . id
}
}
impl < ' a > Eq for Peer < ' a > { }
2020-04-27 17:53:13 +02:00
impl < ' a > std ::hash ::Hash for Peer < ' a > {
2018-07-23 01:06:45 +00:00
fn hash < H : std ::hash ::Hasher > ( & self , h : & mut H ) {
self . id . hash ( h )
}
2018-03-19 17:45:58 -04:00
}
2022-10-28 11:31:24 -04:00
type ChannelMan < ' a > = ChannelManager <
2021-02-16 16:30:08 -05:00
Arc < chainmonitor ::ChainMonitor < EnforcingSigner , Arc < dyn chain ::Filter > , Arc < TestBroadcaster > , Arc < FuzzEstimator > , Arc < dyn Logger > , Arc < TestPersister > > > ,
2022-12-20 14:46:08 -08:00
Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < KeyProvider > , Arc < KeyProvider > , Arc < FuzzEstimator > , & ' a FuzzRouter , Arc < dyn Logger > > ;
2023-01-18 13:03:20 -08:00
type PeerMan < ' a > = PeerManager < Peer < ' a > , Arc < ChannelMan < ' a > > , Arc < P2PGossipSync < Arc < NetworkGraph < Arc < dyn Logger > > > , Arc < dyn chain ::Access > , Arc < dyn Logger > > > , IgnoringMessageHandler , Arc < dyn Logger > , IgnoringMessageHandler , Arc < KeyProvider > > ;
2020-05-12 13:31:20 -04:00
2019-12-20 14:53:16 -05:00
struct MoneyLossDetector < ' a > {
2022-10-28 11:31:24 -04:00
manager : Arc < ChannelMan < ' a > > ,
2021-02-16 16:30:08 -05:00
monitor : Arc < chainmonitor ::ChainMonitor < EnforcingSigner , Arc < dyn chain ::Filter > , Arc < TestBroadcaster > , Arc < FuzzEstimator > , Arc < dyn Logger > , Arc < TestPersister > > > ,
2020-05-12 13:31:20 -04:00
handler : PeerMan < ' a > ,
2018-08-17 17:38:43 -04:00
peers : & ' a RefCell < [ bool ; 256 ] > ,
funding_txn : Vec < Transaction > ,
2020-04-27 17:53:13 +02:00
txids_confirmed : HashMap < Txid , usize > ,
2021-03-05 11:02:42 -05:00
header_hashes : Vec < ( BlockHash , u32 ) > ,
2018-08-17 17:38:43 -04:00
height : usize ,
max_height : usize ,
2018-10-29 14:24:21 -04:00
blocks_connected : u32 ,
2018-08-17 17:38:43 -04:00
}
2019-12-20 14:53:16 -05:00
impl < ' a > MoneyLossDetector < ' a > {
2020-02-04 09:15:59 -08:00
pub fn new ( peers : & ' a RefCell < [ bool ; 256 ] > ,
2022-10-28 11:31:24 -04:00
manager : Arc < ChannelMan < ' a > > ,
2021-02-16 16:30:08 -05:00
monitor : Arc < chainmonitor ::ChainMonitor < EnforcingSigner , Arc < dyn chain ::Filter > , Arc < TestBroadcaster > , Arc < FuzzEstimator > , Arc < dyn Logger > , Arc < TestPersister > > > ,
2020-05-12 13:31:20 -04:00
handler : PeerMan < ' a > ) -> Self {
2018-08-17 17:38:43 -04:00
MoneyLossDetector {
manager ,
monitor ,
handler ,
peers ,
funding_txn : Vec ::new ( ) ,
2018-10-29 14:24:21 -04:00
txids_confirmed : HashMap ::new ( ) ,
2021-03-05 11:02:42 -05:00
header_hashes : vec ! [ ( genesis_block ( Network ::Bitcoin ) . block_hash ( ) , 0 ) ] ,
2018-08-17 17:38:43 -04:00
height : 0 ,
max_height : 0 ,
2018-10-29 14:24:21 -04:00
blocks_connected : 0 ,
2018-08-17 17:38:43 -04:00
}
}
2018-10-29 14:24:21 -04:00
fn connect_block ( & mut self , all_txn : & [ Transaction ] ) {
2020-06-16 15:10:17 -07:00
let mut txdata = Vec ::with_capacity ( all_txn . len ( ) ) ;
2018-10-29 14:24:21 -04:00
for ( idx , tx ) in all_txn . iter ( ) . enumerate ( ) {
2018-11-11 22:40:01 +00:00
let txid = tx . txid ( ) ;
2018-10-29 14:24:21 -04:00
match self . txids_confirmed . entry ( txid ) {
hash_map ::Entry ::Vacant ( e ) = > {
e . insert ( self . height ) ;
2020-06-16 15:10:17 -07:00
txdata . push ( ( idx + 1 , tx ) ) ;
2018-10-29 14:24:21 -04:00
} ,
_ = > { } ,
}
}
self . blocks_connected + = 1 ;
2022-08-09 17:39:51 +02:00
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 } ;
2021-03-05 11:02:42 -05:00
self . height + = 1 ;
2021-04-20 13:39:00 -07:00
self . manager . transactions_confirmed ( & header , & txdata , self . height as u32 ) ;
self . manager . best_block_updated ( & header , self . height as u32 ) ;
2021-04-22 09:52:10 -07:00
( * self . monitor ) . transactions_confirmed ( & header , & txdata , self . height as u32 ) ;
( * self . monitor ) . best_block_updated ( & header , self . height as u32 ) ;
2018-08-17 17:38:43 -04:00
if self . header_hashes . len ( ) > self . height {
2021-03-05 11:02:42 -05:00
self . header_hashes [ self . height ] = ( header . block_hash ( ) , self . blocks_connected ) ;
2018-08-17 17:38:43 -04:00
} else {
assert_eq! ( self . header_hashes . len ( ) , self . height ) ;
2021-03-05 11:02:42 -05:00
self . header_hashes . push ( ( header . block_hash ( ) , self . blocks_connected ) ) ;
2018-08-17 17:38:43 -04:00
}
self . max_height = cmp ::max ( self . height , self . max_height ) ;
}
fn disconnect_block ( & mut self ) {
if self . height > 0 & & ( self . max_height < 6 | | self . height > = self . max_height - 6 ) {
2022-08-09 17:39:51 +02:00
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 } ;
2021-03-20 00:22:09 -04:00
self . manager . block_disconnected ( & header , self . height as u32 ) ;
2019-02-04 21:21:11 -05:00
self . monitor . block_disconnected ( & header , self . height as u32 ) ;
2020-01-17 14:21:02 -05:00
self . height - = 1 ;
2018-10-29 14:24:21 -04:00
let removal_height = self . height ;
self . txids_confirmed . retain ( | _ , height | {
removal_height ! = * height
} ) ;
2018-08-17 17:38:43 -04:00
}
}
}
2019-12-20 14:53:16 -05:00
impl < ' a > Drop for MoneyLossDetector < ' a > {
2018-08-17 17:38:43 -04:00
fn drop ( & mut self ) {
2018-11-02 10:54:25 -04:00
if ! ::std ::thread ::panicking ( ) {
// Disconnect all peers
for ( idx , peer ) in self . peers . borrow ( ) . iter ( ) . enumerate ( ) {
if * peer {
2020-02-20 15:12:42 -05:00
self . handler . socket_disconnected ( & Peer { id : idx as u8 , peers_connected : & self . peers } ) ;
2018-11-02 10:54:25 -04:00
}
2018-08-17 17:38:43 -04:00
}
2018-11-02 10:54:25 -04:00
// Force all channels onto the chain (and time out claim txn)
2022-06-23 20:25:58 +00:00
self . manager . force_close_all_channels_broadcasting_latest_txn ( ) ;
2018-11-02 10:54:25 -04:00
}
2018-08-17 17:38:43 -04:00
}
}
2018-10-26 11:40:01 -04:00
struct KeyProvider {
node_secret : SecretKey ,
2021-11-29 12:50:47 -05:00
inbound_payment_key : KeyMaterial ,
2019-07-29 12:40:43 -04:00
counter : AtomicU64 ,
2022-11-21 12:45:30 -08:00
signer_state : RefCell < HashMap < u8 , ( bool , Arc < Mutex < EnforcementState > > ) > >
2018-10-26 11:40:01 -04:00
}
2019-11-26 16:46:33 -05:00
2022-12-08 15:40:54 -08:00
impl EntropySource for KeyProvider {
fn get_secure_random_bytes ( & self ) -> [ u8 ; 32 ] {
let ctr = self . counter . fetch_add ( 1 , Ordering ::Relaxed ) ;
[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
( ctr > > 8 * 7 ) as u8 , ( ctr > > 8 * 6 ) as u8 , ( ctr > > 8 * 5 ) as u8 , ( ctr > > 8 * 4 ) as u8 , ( ctr > > 8 * 3 ) as u8 , ( ctr > > 8 * 2 ) as u8 , ( ctr > > 8 * 1 ) as u8 , 14 , ( ctr > > 8 * 0 ) as u8 ]
}
}
impl NodeSigner for KeyProvider {
fn get_node_id ( & self , recipient : Recipient ) -> Result < PublicKey , ( ) > {
2023-01-18 13:43:32 -08:00
let node_secret = match recipient {
Recipient ::Node = > Ok ( & self . node_secret ) ,
Recipient ::PhantomNode = > Err ( ( ) )
} ? ;
Ok ( PublicKey ::from_secret_key ( & Secp256k1 ::signing_only ( ) , node_secret ) )
2022-12-08 15:40:54 -08:00
}
2022-08-10 18:04:59 +02:00
fn ecdh ( & self , recipient : Recipient , other_key : & PublicKey , tweak : Option < & Scalar > ) -> Result < SharedSecret , ( ) > {
2023-01-18 13:43:32 -08:00
let mut node_secret = match recipient {
Recipient ::Node = > Ok ( self . node_secret . clone ( ) ) ,
Recipient ::PhantomNode = > Err ( ( ) )
} ? ;
2022-07-11 16:27:10 -04:00
if let Some ( tweak ) = tweak {
2023-01-18 13:43:32 -08:00
node_secret = node_secret . mul_tweak ( tweak ) . map_err ( | _ | ( ) ) ? ;
2022-07-11 16:27:10 -04:00
}
Ok ( SharedSecret ::new ( other_key , & node_secret ) )
}
2021-11-29 12:50:47 -05:00
fn get_inbound_payment_key_material ( & self ) -> KeyMaterial {
self . inbound_payment_key . clone ( )
}
2022-12-08 15:40:54 -08:00
fn sign_invoice ( & self , _hrp_bytes : & [ u8 ] , _invoice_data : & [ u5 ] , _recipient : Recipient ) -> Result < RecoverableSignature , ( ) > {
unreachable! ( )
2018-10-26 11:40:01 -04:00
}
2023-01-18 13:03:06 -08:00
fn sign_gossip_message ( & self , msg : lightning ::ln ::msgs ::UnsignedGossipMessage ) -> Result < Signature , ( ) > {
let msg_hash = Message ::from_slice ( & Sha256dHash ::hash ( & msg . encode ( ) [ .. ] ) [ .. ] ) . map_err ( | _ | ( ) ) ? ;
let secp_ctx = Secp256k1 ::signing_only ( ) ;
Ok ( secp_ctx . sign_ecdsa ( & msg_hash , & self . node_secret ) )
}
2022-12-08 15:40:54 -08:00
}
2018-10-26 11:40:01 -04:00
2022-12-08 15:40:54 -08:00
impl SignerProvider for KeyProvider {
type Signer = EnforcingSigner ;
2018-10-26 11:40:01 -04:00
2022-11-21 12:45:30 -08:00
fn generate_channel_keys_id ( & self , inbound : bool , _channel_value_satoshis : u64 , _user_channel_id : u128 ) -> [ u8 ; 32 ] {
2019-07-29 12:40:43 -04:00
let ctr = self . counter . fetch_add ( 1 , Ordering ::Relaxed ) as u8 ;
2022-11-21 12:45:30 -08:00
self . signer_state . borrow_mut ( ) . insert ( ctr , ( inbound , Arc ::new ( Mutex ::new ( EnforcementState ::new ( ) ) ) ) ) ;
[ ctr ; 32 ]
}
fn derive_channel_signer ( & self , channel_value_satoshis : u64 , channel_keys_id : [ u8 ; 32 ] ) -> Self ::Signer {
2020-02-04 09:15:59 -08:00
let secp_ctx = Secp256k1 ::signing_only ( ) ;
2022-11-21 12:45:30 -08:00
let ctr = channel_keys_id [ 0 ] ;
let ( inbound , state ) = self . signer_state . borrow ( ) . get ( & ctr ) . unwrap ( ) . clone ( ) ;
EnforcingSigner ::new_with_revoked ( if inbound {
2021-02-16 16:30:08 -05:00
InMemorySigner ::new (
2020-02-04 09:15:59 -08:00
& secp_ctx ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 3 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 , ctr ] ) . unwrap ( ) ,
[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 6 , ctr ] ,
channel_value_satoshis ,
2022-11-21 12:45:30 -08:00
channel_keys_id ,
2020-02-04 09:15:59 -08:00
)
2018-10-26 11:40:01 -04:00
} else {
2021-02-16 16:30:08 -05:00
InMemorySigner ::new (
2020-02-04 09:15:59 -08:00
& secp_ctx ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 9 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , ctr ] ) . unwrap ( ) ,
SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 11 , ctr ] ) . unwrap ( ) ,
[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 12 , ctr ] ,
channel_value_satoshis ,
2022-11-21 12:45:30 -08:00
channel_keys_id ,
2020-02-04 09:15:59 -08:00
)
2022-11-21 12:45:30 -08:00
} , state , false )
2018-10-26 11:40:01 -04:00
}
2018-11-26 20:10:01 +09:00
2021-08-17 13:04:29 +02:00
fn read_chan_signer ( & self , mut data : & [ u8 ] ) -> Result < EnforcingSigner , DecodeError > {
2023-01-18 13:43:32 -08:00
let inner : InMemorySigner = Readable ::read ( & mut data ) ? ;
2021-08-17 13:04:29 +02:00
let state = Arc ::new ( Mutex ::new ( EnforcementState ::new ( ) ) ) ;
Ok ( EnforcingSigner ::new_with_revoked (
inner ,
state ,
false
) )
2020-11-25 12:23:47 -05:00
}
2021-04-29 12:19:05 -04:00
2022-12-08 15:40:54 -08:00
fn get_destination_script ( & self ) -> Script {
let secp_ctx = Secp256k1 ::signing_only ( ) ;
let channel_monitor_claim_key = SecretKey ::from_slice ( & hex ::decode ( " 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff " ) . unwrap ( ) [ .. ] ) . unwrap ( ) ;
let our_channel_monitor_claim_key_hash = WPubkeyHash ::hash ( & PublicKey ::from_secret_key ( & secp_ctx , & channel_monitor_claim_key ) . serialize ( ) ) ;
Builder ::new ( ) . push_opcode ( opcodes ::all ::OP_PUSHBYTES_0 ) . push_slice ( & our_channel_monitor_claim_key_hash [ .. ] ) . into_script ( )
}
fn get_shutdown_scriptpubkey ( & self ) -> ShutdownScript {
let secp_ctx = Secp256k1 ::signing_only ( ) ;
let secret_key = SecretKey ::from_slice ( & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ) . unwrap ( ) ;
let pubkey_hash = WPubkeyHash ::hash ( & PublicKey ::from_secret_key ( & secp_ctx , & secret_key ) . serialize ( ) ) ;
ShutdownScript ::new_p2wpkh ( & pubkey_hash )
2021-04-29 12:19:05 -04:00
}
2018-10-26 11:40:01 -04:00
}
2022-12-08 15:40:54 -08:00
2018-03-19 17:45:58 -04:00
#[ inline ]
2019-11-25 16:26:31 -05:00
pub fn do_test ( data : & [ u8 ] , logger : & Arc < dyn Logger > ) {
2018-03-19 17:45:58 -04:00
let input = Arc ::new ( InputData {
data : data . to_vec ( ) ,
read_pos : AtomicUsize ::new ( 0 ) ,
} ) ;
let fee_est = Arc ::new ( FuzzEstimator {
input : input . clone ( ) ,
} ) ;
2022-10-28 11:31:24 -04:00
let router = FuzzRouter { } ;
2018-03-19 17:45:58 -04:00
macro_rules ! get_slice {
( $len : expr ) = > {
match input . get_slice ( $len as usize ) {
Some ( slice ) = > slice ,
None = > return ,
}
}
}
macro_rules ! get_pubkey {
( ) = > {
2019-01-16 15:45:05 -05:00
match PublicKey ::from_slice ( get_slice! ( 33 ) ) {
2018-03-19 17:45:58 -04:00
Ok ( key ) = > key ,
Err ( _ ) = > return ,
}
}
}
2019-01-16 15:45:05 -05:00
let our_network_key = match SecretKey ::from_slice ( get_slice! ( 32 ) ) {
2018-03-19 17:45:58 -04:00
Ok ( key ) = > key ,
Err ( _ ) = > return ,
} ;
2021-11-29 12:50:47 -05:00
let inbound_payment_key = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 42 ] ;
2021-03-26 18:07:24 -04:00
let broadcast = Arc ::new ( TestBroadcaster { txn_broadcasted : Mutex ::new ( Vec ::new ( ) ) } ) ;
2021-10-09 00:23:44 +00:00
let monitor = Arc ::new ( chainmonitor ::ChainMonitor ::new ( None , broadcast . clone ( ) , Arc ::clone ( & logger ) , fee_est . clone ( ) ,
2022-07-18 01:32:27 +00:00
Arc ::new ( TestPersister { update_ret : Mutex ::new ( ChannelMonitorUpdateStatus ::Completed ) } ) ) ) ;
2018-03-19 17:45:58 -04:00
2022-11-21 12:45:30 -08:00
let keys_manager = Arc ::new ( KeyProvider {
node_secret : our_network_key . clone ( ) ,
inbound_payment_key : KeyMaterial ( inbound_payment_key . try_into ( ) . unwrap ( ) ) ,
counter : AtomicU64 ::new ( 0 ) ,
signer_state : RefCell ::new ( HashMap ::new ( ) )
} ) ;
2019-10-18 14:19:49 +01:00
let mut config = UserConfig ::default ( ) ;
2022-06-13 12:53:56 -07:00
config . channel_config . forwarding_fee_proportional_millionths = slice_to_be32 ( get_slice! ( 4 ) ) ;
config . channel_handshake_config . announced_channel = get_slice! ( 1 ) [ 0 ] ! = 0 ;
2021-03-03 11:24:55 -08:00
let network = Network ::Bitcoin ;
let params = ChainParameters {
network ,
2021-04-08 23:36:30 -07:00
best_block : BestBlock ::from_genesis ( network ) ,
2021-03-03 11:24:55 -08:00
} ;
2022-12-20 14:46:08 -08:00
let channelmanager = Arc ::new ( ChannelManager ::new ( fee_est . clone ( ) , monitor . clone ( ) , broadcast . clone ( ) , & router , Arc ::clone ( & logger ) , keys_manager . clone ( ) , keys_manager . clone ( ) , keys_manager . clone ( ) , config , params ) ) ;
2022-12-20 14:46:08 -08:00
// Adding new calls to `EntropySource::get_secure_random_bytes` during startup can change all the
2022-02-19 16:41:38 -05:00
// keys subsequently generated in this test. Rather than regenerating all the messages manually,
// it's easier to just increment the counter here so the keys don't change.
2022-10-24 10:30:11 +02:00
keys_manager . counter . fetch_sub ( 3 , Ordering ::AcqRel ) ;
2023-01-18 13:43:32 -08:00
let our_id = & keys_manager . get_node_id ( Recipient ::Node ) . unwrap ( ) ;
2022-06-03 21:35:37 -07:00
let network_graph = Arc ::new ( NetworkGraph ::new ( genesis_block ( network ) . block_hash ( ) , Arc ::clone ( & logger ) ) ) ;
2022-06-01 10:28:34 -07:00
let gossip_sync = Arc ::new ( P2PGossipSync ::new ( Arc ::clone ( & network_graph ) , None , Arc ::clone ( & logger ) ) ) ;
2022-01-16 22:12:58 -06:00
let scorer = FixedPenaltyScorer ::with_penalty ( 0 ) ;
2018-03-19 17:45:58 -04:00
2018-07-23 01:06:45 +00:00
let peers = RefCell ::new ( [ false ; 256 ] ) ;
2018-08-17 17:38:43 -04:00
let mut loss_detector = MoneyLossDetector ::new ( & peers , channelmanager . clone ( ) , monitor . clone ( ) , PeerManager ::new ( MessageHandler {
2018-03-19 17:45:58 -04:00
chan_handler : channelmanager . clone ( ) ,
2022-06-01 10:28:34 -07:00
route_handler : gossip_sync . clone ( ) ,
2022-08-06 00:33:48 -04:00
onion_message_handler : IgnoringMessageHandler { } ,
2023-01-18 13:43:32 -08:00
} , 0 , & [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 15 , 0 ] , Arc ::clone ( & logger ) , IgnoringMessageHandler { } , keys_manager . clone ( ) ) ) ;
2018-03-19 17:45:58 -04:00
2018-03-27 11:34:22 -04:00
let mut should_forward = false ;
2021-04-26 23:05:56 +00:00
let mut payments_received : Vec < PaymentHash > = Vec ::new ( ) ;
2018-03-27 11:34:22 -04:00
let mut payments_sent = 0 ;
2022-05-13 23:43:25 +02:00
let mut pending_funding_generation : Vec < ( [ u8 ; 32 ] , PublicKey , u64 , Script ) > = Vec ::new ( ) ;
2018-03-27 11:34:22 -04:00
let mut pending_funding_signatures = HashMap ::new ( ) ;
2018-03-19 17:45:58 -04:00
loop {
match get_slice! ( 1 ) [ 0 ] {
0 = > {
let mut new_id = 0 ;
for i in 1 .. 256 {
2018-07-23 01:06:45 +00:00
if ! peers . borrow ( ) [ i - 1 ] {
2018-03-19 17:45:58 -04:00
new_id = i ;
break ;
}
}
if new_id = = 0 { return ; }
2022-03-13 00:40:35 +05:30
loss_detector . handler . new_outbound_connection ( get_pubkey! ( ) , Peer { id : ( new_id - 1 ) as u8 , peers_connected : & peers } , None ) . unwrap ( ) ;
2018-07-23 01:06:45 +00:00
peers . borrow_mut ( ) [ new_id - 1 ] = true ;
2018-03-19 17:45:58 -04:00
} ,
1 = > {
let mut new_id = 0 ;
for i in 1 .. 256 {
2018-07-23 01:06:45 +00:00
if ! peers . borrow ( ) [ i - 1 ] {
2018-03-19 17:45:58 -04:00
new_id = i ;
break ;
}
}
if new_id = = 0 { return ; }
2022-03-13 00:40:35 +05:30
loss_detector . handler . new_inbound_connection ( Peer { id : ( new_id - 1 ) as u8 , peers_connected : & peers } , None ) . unwrap ( ) ;
2018-07-23 01:06:45 +00:00
peers . borrow_mut ( ) [ new_id - 1 ] = true ;
2018-03-19 17:45:58 -04:00
} ,
2 = > {
let peer_id = get_slice! ( 1 ) [ 0 ] ;
2018-07-23 01:06:45 +00:00
if ! peers . borrow ( ) [ peer_id as usize ] { return ; }
2020-02-20 15:12:42 -05:00
loss_detector . handler . socket_disconnected ( & Peer { id : peer_id , peers_connected : & peers } ) ;
2018-07-23 01:06:45 +00:00
peers . borrow_mut ( ) [ peer_id as usize ] = false ;
2018-03-19 17:45:58 -04:00
} ,
3 = > {
let peer_id = get_slice! ( 1 ) [ 0 ] ;
2018-07-23 01:06:45 +00:00
if ! peers . borrow ( ) [ peer_id as usize ] { return ; }
2020-01-31 20:57:01 -05:00
match loss_detector . handler . read_event ( & mut Peer { id : peer_id , peers_connected : & peers } , get_slice! ( get_slice! ( 1 ) [ 0 ] ) ) {
2018-03-19 17:45:58 -04:00
Ok ( res ) = > assert! ( ! res ) ,
2018-07-23 01:06:45 +00:00
Err ( _ ) = > { peers . borrow_mut ( ) [ peer_id as usize ] = false ; }
2018-03-19 17:45:58 -04:00
}
} ,
2018-03-27 11:34:22 -04:00
4 = > {
2021-10-25 18:48:52 -05:00
let final_value_msat = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2023-01-27 19:24:52 +00:00
let payment_params = PaymentParameters ::from_node_id ( get_pubkey! ( ) , 42 ) ;
2021-10-25 18:48:52 -05:00
let params = RouteParameters {
2022-01-21 10:39:01 +01:00
payment_params ,
2021-10-25 18:48:52 -05:00
final_value_msat ,
final_cltv_expiry_delta : 42 ,
} ;
2022-03-09 11:13:47 -06:00
let random_seed_bytes : [ u8 ; 32 ] = keys_manager . get_secure_random_bytes ( ) ;
2022-06-29 17:41:30 +00:00
let route = match find_route ( & our_id , & params , & network_graph , None , Arc ::clone ( & logger ) , & scorer , & random_seed_bytes ) {
2018-03-27 11:34:22 -04:00
Ok ( route ) = > route ,
Err ( _ ) = > return ,
} ;
2018-11-22 21:18:16 -05:00
let mut payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
payment_hash . 0 [ 0 .. 8 ] . copy_from_slice ( & be64_to_array ( payments_sent ) ) ;
2018-12-17 23:58:02 -05:00
let mut sha = Sha256 ::engine ( ) ;
2018-11-22 21:18:16 -05:00
sha . input ( & payment_hash . 0 [ .. ] ) ;
2018-12-17 23:58:02 -05:00
payment_hash . 0 = Sha256 ::from_engine ( sha ) . into_inner ( ) ;
2018-03-27 11:34:22 -04:00
payments_sent + = 1 ;
2022-10-06 21:31:02 +00:00
match channelmanager . send_payment ( & route , payment_hash , & None , PaymentId ( payment_hash . 0 ) ) {
2018-03-27 11:34:22 -04:00
Ok ( _ ) = > { } ,
Err ( _ ) = > return ,
}
} ,
2020-01-10 17:24:33 -05:00
15 = > {
2021-10-25 18:48:52 -05:00
let final_value_msat = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2023-01-27 19:24:52 +00:00
let payment_params = PaymentParameters ::from_node_id ( get_pubkey! ( ) , 42 ) ;
2021-10-25 18:48:52 -05:00
let params = RouteParameters {
2022-01-21 10:39:01 +01:00
payment_params ,
2021-10-25 18:48:52 -05:00
final_value_msat ,
final_cltv_expiry_delta : 42 ,
} ;
2022-03-09 11:13:47 -06:00
let random_seed_bytes : [ u8 ; 32 ] = keys_manager . get_secure_random_bytes ( ) ;
2022-06-29 17:41:30 +00:00
let mut route = match find_route ( & our_id , & params , & network_graph , None , Arc ::clone ( & logger ) , & scorer , & random_seed_bytes ) {
2020-01-10 17:24:33 -05:00
Ok ( route ) = > route ,
Err ( _ ) = > return ,
} ;
route . paths . push ( route . paths [ 0 ] . clone ( ) ) ;
let mut payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
payment_hash . 0 [ 0 .. 8 ] . copy_from_slice ( & be64_to_array ( payments_sent ) ) ;
let mut sha = Sha256 ::engine ( ) ;
sha . input ( & payment_hash . 0 [ .. ] ) ;
payment_hash . 0 = Sha256 ::from_engine ( sha ) . into_inner ( ) ;
payments_sent + = 1 ;
let mut payment_secret = PaymentSecret ( [ 0 ; 32 ] ) ;
payment_secret . 0 [ 0 .. 8 ] . copy_from_slice ( & be64_to_array ( payments_sent ) ) ;
payments_sent + = 1 ;
2022-10-06 21:31:02 +00:00
match channelmanager . send_payment ( & route , payment_hash , & Some ( payment_secret ) , PaymentId ( payment_hash . 0 ) ) {
2020-01-10 17:24:33 -05:00
Ok ( _ ) = > { } ,
Err ( _ ) = > return ,
}
} ,
2018-03-27 11:34:22 -04:00
5 = > {
let peer_id = get_slice! ( 1 ) [ 0 ] ;
2018-07-23 01:06:45 +00:00
if ! peers . borrow ( ) [ peer_id as usize ] { return ; }
2018-03-27 11:34:22 -04:00
let their_key = get_pubkey! ( ) ;
let chan_value = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2018-08-23 15:58:59 -04:00
let push_msat_value = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2020-02-25 12:03:25 +00:00
if channelmanager . create_channel ( their_key , chan_value , push_msat_value , 0 , None ) . is_err ( ) { return ; }
2018-03-27 11:34:22 -04:00
} ,
6 = > {
let mut channels = channelmanager . list_channels ( ) ;
let channel_id = get_slice! ( 1 ) [ 0 ] as usize ;
if channel_id > = channels . len ( ) { return ; }
channels . sort_by ( | a , b | { a . channel_id . cmp ( & b . channel_id ) } ) ;
2022-05-12 22:31:29 +02:00
if channelmanager . close_channel ( & channels [ channel_id ] . channel_id , & channels [ channel_id ] . counterparty . node_id ) . is_err ( ) { return ; }
2018-03-27 11:34:22 -04:00
} ,
7 = > {
if should_forward {
2018-07-24 22:08:18 -04:00
channelmanager . process_pending_htlc_forwards ( ) ;
2018-03-27 11:34:22 -04:00
should_forward = false ;
}
} ,
8 = > {
2021-04-26 23:05:56 +00:00
for payment in payments_received . drain ( .. ) {
2018-08-17 11:53:47 -04:00
// SHA256 is defined as XOR of all input bytes placed in the first byte, and 0s
// for the remaining bytes. Thus, if not all remaining bytes are 0s we cannot
// fulfill this HTLC, but if they are, we can just take the first byte and
// place that anywhere in our preimage.
2018-11-22 21:18:16 -05:00
if & payment . 0 [ 1 .. ] ! = & [ 0 ; 31 ] {
2021-04-23 03:00:44 +00:00
channelmanager . fail_htlc_backwards ( & payment ) ;
2018-08-17 11:53:47 -04:00
} else {
2018-11-22 21:18:16 -05:00
let mut payment_preimage = PaymentPreimage ( [ 0 ; 32 ] ) ;
payment_preimage . 0 [ 0 ] = payment . 0 [ 0 ] ;
2021-04-26 23:05:56 +00:00
channelmanager . claim_funds ( payment_preimage ) ;
2018-08-17 11:53:47 -04:00
}
2018-03-27 11:34:22 -04:00
}
} ,
2021-04-23 19:04:02 +00:00
16 = > {
let payment_preimage = PaymentPreimage ( keys_manager . get_secure_random_bytes ( ) ) ;
let mut sha = Sha256 ::engine ( ) ;
sha . input ( & payment_preimage . 0 [ .. ] ) ;
let payment_hash = PaymentHash ( Sha256 ::from_engine ( sha ) . into_inner ( ) ) ;
// Note that this may fail - our hashes may collide and we'll end up trying to
// double-register the same payment_hash.
2022-11-24 22:31:16 +02:00
let _ = channelmanager . create_inbound_payment_for_hash ( payment_hash , None , 1 , None ) ;
2021-04-23 19:04:02 +00:00
} ,
2018-03-27 11:34:22 -04:00
9 = > {
2021-04-26 23:05:56 +00:00
for payment in payments_received . drain ( .. ) {
2021-04-23 03:00:44 +00:00
channelmanager . fail_htlc_backwards ( & payment ) ;
2018-03-27 11:34:22 -04:00
}
} ,
10 = > {
2018-10-29 14:24:21 -04:00
' outer_loop : for funding_generation in pending_funding_generation . drain ( .. ) {
2022-08-09 17:39:51 +02:00
let mut tx = Transaction { version : 0 , lock_time : PackedLockTime ::ZERO , input : Vec ::new ( ) , output : vec ! [ TxOut {
2022-05-13 23:43:25 +02:00
value : funding_generation . 2 , script_pubkey : funding_generation . 3 ,
2018-03-27 11:34:22 -04:00
} ] } ;
2018-10-29 14:24:21 -04:00
let funding_output = ' search_loop : loop {
2018-11-11 22:40:01 +00:00
let funding_txid = tx . txid ( ) ;
2018-10-29 14:24:21 -04:00
if let None = loss_detector . txids_confirmed . get ( & funding_txid ) {
2020-05-12 13:17:49 -04:00
let outpoint = OutPoint { txid : funding_txid , index : 0 } ;
2018-10-29 14:24:21 -04:00
for chan in channelmanager . list_channels ( ) {
if chan . channel_id = = outpoint . to_channel_id ( ) {
tx . version + = 1 ;
continue 'search_loop ;
}
}
break outpoint ;
2018-08-15 15:43:29 -04:00
}
2018-10-29 14:24:21 -04:00
tx . version + = 1 ;
if tx . version > 0xff {
continue 'outer_loop ;
}
} ;
2022-05-12 23:59:41 +02:00
if let Err ( e ) = channelmanager . funding_transaction_generated ( & funding_generation . 0 , & funding_generation . 1 , tx . clone ( ) ) {
2021-04-21 00:35:23 +00:00
// It's possible the channel has been closed in the mean time, but any other
// failure may be a bug.
if let APIError ::ChannelUnavailable { err } = e {
2023-01-15 23:37:00 +00:00
if ! err . starts_with ( " Can't find a peer matching the passed counterparty node_id " ) {
assert_eq! ( err , " No such channel " ) ;
}
2021-04-21 00:35:23 +00:00
} else { panic! ( ) ; }
}
2018-10-29 14:24:21 -04:00
pending_funding_signatures . insert ( funding_output , tx ) ;
2018-03-27 11:34:22 -04:00
}
} ,
11 = > {
2021-04-21 01:35:12 +00:00
let mut txn = broadcast . txn_broadcasted . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2021-03-26 18:07:24 -04:00
if ! txn . is_empty ( ) {
loss_detector . connect_block ( & txn [ .. ] ) ;
2018-08-17 17:38:43 -04:00
for _ in 2 .. 100 {
2018-10-29 14:24:21 -04:00
loss_detector . connect_block ( & [ ] ) ;
2018-03-27 11:34:22 -04:00
}
}
2021-03-26 18:07:24 -04:00
for tx in txn . drain ( .. ) {
2018-08-17 17:38:43 -04:00
loss_detector . funding_txn . push ( tx ) ;
}
} ,
12 = > {
let txlen = slice_to_be16 ( get_slice! ( 2 ) ) ;
if txlen = = 0 {
2018-10-29 14:24:21 -04:00
loss_detector . connect_block ( & [ ] ) ;
2018-08-17 17:38:43 -04:00
} else {
let txres : Result < Transaction , _ > = deserialize ( get_slice! ( txlen ) ) ;
if let Ok ( tx ) = txres {
2020-01-19 16:03:25 -05:00
let mut output_val = 0 ;
for out in tx . output . iter ( ) {
if out . value > 21_000_000_0000_0000 { return ; }
output_val + = out . value ;
if output_val > 21_000_000_0000_0000 { return ; }
}
2018-10-29 14:24:21 -04:00
loss_detector . connect_block ( & [ tx ] ) ;
2018-08-17 17:38:43 -04:00
} else {
return ;
}
}
} ,
13 = > {
loss_detector . disconnect_block ( ) ;
2018-03-27 11:34:22 -04:00
} ,
2018-09-06 17:23:09 -04:00
14 = > {
let mut channels = channelmanager . list_channels ( ) ;
let channel_id = get_slice! ( 1 ) [ 0 ] as usize ;
if channel_id > = channels . len ( ) { return ; }
channels . sort_by ( | a , b | { a . channel_id . cmp ( & b . channel_id ) } ) ;
2022-06-23 20:25:58 +00:00
channelmanager . force_close_broadcasting_latest_txn ( & channels [ channel_id ] . channel_id , & channels [ channel_id ] . counterparty . node_id ) . unwrap ( ) ;
2018-09-06 17:23:09 -04:00
} ,
2020-01-10 17:24:33 -05:00
// 15 is above
2018-03-19 17:45:58 -04:00
_ = > return ,
}
2018-08-17 17:38:43 -04:00
loss_detector . handler . process_events ( ) ;
2018-10-19 16:25:32 -04:00
for event in loss_detector . manager . get_and_clear_pending_events ( ) {
2018-03-27 11:34:22 -04:00
match event {
2022-05-13 23:43:25 +02:00
Event ::FundingGenerationReady { temporary_channel_id , counterparty_node_id , channel_value_satoshis , output_script , .. } = > {
pending_funding_generation . push ( ( temporary_channel_id , counterparty_node_id , channel_value_satoshis , output_script ) ) ;
2018-03-27 11:34:22 -04:00
} ,
2022-12-01 09:34:34 +01:00
Event ::PaymentClaimable { payment_hash , .. } = > {
2019-11-14 18:50:24 -05:00
//TODO: enhance by fetching random amounts from fuzz input?
2021-04-26 23:05:56 +00:00
payments_received . push ( payment_hash ) ;
2018-03-27 11:34:22 -04:00
} ,
Event ::PendingHTLCsForwardable { .. } = > {
should_forward = true ;
} ,
2021-07-16 02:16:50 +00:00
_ = > { } ,
2018-03-27 11:34:22 -04:00
}
}
2018-03-19 17:45:58 -04:00
}
}
2020-02-20 20:11:40 -05:00
pub fn full_stack_test < Out : test_logger ::Output > ( data : & [ u8 ] , out : Out ) {
let logger : Arc < dyn Logger > = Arc ::new ( test_logger ::TestLogger ::new ( " " . to_owned ( ) , out ) ) ;
do_test ( data , & logger ) ;
}
2019-12-11 13:18:43 -05:00
#[ no_mangle ]
pub extern " C " fn full_stack_run ( data : * const u8 , datalen : usize ) {
2020-02-20 20:11:40 -05:00
let logger : Arc < dyn Logger > = Arc ::new ( test_logger ::TestLogger ::new ( " " . to_owned ( ) , test_logger ::DevNull { } ) ) ;
2019-12-11 13:18:43 -05:00
do_test ( unsafe { std ::slice ::from_raw_parts ( data , datalen ) } , & logger ) ;
2018-03-19 17:45:58 -04:00
}
#[ cfg(test) ]
mod tests {
2018-08-14 09:55:38 -04:00
use lightning ::util ::logger ::{ Logger , Record } ;
use std ::collections ::HashMap ;
use std ::sync ::{ Arc , Mutex } ;
struct TrackingLogger {
/// (module, message) -> count
pub lines : Mutex < HashMap < ( String , String ) , usize > > ,
}
impl Logger for TrackingLogger {
fn log ( & self , record : & Record ) {
* self . lines . lock ( ) . unwrap ( ) . entry ( ( record . module_path . to_string ( ) , format! ( " {} " , record . args ) ) ) . or_insert ( 0 ) + = 1 ;
println! ( " {:<5} [ {} : {} , {} ] {} " , record . level . to_string ( ) , record . module_path , record . file , record . line , record . args ) ;
}
}
#[ test ]
fn test_no_existing_test_breakage ( ) {
// To avoid accidentally causing all existing fuzz test cases to be useless by making minor
// changes (such as requesting feerate info in a new place), we run a pretty full
// step-through with two peers and HTLC forwarding here. Obviously this is pretty finicky,
// so this should be updated pretty liberally, but at least we'll know when changes occur.
// If nothing else, this test serves as a pretty great initial full_stack_target seed.
// What each byte represents is broken down below, and then everything is concatenated into
// one large test at the end (you want %s/ -.*//g %s/\n\| \|\t\|\///g).
2020-11-29 15:20:35 -05:00
// Following BOLT 8, lightning message on the wire are: 2-byte encrypted message length +
2019-02-27 20:05:18 -05:00
// 16-byte MAC of the encrypted message length + encrypted Lightning message + 16-byte MAC
// of the Lightning message
// I.e 2nd inbound read, len 18 : 0006 (encrypted message length) + 03000000000000000000000000000000 (MAC of the encrypted message length)
// Len 22 : 0010 00000000 (encrypted lightning message) + 03000000000000000000000000000000 (MAC of the Lightning message)
2019-07-02 15:52:58 -04:00
// Writing new code generating transactions and see a new failure ? Don't forget to add input for the FuzzEstimator !
2021-02-18 20:04:47 -05:00
// 0100000000000000000000000000000000000000000000000000000000000000 - our network key
2018-08-14 09:55:38 -04:00
// 00000000 - fee_proportional_millionths
// 01 - announce_channels_publicly
//
// 00 - new outbound connection with id 0
2021-02-18 20:04:47 -05:00
// 030000000000000000000000000000000000000000000000000000000000000002 - peer's pubkey
2018-08-14 09:55:38 -04:00
// 030032 - inbound read from peer id 0 of len 50
2021-02-18 20:04:47 -05:00
// 00 030000000000000000000000000000000000000000000000000000000000000002 03000000000000000000000000000000 - noise act two (0||pubkey||mac)
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
2020-05-02 22:00:08 -04:00
// 000a 03000000000000000000000000000000 - message header indicating message length 10
// 03001a - inbound read from peer id 0 of len 26
// 0010 00022000 00022000 03000000000000000000000000000000 - init message (type 16) with static_remotekey (0x2000) and mac
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0141 03000000000000000000000000000000 - message header indicating message length 321
2018-09-14 13:47:46 -04:00
// 0300fe - inbound read from peer id 0 of len 254
2021-08-31 23:22:14 +00:00
// 0020 7500000000000000000000000000000000000000000000000000000000000000 ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 000000000000c350 0000000000000000 0000000000000162 ffffffffffffffff 0000000000000222 0000000000000000 000000fd 0006 01e3 030000000000000000000000000000000000000000000000000000000000000001 030000000000000000000000000000000000000000000000000000000000000002 030000000000000000000000000000000000000000000000000000000000000003 030000000000000000000000000000000000000000000000000000000000000004 - beginning of open_channel message
2018-09-14 13:47:46 -04:00
// 030053 - inbound read from peer id 0 of len 83
2021-02-18 20:04:47 -05:00
// 030000000000000000000000000000000000000000000000000000000000000005 020900000000000000000000000000000000000000000000000000000000000000 01 03000000000000000000000000000000 - rest of open_channel and mac
2018-08-14 09:55:38 -04:00
//
2021-11-10 01:36:26 +00:00
// 00fd00fd - Two feerate requests (all returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2018-08-14 09:55:38 -04:00
// - client should now respond with accept_channel (CHECK 1: type 33 to peer 03000000)
//
// 030012 - inbound read from peer id 0 of len 18
// 0084 03000000000000000000000000000000 - message header indicating message length 132
// 030094 - inbound read from peer id 0 of len 148
2021-02-18 20:04:47 -05:00
// 0022 ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 3d00000000000000000000000000000000000000000000000000000000000000 0000 00000000000000000000000000000000000000000000000000000000000000210100000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - funding_created and mac
2018-08-14 09:55:38 -04:00
// - client should now respond with funding_signed (CHECK 2: type 35 to peer 03000000)
//
// 0c005e - connect a block with one transaction of len 94
// 020000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0150c3000000000000220020ae0000000000000000000000000000000000000000000000000000000000000000000000 - the funding transaction
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
2022-05-30 14:39:04 -07:00
// - by now client should have sent a channel_ready (CHECK 3: SendChannelReady to 03000000 for chan 3d000000)
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0043 03000000000000000000000000000000 - message header indicating message length 67
// 030053 - inbound read from peer id 0 of len 83
2022-05-30 14:39:04 -07:00
// 0024 3d00000000000000000000000000000000000000000000000000000000000000 020800000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - channel_ready and mac
2018-08-14 09:55:38 -04:00
//
// 01 - new inbound connection with id 1
// 030132 - inbound read from peer id 1 of len 50
2021-02-18 20:04:47 -05:00
// 0003000000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000 - inbound noise act 1
2018-08-14 09:55:38 -04:00
// 030142 - inbound read from peer id 1 of len 66
// 000302000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000003000000000000000000000000000000 - inbound noise act 3
//
// 030112 - inbound read from peer id 1 of len 18
2020-05-02 22:00:08 -04:00
// 000a 01000000000000000000000000000000 - message header indicating message length 10
// 03011a - inbound read from peer id 1 of len 26
// 0010 00022000 00022000 01000000000000000000000000000000 - init message (type 16) with static_remotekey (0x2000) and mac
2018-08-14 09:55:38 -04:00
//
2018-08-23 15:58:59 -04:00
// 05 01 030200000000000000000000000000000000000000000000000000000000000000 00c350 0003e8 - create outbound channel to peer 1 for 50k sat
2021-03-16 18:07:22 -04:00
// 00fd - One feerate requests (all returning min feerate) (gonna be ingested by FuzzEstimator)
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0110 01000000000000000000000000000000 - message header indicating message length 272
// 0301ff - inbound read from peer id 1 of len 255
2021-08-31 23:22:14 +00:00
// 0021 0000000000000000000000000000000000000000000000000000000000000e05 0000000000000162 00000000004c4b40 00000000000003e8 00000000000003e8 00000002 03f0 0005 030000000000000000000000000000000000000000000000000000000000000100 030000000000000000000000000000000000000000000000000000000000000200 030000000000000000000000000000000000000000000000000000000000000300 030000000000000000000000000000000000000000000000000000000000000400 030000000000000000000000000000000000000000000000000000000000000500 02660000000000000000000000000000 - beginning of accept_channel
2018-08-14 09:55:38 -04:00
// 030121 - inbound read from peer id 1 of len 33
// 0000000000000000000000000000000000 01000000000000000000000000000000 - rest of accept_channel and mac
//
// 0a - create the funding transaction (client should send funding_created now)
//
// 030112 - inbound read from peer id 1 of len 18
// 0062 01000000000000000000000000000000 - message header indicating message length 98
// 030172 - inbound read from peer id 1 of len 114
2021-02-18 20:04:47 -05:00
// 0023 3a00000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000007c0001000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - funding_signed message and mac
2018-08-14 09:55:38 -04:00
//
// 0b - broadcast funding transaction
2022-05-30 14:39:04 -07:00
// - by now client should have sent a channel_ready (CHECK 4: SendChannelReady to 03020000 for chan 3f000000)
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0043 01000000000000000000000000000000 - message header indicating message length 67
// 030153 - inbound read from peer id 1 of len 83
2022-05-30 14:39:04 -07:00
// 0024 3a00000000000000000000000000000000000000000000000000000000000000 026700000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - channel_ready and mac
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 05ac 03000000000000000000000000000000 - message header indicating message length 1452
// 0300ff - inbound read from peer id 0 of len 255
2022-10-20 10:44:12 +02:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000000 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 11 020203e8 0401a0 060800000e0000010000 0a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - beginning of update_add_htlc from 0 to 1 via client
2018-08-14 09:55:38 -04:00
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300c1 - inbound read from peer id 0 of len 193
2022-10-20 10:44:12 +02:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ab00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0064 03000000000000000000000000000000 - message header indicating message length 100
// 030074 - inbound read from peer id 0 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000300100000000000000000000000000000000000000000000000000000000000000 0000 03000000000000000000000000000000 - commitment_signed and mac
2018-08-14 09:55:38 -04:00
// - client should now respond with revoke_and_ack and commitment_signed (CHECK 5/6: types 133 and 132 to peer 03000000)
//
// 030012 - inbound read from peer id 0 of len 18
// 0063 03000000000000000000000000000000 - message header indicating message length 99
// 030073 - inbound read from peer id 0 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0900000000000000000000000000000000000000000000000000000000000000 020b00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
2018-08-14 09:55:38 -04:00
//
// 07 - process the now-pending HTLC forward
// - client now sends id 1 update_add_htlc and commitment_signed (CHECK 7: SendHTLCs event for node 03020000 with 1 HTLCs for channel 3f000000)
//
// - we respond with commitment_signed then revoke_and_ack (a weird, but valid, order)
// 030112 - inbound read from peer id 1 of len 18
// 0064 01000000000000000000000000000000 - message header indicating message length 100
// 030174 - inbound read from peer id 1 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3a00000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000006a0001000000000000000000000000000000000000000000000000000000000000 0000 01000000000000000000000000000000 - commitment_signed and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0063 01000000000000000000000000000000 - message header indicating message length 99
// 030173 - inbound read from peer id 1 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3a00000000000000000000000000000000000000000000000000000000000000 6600000000000000000000000000000000000000000000000000000000000000 026400000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - revoke_and_ack and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 004a 01000000000000000000000000000000 - message header indicating message length 74
// 03015a - inbound read from peer id 1 of len 90
2021-02-18 20:04:47 -05:00
// 0082 3a00000000000000000000000000000000000000000000000000000000000000 0000000000000000 ff00888888888888888888888888888888888888888888888888888888888888 01000000000000000000000000000000 - update_fulfill_htlc and mac
2018-08-14 09:55:38 -04:00
// - client should immediately claim the pending HTLC from peer 0 (CHECK 8: SendFulfillHTLCs for node 03000000 with preimage ff00888888 for channel 3d000000)
//
// 030112 - inbound read from peer id 1 of len 18
// 0064 01000000000000000000000000000000 - message header indicating message length 100
// 030174 - inbound read from peer id 1 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3a00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000100001000000000000000000000000000000000000000000000000000000000000 0000 01000000000000000000000000000000 - commitment_signed and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0063 01000000000000000000000000000000 - message header indicating message length 99
// 030173 - inbound read from peer id 1 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3a00000000000000000000000000000000000000000000000000000000000000 6700000000000000000000000000000000000000000000000000000000000000 026500000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - revoke_and_ack and mac
2018-08-14 09:55:38 -04:00
//
// - before responding to the commitment_signed generated above, send a new HTLC
// 030012 - inbound read from peer id 0 of len 18
// 05ac 03000000000000000000000000000000 - message header indicating message length 1452
// 0300ff - inbound read from peer id 0 of len 255
2022-10-20 10:44:12 +02:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000001 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 11 020203e8 0401a0 060800000e0000010000 0a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - beginning of update_add_htlc from 0 to 1 via client
2018-08-14 09:55:38 -04:00
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300c1 - inbound read from peer id 0 of len 193
2022-10-20 10:44:12 +02:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ab00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-08-14 09:55:38 -04:00
//
// - now respond to the update_fulfill_htlc+commitment_signed messages the client sent to peer 0
// 030012 - inbound read from peer id 0 of len 18
// 0063 03000000000000000000000000000000 - message header indicating message length 99
// 030073 - inbound read from peer id 0 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0800000000000000000000000000000000000000000000000000000000000000 020a00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
2018-08-23 14:33:44 -04:00
// - client should now respond with revoke_and_ack and commitment_signed (CHECK 5/6 duplicates)
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0064 03000000000000000000000000000000 - message header indicating message length 100
// 030074 - inbound read from peer id 0 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000c30100000000000000000000000000000000000000000000000000000000000000 0000 03000000000000000000000000000000 - commitment_signed and mac
2018-08-14 09:55:38 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0063 03000000000000000000000000000000 - message header indicating message length 99
// 030073 - inbound read from peer id 0 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0b00000000000000000000000000000000000000000000000000000000000000 020d00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
2018-08-14 09:55:38 -04:00
//
// 07 - process the now-pending HTLC forward
// - client now sends id 1 update_add_htlc and commitment_signed (CHECK 7 duplicate)
// - we respond with revoke_and_ack, then commitment_signed, then update_fail_htlc
//
// 030112 - inbound read from peer id 1 of len 18
// 0064 01000000000000000000000000000000 - message header indicating message length 100
// 030174 - inbound read from peer id 1 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3a00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000390001000000000000000000000000000000000000000000000000000000000000 0000 01000000000000000000000000000000 - commitment_signed and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0063 01000000000000000000000000000000 - message header indicating message length 99
// 030173 - inbound read from peer id 1 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3a00000000000000000000000000000000000000000000000000000000000000 6400000000000000000000000000000000000000000000000000000000000000 027000000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - revoke_and_ack and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 002c 01000000000000000000000000000000 - message header indicating message length 44
// 03013c - inbound read from peer id 1 of len 60
2021-02-18 20:04:47 -05:00
// 0083 3a00000000000000000000000000000000000000000000000000000000000000 0000000000000001 0000 01000000000000000000000000000000 - update_fail_htlc and mac
2018-08-14 09:55:38 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0064 01000000000000000000000000000000 - message header indicating message length 100
// 030174 - inbound read from peer id 1 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3a00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000390001000000000000000000000000000000000000000000000000000000000000 0000 01000000000000000000000000000000 - commitment_signed and mac
2018-09-14 13:47:46 -04:00
//
// 030112 - inbound read from peer id 1 of len 18
// 0063 01000000000000000000000000000000 - message header indicating message length 99
// 030173 - inbound read from peer id 1 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3a00000000000000000000000000000000000000000000000000000000000000 6500000000000000000000000000000000000000000000000000000000000000 027100000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - revoke_and_ack and mac
2018-09-14 13:47:46 -04:00
//
2018-12-20 22:50:25 -05:00
// 07 - process the now-pending HTLC forward
2018-09-14 13:47:46 -04:00
// - client now sends id 0 update_fail_htlc and commitment_signed (CHECK 9)
// - now respond to the update_fail_htlc+commitment_signed messages the client sent to peer 0
2018-12-20 22:50:25 -05:00
//
2018-09-14 13:47:46 -04:00
// 030012 - inbound read from peer id 0 of len 18
// 0063 03000000000000000000000000000000 - message header indicating message length 99
// 030073 - inbound read from peer id 0 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0a00000000000000000000000000000000000000000000000000000000000000 020c00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
2018-09-14 13:47:46 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 0064 03000000000000000000000000000000 - message header indicating message length 100
// 030074 - inbound read from peer id 0 of len 116
2021-02-18 20:04:47 -05:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000320100000000000000000000000000000000000000000000000000000000000000 0000 03000000000000000000000000000000 - commitment_signed and mac
2018-09-14 13:47:46 -04:00
// - client should now respond with revoke_and_ack (CHECK 5 duplicate)
//
// 030012 - inbound read from peer id 0 of len 18
// 05ac 03000000000000000000000000000000 - message header indicating message length 1452
// 0300ff - inbound read from peer id 0 of len 255
2022-10-20 10:44:12 +02:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000002 00000000000b0838 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 12 02030927c0 0401a0 060800000e0000010000 0a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - beginning of update_add_htlc from 0 to 1 via client
2018-09-14 13:47:46 -04:00
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300ff - inbound read from peer id 0 of len 255
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
// 0300c1 - inbound read from peer id 0 of len 193
2022-10-20 10:44:12 +02:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 5300000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-09-14 13:47:46 -04:00
//
// 030012 - inbound read from peer id 0 of len 18
// 00a4 03000000000000000000000000000000 - message header indicating message length 164
// 0300b4 - inbound read from peer id 0 of len 180
2021-05-05 02:04:58 +00:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000750100000000000000000000000000000000000000000000000000000000000000 0001 00000000000000000000000000000000000000000000000000000000000000670500000000000000000000000000000000000000000000000000000000000006 03000000000000000000000000000000 - commitment_signed and mac
2018-09-14 13:47:46 -04:00
// - client should now respond with revoke_and_ack and commitment_signed (CHECK 5/6 duplicates)
//
// 030012 - inbound read from peer id 0 of len 18
// 0063 03000000000000000000000000000000 - message header indicating message length 99
// 030073 - inbound read from peer id 0 of len 115
2021-02-18 20:04:47 -05:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0d00000000000000000000000000000000000000000000000000000000000000 020f00000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
2018-09-14 13:47:46 -04:00
//
// 07 - process the now-pending HTLC forward
// - client now sends id 1 update_add_htlc and commitment_signed (CHECK 7 duplicate)
//
// 0c007d - connect a block with one transaction of len 125
2021-05-05 02:04:58 +00:00
// 02000000013a000000000000000000000000000000000000000000000000000000000000000000000000000000800258020000000000002200204b0000000000000000000000000000000000000000000000000000000000000014c0000000000000160014280000000000000000000000000000000000000005000020 - the commitment transaction for channel 3f00000000000000000000000000000000000000000000000000000000000000
2021-07-03 01:13:14 +00:00
//
2018-09-14 13:47:46 -04:00
// 0c005e - connect a block with one transaction of len 94
2021-05-05 02:04:58 +00:00
// 0200000001730000000000000000000000000000000000000000000000000000000000000000000000000000000001a701000000000000220020b20000000000000000000000000000000000000000000000000000000000000000000000 - the HTLC timeout transaction
2019-02-06 20:02:38 -05:00
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
// 0c0000 - connect a block with no transactions
2018-12-20 22:50:25 -05:00
//
// 07 - process the now-pending HTLC forward
2018-12-09 12:17:27 -05:00
// - client now fails the HTLC backwards as it was unable to extract the payment preimage (CHECK 9 duplicate and CHECK 10)
2018-08-14 09:55:38 -04:00
2018-08-23 14:33:44 -04:00
let logger = Arc ::new ( TrackingLogger { lines : Mutex ::new ( HashMap ::new ( ) ) } ) ;
2022-10-20 10:44:12 +02:00
super ::do_test ( & ::hex ::decode ( " 01000000000000000000000000000000000000000000000000000000000000000000000001000300000000000000000000000000000000000000000000000000000000000000020300320003000000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000030012000a0300000000000000000000000000000003001a00100002200000022000030000000000000000000000000000000300120141030000000000000000000000000000000300fe00207500000000000000000000000000000000000000000000000000000000000000ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679000000000000c35000000000000000000000000000000162ffffffffffffffff00000000000002220000000000000000000000fd000601e3030000000000000000000000000000000000000000000000000000000000000001030000000000000000000000000000000000000000000000000000000000000002030000000000000000000000000000000000000000000000000000000000000003030000000000000000000000000000000000000000000000000000000000000004030053030000000000000000000000000000000000000000000000000000000000000005020900000000000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000fd00fd0300120084030000000000000000000000000000000300940022ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb1819096793d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000c005e020000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0150c3000000000000220020ae00000000000000000000000000000000000000000000000000000000000000000000000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c000003001200430300000000000000000000000000000003005300243d0000000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000010301320003000000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000030142000302000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000003000000000000000000000000000000030112000a0100000000000000000000000000000003011a0010000220000002200001000000000000000000000000000000050103020000000000000000000000000000000000000000000000000000000000000000c3500003e800fd0301120110010000000000000000000000000000000301ff00210000000000000000000000000000000000000000000000000000000000000e05000000000000016200000000004c4b4000000000000003e800000000000003e80000000203f00005030000000000000000000000000000000000000000000000000000000000000100030000000000000000000000000000000000000000000000000000000000000200030000000000000000000000000000000000000000000000000000000000000300030000000000000000000000000000000000000000000000000000000000000400030000000000000000000000000000000000000000000000000000000000000500026600000000000000000000000000000301210000000000000000000000000000000000010000000000000000000000000000000a03011200620100000000000000000000000000000003017200233a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c0001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000b03011200430100000000000000000000000000000003015300243a000000000000000000000000000000000000000000000000000000000000000267000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000003001205ac030000000000000000000000000000000300ff00803d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e80ff00000000000000000000000000000000000000000000000000000000000000000003f00003000000000000000000000000000000000000000000000000000000000000055511020203e80401a0060800000e00000100000a00000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0300ffffffffffffffffffffffffffffffffffff
2018-08-23 14:33:44 -04:00
let log_entries = logger . lines . lock ( ) . unwrap ( ) ;
2021-02-18 20:04:47 -05:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendAcceptChannel event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 for channel ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 1
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendFundingSigned event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 2
2022-05-30 14:39:04 -07:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendChannelReady event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 3
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendChannelReady event in peer_handler for node 030200000000000000000000000000000000000000000000000000000000000000 for channel 3a00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 4
2021-02-18 20:04:47 -05:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendRevokeAndACK event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 4 ) ) ; // 5
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 with 0 adds, 0 fulfills, 0 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 3 ) ) ; // 6
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030200000000000000000000000000000000000000000000000000000000000000 with 1 adds, 0 fulfills, 0 fails for channel 3a00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 3 ) ) ; // 7
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 with 0 adds, 1 fulfills, 0 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 8
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000002 with 0 adds, 0 fulfills, 1 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 2 ) ) ; // 9
2021-05-05 02:04:58 +00:00
assert_eq! ( log_entries . get ( & ( " lightning::chain::channelmonitor " . to_string ( ) , " Input spending counterparty commitment tx (0000000000000000000000000000000000000000000000000000000000000073:0) in 0000000000000000000000000000000000000000000000000000000000000067 resolves outbound HTLC with payment hash ff00000000000000000000000000000000000000000000000000000000000000 with timeout " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 10
2018-03-19 17:45:58 -04:00
}
}