Skip to content

Commit 9915134

Browse files
Roasbeefguggero
authored andcommitted
contractcourt: add CommitBlob to taprootBriefcase
This'll be used to store the extra resolution information for the commitment outputs.
1 parent 0b6a7ce commit 9915134

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

contractcourt/briefcase.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import (
1010
"github.com/btcsuite/btcd/txscript"
1111
"github.com/btcsuite/btcd/wire"
1212
"github.com/lightningnetwork/lnd/channeldb"
13+
"github.com/lightningnetwork/lnd/fn"
1314
"github.com/lightningnetwork/lnd/input"
1415
"github.com/lightningnetwork/lnd/kvdb"
1516
"github.com/lightningnetwork/lnd/lnwallet"
17+
"github.com/lightningnetwork/lnd/tlv"
1618
)
1719

1820
// ContractResolutions is a wrapper struct around the two forms of resolutions
@@ -1554,6 +1556,12 @@ func encodeTaprootAuxData(w io.Writer, c *ContractResolutions) error {
15541556
commitSignDesc := commitResolution.SelfOutputSignDesc
15551557
//nolint:lll
15561558
tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock = commitSignDesc.ControlBlock
1559+
1560+
c.CommitResolution.ResolutionBlob.WhenSome(func(b []byte) {
1561+
tapCase.SettledCommitBlob = tlv.SomeRecordT(
1562+
tlv.NewPrimitiveRecord[tlv.TlvType2](b),
1563+
)
1564+
})
15571565
}
15581566

15591567
for _, htlc := range c.HtlcResolutions.IncomingHTLCs {
@@ -1640,6 +1648,10 @@ func decodeTapRootAuxData(r io.Reader, c *ContractResolutions) error {
16401648
if c.CommitResolution != nil {
16411649
c.CommitResolution.SelfOutputSignDesc.ControlBlock =
16421650
tapCase.CtrlBlocks.Val.CommitSweepCtrlBlock
1651+
1652+
tapCase.SettledCommitBlob.WhenSomeV(func(b []byte) {
1653+
c.CommitResolution.ResolutionBlob = fn.Some(b)
1654+
})
16431655
}
16441656

16451657
for i := range c.HtlcResolutions.IncomingHTLCs {

contractcourt/taproot_briefcase.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ type taprootBriefcase struct {
2929
// are to be spent via a keyspend path. This includes anchors, and any
3030
// revocation paths.
3131
TapTweaks tlv.RecordT[tlv.TlvType1, tapTweaks]
32+
33+
// SettledCommitBlob is an optional record that contains an opaque blob
34+
// that may be used to properly sweep commitment outputs on a force
35+
// close transaction.
36+
SettledCommitBlob tlv.OptionalRecordT[tlv.TlvType2, tlv.Blob]
37+
38+
// BreachCommitBlob is an optional record that contains an opaque blob
39+
// used to sweep a remote party's breached output.
40+
BreachedCommitBlob tlv.OptionalRecordT[tlv.TlvType3, tlv.Blob]
41+
42+
// TODO(roasbeef): htlc blobs
3243
}
3344

3445
// TODO(roasbeef): morph into new tlv record
@@ -47,6 +58,18 @@ func (t *taprootBriefcase) EncodeRecords() []tlv.Record {
4758
records := []tlv.Record{
4859
t.CtrlBlocks.Record(), t.TapTweaks.Record(),
4960
}
61+
62+
t.SettledCommitBlob.WhenSome(
63+
func(r tlv.RecordT[tlv.TlvType2, tlv.Blob]) {
64+
records = append(records, r.Record())
65+
},
66+
)
67+
t.BreachedCommitBlob.WhenSome(
68+
func(r tlv.RecordT[tlv.TlvType3, tlv.Blob]) {
69+
records = append(records, r.Record())
70+
},
71+
)
72+
5073
return records
5174
}
5275

@@ -69,16 +92,29 @@ func (t *taprootBriefcase) Encode(w io.Writer) error {
6992

7093
// Decode decodes the given reader into the target struct.
7194
func (t *taprootBriefcase) Decode(r io.Reader) error {
72-
stream, err := tlv.NewStream(t.DecodeRecords()...)
95+
settledCommitBlob := t.SettledCommitBlob.Zero()
96+
breachedCommitBlob := t.BreachedCommitBlob.Zero()
97+
records := append(
98+
t.DecodeRecords(), settledCommitBlob.Record(),
99+
breachedCommitBlob.Record(),
100+
)
101+
stream, err := tlv.NewStream(records...)
73102
if err != nil {
74103
return err
75104
}
76105

77-
_, err = stream.DecodeWithParsedTypes(r)
106+
typeMap, err := stream.DecodeWithParsedTypes(r)
78107
if err != nil {
79108
return err
80109
}
81110

111+
if val, ok := typeMap[t.SettledCommitBlob.TlvType()]; ok && val == nil {
112+
t.SettledCommitBlob = tlv.SomeRecordT(settledCommitBlob)
113+
}
114+
if v, ok := typeMap[t.BreachedCommitBlob.TlvType()]; ok && v == nil {
115+
t.BreachedCommitBlob = tlv.SomeRecordT(breachedCommitBlob)
116+
}
117+
82118
return nil
83119
}
84120

contractcourt/taproot_briefcase_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ func TestTaprootBriefcase(t *testing.T) {
7070
_, err = rand.Read(anchorTweak[:])
7171
require.NoError(t, err)
7272

73+
var commitBlob [100]byte
74+
_, err = rand.Read(commitBlob[:])
75+
require.NoError(t, err)
76+
7377
testCase := &taprootBriefcase{
7478
CtrlBlocks: tlv.NewRecordT[tlv.TlvType0](ctrlBlocks{
7579
CommitSweepCtrlBlock: sweepCtrlBlock[:],
@@ -83,6 +87,12 @@ func TestTaprootBriefcase(t *testing.T) {
8387
BreachedHtlcTweaks: randHtlcTweaks(t),
8488
BreachedSecondLevelHltcTweaks: randHtlcTweaks(t),
8589
}),
90+
SettledCommitBlob: tlv.SomeRecordT(
91+
tlv.NewPrimitiveRecord[tlv.TlvType2](commitBlob[:]),
92+
),
93+
BreachedCommitBlob: tlv.SomeRecordT(
94+
tlv.NewPrimitiveRecord[tlv.TlvType3](commitBlob[:]),
95+
),
8696
}
8797

8898
var b bytes.Buffer

0 commit comments

Comments
 (0)