Give ChannelMonitor a logger via new ReadableArgs trait

This commit is contained in:
Matt Corallo 2018-10-18 15:00:12 -04:00
parent 062a02da1a
commit 47fe673c57
4 changed files with 37 additions and 22 deletions

View file

@ -5,9 +5,13 @@ extern crate lightning;
use lightning::ln::channelmonitor;
use lightning::util::reset_rng_state;
use lightning::util::ser::{Readable, Writer};
use lightning::util::ser::{ReadableArgs, Writer};
mod utils;
use utils::test_logger;
use std::io::Cursor;
use std::sync::Arc;
struct VecWriter(Vec<u8>);
impl Writer for VecWriter {
@ -23,10 +27,11 @@ impl Writer for VecWriter {
#[inline]
pub fn do_test(data: &[u8]) {
reset_rng_state();
if let Ok(monitor) = channelmonitor::ChannelMonitor::read(&mut Cursor::new(data)) {
let logger = Arc::new(test_logger::TestLogger{});
if let Ok(monitor) = channelmonitor::ChannelMonitor::read(&mut Cursor::new(data), logger.clone()) {
let mut w = VecWriter(Vec::new());
monitor.write_for_disk(&mut w).unwrap();
assert!(channelmonitor::ChannelMonitor::read(&mut Cursor::new(&w.0)).unwrap() == monitor);
assert!(channelmonitor::ChannelMonitor::read(&mut Cursor::new(&w.0), logger.clone()).unwrap() == monitor);
w.0.clear();
monitor.write_for_watchtower(&mut w).unwrap();
}

View file

@ -438,7 +438,7 @@ impl Channel {
let secp_ctx = Secp256k1::new();
let channel_monitor = ChannelMonitor::new(&chan_keys.revocation_base_key, &chan_keys.delayed_payment_base_key,
&chan_keys.htlc_base_key, BREAKDOWN_TIMEOUT,
keys_provider.get_destination_script());
keys_provider.get_destination_script(), logger.clone());
Ok(Channel {
user_id: user_id,
@ -600,7 +600,7 @@ impl Channel {
let secp_ctx = Secp256k1::new();
let mut channel_monitor = ChannelMonitor::new(&chan_keys.revocation_base_key, &chan_keys.delayed_payment_base_key,
&chan_keys.htlc_base_key, BREAKDOWN_TIMEOUT,
keys_provider.get_destination_script());
keys_provider.get_destination_script(), logger.clone());
channel_monitor.set_their_base_keys(&msg.htlc_basepoint, &msg.delayed_payment_basepoint);
channel_monitor.set_their_to_self_delay(msg.to_self_delay);

View file

@ -31,7 +31,8 @@ use ln::chan_utils::HTLCOutputInCommitment;
use chain::chaininterface::{ChainListener, ChainWatchInterface, BroadcasterInterface};
use chain::transaction::OutPoint;
use chain::keysinterface::SpendableOutputDescriptor;
use util::ser::{Readable, Writer};
use util::logger::Logger;
use util::ser::{ReadableArgs, Writer};
use util::sha2::Sha256;
use util::{byte_utils, events};
@ -276,7 +277,9 @@ pub struct ChannelMonitor {
payment_preimages: HashMap<[u8; 32], [u8; 32]>,
destination_script: Script,
secp_ctx: Secp256k1<secp256k1::All>, //TODO: dedup this a bit...
logger: Arc<Logger>,
}
impl Clone for ChannelMonitor {
fn clone(&self) -> Self {
@ -304,6 +307,7 @@ impl Clone for ChannelMonitor {
destination_script: self.destination_script.clone(),
secp_ctx: self.secp_ctx.clone(),
logger: self.logger.clone(),
}
}
}
@ -343,7 +347,7 @@ impl PartialEq for ChannelMonitor {
}
impl ChannelMonitor {
pub(super) fn new(revocation_base_key: &SecretKey, delayed_payment_base_key: &SecretKey, htlc_base_key: &SecretKey, our_to_self_delay: u16, destination_script: Script) -> ChannelMonitor {
pub(super) fn new(revocation_base_key: &SecretKey, delayed_payment_base_key: &SecretKey, htlc_base_key: &SecretKey, our_to_self_delay: u16, destination_script: Script, logger: Arc<Logger>) -> ChannelMonitor {
ChannelMonitor {
funding_txo: None,
commitment_transaction_number_obscure_factor: 0,
@ -371,9 +375,10 @@ impl ChannelMonitor {
current_local_signed_commitment_tx: None,
payment_preimages: HashMap::new(),
destination_script: destination_script,
secp_ctx: Secp256k1::new(),
logger,
}
}
@ -1373,8 +1378,8 @@ impl ChannelMonitor {
}
}
impl<R: ::std::io::Read> Readable<R> for ChannelMonitor {
fn read(reader: &mut R) -> Result<Self, DecodeError> {
impl<R: ::std::io::Read> ReadableArgs<R, Arc<Logger>> for ChannelMonitor {
fn read(reader: &mut R, logger: Arc<Logger>) -> Result<Self, DecodeError> {
// TODO: read_to_end and then deserializing from that vector is really dumb, we should
// actually use the fancy serialization framework we have instead of hacking around it.
let mut datavec = Vec::new();
@ -1631,6 +1636,7 @@ impl<R: ::std::io::Read> Readable<R> for ChannelMonitor {
destination_script,
secp_ctx,
logger,
})
}
@ -1645,9 +1651,11 @@ mod tests {
use ln::channelmonitor::ChannelMonitor;
use ln::chan_utils::{HTLCOutputInCommitment, TxCreationKeys};
use util::sha2::Sha256;
use util::test_utils::TestLogger;
use secp256k1::key::{SecretKey,PublicKey};
use secp256k1::{Secp256k1, Signature};
use rand::{thread_rng,Rng};
use std::sync::Arc;
#[test]
fn test_per_commitment_storage() {
@ -1655,6 +1663,7 @@ mod tests {
let mut secrets: Vec<[u8; 32]> = Vec::new();
let mut monitor: ChannelMonitor;
let secp_ctx = Secp256k1::new();
let logger = Arc::new(TestLogger::new());
macro_rules! test_secrets {
() => {
@ -1670,7 +1679,7 @@ mod tests {
{
// insert_secret correct sequence
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1716,7 +1725,7 @@ mod tests {
{
// insert_secret #1 incorrect
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1732,7 +1741,7 @@ mod tests {
{
// insert_secret #2 incorrect (#1 derived from incorrect)
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1758,7 +1767,7 @@ mod tests {
{
// insert_secret #3 incorrect
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1784,7 +1793,7 @@ mod tests {
{
// insert_secret #4 incorrect (1,2,3 derived from incorrect)
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1830,7 +1839,7 @@ mod tests {
{
// insert_secret #5 incorrect
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1866,7 +1875,7 @@ mod tests {
{
// insert_secret #6 incorrect (5 derived from incorrect)
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1912,7 +1921,7 @@ mod tests {
{
// insert_secret #7 incorrect
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -1958,7 +1967,7 @@ mod tests {
{
// insert_secret #8 incorrect
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
secrets.clear();
secrets.push([0; 32]);
@ -2006,6 +2015,7 @@ mod tests {
#[test]
fn test_prune_preimages() {
let secp_ctx = Secp256k1::new();
let logger = Arc::new(TestLogger::new());
let dummy_sig = Signature::from_der(&secp_ctx, &hex::decode("3045022100fa86fa9a36a8cd6a7bb8f06a541787d51371d067951a9461d5404de6b928782e02201c8b7c334c10aed8976a3a465be9a28abff4cb23acbf00022295b378ce1fa3cd").unwrap()[..]).unwrap();
macro_rules! dummy_keys {
@ -2076,7 +2086,7 @@ mod tests {
// Prune with one old state and a local commitment tx holding a few overlaps with the
// old state.
let mut monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new());
let mut monitor = ChannelMonitor::new(&SecretKey::from_slice(&secp_ctx, &[42; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[43; 32]).unwrap(), &SecretKey::from_slice(&secp_ctx, &[44; 32]).unwrap(), 0, Script::new(), logger.clone());
monitor.set_their_to_self_delay(10);
monitor.provide_latest_local_commitment_tx_info(dummy_tx.clone(), dummy_keys!(), 0, preimages_to_local_htlcs!(preimages[0..10]));

View file

@ -6,7 +6,7 @@ use ln::msgs;
use ln::msgs::{HandleError};
use util::events;
use util::logger::{Logger, Level, Record};
use util::ser::{Readable, Writer};
use util::ser::{ReadableArgs, Writer};
use bitcoin::blockdata::transaction::Transaction;
@ -55,7 +55,7 @@ impl channelmonitor::ManyChannelMonitor for TestChannelMonitor {
// to a watchtower and disk...
let mut w = VecWriter(Vec::new());
monitor.write_for_disk(&mut w).unwrap();
assert!(channelmonitor::ChannelMonitor::read(&mut ::std::io::Cursor::new(&w.0)).unwrap() == monitor);
assert!(channelmonitor::ChannelMonitor::read(&mut ::std::io::Cursor::new(&w.0), Arc::new(TestLogger::new())).unwrap() == monitor);
w.0.clear();
monitor.write_for_watchtower(&mut w).unwrap(); // This at least shouldn't crash...
self.added_monitors.lock().unwrap().push((funding_txo, monitor.clone()));