Merge pull request #4 from TheBlueMatt/2021-03-init-util
authorArik Sosman <arik-so@users.noreply.github.com>
Fri, 5 Mar 2021 19:39:04 +0000 (11:39 -0800)
committerGitHub <noreply@github.com>
Fri, 5 Mar 2021 19:39:04 +0000 (11:39 -0800)
Add deserialization/init helper class that overtorment asked for

15 files changed:
src/main/java/org/ldk/batteries/ChannelManagerConstructor.java [new file with mode: 0644]
src/main/java/org/ldk/impl/chain/chaininterface/BroadcasterInterface.java [deleted file]
src/main/java/org/ldk/impl/chain/keysinterface/KeysInterface.java [deleted file]
src/main/java/org/ldk/impl/ln/channelmanager/ChannelManager.java [deleted file]
src/main/java/org/ldk/impl/ln/channelmonitor/ManyChannelMonitor.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/AcceptChannel.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/AnnouncementSignatures.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/ChannelAnnouncement.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/ChannelMessageHandler.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/ChannelReestablish.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/ChannelUpdate.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/RoutingMessageHandler.java [deleted file]
src/main/java/org/ldk/impl/ln/msgs/msgs.java [deleted file]
src/main/java/org/ldk/impl/ln/peer_handler/MessageHandler.java [deleted file]
src/main/java/org/ldk/impl/ln/peer_handler/PeerManager.java [deleted file]

diff --git a/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java b/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java
new file mode 100644 (file)
index 0000000..2a23d71
--- /dev/null
@@ -0,0 +1,87 @@
+package org.ldk.batteries;
+
+import org.ldk.enums.LDKNetwork;
+import org.ldk.structs.*;
+import org.ldk.util.TwoTuple;
+
+
+/**
+ * A simple utility class which assists in constructing a fresh or deserializing from disk a ChannelManager and one or
+ * more ChannelMonitors.
+ */
+public class ChannelManagerConstructor {
+    /**
+     * An Exception that indicates the serialized data is invalid and has been corrupted on disk. You should attempt to
+     * restore from a backup if there is one which is known to be current. Otherwise, funds may have been lost.
+     */
+    public static class InvalidSerializedDataException extends Exception {}
+
+    /**
+     * The ChannelManager either deserialized or newly-constructed.
+     */
+    public final ChannelManager channel_manager;
+    /**
+     * The latest block has the channel manager saw. If this is non-null it is a 32-byte block hash.
+     * You should sync the blockchain starting with the block that builds on this block.
+     */
+    public final byte[] channel_manager_latest_block_hash;
+    /**
+     * A list of ChannelMonitors and the last block they each saw. You should sync the blockchain on each individually
+     * starting with the block that builds on the hash given.
+     * After doing so (and syncing the blockchain on the channel manager as well), you should call chain_sync_completed()
+     * and then continue to normal application operation.
+     */
+    public final TwoTuple<ChannelMonitor, byte[]>[] channel_monitors;
+
+    private final Watch chain_watch;
+
+    /**
+     * Deserializes a channel manager and a set of channel monitors from the given serialized copies and interface implementations
+     */
+    public ChannelManagerConstructor(byte[] channel_manager_serialized, byte[][] channel_monitors_serialized,
+                                     KeysInterface keys_interface, FeeEstimator fee_estimator, Watch chain_watch,
+                                     BroadcasterInterface tx_broadcaster, Logger logger) throws InvalidSerializedDataException {
+        final ChannelMonitor[] monitors = new ChannelMonitor[channel_monitors_serialized.length];
+        this.channel_monitors = new TwoTuple[monitors.length];
+        for (int i = 0; i < monitors.length; i++) {
+            Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ res = UtilMethods.constructor_BlockHashChannelMonitorZ_read(channel_monitors_serialized[i], keys_interface);
+            if (res instanceof Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_Err) {
+                throw new InvalidSerializedDataException();
+            }
+            monitors[i] = ((Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK) res).res.b;
+            this.channel_monitors[i] = new TwoTuple<>(monitors[i], ((Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK)res).res.a);
+        }
+        Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ res =
+                UtilMethods.constructor_BlockHashChannelManagerZ_read(channel_manager_serialized, keys_interface, fee_estimator, chain_watch, tx_broadcaster,
+                        logger, UserConfig.constructor_default(), monitors);
+        if (res instanceof Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_Err) {
+            throw new InvalidSerializedDataException();
+        }
+        this.channel_manager = ((Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK)res).res.b;
+        this.channel_manager_latest_block_hash = ((Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ.Result_C2Tuple_BlockHashChannelManagerZDecodeErrorZ_OK)res).res.a;
+        this.chain_watch = chain_watch;
+    }
+
+    /**
+     * Constructs a channel manager from the given interface implementations
+     */
+    public ChannelManagerConstructor(LDKNetwork network, UserConfig config, byte[] current_blockchain_tip_hash, int current_blockchain_tip_height,
+                                     KeysInterface keys_interface, FeeEstimator fee_estimator, Watch chain_watch,
+                                     BroadcasterInterface tx_broadcaster, Logger logger) throws InvalidSerializedDataException {
+        channel_monitors = new TwoTuple[0];
+        channel_manager_latest_block_hash = null;
+        this.chain_watch = chain_watch;
+        // Note that current_blockchain_tip_hash will be required in a future version but is currently unused.
+        channel_manager = ChannelManager.constructor_new(network, fee_estimator, chain_watch, tx_broadcaster, logger, keys_interface, config, current_blockchain_tip_height);
+    }
+
+    /**
+     * Utility which adds all of the deserialized ChannelMonitors to the chain watch so that further updates from the
+     * ChannelManager are processed as normal.
+     */
+    public void chain_sync_completed() {
+        for (TwoTuple<ChannelMonitor, byte[]> monitor: channel_monitors) {
+            this.chain_watch.watch_channel(monitor.a.get_funding_txo().a, monitor.a);
+        }
+    }
+}
diff --git a/src/main/java/org/ldk/impl/chain/chaininterface/BroadcasterInterface.java b/src/main/java/org/ldk/impl/chain/chaininterface/BroadcasterInterface.java
deleted file mode 100644 (file)
index 7b602d8..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.chain.chaininterface;
-
-public interface BroadcasterInterface {
-    public void broadcast_transaction(byte[] transaction_data);
-}
diff --git a/src/main/java/org/ldk/impl/chain/keysinterface/KeysInterface.java b/src/main/java/org/ldk/impl/chain/keysinterface/KeysInterface.java
deleted file mode 100644 (file)
index 66d7b51..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.chain.keysinterface;
-
-public class KeysInterface {
-    
-}
diff --git a/src/main/java/org/ldk/impl/ln/channelmanager/ChannelManager.java b/src/main/java/org/ldk/impl/ln/channelmanager/ChannelManager.java
deleted file mode 100644 (file)
index f961fc5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ldk.impl.ln.channelmanager;
-
-import org.ldk.impl.chain.chaininterface.BroadcasterInterface;
-import org.ldk.impl.chain.keysinterface.KeysInterface;
-import org.ldk.impl.ln.channelmonitor.ManyChannelMonitor;
-
-public class ChannelManager {
-    public enum Network {
-        Bitcoin,
-        Testnet
-    }
-    /*public ChannelManager(Network net, FeeEstimator feeEstimator, ManyChannelMonitor monitor,
-                          BroadcasterInterface broadcaster, Logger logger, KeysInterface keys,
-                          UserConfig config, int cur_chain_height) {
-
-    }*/
-
-
-}
diff --git a/src/main/java/org/ldk/impl/ln/channelmonitor/ManyChannelMonitor.java b/src/main/java/org/ldk/impl/ln/channelmonitor/ManyChannelMonitor.java
deleted file mode 100644 (file)
index 286004d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.ldk.impl.ln.channelmonitor;
-
-public interface ManyChannelMonitor {
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/AcceptChannel.java b/src/main/java/org/ldk/impl/ln/msgs/AcceptChannel.java
deleted file mode 100644 (file)
index bafb7bb..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-import org.ldk.impl.bindings;
-
-public final class AcceptChannel {
-    private final long c_obj;
-
-    private AcceptChannel(long c_obj) {
-        this.c_obj = c_obj;
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    final protected void finalize() throws Throwable {
-        bindings.AcceptChannel_free(this.c_obj);
-        super.finalize();
-    }
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/AnnouncementSignatures.java b/src/main/java/org/ldk/impl/ln/msgs/AnnouncementSignatures.java
deleted file mode 100644 (file)
index 7190441..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public class AnnouncementSignatures {
-    private long c_obj;
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/ChannelAnnouncement.java b/src/main/java/org/ldk/impl/ln/msgs/ChannelAnnouncement.java
deleted file mode 100644 (file)
index e559337..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public class ChannelAnnouncement {
-    private long c_obj;
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/ChannelMessageHandler.java b/src/main/java/org/ldk/impl/ln/msgs/ChannelMessageHandler.java
deleted file mode 100644 (file)
index aad48d8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public abstract class ChannelMessageHandler {
-    private long c_obj;
-    public long getC_obj() { return c_obj; }
-
-    //abstract void handle_open_channel(char[] public_key, OpenChannel msg);
-}
\ No newline at end of file
diff --git a/src/main/java/org/ldk/impl/ln/msgs/ChannelReestablish.java b/src/main/java/org/ldk/impl/ln/msgs/ChannelReestablish.java
deleted file mode 100644 (file)
index 4aec61c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public class ChannelReestablish {
-    private long c_obj;
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/ChannelUpdate.java b/src/main/java/org/ldk/impl/ln/msgs/ChannelUpdate.java
deleted file mode 100644 (file)
index 7c7507e..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public class ChannelUpdate {
-    private long c_obj;
-}
diff --git a/src/main/java/org/ldk/impl/ln/msgs/RoutingMessageHandler.java b/src/main/java/org/ldk/impl/ln/msgs/RoutingMessageHandler.java
deleted file mode 100644 (file)
index 92b38cb..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-public abstract class RoutingMessageHandler {
-    private long c_obj;
-    public long getC_obj() { return c_obj; }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/ldk/impl/ln/msgs/msgs.java b/src/main/java/org/ldk/impl/ln/msgs/msgs.java
deleted file mode 100644 (file)
index 0bef15e..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.ldk.impl.ln.msgs;
-
-/*public class ClosingSigned {
-       private long c_obj;
-}
-public class CommitmentSigned {
-       private long c_obj;
-}
-public class CommitmentUpdate {
-       private long c_obj;
-}
-public class ErrorMessage {
-       private long c_obj;
-}
-public class FundingCreated {
-       private long c_obj;
-}
-public class FundingLocked {
-       private long c_obj;
-}
-public class FundingSigned {
-       private long c_obj;
-}
-public class Init {
-       private long c_obj;
-}
-public class NodeAnnouncement {
-       private long c_obj;
-}
-public class OpenChannel {
-       private long c_obj;
-}
-public class Ping {
-       private long c_obj;
-}
-public class Pong {
-       private long c_obj;
-}
-public class RevokeAndACK {
-       private long c_obj;
-}
-public class Shutdown {
-       private long c_obj;
-}
-public class UnsignedChannelAnnouncement {
-       private long c_obj;
-}
-public class UnsignedNodeAnnouncement {
-       private long c_obj;
-}
-public class UpdateAddHTLC {
-       private long c_obj;
-}
-public class UpdateFailHTLC {
-       private long c_obj;
-}
-public class UpdateFailMalformedHTLC {
-       private long c_obj;
-}
-public class UpdateFee {
-       private long c_obj;
-}
-public class UpdateFulfillHTLC {
-       private long c_obj;
-}
-
-*/
\ No newline at end of file
diff --git a/src/main/java/org/ldk/impl/ln/peer_handler/MessageHandler.java b/src/main/java/org/ldk/impl/ln/peer_handler/MessageHandler.java
deleted file mode 100644 (file)
index 079727e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.ldk.impl.ln.peer_handler;
-
-import org.ldk.impl.bindings;
-import org.ldk.impl.ln.msgs.ChannelMessageHandler;
-import org.ldk.impl.ln.msgs.RoutingMessageHandler;
-
-public class MessageHandler {
-    private final long c_obj;
-    // We don't care about these, but we hold references to them to ensure they don't get free'd before us
-    private final ChannelMessageHandler chan_handler;
-    private final RoutingMessageHandler route_handler;
-
-    //oc    Pr  Bprivate MessageHandler(long c_obj) { this.c_obj = c_obj; }
-    public MessageHandler(ChannelMessageHandler chan_handler, RoutingMessageHandler route_handler) {
-        this.c_obj = bindings.MessageHandler_new(chan_handler.getC_obj(), route_handler.getC_obj());
-        this.chan_handler = chan_handler;
-        this.route_handler = route_handler;
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    final protected void finalize() throws Throwable {
-        bindings.MessageHandler_free(this.c_obj);
-        super.finalize();
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/org/ldk/impl/ln/peer_handler/PeerManager.java b/src/main/java/org/ldk/impl/ln/peer_handler/PeerManager.java
deleted file mode 100644 (file)
index 93add85..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ldk.impl.ln.peer_handler;
-
-import org.ldk.impl.bindings;
-
-public class PeerManager {
-    private final long c_obj;
-
-    private PeerManager(long c_obj) {
-        this.c_obj = c_obj;
-    }
-    //public PeerManager(MessageHandler)
-
-    @SuppressWarnings("deprecation")
-    @Override
-    final protected void finalize() throws Throwable {
-        bindings.PeerManager_free(this.c_obj);
-        super.finalize();
-    }
-}