From f3db1ea15c6ef1aca1cafefae4ee0ac1d0d969e0 Mon Sep 17 00:00:00 2001 From: pm47 Date: Thu, 2 Mar 2017 17:03:50 +0100 Subject: [PATCH] moved extractOutgoingMessages to Helpers --- .../fr/acinq/eclair/channel/Channel.scala | 8 +-- .../fr/acinq/eclair/channel/Forwarder.scala | 60 ++++--------------- .../fr/acinq/eclair/channel/Helpers.scala | 30 +++++++++- 3 files changed, 44 insertions(+), 54 deletions(-) diff --git a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Channel.scala b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Channel.scala index 461aa8ec8..6175abed8 100644 --- a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Channel.scala +++ b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Channel.scala @@ -834,11 +834,11 @@ class Channel(nodeParams: NodeParams, remoteNodeId: PublicKey, blockchain: Actor } onTransition { - case previousState -> currentState => - if (currentState != previousState) { - context.system.eventStream.publish(ChannelStateChanged(self, context.parent, remoteNodeId, previousState, currentState, nextStateData)) + case state -> nextState => + if (nextState != state) { + context.system.eventStream.publish(ChannelStateChanged(self, context.parent, remoteNodeId, state, nextState, nextStateData)) } - forwarder ! StoreAndForward(previousState, currentState, stateData, nextStateData) + forwarder ! StoreAndForward(nextStateData, Helpers.extractOutgoingMessages(state, nextState, stateData, nextStateData)) } /* diff --git a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala index 481297eb7..7c760938a 100644 --- a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala +++ b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Forwarder.scala @@ -2,20 +2,19 @@ package fr.acinq.eclair.channel import akka.actor.{Actor, ActorLogging, ActorRef} import fr.acinq.eclair.NodeParams -import fr.acinq.eclair.db.Dbs -import fr.acinq.eclair.wire.{LightningMessage, Error} +import fr.acinq.eclair.wire.{Error, LightningMessage} /** * Created by fabrice on 27/02/17. */ -case class StoreAndForward(previousState: State, nextState: State, previousData: Data, currentData: Data) +case class StoreAndForward(stateData: Data, outgoing: Seq[LightningMessage]) class Forwarder(nodeParams: NodeParams) extends Actor with ActorLogging { - def receive = { - case destination: ActorRef => context become main(destination) - } + // caller is responsible for sending the destination before anything else + // the general case is that destination can die anytime and it is managed by the caller + def receive = main(context.system.deadLetters) def main(destination: ActorRef): Receive = { @@ -23,48 +22,11 @@ class Forwarder(nodeParams: NodeParams) extends Actor with ActorLogging { case error: Error => destination ! error - case StoreAndForward(previousState, nextState, previousData, nextData) => - val outgoing = Forwarder.extractOutgoingMessages(previousState, nextState, previousData, nextData) - if (outgoing.size > 0) { - log.debug(s"sending ${outgoing.map(_.getClass.getSimpleName).mkString(" ")}") - outgoing.foreach(destination forward _) - } - val (previousId, nextId) = (Helpers.getChannelId(previousData), Helpers.getChannelId(nextData)) - nodeParams.channelsDb.put(nextId, nextData) - if (previousId != nextId) { - nodeParams.channelsDb.delete(previousId) - } + case StoreAndForward(stateData: HasCommitments, outgoing) => + nodeParams.channelsDb.put(stateData.channelId, stateData) + outgoing.foreach(destination forward _) + + case StoreAndForward(_, outgoing) => + outgoing.foreach(destination forward _) } } - -object Forwarder { - - def extractOutgoingMessages(previousState: State, nextState: State, previousData: Data, currentData: Data): Seq[LightningMessage] = { - previousState match { - case OFFLINE => - (previousData, currentData) match { - case (_, d: DATA_WAIT_FOR_FUNDING_CONFIRMED) => d.lastSent.right.toSeq // NB: if we re-send the message and the other party didn't receive it they will return an error (see #120) - case (_, d: DATA_WAIT_FOR_FUNDING_LOCKED) => d.lastSent :: Nil - case (_, d: DATA_WAIT_FOR_ANN_SIGNATURES) => d.lastSent :: Nil - case (_: HasCommitments, d2: HasCommitments)=> d2.commitments.unackedMessages - case _ => Nil - } - case _ => - (previousData, currentData) match { - case (_, Nothing) => Nil - case (_, d: DATA_WAIT_FOR_OPEN_CHANNEL) => Nil - case (_, d: DATA_WAIT_FOR_ACCEPT_CHANNEL) => d.lastSent :: Nil - case (_, d: DATA_WAIT_FOR_FUNDING_INTERNAL) => Nil - case (_, d: DATA_WAIT_FOR_FUNDING_CREATED) => d.lastSent :: Nil - case (_, d: DATA_WAIT_FOR_FUNDING_SIGNED) => d.lastSent :: Nil - case (_, d: DATA_WAIT_FOR_FUNDING_CONFIRMED) => d.lastSent.right.toOption.map(_ :: Nil).getOrElse(Nil) - case (_, d: DATA_WAIT_FOR_FUNDING_LOCKED) => d.lastSent :: Nil - case (_, d: DATA_WAIT_FOR_ANN_SIGNATURES) => d.lastSent :: Nil - case (_, d: DATA_CLOSING) => Nil - case (d1: HasCommitments, d2: HasCommitments) => d2.commitments.unackedMessages diff d1.commitments.unackedMessages - case (_, _: HasCommitments) => ??? // eg: goto(CLOSING) - } - } - } - -} diff --git a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Helpers.scala b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Helpers.scala index a31d9a284..19f340c13 100644 --- a/eclair-node/src/main/scala/fr/acinq/eclair/channel/Helpers.scala +++ b/eclair-node/src/main/scala/fr/acinq/eclair/channel/Helpers.scala @@ -9,7 +9,7 @@ import fr.acinq.eclair.crypto.Generators import fr.acinq.eclair.transactions.Scripts._ import fr.acinq.eclair.transactions.Transactions._ import fr.acinq.eclair.transactions._ -import fr.acinq.eclair.wire.{ClosingSigned, UpdateAddHtlc, UpdateFulfillHtlc} +import fr.acinq.eclair.wire.{ClosingSigned, LightningMessage, UpdateAddHtlc, UpdateFulfillHtlc} import grizzled.slf4j.Logging import scala.util.{Failure, Success, Try} @@ -40,6 +40,34 @@ object Helpers { require(reserveToFundingRatio <= nodeParams.maxReserveToFundingRatio, s"channelReserveSatoshis too high: ratio=$reserveToFundingRatio max=${nodeParams.maxReserveToFundingRatio}") } + def extractOutgoingMessages(currentState: State, nextState: State, currentData: Data, nextData: Data): Seq[LightningMessage] = { + currentState match { + case OFFLINE => + (currentData, nextData) match { + case (_, d: DATA_WAIT_FOR_FUNDING_CONFIRMED) => d.lastSent.right.toSeq // NB: if we re-send the message and the other party didn't receive it they will return an error (see #120) + case (_, d: DATA_WAIT_FOR_FUNDING_LOCKED) => d.lastSent :: Nil + case (_, d: DATA_WAIT_FOR_ANN_SIGNATURES) => d.lastSent :: Nil + case (_: HasCommitments, d2: HasCommitments)=> d2.commitments.unackedMessages + case _ => Nil + } + case _ => + (currentData, nextData) match { + case (_, Nothing) => Nil + case (_, d: DATA_WAIT_FOR_OPEN_CHANNEL) => Nil + case (_, d: DATA_WAIT_FOR_ACCEPT_CHANNEL) => d.lastSent :: Nil + case (_, d: DATA_WAIT_FOR_FUNDING_INTERNAL) => Nil + case (_, d: DATA_WAIT_FOR_FUNDING_CREATED) => d.lastSent :: Nil + case (_, d: DATA_WAIT_FOR_FUNDING_SIGNED) => d.lastSent :: Nil + case (_, d: DATA_WAIT_FOR_FUNDING_CONFIRMED) => d.lastSent.right.toOption.map(_ :: Nil).getOrElse(Nil) + case (_, d: DATA_WAIT_FOR_FUNDING_LOCKED) => d.lastSent :: Nil + case (_, d: DATA_WAIT_FOR_ANN_SIGNATURES) => d.lastSent :: Nil + case (_, d: DATA_CLOSING) => Nil + case (d1: HasCommitments, d2: HasCommitments) => d2.commitments.unackedMessages diff d1.commitments.unackedMessages + case (_, _: HasCommitments) => ??? // eg: goto(CLOSING) + } + } + } + object Funding { def makeFundingInputInfo(fundingTxId: BinaryData, fundingTxOutputIndex: Int, fundingSatoshis: Satoshi, fundingPubkey1: PublicKey, fundingPubkey2: PublicKey): InputInfo = {