Store `Payee` information in `HTLCSource::OutboundRoute`.
[rust-lightning] / lightning-persister / src / lib.rs
index 6cfa540cf1ec9c32a89a13bf1ba995e8dd3808f5..eba0692485a551403b0ae40dc4e74909a2c1bb71 100644 (file)
@@ -17,8 +17,8 @@ use bitcoin::hashes::hex::{FromHex, ToHex};
 use crate::util::DiskWriteable;
 use lightning::chain;
 use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
-use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateErr};
-use lightning::chain::channelmonitor;
+use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate};
+use lightning::chain::chainmonitor;
 use lightning::chain::keysinterface::{Sign, KeysInterface};
 use lightning::chain::transaction::OutPoint;
 use lightning::ln::channelmanager::ChannelManager;
@@ -158,17 +158,22 @@ impl FilesystemPersister {
        }
 }
 
-impl<ChannelSigner: Sign> channelmonitor::Persist<ChannelSigner> for FilesystemPersister {
-       fn persist_new_channel(&self, funding_txo: OutPoint, monitor: &ChannelMonitor<ChannelSigner>) -> Result<(), ChannelMonitorUpdateErr> {
+impl<ChannelSigner: Sign> chainmonitor::Persist<ChannelSigner> for FilesystemPersister {
+       // TODO: We really need a way for the persister to inform the user that its time to crash/shut
+       // down once these start returning failure.
+       // A PermanentFailure implies we need to shut down since we're force-closing channels without
+       // even broadcasting!
+
+       fn persist_new_channel(&self, funding_txo: OutPoint, monitor: &ChannelMonitor<ChannelSigner>, _update_id: chainmonitor::MonitorUpdateId) -> Result<(), chain::ChannelMonitorUpdateErr> {
                let filename = format!("{}_{}", funding_txo.txid.to_hex(), funding_txo.index);
                util::write_to_file(self.path_to_monitor_data(), filename, monitor)
-                       .map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
+                       .map_err(|_| chain::ChannelMonitorUpdateErr::PermanentFailure)
        }
 
-       fn update_persisted_channel(&self, funding_txo: OutPoint, _update: &ChannelMonitorUpdate, monitor: &ChannelMonitor<ChannelSigner>) -> Result<(), ChannelMonitorUpdateErr> {
+       fn update_persisted_channel(&self, funding_txo: OutPoint, _update: &Option<ChannelMonitorUpdate>, monitor: &ChannelMonitor<ChannelSigner>, _update_id: chainmonitor::MonitorUpdateId) -> Result<(), chain::ChannelMonitorUpdateErr> {
                let filename = format!("{}_{}", funding_txo.txid.to_hex(), funding_txo.index);
                util::write_to_file(self.path_to_monitor_data(), filename, monitor)
-                       .map_err(|_| ChannelMonitorUpdateErr::PermanentFailure)
+                       .map_err(|_| chain::ChannelMonitorUpdateErr::PermanentFailure)
        }
 }
 
@@ -180,7 +185,8 @@ mod tests {
        use bitcoin::blockdata::block::{Block, BlockHeader};
        use bitcoin::hashes::hex::FromHex;
        use bitcoin::Txid;
-       use lightning::chain::channelmonitor::{Persist, ChannelMonitorUpdateErr};
+       use lightning::chain::ChannelMonitorUpdateErr;
+       use lightning::chain::chainmonitor::Persist;
        use lightning::chain::transaction::OutPoint;
        use lightning::{check_closed_broadcast, check_closed_event, check_added_monitors};
        use lightning::ln::features::InitFeatures;
@@ -295,6 +301,8 @@ mod tests {
                nodes[1].node.force_close_channel(&chan.2).unwrap();
                check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
                let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
+               let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
+               let update_id = update_map.get(&added_monitors[0].0.to_channel_id()).unwrap();
 
                // Set the persister's directory to read-only, which should result in
                // returning a permanent failure when we then attempt to persist a
@@ -308,7 +316,7 @@ mod tests {
                        txid: Txid::from_hex("8984484a580b825b9972d7adb15050b3ab624ccd731946b3eeddb92f4e7ef6be").unwrap(),
                        index: 0
                };
-               match persister.persist_new_channel(test_txo, &added_monitors[0].1) {
+               match persister.persist_new_channel(test_txo, &added_monitors[0].1, update_id.2) {
                        Err(ChannelMonitorUpdateErr::PermanentFailure) => {},
                        _ => panic!("unexpected result from persisting new channel")
                }
@@ -332,6 +340,8 @@ mod tests {
                nodes[1].node.force_close_channel(&chan.2).unwrap();
                check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
                let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
+               let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
+               let update_id = update_map.get(&added_monitors[0].0.to_channel_id()).unwrap();
 
                // Create the persister with an invalid directory name and test that the
                // channel fails to open because the directories fail to be created. There
@@ -343,7 +353,7 @@ mod tests {
                        txid: Txid::from_hex("8984484a580b825b9972d7adb15050b3ab624ccd731946b3eeddb92f4e7ef6be").unwrap(),
                        index: 0
                };
-               match persister.persist_new_channel(test_txo, &added_monitors[0].1) {
+               match persister.persist_new_channel(test_txo, &added_monitors[0].1, update_id.2) {
                        Err(ChannelMonitorUpdateErr::PermanentFailure) => {},
                        _ => panic!("unexpected result from persisting new channel")
                }