mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-26 17:52:25 +01:00
In this commit, we add a new TLV record that's intended to be used as an explicit channel commitment type for a new form of funding negotiation, and later on a dynamic commitment upgrade protocol. As defined, we have 3 channel types: base (the OG), tweakless, and anchors w/ zero fee HTLCs. We omit the original variant of anchors as it was never truly deployed from the PoV of lnd.
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package lnwire
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/lightningnetwork/lnd/tlv"
|
|
)
|
|
|
|
const (
|
|
// ChannelTypeRecordType is the type of the experimental record used
|
|
// to denote which channel type is being negotiated.
|
|
ChannelTypeRecordType tlv.Type = 1
|
|
)
|
|
|
|
// ChannelType represents a specific channel type as a set of feature bits that
|
|
// comprise it.
|
|
type ChannelType RawFeatureVector
|
|
|
|
// featureBitLen returns the length in bytes of the encoded feature bits.
|
|
func (c ChannelType) featureBitLen() uint64 {
|
|
fv := RawFeatureVector(c)
|
|
return uint64(fv.SerializeSize())
|
|
}
|
|
|
|
// Record returns a TLV record that can be used to encode/decode the channel
|
|
// type from a given TLV stream.
|
|
func (c *ChannelType) Record() tlv.Record {
|
|
return tlv.MakeDynamicRecord(
|
|
ChannelTypeRecordType, c, c.featureBitLen, channelTypeEncoder,
|
|
channelTypeDecoder,
|
|
)
|
|
}
|
|
|
|
// channelTypeEncoder is a custom TLV encoder for the ChannelType record.
|
|
func channelTypeEncoder(w io.Writer, val interface{}, buf *[8]byte) error {
|
|
if v, ok := val.(*ChannelType); ok {
|
|
// Encode the feature bits as a byte slice without its length
|
|
// prepended, as that's already taken care of by the TLV record.
|
|
fv := RawFeatureVector(*v)
|
|
return fv.encode(w, fv.SerializeSize(), 8)
|
|
}
|
|
|
|
return tlv.NewTypeForEncodingErr(val, "lnwire.ChannelType")
|
|
}
|
|
|
|
// channelTypeDecoder is a custom TLV decoder for the ChannelType record.
|
|
func channelTypeDecoder(r io.Reader, val interface{}, buf *[8]byte, l uint64) error {
|
|
if v, ok := val.(*ChannelType); ok {
|
|
fv := NewRawFeatureVector()
|
|
if err := fv.decode(r, int(l), 8); err != nil {
|
|
return err
|
|
}
|
|
*v = ChannelType(*fv)
|
|
return nil
|
|
}
|
|
|
|
return tlv.NewTypeForEncodingErr(val, "lnwire.ChannelType")
|
|
}
|