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.
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 ;
2020-11-29 15:20:35 -05:00
use bitcoin ::blockdata ::constants ::genesis_block ;
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
2020-07-17 22:08:34 -07:00
use lightning ::chain ;
2021-07-03 01:58:30 +00:00
use lightning ::chain ::{ BestBlock , 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 ;
2021-11-29 12:50:47 -05:00
use lightning ::chain ::keysinterface ::{ InMemorySigner , KeyMaterial , KeysInterface } ;
2021-04-28 17:28:10 -04:00
use lightning ::ln ::{ PaymentHash , PaymentPreimage , PaymentSecret } ;
2021-07-03 01:58:30 +00:00
use lightning ::ln ::channelmanager ::{ ChainParameters , ChannelManager } ;
2021-08-05 14:51:17 +09:00
use lightning ::ln ::peer_handler ::{ MessageHandler , PeerManager , SocketDescriptor , IgnoringMessageHandler } ;
2020-11-25 12:23:47 -05:00
use lightning ::ln ::msgs ::DecodeError ;
2021-07-26 12:31:24 -04:00
use lightning ::ln ::script ::ShutdownScript ;
2021-08-12 16:02:42 -05:00
use lightning ::routing ::network_graph ::{ NetGraphMsgHandler , NetworkGraph } ;
2021-10-25 18:48:52 -05:00
use lightning ::routing ::router ::{ find_route , Payee , RouteParameters } ;
2021-11-12 15:52:59 +00:00
use lightning ::routing ::scoring ::Scorer ;
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 ;
2020-11-25 12:23:47 -05:00
use lightning ::util ::ser ::Readable ;
2018-07-25 02:34:51 +00:00
use utils ::test_logger ;
2020-09-14 20:50:04 -04:00
use utils ::test_persister ::TestPersister ;
2018-03-19 17:45:58 -04:00
2020-04-27 16:51:59 +02:00
use bitcoin ::secp256k1 ::key ::{ PublicKey , SecretKey } ;
2021-04-29 12:19:05 -04:00
use bitcoin ::secp256k1 ::recovery ::RecoverableSignature ;
2020-04-27 16:51:59 +02:00
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 } ;
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 } ;
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
}
}
}
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
}
2020-05-12 13:31:20 -04:00
type ChannelMan = ChannelManager <
2021-02-16 16:30:08 -05:00
EnforcingSigner ,
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
Arc < TestBroadcaster > , Arc < KeyProvider > , Arc < FuzzEstimator > , Arc < dyn Logger > > ;
2021-11-01 13:14:14 -05:00
type PeerMan < ' a > = PeerManager < Peer < ' a > , Arc < ChannelMan > , Arc < NetGraphMsgHandler < Arc < NetworkGraph > , Arc < dyn chain ::Access > , Arc < dyn Logger > > > , Arc < dyn Logger > , IgnoringMessageHandler > ;
2020-05-12 13:31:20 -04:00
2019-12-20 14:53:16 -05:00
struct MoneyLossDetector < ' a > {
2020-05-12 13:31:20 -04:00
manager : Arc < ChannelMan > ,
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 ] > ,
2020-05-12 13:31:20 -04:00
manager : Arc < ChannelMan > ,
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 ;
2021-03-05 11:02:42 -05:00
let header = BlockHeader { version : 0x20000000 , prev_blockhash : self . header_hashes [ self . height ] . 0 , merkle_root : Default ::default ( ) , time : self . blocks_connected , bits : 42 , nonce : 42 } ;
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 ) {
2021-03-05 11:02:42 -05:00
let header = BlockHeader { version : 0x20000000 , prev_blockhash : self . header_hashes [ self . height - 1 ] . 0 , merkle_root : Default ::default ( ) , 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)
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 ,
2021-11-29 12:50:47 -05:00
inbound_payment_key : KeyMaterial ,
2019-07-29 12:40:43 -04:00
counter : AtomicU64 ,
2018-10-26 11:40:01 -04:00
}
impl KeysInterface for KeyProvider {
2021-02-16 16:30:08 -05:00
type Signer = EnforcingSigner ;
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 ( )
}
2021-11-29 12:50:47 -05:00
fn get_inbound_payment_key_material ( & self ) -> KeyMaterial {
self . inbound_payment_key . clone ( )
}
2018-10-26 11:40:01 -04:00
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
}
2021-07-26 12:31:24 -04:00
fn get_shutdown_scriptpubkey ( & self ) -> ShutdownScript {
2018-10-26 11:40:01 -04:00
let secp_ctx = Secp256k1 ::signing_only ( ) ;
2021-07-26 12:31:24 -04:00
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 )
2018-10-26 11:40:01 -04:00
}
2021-02-16 16:30:08 -05:00
fn get_channel_signer ( & self , inbound : bool , channel_value_satoshis : u64 ) -> EnforcingSigner {
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 ( ) ;
2021-02-16 16:30:08 -05:00
EnforcingSigner ::new ( if inbound {
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 ,
2021-02-06 13:11:23 -05:00
[ 0 ; 32 ]
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 ,
2021-02-06 13:11:23 -05:00
[ 0 ; 32 ]
2020-02-04 09:15:59 -08:00
)
2019-12-06 14:08:34 -05:00
} )
2018-10-26 11:40:01 -04:00
}
2018-11-26 20:10:01 +09:00
2020-08-23 17:06:33 -04:00
fn get_secure_random_bytes ( & 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
}
2020-11-25 12:23:47 -05:00
2021-08-17 13:04:29 +02:00
fn read_chan_signer ( & self , mut data : & [ u8 ] ) -> Result < EnforcingSigner , DecodeError > {
let inner : InMemorySigner = Readable ::read ( & mut data ) ? ;
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
fn sign_invoice ( & self , _invoice_preimage : Vec < u8 > ) -> Result < RecoverableSignature , ( ) > {
unreachable! ( )
}
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 ,
} ;
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 ( ) ,
Arc ::new ( TestPersister { update_ret : Mutex ::new ( Ok ( ( ) ) ) } ) ) ) ;
2018-03-19 17:45:58 -04:00
2021-11-29 12:50:47 -05: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 ) } ) ;
2019-10-18 14:19:49 +01:00
let mut config = UserConfig ::default ( ) ;
Make the base fee configurable in ChannelConfig
Currently the base fee we apply is always the expected cost to
claim an HTLC on-chain in case of closure. This results in
significantly higher than market rate fees [1], and doesn't really
match the actual forwarding trust model anyway - as long as
channel counterparties are honest, our HTLCs shouldn't end up
on-chain no matter what the HTLC sender/recipient do.
While some users may wish to use a feerate that implies they will
not lose funds even if they go to chain (assuming no flood-and-loot
style attacks), they should do so by calculating fees themselves;
since they're already charging well above market-rate,
over-estimating some won't have a large impact.
Worse, we current re-calculate fees at forward-time, not based on
the fee we set in the channel_update. This means that the fees
others expect to pay us (and which they calculate their route based
on), is not what we actually want to charge, and that any attempt
to forward through us is inherently race-y.
This commit adds a configuration knob to set the base fee
explicitly, defaulting to 1 sat, which appears to be market-rate
today.
[1] Note that due to an msat-vs-sat bug we currently actually
charge 1000x *less* than the calculated cost.
2021-06-21 20:20:29 +00:00
config . channel_options . forwarding_fee_proportional_millionths = slice_to_be32 ( get_slice! ( 4 ) ) ;
2018-10-31 14:51:39 -04:00
config . channel_options . 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
} ;
let channelmanager = Arc ::new ( ChannelManager ::new ( fee_est . clone ( ) , monitor . clone ( ) , broadcast . clone ( ) , Arc ::clone ( & logger ) , keys_manager . clone ( ) , config , params ) ) ;
2020-05-02 15:05:04 -04:00
let our_id = PublicKey ::from_secret_key ( & Secp256k1 ::signing_only ( ) , & keys_manager . get_node_secret ( ) ) ;
2021-11-01 13:14:14 -05:00
let network_graph = Arc ::new ( NetworkGraph ::new ( genesis_block ( network ) . block_hash ( ) ) ) ;
2021-11-01 15:01:39 -05:00
let net_graph_msg_handler = Arc ::new ( NetGraphMsgHandler ::new ( Arc ::clone ( & network_graph ) , None , Arc ::clone ( & logger ) ) ) ;
2021-10-27 10:39:22 -05:00
let scorer = Scorer ::with_fixed_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 ( ) ,
2020-05-02 15:05:04 -04:00
route_handler : net_graph_msg_handler . clone ( ) ,
2021-08-05 14:51:17 +09: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 ) , IgnoringMessageHandler { } ) ) ;
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 ;
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 ( ) ;
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 = > {
2021-10-25 18:48:52 -05:00
let final_value_msat = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2021-10-31 18:20:27 +00:00
let payee = Payee ::from_node_id ( get_pubkey! ( ) ) ;
2021-10-25 18:48:52 -05:00
let params = RouteParameters {
payee ,
final_value_msat ,
final_cltv_expiry_delta : 42 ,
} ;
2021-11-01 15:01:39 -05:00
let route = match find_route ( & our_id , & params , & network_graph , None , Arc ::clone ( & logger ) , & scorer ) {
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 = > {
2021-10-25 18:48:52 -05:00
let final_value_msat = slice_to_be24 ( get_slice! ( 3 ) ) as u64 ;
2021-10-31 18:20:27 +00:00
let payee = Payee ::from_node_id ( get_pubkey! ( ) ) ;
2021-10-25 18:48:52 -05:00
let params = RouteParameters {
payee ,
final_value_msat ,
final_cltv_expiry_delta : 42 ,
} ;
2021-11-01 15:01:39 -05:00
let mut route = match find_route ( & our_id , & params , & network_graph , None , Arc ::clone ( & logger ) , & scorer ) {
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 = > {
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.
2021-11-12 14:48:39 -05:00
let _ = channelmanager . create_inbound_payment_for_hash ( payment_hash , None , 1 ) ;
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 ( .. ) {
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 ) {
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 ;
}
} ;
2021-04-21 00:35:23 +00:00
if let Err ( e ) = channelmanager . funding_transaction_generated ( & funding_generation . 0 , tx . clone ( ) ) {
// 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 {
assert_eq! ( err , " No such channel " ) ;
} 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 ) } ) ;
2021-01-14 17:05:38 +01:00
channelmanager . force_close_channel ( & channels [ channel_id ] . channel_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 {
Event ::FundingGenerationReady { temporary_channel_id , channel_value_satoshis , output_script , .. } = > {
pending_funding_generation . push ( ( temporary_channel_id , channel_value_satoshis , output_script ) ) ;
} ,
2021-04-26 23:05:56 +00:00
Event ::PaymentReceived { 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
// - 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
2021-02-18 20:04:47 -05:00
// 0024 3d00000000000000000000000000000000000000000000000000000000000000 020800000000000000000000000000000000000000000000000000000000000000 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
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
// - 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
2021-02-18 20:04:47 -05:00
// 0024 3a00000000000000000000000000000000000000000000000000000000000000 026700000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000000 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e000001000000000000000003e8000000a00000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 4e00000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000001 0000000000003e80 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e000001000000000000000003e8000000a00000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 4e00000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// 0080 3d00000000000000000000000000000000000000000000000000000000000000 0000000000000002 00000000000b0838 ff00000000000000000000000000000000000000000000000000000000000000 000003f0 00 030000000000000000000000000000000000000000000000000000000000000555 0000000e000001000000000000000927c0000000a00000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000 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
2021-05-05 02:04:58 +00:00
// ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 4b00000000000000000000000000000000000000000000000000000000000000 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 ( ) ) } ) ;
2021-11-10 01:36:26 +00:00
super ::do_test ( & ::hex ::decode ( " 01000000000000000000000000000000000000000000000000000000000000000000000001000300000000000000000000000000000000000000000000000000000000000000020300320003000000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000030012000a0300000000000000000000000000000003001a00100002200000022000030000000000000000000000000000000300120141030000000000000000000000000000000300fe00207500000000000000000000000000000000000000000000000000000000000000ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb181909679000000000000c35000000000000000000000000000000162ffffffffffffffff00000000000002220000000000000000000000fd000601e3030000000000000000000000000000000000000000000000000000000000000001030000000000000000000000000000000000000000000000000000000000000002030000000000000000000000000000000000000000000000000000000000000003030000000000000000000000000000000000000000000000000000000000000004030053030000000000000000000000000000000000000000000000000000000000000005020900000000000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000fd00fd0300120084030000000000000000000000000000000300940022ff4f00f805273c1b203bb5ebf8436bfde57b3be8c2f5e95d9491dbb1819096793d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000c005e020000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0150c3000000000000220020ae00000000000000000000000000000000000000000000000000000000000000000000000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c00000c000003001200430300000000000000000000000000000003005300243d0000000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000010301320003000000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000030142000302000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000003000000000000000000000000000000030112000a0100000000000000000000000000000003011a0010000220000002200001000000000000000000000000000000050103020000000000000000000000000000000000000000000000000000000000000000c3500003e800fd0301120110010000000000000000000000000000000301ff00210000000000000000000000000000000000000000000000000000000000000e05000000000000016200000000004c4b4000000000000003e800000000000003e80000000203f00005030000000000000000000000000000000000000000000000000000000000000100030000000000000000000000000000000000000000000000000000000000000200030000000000000000000000000000000000000000000000000000000000000300030000000000000000000000000000000000000000000000000000000000000400030000000000000000000000000000000000000000000000000000000000000500026600000000000000000000000000000301210000000000000000000000000000000000010000000000000000000000000000000a03011200620100000000000000000000000000000003017200233a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c0001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000b03011200430100000000000000000000000000000003015300243a000000000000000000000000000000000000000000000000000000000000000267000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000003001205ac030000000000000000000000000000000300ff00803d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e80ff00000000000000000000000000000000000000000000000000000000000000000003f0000300000000000000000000000000000000000000000000000000000000000005550000000e000001000000000000000003e8000000a00000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0300ffffffffffffffffffffffffffffffffffff
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
assert_eq! ( log_entries . get ( & ( " lightning::ln::peer_handler " . to_string ( ) , " Handling SendFundingLocked 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 SendFundingLocked event in peer_handler for node 030200000000000000000000000000000000000000000000000000000000000000 for channel 3a00000000000000000000000000000000000000000000000000000000000000 " . to_string ( ) ) ) , Some ( & 1 ) ) ; // 4
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
}
}