X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fchain%2Fchaininterface.rs;h=7b5e0d0749832a7cf2ffcfcd560156d085fd53f7;hb=4d77e9d75216d84795bfbaf6a9b41f94637fac1c;hp=5ff720c32e5fed57d8c0ad23e20c3180c675674e;hpb=6c07555cad1d8500dca3fd11ab736d4e5c84f8c2;p=rust-lightning diff --git a/src/chain/chaininterface.rs b/src/chain/chaininterface.rs index 5ff720c3..7b5e0d07 100644 --- a/src/chain/chaininterface.rs +++ b/src/chain/chaininterface.rs @@ -1,10 +1,15 @@ +//! Traits and utility impls which allow other parts of rust-lightning to interact with the +//! blockchain. +//! +//! Includes traits for monitoring and receiving notifications of new blocks and block +//! disconnections, transactio broadcasting, and feerate information requests. + use bitcoin::blockdata::block::{Block, BlockHeader}; use bitcoin::blockdata::transaction::Transaction; use bitcoin::blockdata::script::Script; use bitcoin::blockdata::constants::genesis_block; -use bitcoin::util::hash::Sha256dHash; +use bitcoin::util::hash::{BitcoinHash, Sha256dHash}; use bitcoin::network::constants::Network; -use bitcoin::network::serialize::BitcoinHash; use util::logger::Logger; @@ -24,6 +29,7 @@ pub enum ChainError { /// An interface to request notification of certain scripts as they appear the /// chain. +/// /// 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). @@ -38,6 +44,8 @@ pub trait ChainWatchInterface: Sync + Send { /// Indicates that a listener needs to see all transactions. fn watch_all_txn(&self); + /// Register the given listener to receive events. Only a weak pointer is provided and the + /// registration should be freed once that pointer expires. fn register_listener(&self, listener: Weak); //TODO: unregister @@ -60,8 +68,10 @@ pub trait ChainListener: Sync + Send { /// Note that if a new transaction/outpoint is watched during a block_connected call, the block /// *must* be re-scanned with the new transaction/outpoints and block_connected should be /// called again with the same header and (at least) the new transactions. + /// /// Note that if non-new transaction/outpoints may be registered during a call, a second call /// *must not* happen. + /// /// This also means those counting confirmations using block_connected callbacks should watch /// for duplicate headers and not count them towards confirmations! fn block_connected(&self, header: &BlockHeader, height: u32, txn_matched: &[&Transaction], indexes_of_txn_matched: &[u32]); @@ -70,23 +80,32 @@ pub trait ChainListener: Sync + Send { fn block_disconnected(&self, header: &BlockHeader); } +/// An enum that represents the speed at which we want a transaction to confirm used for feerate +/// estimation. pub enum ConfirmationTarget { + /// We are happy with this transaction confirming slowly when feerate drops some. Background, + /// We'd like this transaction to confirm without major delay, but 12-18 blocks is fine. Normal, + /// We'd like this transaction to confirm in the next few blocks. HighPriority, } /// A trait which should be implemented to provide feerate information on a number of time /// 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 { - /// Gets estimated satoshis of fee required per 1000 Weight-Units. This translates to: - /// * satoshis-per-byte * 250 - /// * ceil(satoshis-per-kbyte / 4) + /// 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). + /// + /// This translates to: + /// * satoshis-per-byte * 250 + /// * ceil(satoshis-per-kbyte / 4) fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u64; } @@ -178,6 +197,7 @@ impl ChainWatchedUtil { } /// Utility to capture some common parts of ChainWatchInterface implementors. +/// /// Keeping a local copy of this in a ChainWatchInterface implementor is likely useful. pub struct ChainWatchInterfaceUtil { network: Network, @@ -224,6 +244,7 @@ impl ChainWatchInterface for ChainWatchInterfaceUtil { } impl ChainWatchInterfaceUtil { + /// Creates a new ChainWatchInterfaceUtil for the given network pub fn new(network: Network, logger: Arc) -> ChainWatchInterfaceUtil { ChainWatchInterfaceUtil { network: network, @@ -235,6 +256,7 @@ impl ChainWatchInterfaceUtil { } /// Notify listeners that a block was connected given a full, unfiltered block. + /// /// Handles re-scanning the block and calling block_connected again if listeners register new /// watch data during the callbacks for you (see ChainListener::block_connected for more info). pub fn block_connected_with_filtering(&self, block: &Block, height: u32) { @@ -268,6 +290,7 @@ impl ChainWatchInterfaceUtil { /// Notify listeners that a block was connected, given pre-filtered list of transactions in the /// block which matched the filter (probably using does_match_tx). + /// /// Returns true if notified listeners registered additional watch data (implying that the /// block must be re-scanned and this function called again prior to further block_connected /// calls, see ChainListener::block_connected for more info).