Add a few notes about deserializing stale ChannelManagers
authorMatt Corallo <git@bluematt.me>
Wed, 3 Feb 2021 20:13:06 +0000 (15:13 -0500)
committerMatt Corallo <git@bluematt.me>
Thu, 11 Feb 2021 21:19:56 +0000 (16:19 -0500)
See diff for more details

lightning/src/ln/channelmanager.rs

index 3dcc74f905269a7f8a58978a529f96b6e48a5851..7d071c3402665b9c71abf29200407d935ac9f12a 100644 (file)
@@ -3790,6 +3790,13 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
 /// 4) Reconnect blocks on your ChannelMonitors.
 /// 5) Move the ChannelMonitors into your local chain::Watch.
 /// 6) Disconnect/connect blocks on the ChannelManager.
+///
+/// Note that because some channels may be closed during deserialization, it is critical that you
+/// always deserialize only the latest version of a ChannelManager and ChannelMonitors available to
+/// you. If you deserialize an old ChannelManager (during which force-closure transactions may be
+/// broadcast), and then later deserialize a newer version of the same ChannelManager (which will
+/// not force-close the same channels but consider them live), you may end up revoking a state for
+/// which you've already broadcasted the transaction.
 pub struct ChannelManagerReadArgs<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
        where M::Target: chain::Watch<Keys=ChanSigner>,
         T::Target: BroadcasterInterface,