contractcourt: add CommitBlob to taprootBriefcase

This'll be used to store the extra resolution information for the
commitment outputs.
This commit is contained in:
Olaoluwa Osuntokun 2024-06-03 22:56:06 -07:00
parent 5a5669d63a
commit 808a61739a
3 changed files with 37 additions and 2 deletions

View file

@ -10,9 +10,11 @@ import (
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/lightningnetwork/lnd/channeldb"
"github.com/lightningnetwork/lnd/fn"
"github.com/lightningnetwork/lnd/input"
"github.com/lightningnetwork/lnd/kvdb"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/tlv"
)
// ContractResolutions is a wrapper struct around the two forms of resolutions
@ -1554,6 +1556,12 @@ func encodeTaprootAuxData(w io.Writer, c *ContractResolutions) error {
commitSignDesc := commitResolution.SelfOutputSignDesc
//nolint:lll
tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock = commitSignDesc.ControlBlock
c.CommitResolution.ResolutionBlob.WhenSome(func(b []byte) {
tapCase.CommitBlob = tlv.SomeRecordT(
tlv.NewPrimitiveRecord[tlv.TlvType2](b),
)
})
}
for _, htlc := range c.HtlcResolutions.IncomingHTLCs {
@ -1640,6 +1648,10 @@ func decodeTapRootAuxData(r io.Reader, c *ContractResolutions) error {
if c.CommitResolution != nil {
c.CommitResolution.SelfOutputSignDesc.ControlBlock =
tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock
tapCase.CommitBlob.WhenSomeV(func(b []byte) {
c.CommitResolution.ResolutionBlob = fn.Some(b)
})
}
for i := range c.HtlcResolutions.IncomingHTLCs {

View file

@ -29,6 +29,11 @@ type taprootBriefcase struct {
// are to be spent via a keyspend path. This includes anchors, and any
// revocation paths.
TapTweaks tlv.RecordT[tlv.TlvType1, tapTweaks]
// CommitBlob is an optional record that contains an opaque blob that
// may be used to properly sweep commitment outputs on a force close
// transaction.
CommitBlob tlv.OptionalRecordT[tlv.TlvType2, tlv.Blob]
}
// TODO(roasbeef): morph into new tlv record
@ -47,6 +52,11 @@ func (t *taprootBriefcase) EncodeRecords() []tlv.Record {
records := []tlv.Record{
t.CtrlBlocks.Record(), t.TapTweaks.Record(),
}
t.CommitBlob.WhenSome(func(r tlv.RecordT[tlv.TlvType2, tlv.Blob]) {
records = append(records, r.Record())
})
return records
}
@ -69,16 +79,22 @@ func (t *taprootBriefcase) Encode(w io.Writer) error {
// Decode decodes the given reader into the target struct.
func (t *taprootBriefcase) Decode(r io.Reader) error {
stream, err := tlv.NewStream(t.DecodeRecords()...)
commitBlob := t.CommitBlob.Zero()
records := append(t.DecodeRecords(), commitBlob.Record())
stream, err := tlv.NewStream(records...)
if err != nil {
return err
}
_, err = stream.DecodeWithParsedTypes(r)
typeMap, err := stream.DecodeWithParsedTypes(r)
if err != nil {
return err
}
if val, ok := typeMap[t.CommitBlob.TlvType()]; ok && val == nil {
t.CommitBlob = tlv.SomeRecordT(commitBlob)
}
return nil
}

View file

@ -70,6 +70,10 @@ func TestTaprootBriefcase(t *testing.T) {
_, err = rand.Read(anchorTweak[:])
require.NoError(t, err)
var commitBlob [100]byte
_, err = rand.Read(commitBlob[:])
require.NoError(t, err)
testCase := &taprootBriefcase{
CtrlBlocks: tlv.NewRecordT[tlv.TlvType0](ctrlBlocks{
CommitSweepCtrlBlock: sweepCtrlBlock[:],
@ -83,6 +87,9 @@ func TestTaprootBriefcase(t *testing.T) {
BreachedHtlcTweaks: randHtlcTweaks(t),
BreachedSecondLevelHltcTweaks: randHtlcTweaks(t),
}),
CommitBlob: tlv.SomeRecordT(
tlv.NewPrimitiveRecord[tlv.TlvType2](commitBlob[:]),
),
}
var b bytes.Buffer