X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fchain%2Fchaininterface.rs;h=d875dcce3e128c1443a2deaa46f1a8465a7cd06b;hb=31a0456c0e77cbd237edca985f591918f1fdb51d;hp=aa69d8596f63efd15c09011fc50c5af8795c74a2;hpb=bc4f4631ccda9045a0f3ec884109de49f3a0db12;p=rust-lightning diff --git a/lightning/src/chain/chaininterface.rs b/lightning/src/chain/chaininterface.rs index aa69d859..d875dcce 100644 --- a/lightning/src/chain/chaininterface.rs +++ b/lightning/src/chain/chaininterface.rs @@ -13,37 +13,31 @@ //! Includes traits for monitoring and receiving notifications of new blocks and block //! disconnections, transaction broadcasting, and feerate information requests. -use bitcoin::blockdata::block::{Block, BlockHeader}; -use bitcoin::blockdata::transaction::Transaction; -use bitcoin::blockdata::script::Script; -use bitcoin::hash_types::Txid; +use core::{cmp, ops::Deref}; -use std::sync::{Mutex, Arc}; -use std::collections::HashSet; -use std::ops::Deref; -use std::marker::PhantomData; -use std::ptr; +use bitcoin::blockdata::transaction::Transaction; /// An interface to send a transaction to the Bitcoin network. -pub trait BroadcasterInterface: Sync + Send { - /// Sends a transaction out to (hopefully) be mined. - fn broadcast_transaction(&self, tx: &Transaction); -} - -/// A trait indicating a desire to listen for events from the chain -pub trait ChainListener: Sync + Send { - /// Notifies a listener that a block was connected. Transactions may be filtered and are given - /// paired with their position within the block. - fn block_connected(&self, header: &BlockHeader, txdata: &[(usize, &Transaction)], height: u32); - - /// Notifies a listener that a block was disconnected. - /// Unlike block_connected, this *must* never be called twice for the same disconnect event. - /// Height must be the one of the block which was disconnected (not new height of the best chain) - fn block_disconnected(&self, header: &BlockHeader, disconnected_height: u32); +pub trait BroadcasterInterface { + /// Sends a list of transactions out to (hopefully) be mined. + /// This only needs to handle the actual broadcasting of transactions, LDK will automatically + /// rebroadcast transactions that haven't made it into a block. + /// + /// In some cases LDK may attempt to broadcast a transaction which double-spends another + /// and this isn't a bug and can be safely ignored. + /// + /// If more than one transaction is given, these transactions should be considered to be a + /// package and broadcast together. Some of the transactions may or may not depend on each other, + /// be sure to manage both cases correctly. + /// + /// Bitcoin transaction packages are defined in BIP 331 and here: + /// https://github.com/bitcoin/bitcoin/blob/master/doc/policy/packages.md + fn broadcast_transactions(&self, txs: &[&Transaction]); } /// An enum that represents the speed at which we want a transaction to confirm used for feerate /// estimation. +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] pub enum ConfirmationTarget { /// We are happy with this transaction confirming slowly when feerate drops some. Background, @@ -57,247 +51,76 @@ pub enum ConfirmationTarget { /// horizons. /// /// Note that all of the functions implemented here *must* be reentrant-safe (obviously - they're -/// called from inside the library in response to ChainListener events, P2P events, or timer -/// events). -pub trait FeeEstimator: Sync + Send { +/// called from inside the library in response to chain events, P2P events, or timer events). +pub trait FeeEstimator { /// Gets estimated satoshis of fee required per 1000 Weight-Units. /// - /// Must be no smaller than 253 (ie 1 satoshi-per-byte rounded up to ensure later round-downs - /// don't put us below 1 satoshi-per-byte). + /// LDK will wrap this method and ensure that the value returned is no smaller than 253 + /// (ie 1 satoshi-per-byte rounded up to ensure later round-downs don't put us below 1 satoshi-per-byte). /// - /// This translates to: + /// The following unit conversions can be used to convert to sats/KW: /// * satoshis-per-byte * 250 - /// * ceil(satoshis-per-kbyte / 4) + /// * satoshis-per-kbyte / 4 fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u32; } /// Minimum relay fee as required by bitcoin network mempool policy. pub const MIN_RELAY_FEE_SAT_PER_1000_WEIGHT: u64 = 4000; +/// Minimum feerate that takes a sane approach to bitcoind weight-to-vbytes rounding. +/// See the following Core Lightning commit for an explanation: +/// +pub const FEERATE_FLOOR_SATS_PER_KW: u32 = 253; -/// Utility for tracking registered txn/outpoints and checking for matches -#[cfg_attr(test, derive(PartialEq))] -pub struct ChainWatchedUtil { - watch_all: bool, - - // We are more conservative in matching during testing to ensure everything matches *exactly*, - // even though during normal runtime we take more optimized match approaches... - #[cfg(test)] - watched_txn: HashSet<(Txid, Script)>, - #[cfg(not(test))] - watched_txn: HashSet