diff --git a/eclair-node/pom.xml b/eclair-node/pom.xml index 935ed61b6..c70400af7 100644 --- a/eclair-node/pom.xml +++ b/eclair-node/pom.xml @@ -102,6 +102,11 @@ lenses_${scala.version.short} 0.4 + + org.scodec + scodec-core_${scala.version.short} + 1.10.3 + org.clapper diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/sdc/Codecs.scala b/eclair-node/src/main/scala/fr/acinq/eclair/wire/Codecs.scala similarity index 81% rename from eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/sdc/Codecs.scala rename to eclair-node/src/main/scala/fr/acinq/eclair/wire/Codecs.scala index bedb727a4..69e4613a7 100644 --- a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/sdc/Codecs.scala +++ b/eclair-node/src/main/scala/fr/acinq/eclair/wire/Codecs.scala @@ -1,7 +1,7 @@ -package fr.acinq.eclair.wire.bolt2.sdc +package fr.acinq.eclair.wire import fr.acinq.bitcoin.BinaryData -import fr.acinq.eclair.wire.bolt2.custom._ +import fr.acinq.eclair.wire import scodec.bits.ByteVector import scodec.codecs._ import scodec.{Attempt, Codec, Err} @@ -59,15 +59,32 @@ object Codecs { val fundingLockedCodec: Codec[FundingLocked] = ( ("temporaryChannelId" | uint64) :: - ("channelId" | uint64) :: + ("channelId" | uint64) :: ("nextKeyOffset" | binarydata(32)) :: ("nextRevocationHalfKey" | binarydata(33))).as[FundingLocked] + val updateFeeCodec: Codec[UpdateFee] = ( + ("channelId" | uint64) :: + ("feeratePerKb" | uint32)).as[UpdateFee] + + val shutdownCodec: Codec[wire.Shutdown] = ( + ("channelId" | uint64) :: + ("len" | uint32) :: + ("scriptPubKey" | binarydata(32))).as[Shutdown] + + val closeSignatureCodec: Codec[CloseSignature] = ( + ("channelId" | uint64) :: + ("feeSatoshis" | uint64) :: + ("signature" | binarydata(64))).as[CloseSignature] + val lightningMessageCodec = discriminated[LightningMessage].by(uint32) .typecase(32L, openChannelCodec) .typecase(33L, acceptChannelCodec) .typecase(34L, fundingCreatedCodec) .typecase(35L, fundingSignedCodec) .typecase(36L, fundingLockedCodec) + .typecase(37L, updateFeeCodec) + .typecase(38L, shutdownCodec) + .typecase(39L, closeSignatureCodec) } diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/custom/OpenChannel.scala b/eclair-node/src/main/scala/fr/acinq/eclair/wire/OpenChannel.scala similarity index 89% rename from eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/custom/OpenChannel.scala rename to eclair-node/src/main/scala/fr/acinq/eclair/wire/OpenChannel.scala index eb6cacfd0..4287a6af3 100644 --- a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/custom/OpenChannel.scala +++ b/eclair-node/src/main/scala/fr/acinq/eclair/wire/OpenChannel.scala @@ -1,9 +1,9 @@ -package fr.acinq.eclair.wire.bolt2.custom +package fr.acinq.eclair.wire import java.io.{InputStream, OutputStream} -import fr.acinq.bitcoin.{BinaryData, BtcMessage} import fr.acinq.bitcoin.Protocol._ +import fr.acinq.bitcoin.{BinaryData, BtcMessage} /** * Created by PM on 15/11/2016. @@ -92,3 +92,14 @@ case class FundingLocked(temporaryChannelId: Long, channelId: Long, nextKeyOffset: BinaryData, nextRevocationHalfKey: BinaryData) extends ChannelMessage + +case class UpdateFee(channelId: Long, + feeratePerKb: Long) extends ChannelMessage + +case class Shutdown(channelId: Long, + len: Long, + scriptPubKey: BinaryData) extends ChannelMessage + +case class CloseSignature(channelId: Long, + feeSatoshis: Long, + signature: BinaryData) extends ChannelMessage \ No newline at end of file diff --git a/eclair-node/src/test/scala/fr/acinq/eclair/wire/CodecsSpec.scala b/eclair-node/src/test/scala/fr/acinq/eclair/wire/CodecsSpec.scala new file mode 100644 index 000000000..e621e6ff7 --- /dev/null +++ b/eclair-node/src/test/scala/fr/acinq/eclair/wire/CodecsSpec.scala @@ -0,0 +1,29 @@ +package fr.acinq.eclair.wire + +import fr.acinq.eclair.wire.Codecs.lightningMessageCodec +import org.junit.runner.RunWith +import org.scalatest.FunSuite +import org.scalatest.junit.JUnitRunner + +/** + * Created by PM on 31/05/2016. + */ +@RunWith(classOf[JUnitRunner]) +class CodecsSpec extends FunSuite { + + test("encode/decode all messages") { + + val open = OpenChannel(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, Array.fill[Byte](33)(1), Array.fill[Byte](33)(2), Array.fill[Byte](33)(3)) + val accept = AcceptChannel(2, 3, 4, 5, 6, 7, 8, Array.fill[Byte](32)(0), 9, Array.fill[Byte](33)(1), Array.fill[Byte](33)(2), Array.fill[Byte](33)(3)) + val funding_created = FundingCreated(2, Array.fill[Byte](32)(0), 3, Array.fill[Byte](64)(1)) + val funding_signed = FundingSigned(2, Array.fill[Byte](64)(1)) + val funding_locked = FundingLocked(1, 2, Array.fill[Byte](32)(1), Array.fill[Byte](33)(2)) + + val msgs: List[LightningMessage] = open :: accept :: funding_created :: funding_signed :: funding_locked :: Nil + + msgs.foreach { + case msg => assert(msg === lightningMessageCodec.encode(msg).flatMap(lightningMessageCodec.decode(_)).toOption.get.value) + } + } + +} diff --git a/eclair-wire/pom.xml b/eclair-wire/pom.xml deleted file mode 100644 index c1fcaa36c..000000000 --- a/eclair-wire/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - fr.acinq.eclair - eclair_2.11 - 0.2-SNAPSHOT - - - eclair-wire_2.11 - jar - - ${project.artifactId} - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - generate-sources - - add-source - - - - ${project.build.directory}/generated-sources/scala - - - - - - - - - - - org.scodec - scodec-core_${scala.version.short} - 1.10.3 - - - fr.acinq - bitcoin-lib_${scala.version.short} - ${bitcoinlib.version} - - - - diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/Test.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/Test.scala deleted file mode 100644 index 0be199ad1..000000000 --- a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/bolt2/Test.scala +++ /dev/null @@ -1,27 +0,0 @@ -package fr.acinq.eclair.wire.bolt2 - -import fr.acinq.eclair.wire.bolt2.custom._ -import fr.acinq.eclair.wire.bolt2.sdc.Codecs.lightningMessageCodec - - -/** - * Created by PM on 15/11/2016. - */ -object Test extends App { - - val open = OpenChannel(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, Array.fill[Byte](33)(1), Array.fill[Byte](33)(2), Array.fill[Byte](33)(3)) - val accept = AcceptChannel(2, 3, 4, 5, 6, 7, 8, Array.fill[Byte](32)(0), 9, Array.fill[Byte](33)(1), Array.fill[Byte](33)(2), Array.fill[Byte](33)(3)) - val funding_created = FundingCreated(2, Array.fill[Byte](32)(0), 3, Array.fill[Byte](64)(1)) - val funding_signed = FundingSigned(2, Array.fill[Byte](64)(1)) - val funding_locked = FundingLocked(1, 2, Array.fill[Byte](32)(1), Array.fill[Byte](33)(2)) - - val msgs: List[LightningMessage] = open :: accept :: funding_created :: funding_signed :: funding_locked :: Nil - - msgs.foreach { - case msg => - val bin = lightningMessageCodec.encode(msg) - println(bin) - println(bin.flatMap(lightningMessageCodec.decode(_))) - } - -} diff --git a/pom.xml b/pom.xml index 3ecc6a263..2255c9799 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,6 @@ pom - eclair-wire lightning-types eclair-node