@@ -14,15 +14,18 @@ use bitcoin::hashes::sha256::Hash as Sha256;
14
14
use bitcoin:: secp256k1:: { self , PublicKey , Secp256k1 , SecretKey } ;
15
15
use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
16
16
17
- use chain:: keysinterface:: { KeysInterface , Sign } ;
17
+ use chain:: keysinterface:: { InMemorySigner , KeysInterface , KeysManager , Sign } ;
18
18
use ln:: msgs:: DecodeError ;
19
19
use ln:: onion_utils;
20
20
use util:: chacha20poly1305rfc:: ChaChaPolyWriteAdapter ;
21
+ use util:: events:: MessageSendEvent ;
22
+ use util:: logger:: Logger ;
21
23
use util:: ser:: { IgnoringLengthReadable , LengthRead , LengthReadable , Readable , VecWriter , Writeable , Writer } ;
22
24
23
25
use core:: ops:: Deref ;
24
26
use io:: { self , Read } ;
25
27
use prelude:: * ;
28
+ use sync:: { Arc , Mutex } ;
26
29
27
30
#[ derive( Clone , Debug , PartialEq ) ]
28
31
pub ( crate ) struct Packet {
@@ -225,6 +228,41 @@ impl BlindedRoute {
225
228
}
226
229
}
227
230
231
+ /// A sender, receiver and forwarder of onion messages. In upcoming releases, this object will be
232
+ /// used to retrieve invoices and fulfill invoice requests from [offers].
233
+ ///
234
+ /// [offers]: https://github.com/lightning/bolts/pull/798
235
+ pub struct OnionMessenger < Signer : Sign , K : Deref , L : Deref >
236
+ where K :: Target : KeysInterface < Signer = Signer > ,
237
+ L :: Target : Logger ,
238
+ {
239
+ keys_manager : K ,
240
+ logger : L ,
241
+ pending_msg_events : Mutex < Vec < MessageSendEvent > > ,
242
+ secp_ctx : Secp256k1 < secp256k1:: All > ,
243
+ // Coming soon:
244
+ // invoice_handler: InvoiceHandler,
245
+ // custom_handler: CustomHandler, // handles custom onion messages
246
+ }
247
+
248
+ impl < Signer : Sign , K : Deref , L : Deref > OnionMessenger < Signer , K , L >
249
+ where K :: Target : KeysInterface < Signer = Signer > ,
250
+ L :: Target : Logger ,
251
+ {
252
+ /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
253
+ /// their respective handlers.
254
+ pub fn new ( keys_manager : K , logger : L ) -> Self {
255
+ let mut secp_ctx = Secp256k1 :: new ( ) ;
256
+ secp_ctx. seeded_randomize ( & keys_manager. get_secure_random_bytes ( ) ) ;
257
+ OnionMessenger {
258
+ keys_manager,
259
+ pending_msg_events : Mutex :: new ( Vec :: new ( ) ) ,
260
+ secp_ctx,
261
+ logger,
262
+ }
263
+ }
264
+ }
265
+
228
266
#[ inline]
229
267
fn construct_keys_callback <
230
268
T : secp256k1:: Signing + secp256k1:: Verification ,
@@ -300,3 +338,16 @@ fn construct_blinded_route_keys<T: secp256k1::Signing + secp256k1::Verification>
300
338
301
339
Ok ( ( encrypted_data_keys, blinded_node_pks) )
302
340
}
341
+
342
+ /// Useful for simplifying the parameters of [`SimpleArcChannelManager`] and
343
+ /// [`SimpleArcPeerManager`]. See their docs for more details.
344
+ ///
345
+ ///[`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
346
+ ///[`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
347
+ pub type SimpleArcOnionMessenger < L > = OnionMessenger < InMemorySigner , Arc < KeysManager > , Arc < L > > ;
348
+ /// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
349
+ /// [`SimpleRefPeerManager`]. See their docs for more details.
350
+ ///
351
+ ///[`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
352
+ ///[`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
353
+ pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < InMemorySigner , & ' a KeysManager , & ' b L > ;
0 commit comments