lnwire: update the ChannelAnnouncement message to match BOLT-0007
This commit is contained in:
parent
e93197b303
commit
f47e7a9bf4
@ -5,6 +5,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/roasbeef/btcd/btcec"
|
"github.com/roasbeef/btcd/btcec"
|
||||||
|
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ChannelAnnouncement message is used to announce the existence of a channel
|
// ChannelAnnouncement message is used to announce the existence of a channel
|
||||||
@ -24,7 +25,18 @@ type ChannelAnnouncement struct {
|
|||||||
BitcoinSig1 *btcec.Signature
|
BitcoinSig1 *btcec.Signature
|
||||||
BitcoinSig2 *btcec.Signature
|
BitcoinSig2 *btcec.Signature
|
||||||
|
|
||||||
// ShortChannelID is the unique description of the funding transaction.
|
// Features is the feature vector that encodes the features supported
|
||||||
|
// by the target node. This field can be used to signal the type of the
|
||||||
|
// channel, or modifications to the fields that would normally follow
|
||||||
|
// this vector.
|
||||||
|
Features *FeatureVector
|
||||||
|
|
||||||
|
// ChainHash denotes the target chain that this channel was opened
|
||||||
|
// within. This value should be the genesis hash of the target chain.
|
||||||
|
ChainHash chainhash.Hash
|
||||||
|
|
||||||
|
// ShortChannelID is the unique description of the funding transaction,
|
||||||
|
// or where exactly it's located within the target blockchain.
|
||||||
ShortChannelID ShortChannelID
|
ShortChannelID ShortChannelID
|
||||||
|
|
||||||
// The public keys of the two nodes who are operating the channel, such
|
// The public keys of the two nodes who are operating the channel, such
|
||||||
@ -51,9 +63,11 @@ func (a *ChannelAnnouncement) Decode(r io.Reader, pver uint32) error {
|
|||||||
return readElements(r,
|
return readElements(r,
|
||||||
&a.NodeSig1,
|
&a.NodeSig1,
|
||||||
&a.NodeSig2,
|
&a.NodeSig2,
|
||||||
&a.ShortChannelID,
|
|
||||||
&a.BitcoinSig1,
|
&a.BitcoinSig1,
|
||||||
&a.BitcoinSig2,
|
&a.BitcoinSig2,
|
||||||
|
&a.Features,
|
||||||
|
a.ChainHash[:],
|
||||||
|
&a.ShortChannelID,
|
||||||
&a.NodeID1,
|
&a.NodeID1,
|
||||||
&a.NodeID2,
|
&a.NodeID2,
|
||||||
&a.BitcoinKey1,
|
&a.BitcoinKey1,
|
||||||
@ -69,9 +83,11 @@ func (a *ChannelAnnouncement) Encode(w io.Writer, pver uint32) error {
|
|||||||
return writeElements(w,
|
return writeElements(w,
|
||||||
a.NodeSig1,
|
a.NodeSig1,
|
||||||
a.NodeSig2,
|
a.NodeSig2,
|
||||||
a.ShortChannelID,
|
|
||||||
a.BitcoinSig1,
|
a.BitcoinSig1,
|
||||||
a.BitcoinSig2,
|
a.BitcoinSig2,
|
||||||
|
a.Features,
|
||||||
|
a.ChainHash[:],
|
||||||
|
a.ShortChannelID,
|
||||||
a.NodeID1,
|
a.NodeID1,
|
||||||
a.NodeID2,
|
a.NodeID2,
|
||||||
a.BitcoinKey1,
|
a.BitcoinKey1,
|
||||||
@ -100,15 +116,21 @@ func (a *ChannelAnnouncement) MaxPayloadLength(pver uint32) uint32 {
|
|||||||
// NodeSig2 - 64 bytes
|
// NodeSig2 - 64 bytes
|
||||||
length += 64
|
length += 64
|
||||||
|
|
||||||
// ShortChannelID - 8 bytes
|
|
||||||
length += 8
|
|
||||||
|
|
||||||
// BitcoinSig1 - 64 bytes
|
// BitcoinSig1 - 64 bytes
|
||||||
length += 64
|
length += 64
|
||||||
|
|
||||||
// BitcoinSig2 - 64 bytes
|
// BitcoinSig2 - 64 bytes
|
||||||
length += 64
|
length += 64
|
||||||
|
|
||||||
|
// Features (max possible features)
|
||||||
|
length += 65096
|
||||||
|
|
||||||
|
// ChainHash - 32 bytes
|
||||||
|
length += 32
|
||||||
|
|
||||||
|
// ShortChannelID - 8 bytes
|
||||||
|
length += 8
|
||||||
|
|
||||||
// NodeID1 - 33 bytes
|
// NodeID1 - 33 bytes
|
||||||
length += 33
|
length += 33
|
||||||
|
|
||||||
@ -124,12 +146,14 @@ func (a *ChannelAnnouncement) MaxPayloadLength(pver uint32) uint32 {
|
|||||||
return length
|
return length
|
||||||
}
|
}
|
||||||
|
|
||||||
// DataToSign is used to retrieve part of the announcement message which
|
// DataToSign is used to retrieve part of the announcement message which should
|
||||||
// should be signed.
|
// be signed.
|
||||||
func (a *ChannelAnnouncement) DataToSign() ([]byte, error) {
|
func (a *ChannelAnnouncement) DataToSign() ([]byte, error) {
|
||||||
// We should not include the signatures itself.
|
// We should not include the signatures itself.
|
||||||
var w bytes.Buffer
|
var w bytes.Buffer
|
||||||
err := writeElements(&w,
|
err := writeElements(&w,
|
||||||
|
a.Features,
|
||||||
|
a.ChainHash[:],
|
||||||
a.ShortChannelID,
|
a.ShortChannelID,
|
||||||
a.NodeID1,
|
a.NodeID1,
|
||||||
a.NodeID2,
|
a.NodeID2,
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"testing/quick"
|
"testing/quick"
|
||||||
|
|
||||||
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/roasbeef/btcd/btcec"
|
"github.com/roasbeef/btcd/btcec"
|
||||||
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
"github.com/roasbeef/btcd/chaincfg/chainhash"
|
||||||
"github.com/roasbeef/btcd/wire"
|
"github.com/roasbeef/btcd/wire"
|
||||||
@ -345,7 +346,9 @@ func TestLightningWireProtocol(t *testing.T) {
|
|||||||
MsgChannelAnnouncement: func(v []reflect.Value, r *rand.Rand) {
|
MsgChannelAnnouncement: func(v []reflect.Value, r *rand.Rand) {
|
||||||
req := ChannelAnnouncement{
|
req := ChannelAnnouncement{
|
||||||
ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())),
|
ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())),
|
||||||
|
Features: randFeatureVector(r),
|
||||||
}
|
}
|
||||||
|
req.Features.featuresMap = nil
|
||||||
req.NodeSig1 = testSig
|
req.NodeSig1 = testSig
|
||||||
req.NodeSig2 = testSig
|
req.NodeSig2 = testSig
|
||||||
req.BitcoinSig1 = testSig
|
req.BitcoinSig1 = testSig
|
||||||
@ -372,6 +375,10 @@ func TestLightningWireProtocol(t *testing.T) {
|
|||||||
t.Fatalf("unable to generate key: %v", err)
|
t.Fatalf("unable to generate key: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if _, err := r.Read(req.ChainHash[:]); err != nil {
|
||||||
|
t.Fatalf("unable to generate chain hash: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
v[0] = reflect.ValueOf(req)
|
v[0] = reflect.ValueOf(req)
|
||||||
},
|
},
|
||||||
@ -416,6 +423,10 @@ func TestLightningWireProtocol(t *testing.T) {
|
|||||||
BaseFee: uint32(r.Int31()),
|
BaseFee: uint32(r.Int31()),
|
||||||
FeeRate: uint32(r.Int31()),
|
FeeRate: uint32(r.Int31()),
|
||||||
}
|
}
|
||||||
|
if _, err := r.Read(req.ChainHash[:]); err != nil {
|
||||||
|
t.Fatalf("unable to generate chain hash: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
v[0] = reflect.ValueOf(req)
|
v[0] = reflect.ValueOf(req)
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user