1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-13 19:37:35 +01:00

[OpenChannel] Use TLV for channel version (#1534)

We were previously using an encoding that was incompatible with TLV.
We keep the old format, but also understand the channel version when provided
in a TLV field.

If the old format is provided, it will be preferred.
This commit is contained in:
Bastien Teinturier 2020-10-08 11:07:27 +02:00 committed by GitHub
parent 0850b084ce
commit e8bf5d1048
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 7 deletions

View file

@ -45,7 +45,11 @@ object OpenChannelTlv {
val openTlvCodec: Codec[TlvStream[OpenChannelTlv]] = tlvStream(discriminated[OpenChannelTlv].by(varint) val openTlvCodec: Codec[TlvStream[OpenChannelTlv]] = tlvStream(discriminated[OpenChannelTlv].by(varint)
.typecase(UInt64(0), variableSizeBytesLong(varintoverflow, bytes).as[UpfrontShutdownScript]) .typecase(UInt64(0), variableSizeBytesLong(varintoverflow, bytes).as[UpfrontShutdownScript])
// TODO: @t-bast: once enough active Phoenix users have upgraded to versions > 1.3.3, we should configure the ACINQ
// node to write with the new encoding (0x47000001).
// Once that's done, we can remove the old encoding below (0x47000000) for future Phoenix upgrades.
.typecase(UInt64(0x47000000), bits(ChannelVersion.LENGTH_BITS).as[ChannelVersion].as[ChannelVersionTlv]) .typecase(UInt64(0x47000000), bits(ChannelVersion.LENGTH_BITS).as[ChannelVersion].as[ChannelVersionTlv])
.typecase(UInt64(0x47000001), variableSizeBytesLong(varintoverflow, bits(ChannelVersion.LENGTH_BITS)).as[ChannelVersion].as[ChannelVersionTlv])
) )
} }

View file

@ -19,19 +19,24 @@ package fr.acinq.eclair.wire
import fr.acinq.eclair.channel.ChannelVersion import fr.acinq.eclair.channel.ChannelVersion
import fr.acinq.eclair.wire.OpenChannelTlv.ChannelVersionTlv import fr.acinq.eclair.wire.OpenChannelTlv.ChannelVersionTlv
import org.scalatest.funsuite.AnyFunSuite import org.scalatest.funsuite.AnyFunSuite
import scodec.{Attempt, DecodeResult}
import scodec.bits._ import scodec.bits._
import scodec.{Attempt, DecodeResult}
class OpenTlvSpec extends AnyFunSuite { class OpenTlvSpec extends AnyFunSuite {
test("channel version tlv") { test("channel version tlv") {
case class TestCase(expected: ChannelVersion, encoded: BitVector, reEncoded: BitVector)
val refs = Map( val testCases = Seq(
ChannelVersion.STANDARD -> hex"fe47000000 00000001".bits, TestCase(ChannelVersion.STANDARD, hex"fe47000000 00000001".bits, hex"fe47000000 00000001".bits),
(ChannelVersion.STANDARD | ChannelVersion.ZERO_RESERVE) -> hex"fe47000000 00000009".bits TestCase(ChannelVersion.STANDARD, hex"fe47000001 04 00000001".bits, hex"fe47000000 00000001".bits),
TestCase(ChannelVersion.STANDARD | ChannelVersion.ZERO_RESERVE, hex"fe47000000 00000009".bits, hex"fe47000000 00000009".bits),
TestCase(ChannelVersion.STANDARD | ChannelVersion.ZERO_RESERVE, hex"fe47000001 04 00000009".bits, hex"fe47000000 00000009".bits)
) )
refs.foreach { case (cv, bits) => assert(OpenChannelTlv.openTlvCodec.encode(TlvStream(ChannelVersionTlv(cv))) === Attempt.Successful(bits)) } for (testCase <- testCases) {
refs.foreach { case (cv, bits) => assert(OpenChannelTlv.openTlvCodec.decode(bits) === Attempt.successful(DecodeResult(TlvStream(ChannelVersionTlv(cv)), BitVector.empty))) } assert(OpenChannelTlv.openTlvCodec.decode(testCase.encoded) === Attempt.successful(DecodeResult(TlvStream(ChannelVersionTlv(testCase.expected)), BitVector.empty)))
assert(OpenChannelTlv.openTlvCodec.encode(TlvStream(ChannelVersionTlv(testCase.expected))) === Attempt.Successful(testCase.reEncoded))
}
} }
} }