Skip to content

Commit d2ab686

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 Issue #54
1 parent 194367f commit d2ab686

10 files changed

+740
-19
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"

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,10 +23,12 @@ 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::default::Default;
2829
use std::{cmp,mem};
2930
use std::time::Instant;
31+
use std::sync::{Arc};
3032

3133
pub struct ChannelKeys {
3234
pub funding_key: SecretKey,
@@ -302,6 +304,8 @@ pub struct Channel {
302304
their_shutdown_scriptpubkey: Option<Script>,
303305

304306
channel_monitor: ChannelMonitor,
307+
308+
logger: Arc<Logger>,
305309
}
306310

307311
const OUR_MAX_HTLCS: u16 = 5; //TODO
@@ -360,7 +364,7 @@ impl Channel {
360364
// Constructors:
361365

362366
/// panics if channel_value_satoshis is >= `MAX_FUNDING_SATOSHIS`
363-
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 {
367+
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 {
364368
if channel_value_satoshis >= MAX_FUNDING_SATOSHIS {
365369
panic!("funding value > 2^24");
366370
}
@@ -428,6 +432,8 @@ impl Channel {
428432
their_shutdown_scriptpubkey: None,
429433

430434
channel_monitor: channel_monitor,
435+
436+
logger,
431437
}
432438
}
433439

@@ -445,7 +451,7 @@ impl Channel {
445451
/// Assumes chain_hash has already been checked and corresponds with what we expect!
446452
/// Generally prefers to take the DisconnectPeer action on failure, as a notice to the sender
447453
/// that we're rejecting the new channel.
448-
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> {
454+
pub fn new_from_req(fee_estimator: &FeeEstimator, chan_keys: ChannelKeys, their_node_id: PublicKey, msg: &msgs::OpenChannel, user_id: u64, announce_publicly: bool, logger: Arc<Logger>) -> Result<Channel, HandleError> {
449455
// Check sanity of message fields:
450456
if msg.funding_satoshis >= MAX_FUNDING_SATOSHIS {
451457
return Err(HandleError{err: "funding value > 2^24", action: Some(msgs::ErrorAction::DisconnectPeer{ msg: None })});
@@ -547,6 +553,8 @@ impl Channel {
547553
their_shutdown_scriptpubkey: None,
548554

549555
channel_monitor: channel_monitor,
556+
557+
logger,
550558
};
551559

552560
let obscure_factor = chan.get_commitment_transaction_number_obscure_factor();
@@ -2347,10 +2355,13 @@ mod tests {
23472355
use ln::chan_utils;
23482356
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
23492357
use chain::transaction::OutPoint;
2358+
use util::test_utils;
2359+
use util::logger::Logger;
23502360
use secp256k1::{Secp256k1,Message,Signature};
23512361
use secp256k1::key::{SecretKey,PublicKey};
23522362
use crypto::sha2::Sha256;
23532363
use crypto::digest::Digest;
2364+
use std::sync::Arc;
23542365

23552366
struct TestFeeEstimator {
23562367
fee_est: u64
@@ -2371,6 +2382,7 @@ mod tests {
23712382
fn outbound_commitment_test() {
23722383
// Test vectors from BOLT 3 Appendix C:
23732384
let feeest = TestFeeEstimator{fee_est: 15000};
2385+
let logger : Arc<Logger> = Arc::new(test_utils::TestLogger::new());
23742386
let secp_ctx = Secp256k1::new();
23752387

23762388
let chan_keys = ChannelKeys {
@@ -2388,7 +2400,7 @@ mod tests {
23882400
assert_eq!(PublicKey::from_secret_key(&secp_ctx, &chan_keys.funding_key).unwrap().serialize()[..],
23892401
hex_bytes("023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb").unwrap()[..]);
23902402

2391-
let mut chan = Channel::new_outbound(&feeest, chan_keys, PublicKey::new(), 10000000, false, 42); // Nothing uses their network key in this test
2403+
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
23922404
chan.their_to_self_delay = 144;
23932405
chan.our_dust_limit_satoshis = 546;
23942406

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};
@@ -159,6 +160,8 @@ pub struct ChannelManager {
159160
our_network_key: SecretKey,
160161

161162
pending_events: Mutex<Vec<events::Event>>,
163+
164+
logger: Arc<Logger>,
162165
}
163166

164167
const CLTV_EXPIRY_DELTA: u16 = 6 * 24 * 2; //TODO?
@@ -204,7 +207,7 @@ impl ChannelManager {
204207
/// fee_proportional_millionths is an optional fee to charge any payments routed through us.
205208
/// Non-proportional fees are fixed according to our risk using the provided fee estimator.
206209
/// panics if channel_value_satoshis is >= `MAX_FUNDING_SATOSHIS`!
207-
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> {
210+
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> {
208211
let secp_ctx = Secp256k1::new();
209212

210213
let res = Arc::new(ChannelManager {
@@ -229,6 +232,8 @@ impl ChannelManager {
229232
our_network_key,
230233

231234
pending_events: Mutex::new(Vec::new()),
235+
236+
logger,
232237
});
233238
let weak_res = Arc::downgrade(&res);
234239
res.chain_monitor.register_listener(weak_res);
@@ -263,7 +268,7 @@ impl ChannelManager {
263268
}
264269
};
265270

266-
let channel = Channel::new_outbound(&*self.fee_estimator, chan_keys, their_network_key, channel_value_satoshis, self.announce_channels_publicly, user_id);
271+
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));
267272
let res = channel.get_open_channel(self.genesis_hash.clone(), &*self.fee_estimator)?;
268273
let mut channel_state = self.channel_state.lock().unwrap();
269274
match channel_state.by_id.insert(channel.channel_id(), channel) {
@@ -718,6 +723,7 @@ impl ChannelManager {
718723
/// Call this upon creation of a funding transaction for the given channel.
719724
/// Panics if a funding transaction has already been provided for this channel.
720725
pub fn funding_transaction_generated(&self, temporary_channel_id: &[u8; 32], funding_txo: OutPoint) {
726+
721727
macro_rules! add_pending_event {
722728
($event: expr) => {
723729
{
@@ -1195,7 +1201,7 @@ impl ChannelMessageHandler for ChannelManager {
11951201
}
11961202
};
11971203

1198-
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, false, self.announce_channels_publicly)?;
1204+
let channel = Channel::new_from_req(&*self.fee_estimator, chan_keys, their_node_id.clone(), msg, 0, self.announce_channels_publicly, Arc::clone(&self.logger))?;
11991205
let accept_msg = channel.get_accept_channel()?;
12001206
channel_state.by_id.insert(channel.channel_id(), channel);
12011207
Ok(accept_msg)
@@ -1892,6 +1898,7 @@ mod tests {
18921898
use ln::msgs::{MsgEncodable,ChannelMessageHandler,RoutingMessageHandler};
18931899
use util::test_utils;
18941900
use util::events::{Event, EventsProvider};
1901+
use util::logger::Logger;
18951902

18961903
use bitcoin::util::misc::hex_bytes;
18971904
use bitcoin::util::hash::Sha256dHash;
@@ -2606,19 +2613,20 @@ mod tests {
26062613
let mut nodes = Vec::new();
26072614
let mut rng = thread_rng();
26082615
let secp_ctx = Secp256k1::new();
2616+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
26092617

26102618
for _ in 0..node_count {
26112619
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 });
2612-
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
2620+
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Arc::clone(&logger)));
26132621
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
26142622
let chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone()));
26152623
let node_id = {
26162624
let mut key_slice = [0; 32];
26172625
rng.fill_bytes(&mut key_slice);
26182626
SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
26192627
};
2620-
let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone()).unwrap();
2621-
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap());
2628+
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();
2629+
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap(), Arc::clone(&logger));
26222630
nodes.push(Node { feeest, chain_monitor, tx_broadcaster, chan_monitor, node_id, node, router });
26232631
}
26242632

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

src/ln/router.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use bitcoin::util::hash::Sha256dHash;
66
use ln::channelmanager;
77
use ln::msgs::{ErrorAction,HandleError,RoutingMessageHandler,MsgEncodable,NetAddress,GlobalFeatures};
88
use ln::msgs;
9+
use util::logger::Logger;
910

1011
use std::cmp;
11-
use std::sync::RwLock;
12+
use std::sync::{RwLock,Arc};
1213
use std::collections::{HashMap,BinaryHeap};
1314
use std::collections::hash_map::Entry;
1415

@@ -105,6 +106,7 @@ pub struct RouteHint {
105106
pub struct Router {
106107
secp_ctx: Secp256k1,
107108
network_map: RwLock<NetworkMap>,
109+
logger: Arc<Logger>,
108110
}
109111

110112
macro_rules! secp_verify_sig {
@@ -325,7 +327,7 @@ struct DummyDirectionalChannelInfo {
325327
}
326328

327329
impl Router {
328-
pub fn new(our_pubkey: PublicKey) -> Router {
330+
pub fn new(our_pubkey: PublicKey, logger: Arc<Logger>) -> Router {
329331
let mut nodes = HashMap::new();
330332
nodes.insert(our_pubkey.clone(), NodeInfo {
331333
channels: Vec::new(),
@@ -344,6 +346,7 @@ impl Router {
344346
our_node_id: our_pubkey,
345347
nodes: nodes,
346348
}),
349+
logger,
347350
}
348351
}
349352

@@ -554,18 +557,23 @@ mod tests {
554557
use ln::channelmanager;
555558
use ln::router::{Router,NodeInfo,NetworkMap,ChannelInfo,DirectionalChannelInfo,RouteHint};
556559
use ln::msgs::GlobalFeatures;
560+
use util::test_utils;
561+
use util::logger::Logger;
557562

558563
use bitcoin::util::misc::hex_bytes;
559564
use bitcoin::util::hash::Sha256dHash;
560565

561566
use secp256k1::key::{PublicKey,SecretKey};
562567
use secp256k1::Secp256k1;
563568

569+
use std::sync::Arc;
570+
564571
#[test]
565572
fn route_test() {
566573
let secp_ctx = Secp256k1::new();
567574
let our_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex_bytes("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap()).unwrap();
568-
let router = Router::new(our_id);
575+
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
576+
let router = Router::new(our_id, Arc::clone(&logger));
569577

570578
// Build network from our_id to node8:
571579
//

0 commit comments

Comments
 (0)