From 4638578ce9a50777ca45b61e2154fa4e6b0331a4 Mon Sep 17 00:00:00 2001 From: dpad85 <5765435+dpad85@users.noreply.github.com> Date: Tue, 21 Jul 2020 17:03:32 +0200 Subject: [PATCH] Add support for FCM custom token (bit 35017) When sending this message to a peer, the node expects the peer to link the token with its own pubkey, and use fcm to wake him up when needed. --- .../src/main/scala/fr/acinq/eclair/io/Peer.scala | 7 ++++++- .../main/scala/fr/acinq/eclair/io/Switchboard.scala | 6 ++++++ .../acinq/eclair/wire/LightningMessageCodecs.scala | 13 +++++++++---- .../acinq/eclair/wire/LightningMessageTypes.scala | 4 +++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala index d082c6268..79fea0691 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala @@ -146,6 +146,11 @@ class Peer(val nodeParams: NodeParams, remoteNodeId: PublicKey, watcher: ActorRe context.system.eventStream.publish(swapOutResponse) stay + case Event(f: SendFCMToken, d: ConnectedData) => + log.info(s"peer forwarding $f to peerConnection") + d.peerConnection ! FCMToken(f.token) + stay + case Event(c: Peer.OpenChannel, d: ConnectedData) => if (c.fundingSatoshis >= Channel.MAX_FUNDING && !nodeParams.features.hasFeature(Wumbo)) { sender ! Status.Failure(new RuntimeException(s"fundingSatoshis=${c.fundingSatoshis} is too big, you must enable large channels support in 'eclair.features' to use funding above ${Channel.MAX_FUNDING} (see eclair.conf)")) @@ -486,7 +491,7 @@ object Peer { case class SendSwapOutRequest(nodeId: PublicKey, amountSatoshis: Satoshi, bitcoinAddress: String, feeratePerKw: Long) case class SendSwapInRequest(nodeId: PublicKey) - + case class SendFCMToken(nodeId: PublicKey, token: String) // @formatter:on def makeChannelParams(nodeParams: NodeParams, defaultFinalScriptPubkey: ByteVector, localPaymentBasepoint: Option[PublicKey], isFunder: Boolean, fundingAmount: Satoshi): LocalParams = { diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/io/Switchboard.scala b/eclair-core/src/main/scala/fr/acinq/eclair/io/Switchboard.scala index 16bb9a10b..33ae1a9f2 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/io/Switchboard.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/io/Switchboard.scala @@ -81,6 +81,12 @@ class Switchboard(nodeParams: NodeParams, watcher: ActorRef, relayer: ActorRef, case None => sender ! Status.Failure(new RuntimeException("no connection to peer")) } + case f: Peer.SendFCMToken => + getPeer(f.nodeId) match { + case Some(peer) => peer forward f + case None => log.error(s"could not register fcm token=${f.token} with unknown peer=${f.nodeId}") + } + case authenticated: PeerConnection.Authenticated => // if this is an incoming connection, we might not yet have created the peer val peer = createOrGetPeer(authenticated.remoteNodeId, offlineChannels = Set.empty) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala index 1b689071c..8d749317e 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala @@ -63,7 +63,7 @@ object LightningMessageCodecs { val magic: Codec[Boolean] = recover(constant(hex"fe 47010000")) // we have limited space for backup, largest message is commit_sig with 30 htlcs in each direction: 65535B - (32B + 64B + 2*30*64B) = 61599B ~= 60000B - val channeldataoptional: Codec[Option[ByteVector]] = choice(optional(magic, limitedSizeBytes( 60000, variableSizeBytesLong(varintoverflow, bytes))), provide(Option.empty[ByteVector])) + val channeldataoptional: Codec[Option[ByteVector]] = choice(optional(magic, limitedSizeBytes(60000, variableSizeBytesLong(varintoverflow, bytes))), provide(Option.empty[ByteVector])) val channelReestablishCodec: Codec[ChannelReestablish] = ( ("channelId" | bytes32) :: @@ -347,6 +347,9 @@ object LightningMessageCodecs { // + val fcmTokenCodec: Codec[FCMToken] = + ("fcmToken" | variableSizeBytes(uint16, utf8)).as[FCMToken] + val lightningMessageCodec = discriminated[LightningMessage].by(uint16) .typecase(16, initCodec) .typecase(17, errorCodec) @@ -376,15 +379,15 @@ object LightningMessageCodecs { .typecase(263, queryChannelRangeCodec) .typecase(264, replyChannelRangeCodec) .typecase(265, gossipTimestampFilterCodec) - // NB: blank lines to minimize merge conflicts + // NB: blank lines to minimize merge conflicts .typecase(35001, payToOpenRequestCodec) .typecase(35003, payToOpenResponseCodec) - // + // .typecase(35005, swapInPendingCodec) .typecase(35007, swapInRequestCodec) .typecase(35009, swapInResponseCodec) .typecase(35015, swapInConfirmedCodec) - // + // .typecase(35011, swapOutRequestCodec) .typecase(35013, swapOutResponseCodec) // @@ -393,6 +396,8 @@ object LightningMessageCodecs { // + .typecase(35017, fcmTokenCodec) + val meteredLightningMessageCodec = Codec[LightningMessage]( (msg: LightningMessage) => KamonExt.time(Metrics.EncodeDuration.withTag(Tags.MessageType, msg.getClass.getSimpleName))(lightningMessageCodec.encode(msg)), (bits: BitVector) => { diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala index eb4ae946c..25118c010 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala @@ -374,4 +374,6 @@ case class SwapOutResponse(chainHash: ByteVector32, // -// \ No newline at end of file +// + +case class FCMToken(token: String) extends LightningMessage