diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecs.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecs.scala index f506a3cc57..d8d5a32d1e 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecs.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecs.scala @@ -278,6 +278,10 @@ object LightningMessageCodecs { ("htlcSignatures" | listofsignatures) :: ("tlvStream" | CommitSigTlv.commitSigTlvCodec)).as[CommitSig] + // This isn't a "real" lightning codec, as we send each commit_sig individually to our peers. + // But it's necessary to send CommitSigBatch objects to front machines when the cluster mode is used. + val commitSigBatchCodec: Codec[CommitSigBatch] = listOfN(uint16, lengthDelimited(commitSigCodec)).xmap(sigs => CommitSigBatch(sigs.toSeq), batch => batch.messages.toList) + val revokeAndAckCodec: Codec[RevokeAndAck] = ( ("channelId" | bytes32) :: ("perCommitmentSecret" | privateKey) :: @@ -567,7 +571,7 @@ object LightningMessageCodecs { // .typecase(39409, recommendedFeeratesCodec) // - + .typecase(53011, commitSigBatchCodec) // // diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecsSpec.scala b/eclair-core/src/test/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecsSpec.scala index 589ca88ece..4a3e13b9d0 100644 --- a/eclair-core/src/test/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecsSpec.scala +++ b/eclair-core/src/test/scala/fr/acinq/eclair/wire/protocol/LightningMessageCodecsSpec.scala @@ -27,7 +27,7 @@ import fr.acinq.eclair._ import fr.acinq.eclair.blockchain.fee.FeeratePerKw import fr.acinq.eclair.channel.ChannelSpendSignature.{IndividualSignature, PartialSignatureWithNonce} import fr.acinq.eclair.channel.ChannelTypes.SimpleTaprootChannelsPhoenix -import fr.acinq.eclair.channel.{ChannelFlags, ChannelTypes} +import fr.acinq.eclair.channel.{ChannelFlags, ChannelSpendSignature, ChannelTypes} import fr.acinq.eclair.json.JsonSerializers import fr.acinq.eclair.reputation.Reputation import fr.acinq.eclair.router.Announcements @@ -696,6 +696,18 @@ class LightningMessageCodecsSpec extends AnyFunSuite { } } + test("encode/decode commit_sig batch") { + val channelId = randomBytes32() + val batch = CommitSigBatch(Seq( + CommitSig(channelId, ChannelSpendSignature.IndividualSignature(randomBytes64()), Nil, batchSize = 3), + CommitSig(channelId, ChannelSpendSignature.IndividualSignature(randomBytes64()), Nil, batchSize = 3), + CommitSig(channelId, ChannelSpendSignature.IndividualSignature(randomBytes64()), Nil, batchSize = 3), + )) + val encoded = lightningMessageCodec.encode(batch).require + val decoded = lightningMessageCodec.decode(encoded).require.value + assert(decoded == batch) + } + test("unknown messages") { // Non-standard tag number so this message can only be handled by a codec with a fallback val unknown = UnknownMessage(tag = 47282, data = ByteVector32.Zeroes.bytes)