Skip to content

Commit 2f9b8a7

Browse files
author
Antoine Riard
committed
Logging interface
Implement error, warn, info, debug and trace macros, internally calling an instance of Logger, and passing it to every main structures Build-time or client-side filtering. Latter can't be superior than former. Issue #54
1 parent 830343f commit 2f9b8a7

13 files changed

+513
-26
lines changed

Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ build = "build.rs"
1515
# Supports tracking channels with a non-bitcoin chain hashes. Currently enables all kinds of fun DoS attacks.
1616
non_bitcoin_chain_hash_routing = []
1717
fuzztarget = ["secp256k1/fuzztarget", "bitcoin/fuzztarget"]
18+
max_level_error = []
19+
max_level_warn = []
20+
max_level_info = []
21+
max_level_debug = []
22+
max_level_trace = []
1823

1924
[dependencies]
2025
bitcoin = "0.13"

fuzz/fuzz_targets/channel_target.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ use lightning::ln::msgs::{MsgDecodable, ErrorAction};
1414
use lightning::chain::chaininterface::{FeeEstimator, ConfirmationTarget};
1515
use lightning::chain::transaction::OutPoint;
1616
use lightning::util::reset_rng_state;
17+
use lightning::util::test_utils;
18+
use lightning::util::logger::Logger;
1719

1820
use secp256k1::key::{PublicKey, SecretKey};
1921
use secp256k1::Secp256k1;
2022

2123
use std::sync::atomic::{AtomicUsize,Ordering};
24+
use std::sync::Arc;
2225

2326
#[inline]
2427
pub fn slice_to_be16(v: &[u8]) -> u16 {
@@ -101,6 +104,8 @@ pub fn do_test(data: &[u8]) {
101104
input: &input,
102105
};
103106

107+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
108+
104109
macro_rules! get_slice {
105110
($len: expr) => {
106111
match input.get_slice($len as usize) {
@@ -191,7 +196,7 @@ pub fn do_test(data: &[u8]) {
191196
let mut channel = if get_slice!(1)[0] != 0 {
192197
let chan_value = slice_to_be24(get_slice!(3));
193198

194-
let mut chan = Channel::new_outbound(&fee_est, chan_keys!(), their_pubkey, chan_value, get_slice!(1)[0] == 0, slice_to_be64(get_slice!(8)));
199+
let mut chan = Channel::new_outbound(&fee_est, chan_keys!(), their_pubkey, chan_value, get_slice!(1)[0] == 0, slice_to_be64(get_slice!(8)), Arc::clone(&logger));
195200
chan.get_open_channel(Sha256dHash::from(get_slice!(32)), &fee_est).unwrap();
196201
let accept_chan = if get_slice!(1)[0] == 0 {
197202
decode_msg_with_len16!(msgs::AcceptChannel, 270, 1)
@@ -213,7 +218,7 @@ pub fn do_test(data: &[u8]) {
213218
} else {
214219
decode_msg!(msgs::OpenChannel, 2*32+6*8+4+2*2+6*33+1)
215220
};
216-
let mut chan = match Channel::new_from_req(&fee_est, chan_keys!(), their_pubkey, &open_chan, slice_to_be64(get_slice!(8)), false, get_slice!(1)[0] == 0) {
221+
let mut chan = match Channel::new_from_req(&fee_est, chan_keys!(), their_pubkey, &open_chan, slice_to_be64(get_slice!(8)), false, get_slice!(1)[0] == 0, Arc::clone(&logger)) {
217222
Ok(chan) => chan,
218223
Err(_) => return,
219224
};

fuzz/fuzz_targets/full_stack_target.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ use lightning::ln::channelmanager::ChannelManager;
2020
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
2121
use lightning::ln::router::Router;
2222
use lightning::util::events::{EventsProvider,Event};
23+
use lightning::util::test_utils;
2324
use lightning::util::reset_rng_state;
25+
use lightning::util::logger::Logger;
2426

2527
use secp256k1::key::{PublicKey,SecretKey};
2628
use secp256k1::Secp256k1;
@@ -169,18 +171,19 @@ pub fn do_test(data: &[u8]) {
169171
Err(_) => return,
170172
};
171173

174+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
172175
let monitor = Arc::new(TestChannelMonitor{});
173-
let watch = Arc::new(ChainWatchInterfaceUtil::new());
176+
let watch = Arc::new(ChainWatchInterfaceUtil::new(Arc::clone(&logger)));
174177
let broadcast = Arc::new(TestBroadcaster{});
175178

176-
let channelmanager = ChannelManager::new(our_network_key, slice_to_be32(get_slice!(4)), get_slice!(1)[0] != 0, Network::Bitcoin, fee_est.clone(), monitor.clone(), watch.clone(), broadcast.clone()).unwrap();
177-
let router = Arc::new(Router::new(PublicKey::from_secret_key(&secp_ctx, &our_network_key).unwrap()));
179+
let channelmanager = ChannelManager::new(our_network_key, slice_to_be32(get_slice!(4)), get_slice!(1)[0] != 0, Network::Bitcoin, fee_est.clone(), monitor.clone(), watch.clone(), broadcast.clone(), Arc::clone(&logger)).unwrap();
180+
let router = Arc::new(Router::new(PublicKey::from_secret_key(&secp_ctx, &our_network_key).unwrap(), Arc::clone(&logger)));
178181

179182
let peers = RefCell::new([false; 256]);
180183
let handler = PeerManager::new(MessageHandler {
181184
chan_handler: channelmanager.clone(),
182185
route_handler: router.clone(),
183-
}, our_network_key);
186+
}, our_network_key, Arc::clone(&logger));
184187

185188
let mut should_forward = false;
186189
let mut payments_received = Vec::new();

fuzz/fuzz_targets/router_target.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ use lightning::ln::channelmanager::ChannelDetails;
66
use lightning::ln::msgs;
77
use lightning::ln::msgs::{MsgDecodable, RoutingMessageHandler};
88
use lightning::ln::router::{Router, RouteHint};
9+
use lightning::util::test_utils;
910
use lightning::util::reset_rng_state;
11+
use lightning::util::logger::Logger;
1012

1113
use secp256k1::key::PublicKey;
1214
use secp256k1::Secp256k1;
1315

16+
use std::sync::Arc;
17+
1418
#[inline]
1519
pub fn slice_to_be16(v: &[u8]) -> u16 {
1620
((v[0] as u16) << 8*1) |
@@ -98,8 +102,10 @@ pub fn do_test(data: &[u8]) {
98102
}
99103
}
100104

105+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
106+
101107
let our_pubkey = get_pubkey!();
102-
let router = Router::new(our_pubkey.clone());
108+
let router = Router::new(our_pubkey.clone(), Arc::clone(&logger));
103109

104110
loop {
105111
match get_slice!(1)[0] {

src/chain/chaininterface.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use bitcoin::blockdata::block::{Block, BlockHeader};
22
use bitcoin::blockdata::transaction::Transaction;
33
use bitcoin::blockdata::script::Script;
44
use bitcoin::util::hash::Sha256dHash;
5-
use std::sync::{Mutex,Weak,MutexGuard};
5+
use util::logger::Logger;
6+
use std::sync::{Mutex,Weak,MutexGuard,Arc};
67
use std::sync::atomic::{AtomicUsize, Ordering};
78

89
/// An interface to request notification of certain scripts as they appear the
@@ -70,7 +71,8 @@ pub trait FeeEstimator: Sync + Send {
7071
pub struct ChainWatchInterfaceUtil {
7172
watched: Mutex<(Vec<Script>, Vec<(Sha256dHash, u32)>, bool)>, //TODO: Something clever to optimize this
7273
listeners: Mutex<Vec<Weak<ChainListener>>>,
73-
reentered: AtomicUsize
74+
reentered: AtomicUsize,
75+
logger: Arc<Logger>,
7476
}
7577

7678
/// Register listener
@@ -100,11 +102,12 @@ impl ChainWatchInterface for ChainWatchInterfaceUtil {
100102
}
101103

102104
impl ChainWatchInterfaceUtil {
103-
pub fn new() -> ChainWatchInterfaceUtil {
105+
pub fn new(logger: Arc<Logger>) -> ChainWatchInterfaceUtil {
104106
ChainWatchInterfaceUtil {
105107
watched: Mutex::new((Vec::new(), Vec::new(), false)),
106108
listeners: Mutex::new(Vec::new()),
107-
reentered: AtomicUsize::new(1)
109+
reentered: AtomicUsize::new(1),
110+
logger: logger,
108111
}
109112
}
110113

src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern crate rand;
66
extern crate secp256k1;
77
#[cfg(test)] extern crate hex;
88

9+
#[macro_use]
10+
pub mod util;
911
pub mod chain;
1012
pub mod ln;
11-
pub mod util;

src/ln/channel.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
2323
use chain::transaction::OutPoint;
2424
use util::{transaction_utils,rng};
2525
use util::sha2::Sha256;
26+
use util::logger::Logger;
2627

2728
use std;
2829
use std::default::Default;
2930
use std::{cmp,mem};
3031
use std::time::Instant;
32+
use std::sync::{Arc};
3133

3234
pub struct ChannelKeys {
3335
pub funding_key: SecretKey,
@@ -303,6 +305,8 @@ pub struct Channel {
303305
their_shutdown_scriptpubkey: Option<Script>,
304306

305307
channel_monitor: ChannelMonitor,
308+
309+
logger: Arc<Logger>,
306310
}
307311

308312
const OUR_MAX_HTLCS: u16 = 5; //TODO
@@ -361,7 +365,7 @@ impl Channel {
361365
// Constructors:
362366

363367
/// panics if channel_value_satoshis is >= `MAX_FUNDING_SATOSHIS`
364-
pub fn new_outbound(fee_estimator: &FeeEstimator, chan_keys: ChannelKeys, their_node_id: PublicKey, channel_value_satoshis: u64, announce_publicly: bool, user_id: u64) -> Channel {
368+
pub fn new_outbound(fee_estimator: &FeeEstimator, chan_keys: ChannelKeys, their_node_id: PublicKey, channel_value_satoshis: u64, announce_publicly: bool, user_id: u64, logger: Arc<Logger>) -> Channel {
365369
if channel_value_satoshis >= MAX_FUNDING_SATOSHIS {
366370
panic!("funding value > 2^24");
367371
}
@@ -429,6 +433,8 @@ impl Channel {
429433
their_shutdown_scriptpubkey: None,
430434

431435
channel_monitor: channel_monitor,
436+
437+
logger,
432438
}
433439
}
434440

@@ -446,7 +452,7 @@ impl Channel {
446452
/// Assumes chain_hash has already been checked and corresponds with what we expect!
447453
/// Generally prefers to take the DisconnectPeer action on failure, as a notice to the sender
448454
/// that we're rejecting the new channel.
449-
pub fn new_from_req(fee_estimator: &FeeEstimator, chan_keys: ChannelKeys, their_node_id: PublicKey, msg: &msgs::OpenChannel, user_id: u64, require_announce: bool, allow_announce: bool) -> Result<Channel, HandleError> {
455+
pub fn new_from_req(fee_estimator: &FeeEstimator, chan_keys: ChannelKeys, their_node_id: PublicKey, msg: &msgs::OpenChannel, user_id: u64, require_announce: bool, allow_announce: bool, logger: Arc<Logger>) -> Result<Channel, HandleError> {
450456
// Check sanity of message fields:
451457
if msg.funding_satoshis >= MAX_FUNDING_SATOSHIS {
452458
return Err(HandleError{err: "funding value > 2^24", action: Some(msgs::ErrorAction::DisconnectPeer{ msg: None })});
@@ -548,6 +554,8 @@ impl Channel {
548554
their_shutdown_scriptpubkey: None,
549555

550556
channel_monitor: channel_monitor,
557+
558+
logger,
551559
};
552560

553561
let obscure_factor = chan.get_commitment_transaction_number_obscure_factor();
@@ -2392,10 +2400,13 @@ mod tests {
23922400
use ln::chan_utils;
23932401
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
23942402
use chain::transaction::OutPoint;
2403+
use util::test_utils;
2404+
use util::logger::Logger;
23952405
use secp256k1::{Secp256k1,Message,Signature};
23962406
use secp256k1::key::{SecretKey,PublicKey};
23972407
use crypto::sha2::Sha256;
23982408
use crypto::digest::Digest;
2409+
use std::sync::Arc;
23992410

24002411
struct TestFeeEstimator {
24012412
fee_est: u64
@@ -2416,6 +2427,7 @@ mod tests {
24162427
fn outbound_commitment_test() {
24172428
// Test vectors from BOLT 3 Appendix C:
24182429
let feeest = TestFeeEstimator{fee_est: 15000};
2430+
let logger : Arc<Logger> = Arc::new(test_utils::TestLogger::new());
24192431
let secp_ctx = Secp256k1::new();
24202432

24212433
let chan_keys = ChannelKeys {
@@ -2433,7 +2445,7 @@ mod tests {
24332445
assert_eq!(PublicKey::from_secret_key(&secp_ctx, &chan_keys.funding_key).unwrap().serialize()[..],
24342446
hex::decode("023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb").unwrap()[..]);
24352447

2436-
let mut chan = Channel::new_outbound(&feeest, chan_keys, PublicKey::new(), 10000000, false, 42); // Nothing uses their network key in this test
2448+
let mut chan = Channel::new_outbound(&feeest, chan_keys, PublicKey::new(), 10000000, false, 42, Arc::clone(&logger)); // Nothing uses their network key in this test
24372449
chan.their_to_self_delay = 144;
24382450
chan.our_dust_limit_satoshis = 546;
24392451

src/ln/channelmanager.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use ln::msgs;
1919
use ln::msgs::{HandleError,ChannelMessageHandler,MsgEncodable,MsgDecodable};
2020
use util::{byte_utils, events, internal_traits, rng};
2121
use util::sha2::Sha256;
22+
use util::logger::Logger;
2223

2324
use crypto;
2425
use crypto::mac::{Mac,MacResult};
@@ -166,6 +167,8 @@ pub struct ChannelManager {
166167
our_network_key: SecretKey,
167168

168169
pending_events: Mutex<Vec<events::Event>>,
170+
171+
logger: Arc<Logger>,
169172
}
170173

171174
const CLTV_EXPIRY_DELTA: u16 = 6 * 24 * 2; //TODO?
@@ -211,7 +214,7 @@ impl ChannelManager {
211214
/// fee_proportional_millionths is an optional fee to charge any payments routed through us.
212215
/// Non-proportional fees are fixed according to our risk using the provided fee estimator.
213216
/// panics if channel_value_satoshis is >= `MAX_FUNDING_SATOSHIS`!
214-
pub fn new(our_network_key: SecretKey, fee_proportional_millionths: u32, announce_channels_publicly: bool, network: Network, feeest: Arc<FeeEstimator>, monitor: Arc<ManyChannelMonitor>, chain_monitor: Arc<ChainWatchInterface>, tx_broadcaster: Arc<BroadcasterInterface>) -> Result<Arc<ChannelManager>, secp256k1::Error> {
217+
pub fn new(our_network_key: SecretKey, fee_proportional_millionths: u32, announce_channels_publicly: bool, network: Network, feeest: Arc<FeeEstimator>, monitor: Arc<ManyChannelMonitor>, chain_monitor: Arc<ChainWatchInterface>, tx_broadcaster: Arc<BroadcasterInterface>, logger: Arc<Logger>) -> Result<Arc<ChannelManager>, secp256k1::Error> {
215218
let secp_ctx = Secp256k1::new();
216219

217220
let res = Arc::new(ChannelManager {
@@ -236,6 +239,8 @@ impl ChannelManager {
236239
our_network_key,
237240

238241
pending_events: Mutex::new(Vec::new()),
242+
243+
logger,
239244
});
240245
let weak_res = Arc::downgrade(&res);
241246
res.chain_monitor.register_listener(weak_res);
@@ -270,7 +275,7 @@ impl ChannelManager {
270275
}
271276
};
272277

273-
let channel = Channel::new_outbound(&*self.fee_estimator, chan_keys, their_network_key, channel_value_satoshis, self.announce_channels_publicly, user_id);
278+
let channel = Channel::new_outbound(&*self.fee_estimator, chan_keys, their_network_key, channel_value_satoshis, self.announce_channels_publicly, user_id, Arc::clone(&self.logger));
274279
let res = channel.get_open_channel(self.genesis_hash.clone(), &*self.fee_estimator)?;
275280
let mut channel_state = self.channel_state.lock().unwrap();
276281
match channel_state.by_id.insert(channel.channel_id(), channel) {
@@ -766,6 +771,7 @@ impl ChannelManager {
766771
/// Call this upon creation of a funding transaction for the given channel.
767772
/// Panics if a funding transaction has already been provided for this channel.
768773
pub fn funding_transaction_generated(&self, temporary_channel_id: &[u8; 32], funding_txo: OutPoint) {
774+
769775
macro_rules! add_pending_event {
770776
($event: expr) => {
771777
{
@@ -1286,7 +1292,7 @@ impl ChannelMessageHandler for ChannelManager {
12861292
}
12871293
};
12881294

1289-
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, false, self.announce_channels_publicly)?;
1295+
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, false, self.announce_channels_publicly, Arc::clone(&self.logger))?;
12901296
let accept_msg = channel.get_accept_channel()?;
12911297
channel_state.by_id.insert(channel.channel_id(), channel);
12921298
Ok(accept_msg)
@@ -1972,6 +1978,7 @@ mod tests {
19721978
use ln::msgs::{MsgEncodable,ChannelMessageHandler,RoutingMessageHandler};
19731979
use util::test_utils;
19741980
use util::events::{Event, EventsProvider};
1981+
use util::logger::Logger;
19751982

19761983
use bitcoin::util::hash::Sha256dHash;
19771984
use bitcoin::blockdata::block::{Block, BlockHeader};
@@ -2686,19 +2693,20 @@ mod tests {
26862693
let mut nodes = Vec::new();
26872694
let mut rng = thread_rng();
26882695
let secp_ctx = Secp256k1::new();
2696+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
26892697

26902698
for _ in 0..node_count {
26912699
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 });
2692-
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
2700+
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Arc::clone(&logger)));
26932701
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
26942702
let chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone()));
26952703
let node_id = {
26962704
let mut key_slice = [0; 32];
26972705
rng.fill_bytes(&mut key_slice);
26982706
SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
26992707
};
2700-
let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone()).unwrap();
2701-
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap());
2708+
let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone(), Arc::clone(&logger)).unwrap();
2709+
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap(), Arc::clone(&logger));
27022710
nodes.push(Node { feeest, chain_monitor, tx_broadcaster, chan_monitor, node_id, node, router });
27032711
}
27042712

src/ln/peer_handler.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use ln::msgs::{MsgEncodable,MsgDecodable};
55
use ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep};
66
use util::byte_utils;
77
use util::events::{EventsProvider,Event};
8+
use util::logger::Logger;
89

910
use std::collections::{HashMap,LinkedList};
1011
use std::sync::{Arc, Mutex};
@@ -96,6 +97,7 @@ pub struct PeerManager<Descriptor: SocketDescriptor> {
9697
pending_events: Mutex<Vec<Event>>,
9798
our_node_secret: SecretKey,
9899
initial_syncs_sent: AtomicUsize,
100+
logger: Arc<Logger>,
99101
}
100102

101103

@@ -117,13 +119,14 @@ const INITIAL_SYNCS_TO_SEND: usize = 5;
117119
/// Manages and reacts to connection events. You probably want to use file descriptors as PeerIds.
118120
/// PeerIds may repeat, but only after disconnect_event() has been called.
119121
impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
120-
pub fn new(message_handler: MessageHandler, our_node_secret: SecretKey) -> PeerManager<Descriptor> {
122+
pub fn new(message_handler: MessageHandler, our_node_secret: SecretKey, logger: Arc<Logger>) -> PeerManager<Descriptor> {
121123
PeerManager {
122124
message_handler: message_handler,
123125
peers: Mutex::new(PeerHolder { peers: HashMap::new(), node_id_to_descriptor: HashMap::new() }),
124126
pending_events: Mutex::new(Vec::new()),
125127
our_node_secret: our_node_secret,
126128
initial_syncs_sent: AtomicUsize::new(0),
129+
logger,
127130
}
128131
}
129132

@@ -801,6 +804,7 @@ mod tests {
801804
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor};
802805
use util::events;
803806
use util::test_utils;
807+
use util::logger::Logger;
804808

805809
use secp256k1::Secp256k1;
806810
use secp256k1::key::{SecretKey, PublicKey};
@@ -827,6 +831,7 @@ mod tests {
827831
let secp_ctx = Secp256k1::new();
828832
let mut peers = Vec::new();
829833
let mut rng = thread_rng();
834+
let logger : Arc<Logger> = Arc::new(test_utils::TestLogger::new());
830835

831836
for _ in 0..peer_count {
832837
let chan_handler = test_utils::TestChannelMessageHandler::new();
@@ -837,7 +842,7 @@ mod tests {
837842
SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
838843
};
839844
let msg_handler = MessageHandler { chan_handler: Arc::new(chan_handler), route_handler: Arc::new(router) };
840-
let peer = PeerManager::new(msg_handler, node_id);
845+
let peer = PeerManager::new(msg_handler, node_id, Arc::clone(&logger));
841846
peers.push(peer);
842847
}
843848

0 commit comments

Comments
 (0)