@@ -182,6 +182,24 @@ Instantiate it:
182
182
let filter = MyFilter ()
183
183
```
184
184
185
+ ### KeysInterface
186
+
187
+ Define the subclass:
188
+
189
+ ``` swift
190
+ // MyKeysInterface.swift
191
+
192
+ import Foundation
193
+
194
+ class MyKeysInterface : KeysInterface {
195
+ override func get_node_secret () -> [UInt8 ] {
196
+ return [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ]
197
+ }
198
+ }
199
+ ```
200
+
201
+ We won't be instantiating it directly, but we will need the keys interface later on.
202
+
185
203
## Phase 2: Initializations
186
204
187
205
### ChainMonitor
@@ -207,6 +225,14 @@ let timestamp_nanos = UInt32.init(truncating: NSNumber(value: timestamp_seconds
207
225
let keysManager = KeysManager (seed : seed, starting_time_secs : timestamp_seconds, starting_time_nanos : timestamp_nanos)
208
226
```
209
227
228
+ We will keep needing to pass around a keysInterface instance, so let's prepare it right here:
229
+
230
+ ``` swift
231
+ let keysInterface = MyKeysInterface (pointer : keysManager.as_KeysInterface ().cOpaqueStruct ! )
232
+ ```
233
+
234
+ This is a bit inelegant, but we will be providing simpler casting methods for user-provided types shortly.
235
+
210
236
### ChannelManager
211
237
212
238
To instantiate the channel manager, we need a couple minor prerequisites.
@@ -230,5 +256,51 @@ Finally, we can proceed by instantiating the ChannelManager.
230
256
``` swift
231
257
// main context (continued)
232
258
233
- let channelManager = ChannelManager.init (fee_est : feeEstimator, chain_monitor : chainMonitor.as_Watch (), tx_broadcaster : broadcaster, logger : logger, keys_manager : keysManager.as_KeysInterface (), config : userConfig, params : chainParameters)
259
+ let channelManager = ChannelManager.init (fee_est : feeEstimator, chain_monitor : chainMonitor.as_Watch (), tx_broadcaster : broadcaster, logger : logger, keys_manager : keysInterface, config : userConfig, params : chainParameters)
260
+ ```
261
+
262
+ ### NetGraphMsgHandler
263
+
264
+ If you intend to use the LDK's built-in routing algorithm, you will need to instantiate
265
+ a graph message handler:
266
+
267
+ ``` swift
268
+ // main context (continued)
269
+
270
+ let networkGraph = NetworkGraph (genesis_hash : [UInt8 ](Data (base64Encoded : " AAAAAAAZ1micCFrhZYMek0/3Y65GoqbBcrPxtgqM4m8=" )! ))
271
+ let router = NetGraphMsgHandler (chain_access : nil , logger : logger, network_graph : networkGraph)
272
+ ```
273
+
274
+ Note that a network graph instance needs to be provided upon initialization, which in turn requires the genesis block hash.
275
+
276
+ ### PeerHandler
277
+
278
+ Finally, let's instantiate the peer handler. It requires a seed for ephemeral key generation,
279
+ as well as a hybrid message handler for routing and channel events.
280
+
281
+ Let's first set up the seed:
282
+
283
+ ``` swift
284
+ var keyData2 = Data (count : 32 )
285
+ keyData2.withUnsafeMutableBytes {
286
+ SecRandomCopyBytes (kSecRandomDefault, 32 , $0 .baseAddress ! )
287
+ }
288
+ let peerManagerSeed = [UInt8 ](keyData2)
289
+ ```
290
+
291
+ Next, let's prepare the combined message handler:
292
+
293
+ ``` swift
294
+ let messageHandler = MessageHandler (chan_handler_arg : channelManager.as_ChannelMessageHandler (), route_handler_arg : router.as_RoutingMessageHandler ())
295
+ ```
296
+
297
+ And finally, let's instantiate the peer manager itself:
298
+
299
+ ``` swift
300
+ // main context (continued)
301
+
302
+ let peerManager = PeerManager (message_handler : messageHandler, our_node_secret : keysInterface.get_node_secret (), ephemeral_random_data : peerManagerSeed, logger : logger)
234
303
```
304
+
305
+ Now, all that remains is setting up the actual syscalls that are necessary within
306
+ the host environment, and route them to the appropriate LDK objects.
0 commit comments