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.
2018-03-27 11:34:22 -04:00
use bitcoin ::blockdata ::block ::BlockHeader ;
use bitcoin ::blockdata ::transaction ::{ Transaction , TxOut } ;
2018-10-26 11:40:01 -04:00
use bitcoin ::blockdata ::script ::{ Builder , Script } ;
use bitcoin ::blockdata ::opcodes ;
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 ;
2019-03-04 18:02:02 +01:00
use bitcoin ::util ::hash ::BitcoinHash ;
2018-03-19 17:45:58 -04:00
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 ;
2020-04-27 18:13:27 +02:00
use bitcoin ::hash_types ::{ Txid , BlockHash , WPubkeyHash } ;
2018-03-27 11:34:22 -04:00
use lightning ::chain ::chaininterface ::{ BroadcasterInterface , ConfirmationTarget , ChainListener , FeeEstimator , ChainWatchInterfaceUtil } ;
2018-06-27 09:11:58 -04:00
use lightning ::chain ::transaction ::OutPoint ;
2019-11-26 16:46:33 -05:00
use lightning ::chain ::keysinterface ::{ InMemoryChannelKeys , KeysInterface } ;
2018-04-24 00:19:52 -04:00
use lightning ::ln ::channelmonitor ;
2020-01-02 01:23:48 -05:00
use lightning ::ln ::channelmanager ::{ ChannelManager , PaymentHash , PaymentPreimage , PaymentSecret } ;
2018-03-19 17:45:58 -04:00
use lightning ::ln ::peer_handler ::{ MessageHandler , PeerManager , SocketDescriptor } ;
2020-05-02 15:05:04 -04:00
use lightning ::routing ::router ::get_route ;
use lightning ::routing ::network_graph ::NetGraphMsgHandler ;
2018-03-27 11:34:22 -04:00
use lightning ::util ::events ::{ EventsProvider , Event } ;
2019-12-06 14:08:34 -05:00
use lightning ::util ::enforcing_trait_impls ::EnforcingChannelKeys ;
2018-07-25 02:34:51 +00:00
use lightning ::util ::logger ::Logger ;
2018-10-31 14:51:39 -04:00
use lightning ::util ::config ::UserConfig ;
2018-07-25 02:34:51 +00:00
use utils ::test_logger ;
2018-03-19 17:45:58 -04:00
2020-04-27 16:51:59 +02:00
use bitcoin ::secp256k1 ::key ::{ PublicKey , SecretKey } ;
use bitcoin ::secp256k1 ::Secp256k1 ;
2018-03-19 17:45:58 -04:00
2018-07-23 01:06:45 +00:00
use std ::cell ::RefCell ;
2018-10-29 14:24:21 -04:00
use std ::collections ::{ HashMap , hash_map } ;
2018-08-17 17:38:43 -04:00
use std ::cmp ;
2018-03-19 17:45:58 -04:00
use std ::sync ::Arc ;
2019-07-29 12:40:43 -04:00
use std ::sync ::atomic ::{ AtomicU64 , AtomicUsize , Ordering } ;
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 {
2018-07-24 20:34:56 -04:00
fn get_est_sat_per_1000_weight ( & self , _ : ConfirmationTarget ) -> u64 {
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 ) {
2018-08-17 17:38:43 -04:00
Some ( slice ) = > cmp ::max ( slice_to_be16 ( slice ) as u64 , 253 ) ,
2020-03-16 22:05:57 -04:00
None = > 253
2018-03-19 17:45:58 -04:00
}
}
}
2018-03-26 16:48:18 -04:00
struct TestBroadcaster { }
impl BroadcasterInterface for TestBroadcaster {
fn broadcast_transaction ( & self , _tx : & Transaction ) { }
}
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
}
2019-12-20 14:53:16 -05:00
struct MoneyLossDetector < ' a > {
2020-02-27 11:33:03 -05:00
manager : Arc < ChannelManager < EnforcingChannelKeys , Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > , Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < FuzzEstimator > > > ,
monitor : Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > ,
handler : PeerManager < Peer < ' a > , Arc < ChannelManager < EnforcingChannelKeys , Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > , Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < FuzzEstimator > > > > ,
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 > ,
header_hashes : Vec < BlockHash > ,
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 ] > ,
2020-02-27 11:33:03 -05:00
manager : Arc < ChannelManager < EnforcingChannelKeys , Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > , Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < FuzzEstimator > > > ,
monitor : Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > ,
handler : PeerManager < Peer < ' a > , Arc < ChannelManager < EnforcingChannelKeys , Arc < channelmonitor ::SimpleManyChannelMonitor < OutPoint , EnforcingChannelKeys , Arc < TestBroadcaster > , Arc < FuzzEstimator > > > , Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < FuzzEstimator > > > > ) -> 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 ( ) ,
2018-08-17 17:38:43 -04:00
header_hashes : vec ! [ Default ::default ( ) ] ,
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 ] ) {
let mut txn = Vec ::with_capacity ( all_txn . len ( ) ) ;
let mut txn_idxs = Vec ::with_capacity ( all_txn . len ( ) ) ;
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 ) ;
txn . push ( tx ) ;
txn_idxs . push ( idx as u32 + 1 ) ;
} ,
_ = > { } ,
}
}
let header = BlockHeader { version : 0x20000000 , prev_blockhash : self . header_hashes [ self . height ] , merkle_root : Default ::default ( ) , time : self . blocks_connected , bits : 42 , nonce : 42 } ;
2018-08-17 17:38:43 -04:00
self . height + = 1 ;
2018-10-29 14:24:21 -04:00
self . blocks_connected + = 1 ;
self . manager . block_connected ( & header , self . height as u32 , & txn [ .. ] , & txn_idxs [ .. ] ) ;
( * self . monitor ) . block_connected ( & header , self . height as u32 , & txn [ .. ] , & txn_idxs [ .. ] ) ;
2018-08-17 17:38:43 -04:00
if self . header_hashes . len ( ) > self . height {
self . header_hashes [ self . height ] = header . bitcoin_hash ( ) ;
} else {
assert_eq! ( self . header_hashes . len ( ) , self . height ) ;
self . header_hashes . push ( header . bitcoin_hash ( ) ) ;
}
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 ) {
let header = BlockHeader { version : 0x20000000 , prev_blockhash : self . header_hashes [ self . height ] , merkle_root : Default ::default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
2019-02-04 21:21:11 -05:00
self . manager . block_disconnected ( & header , self . height as u32 ) ;
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)
self . manager . force_close_all_channels ( ) ;
}
2018-08-17 17:38:43 -04:00
}
}
2018-10-26 11:40:01 -04:00
struct KeyProvider {
node_secret : SecretKey ,
2019-07-29 12:40:43 -04:00
counter : AtomicU64 ,
2018-10-26 11:40:01 -04:00
}
impl KeysInterface for KeyProvider {
2019-12-06 14:08:34 -05:00
type ChanKeySigner = EnforcingChannelKeys ;
2019-11-26 16:46:33 -05:00
2018-10-26 11:40:01 -04:00
fn get_node_secret ( & self ) -> SecretKey {
self . node_secret . clone ( )
}
fn get_destination_script ( & self ) -> Script {
let secp_ctx = Secp256k1 ::signing_only ( ) ;
2019-01-16 15:45:05 -05:00
let channel_monitor_claim_key = SecretKey ::from_slice ( & hex ::decode ( " 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff " ) . unwrap ( ) [ .. ] ) . unwrap ( ) ;
2020-04-27 18:13:27 +02:00
let our_channel_monitor_claim_key_hash = WPubkeyHash ::hash ( & PublicKey ::from_secret_key ( & secp_ctx , & channel_monitor_claim_key ) . serialize ( ) ) ;
2019-01-16 15:45:05 -05:00
Builder ::new ( ) . push_opcode ( opcodes ::all ::OP_PUSHBYTES_0 ) . push_slice ( & our_channel_monitor_claim_key_hash [ .. ] ) . into_script ( )
2018-10-26 11:40:01 -04:00
}
fn get_shutdown_pubkey ( & self ) -> PublicKey {
let secp_ctx = Secp256k1 ::signing_only ( ) ;
2019-01-16 15:45:05 -05:00
PublicKey ::from_secret_key ( & 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 , 0 , 0 ] ) . unwrap ( ) )
2018-10-26 11:40:01 -04:00
}
2020-01-23 13:33:31 -08:00
fn get_channel_keys ( & self , inbound : bool , channel_value_satoshis : u64 ) -> EnforcingChannelKeys {
2019-07-29 12:40:43 -04:00
let ctr = self . counter . fetch_add ( 1 , Ordering ::Relaxed ) as u8 ;
2020-02-04 09:15:59 -08:00
let secp_ctx = Secp256k1 ::signing_only ( ) ;
2019-12-06 14:08:34 -05:00
EnforcingChannelKeys ::new ( if inbound {
2020-02-04 09:15:59 -08:00
InMemoryChannelKeys ::new (
& 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 ,
)
2018-10-26 11:40:01 -04:00
} else {
2020-02-04 09:15:59 -08:00
InMemoryChannelKeys ::new (
& 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 ,
)
2019-12-06 14:08:34 -05:00
} )
2018-10-26 11:40:01 -04:00
}
2018-11-26 20:10:01 +09:00
2019-11-25 16:12:45 -05:00
fn get_onion_rand ( & self ) -> ( SecretKey , [ u8 ; 32 ] ) {
2019-07-29 12:40:43 -04:00
let ctr = self . counter . fetch_add ( 1 , Ordering ::Relaxed ) as u8 ;
2019-11-25 16:12:45 -05:00
( 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 , 13 , ctr ] ) . unwrap ( ) ,
[ 0 ; 32 ] )
2018-11-26 20:10:01 +09:00
}
2018-11-30 11:51:37 +02:00
fn get_channel_id ( & self ) -> [ u8 ; 32 ] {
2019-07-18 22:17:36 -04:00
let ctr = self . counter . fetch_add ( 1 , Ordering ::Relaxed ) ;
2019-07-29 12:40:43 -04:00
[ 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 ]
2018-11-30 11:51:37 +02:00
}
2018-10-26 11:40:01 -04: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 ( ) ,
} ) ;
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 ,
} ;
2018-08-30 01:37:37 +00:00
let watch = Arc ::new ( ChainWatchInterfaceUtil ::new ( Network ::Bitcoin , Arc ::clone ( & logger ) ) ) ;
2018-03-26 16:48:18 -04:00
let broadcast = Arc ::new ( TestBroadcaster { } ) ;
2020-01-16 13:26:38 -05:00
let monitor = Arc ::new ( channelmonitor ::SimpleManyChannelMonitor ::new ( watch . clone ( ) , broadcast . clone ( ) , Arc ::clone ( & logger ) , fee_est . clone ( ) ) ) ;
2018-03-19 17:45:58 -04:00
2019-07-29 12:40:43 -04:00
let keys_manager = Arc ::new ( KeyProvider { node_secret : our_network_key . clone ( ) , counter : AtomicU64 ::new ( 0 ) } ) ;
2019-10-18 14:19:49 +01:00
let mut config = UserConfig ::default ( ) ;
2018-10-31 14:51:39 -04:00
config . channel_options . fee_proportional_millionths = slice_to_be32 ( get_slice! ( 4 ) ) ;
config . channel_options . announced_channel = get_slice! ( 1 ) [ 0 ] ! = 0 ;
2019-03-26 12:16:20 -07:00
config . peer_channel_config_limits . min_dust_limit_satoshis = 0 ;
2020-01-16 13:54:38 -05:00
let channelmanager = Arc ::new ( ChannelManager ::new ( Network ::Bitcoin , fee_est . clone ( ) , monitor . clone ( ) , broadcast . clone ( ) , Arc ::clone ( & logger ) , keys_manager . clone ( ) , config , 0 ) . unwrap ( ) ) ;
2020-05-02 15:05:04 -04:00
let our_id = PublicKey ::from_secret_key ( & Secp256k1 ::signing_only ( ) , & keys_manager . get_node_secret ( ) ) ;
let net_graph_msg_handler = Arc ::new ( NetGraphMsgHandler ::new ( watch . clone ( ) , Arc ::clone ( & logger ) ) ) ;
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 ( ) ,
2020-05-02 15:05:04 -04:00
route_handler : net_graph_msg_handler . clone ( ) ,
2019-07-18 22:17:36 -04:00
} , our_network_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 , 15 , 0 ] , Arc ::clone ( & logger ) ) ) ;
2018-03-19 17:45:58 -04:00
2018-03-27 11:34:22 -04:00
let mut should_forward = false ;
2020-01-02 01:23:48 -05:00
let mut payments_received : Vec < ( PaymentHash , Option < PaymentSecret > , u64 ) > = Vec ::new ( ) ;
2018-03-27 11:34:22 -04:00
let mut payments_sent = 0 ;
2018-07-22 18:19:28 -04:00
let mut pending_funding_generation : Vec < ( [ u8 ; 32 ] , u64 , Script ) > = Vec ::new ( ) ;
2018-03-27 11:34:22 -04:00
let mut pending_funding_signatures = HashMap ::new ( ) ;
let mut pending_funding_relay = Vec ::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 ; }
2018-08-17 17:38:43 -04:00
loss_detector . handler . new_outbound_connection ( get_pubkey! ( ) , Peer { id : ( new_id - 1 ) as u8 , peers_connected : & peers } ) . 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 ; }
2018-08-17 17:38:43 -04:00
loss_detector . handler . new_inbound_connection ( Peer { id : ( new_id - 1 ) as u8 , peers_connected : & peers } ) . 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 = > {
let value = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2020-05-02 15:05:04 -04:00
let route = match get_route ( & our_id , & net_graph_msg_handler , & get_pubkey! ( ) , None , & Vec ::new ( ) , value , 42 , Arc ::clone ( & logger ) ) {
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 ;
2020-04-07 13:36:58 -04:00
match channelmanager . send_payment ( & route , payment_hash , & None ) {
2018-03-27 11:34:22 -04:00
Ok ( _ ) = > { } ,
Err ( _ ) = > return ,
}
} ,
2020-01-10 17:24:33 -05:00
15 = > {
let value = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2020-05-02 15:05:04 -04:00
let mut route = match get_route ( & our_id , & net_graph_msg_handler , & get_pubkey! ( ) , None , & Vec ::new ( ) , value , 42 , Arc ::clone ( & logger ) ) {
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 ;
match channelmanager . send_payment ( & route , payment_hash , & Some ( payment_secret ) ) {
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 ) } ) ;
if channelmanager . close_channel ( & channels [ channel_id ] . channel_id ) . is_err ( ) { return ; }
} ,
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 = > {
2020-01-02 01:23:48 -05:00
for ( payment , payment_secret , amt ) 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 ] {
2020-01-02 01:23:48 -05:00
channelmanager . fail_htlc_backwards ( & payment , & payment_secret ) ;
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 ] ;
2020-01-02 01:23:48 -05:00
channelmanager . claim_funds ( payment_preimage , & payment_secret , amt ) ;
2018-08-17 11:53:47 -04:00
}
2018-03-27 11:34:22 -04:00
}
} ,
9 = > {
2020-01-02 01:23:48 -05:00
for ( payment , payment_secret , _ ) in payments_received . drain ( .. ) {
channelmanager . fail_htlc_backwards ( & payment , & payment_secret ) ;
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 ( .. ) {
2018-03-27 11:34:22 -04:00
let mut tx = Transaction { version : 0 , lock_time : 0 , input : Vec ::new ( ) , output : vec ! [ TxOut {
value : funding_generation . 1 , script_pubkey : funding_generation . 2 ,
} ] } ;
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 ) {
let outpoint = OutPoint ::new ( funding_txid , 0 ) ;
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 ;
}
} ;
channelmanager . funding_transaction_generated ( & funding_generation . 0 , funding_output . clone ( ) ) ;
pending_funding_signatures . insert ( funding_output , tx ) ;
2018-03-27 11:34:22 -04:00
}
} ,
11 = > {
if ! pending_funding_relay . is_empty ( ) {
2018-10-29 14:24:21 -04:00
loss_detector . connect_block ( & pending_funding_relay [ .. ] ) ;
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
}
}
2018-08-17 17:38:43 -04:00
for tx in pending_funding_relay . drain ( .. ) {
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 ) } ) ;
channelmanager . force_close_channel ( & channels [ channel_id ] . channel_id ) ;
} ,
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 {
Event ::FundingGenerationReady { temporary_channel_id , channel_value_satoshis , output_script , .. } = > {
pending_funding_generation . push ( ( temporary_channel_id , channel_value_satoshis , output_script ) ) ;
} ,
Event ::FundingBroadcastSafe { funding_txo , .. } = > {
pending_funding_relay . push ( pending_funding_signatures . remove ( & funding_txo ) . unwrap ( ) ) ;
} ,
2020-01-02 01:23:48 -05:00
Event ::PaymentReceived { payment_hash , payment_secret , amt } = > {
2019-11-14 18:50:24 -05:00
//TODO: enhance by fetching random amounts from fuzz input?
2020-01-02 01:23:48 -05:00
payments_received . push ( ( payment_hash , payment_secret , amt ) ) ;
2018-03-27 11:34:22 -04:00
} ,
Event ::PaymentSent { .. } = > { } ,
Event ::PaymentFailed { .. } = > { } ,
Event ::PendingHTLCsForwardable { .. } = > {
should_forward = true ;
} ,
2018-10-19 16:25:32 -04:00
Event ::SpendableOutputs { .. } = > { } ,
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).
2019-02-27 20:05:18 -05:00
// Following BOLT 8, lightning message on the wire are: 2-byte encrypted message length +
// 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 !
2018-08-14 09:55:38 -04:00
// 0000000000000000000000000000000000000000000000000000000000000000 - our network key
// 00000000 - fee_proportional_millionths
// 01 - announce_channels_publicly
//
// 00 - new outbound connection with id 0
// 030000000000000000000000000000000000000000000000000000000000000000 - peer's pubkey
// 030032 - inbound read from peer id 0 of len 50
// 00 030000000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - noise act two (0||pubkey||mac)
//
// 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
// 0020 7500000000000000000000000000000000000000000000000000000000000000 ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 000000000000c350 0000000000000000 0000000000000222 ffffffffffffffff 0000000000000222 0000000000000000 000000fd 0006 01e3 030000000000000000000000000000000000000000000000000000000000000001 030000000000000000000000000000000000000000000000000000000000000002 030000000000000000000000000000000000000000000000000000000000000003 030000000000000000000000000000000000000000000000000000000000000004 - beginning of open_channel message
// 030053 - inbound read from peer id 0 of len 83
// 030000000000000000000000000000000000000000000000000000000000000005 030000000000000000000000000000000000000000000000000000000000000000 01 03000000000000000000000000000000 - rest of open_channel and mac
2018-08-14 09:55:38 -04:00
//
2019-02-27 20:05:18 -05:00
// 00fd00fd00fd - Three 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
2020-05-02 22:00:08 -04:00
// 0022 ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 3d00000000000000000000000000000000000000000000000000000000000000 0000 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 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
// - by now client should have sent a funding_locked (CHECK 3: SendFundingLocked to 03000000 for chan 3d000000)
//
// 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
2018-09-14 13:47:46 -04:00
// 0024 3d00000000000000000000000000000000000000000000000000000000000000 030100000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - funding_locked 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
// 0003000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000 - inbound noise act 1
// 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
2019-02-27 20:05:18 -05:00
// 00fd00fd00fd - Three 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
2019-07-18 22:17:36 -04:00
// 0021 0000000000000000000000000000000000000000000000000000000000000e02 000000000000001a 00000000004c4b40 00000000000003e8 00000000000003e8 00000002 03f0 0005 030000000000000000000000000000000000000000000000000000000000000100 030000000000000000000000000000000000000000000000000000000000000200 030000000000000000000000000000000000000000000000000000000000000300 030000000000000000000000000000000000000000000000000000000000000400 030000000000000000000000000000000000000000000000000000000000000500 03000000000000000000000000000000 - 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
2019-07-18 22:17:36 -04:00
// 0023 3900000000000000000000000000000000000000000000000000000000000000 f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 01000000000000000000000000000000 - funding_signed message and mac
2018-08-14 09:55:38 -04:00
//
// 0b - broadcast funding transaction
// - by now client should have sent a funding_locked (CHECK 4: SendFundingLocked to 03020000 for chan 3f000000)
//
// 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
2019-07-18 22:17:36 -04:00
// 0024 3900000000000000000000000000000000000000000000000000000000000000 030100000000000000000000000000000000000000000000000000000000000000 01000000000000000000000000000000 - funding_locked 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
2020-04-09 22:04:30 -04:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000000 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 00000121 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e000001000000000000000003e80000007b0000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - 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
2020-04-09 22:04:30 -04:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 9500000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-08-14 09:55:38 -04:00
//
2019-02-27 20:05:18 -05:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2018-08-23 14:33:44 -04:00
//
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
2020-05-02 22:00:08 -04:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 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
2018-09-14 13:47:46 -04:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 030200000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0084 3900000000000000000000000000000000000000000000000000000000000000 f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 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
2019-07-18 22:17:36 -04:00
// 0085 3900000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 030200000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0082 3900000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0084 3900000000000000000000000000000000000000000000000000000000000000 fd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 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
2019-07-18 22:17:36 -04:00
// 0085 3900000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000 030300000000000000000000000000000000000000000000000000000000000000 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
2020-04-09 22:04:30 -04:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000001 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 00000121 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e000001000000000000000003e80000007b0000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - 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
2020-04-09 22:04:30 -04:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 9500000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-08-14 09:55:38 -04:00
//
2019-02-27 20:05:18 -05:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2018-08-23 14:33:44 -04:00
//
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
2018-09-14 13:47:46 -04:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000 030300000000000000000000000000000000000000000000000000000000000000 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
2020-05-02 22:00:08 -04:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 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
2018-09-14 13:47:46 -04:00
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0200000000000000000000000000000000000000000000000000000000000000 030400000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0084 3900000000000000000000000000000000000000000000000000000000000000 fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 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
2019-07-18 22:17:36 -04:00
// 0085 3900000000000000000000000000000000000000000000000000000000000000 0200000000000000000000000000000000000000000000000000000000000000 030400000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0083 3900000000000000000000000000000000000000000000000000000000000000 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
2019-07-18 22:17:36 -04:00
// 0084 3900000000000000000000000000000000000000000000000000000000000000 fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 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
2019-07-18 22:17:36 -04:00
// 0085 3900000000000000000000000000000000000000000000000000000000000000 0300000000000000000000000000000000000000000000000000000000000000 030500000000000000000000000000000000000000000000000000000000000000 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
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0300000000000000000000000000000000000000000000000000000000000000 030500000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
//
// 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
2020-05-02 22:00:08 -04:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 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
2020-04-09 22:04:30 -04:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000002 00000000000b0838 ff00000000000000000000000000000000000000000000000000000000000000 00000121 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e0000010000000000000003e8000000007b0000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - 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
2020-04-09 22:04:30 -04:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 9500000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - end of update_add_htlc from 0 to 1 via client and mac
2018-09-14 13:47:46 -04:00
//
2019-02-27 20:05:18 -05:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2018-08-14 09:55:38 -04:00
//
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
2020-05-02 22:00:08 -04:00
// 0084 3d00000000000000000000000000000000000000000000000000000000000000 7b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 0001 c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f00000000000000 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
// 0085 3d00000000000000000000000000000000000000000000000000000000000000 0400000000000000000000000000000000000000000000000000000000000000 030600000000000000000000000000000000000000000000000000000000000000 03000000000000000000000000000000 - revoke_and_ack and mac
//
// 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
2020-05-02 22:00:08 -04:00
// 02000000013900000000000000000000000000000000000000000000000000000000000000000000000000000080020001000000000000220020bb000000000000000000000000000000000000000000000000000000000000006cc10000000000001600142b0000000000000000000000000000000000000005000020 - the commitment transaction for channel 3f00000000000000000000000000000000000000000000000000000000000000
2019-07-19 18:24:41 -04:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2019-02-27 20:05:18 -05:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
2018-09-14 13:47:46 -04:00
// 0c005e - connect a block with one transaction of len 94
2020-05-02 22:00:08 -04:00
// 0200000001a100000000000000000000000000000000000000000000000000000000000000000000000000000000014f00000000000000220020f60000000000000000000000000000000000000000000000000000000000000000000000 - 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
2020-04-09 22:04:30 -04:00
// 00fd - A feerate request (returning min feerate, which our open_channel also uses) (gonna be ingested by FuzzEstimator)
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
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 ( ) ) } ) ;
2020-05-02 22:00:08 -04:00
super ::do_test ( & ::hex ::decode ( " 00000000000000000000000000000000000000000000000000000000000000000000000001000300000000000000000000000000000000000000000000000000000000000000000300320003000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000030012000a0300000000000000000000000000000003001a00100002200000022000030000000000000000000000000000000300120141030000000000000000000000000000000300fe00207500000000000000000000000000000000000000000000000000000000000000ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679000000000000c35000000000000000000000000000000222ffffffffffffffff00000000000002220000000000000000000000fd000601e3030000000000000000000000000000000000000000000000000000000000000001030000000000000000000000000000000000000000000000000000000000000002030000000000000000000000000000000000000000000000000000000000000003030000000000000000000000000000000000000000000000000000000000000004030053030000000000000000000000000000000000000000000000000000000000000005030000000000000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000fd00fd00fd0300120084030000000000000000000000000000000300940022ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb1819096793d00000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001030000000000000000000000000000000c005e020000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0150c3000000000000220020ae00000000000000000000000000000000000000000000000000000000000000000000000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c000003001200430300000000000000000000000000000003005300243d0000000000000000000000000000000000000000000000000000000000000003010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000010301320003000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000030142000302000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000003000000000000000000000000000000030112000a0100000000000000000000000000000003011a0010000220000002200001000000000000000000000000000000050103020000000000000000000000000000000000000000000000000000000000000000c3500003e800fd00fd00fd0301120110010000000000000000000000000000000301ff00210000000000000000000000000000000000000000000000000000000000000e02000000000000001a00000000004c4b4000000000000003e800000000000003e80000000203f00005030000000000000000000000000000000000000000000000000000000000000100030000000000000000000000000000000000000000000000000000000000000200030000000000000000000000000000000000000000000000000000000000000300030000000000000000000000000000000000000000000000000000000000000400030000000000000000000000000000000000000000000000000000000000000500030000000000000000000000000000000301210000000000000000000000000000000000010000000000000000000000000000000a03011200620100000000000000000000000000000003017200233900000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000b030112004301000000000000000000000000000000030153002439000000000000000000000000000000000000000000000000000000000000000301000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000003001205ac030000000000000000000000000000000300ff00803d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e80ff0000000000000000000000000000000000000000000000000000000000000000000121000300000000000000000000000000000000000000000000000000000000000005550000000e000001000000000000000003e80000007b0000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0300ffffffffffffffffffffffff
2018-08-23 14:33:44 -04:00
let log_entries = logger . lines . lock ( ) . unwrap ( ) ;
2018-10-19 16:49:12 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendAcceptChannel event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 for channel ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 1
2018-10-19 17:06:40 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendFundingSigned event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 2
2018-08-23 14:33:44 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendFundingLocked event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 3
2019-07-18 22:17:36 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendFundingLocked event in peer_handler for node 030200000000000000000000000000000000000000000000000000000000000000 for channel 3900000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 4
2018-10-20 12:56:42 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendRevokeAndACK event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 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 030000000000000000000000000000000000000000000000000000000000000000 with 0 adds, 0 fulfills, 0 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 3 ) ) ; // 6
2019-07-18 22:17:36 -04:00
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 3900000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 3 ) ) ; // 7
2018-08-22 12:09:11 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 with 0 adds, 1 fulfills, 0 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 8
2018-12-10 22:47:21 -05:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling UpdateHTLCs event in peer_handler for node 030000000000000000000000000000000000000000000000000000000000000000 with 0 adds, 0 fulfills, 1 fails for channel 3d00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 2 ) ) ; // 9
2020-05-02 22:00:08 -04:00
assert_eq! ( log_entries . get ( & ( " lightning::ln::channelmonitor " . to_string ( ) , " Input spending remote commitment tx (00000000000000000000000000000000000000000000000000000000000000a1:0) in 0000000000000000000000000000000000000000000000000000000000000018 resolves outbound HTLC with payment hash ff00000000000000000000000000000000000000000000000000000000000000 with timeout " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 10
2018-03-19 17:45:58 -04:00
}
}