diff --git a/lnwallet/channel.go b/lnwallet/channel.go index ab7f31dc..c5d40a37 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -1804,7 +1804,7 @@ func (lc *LightningChannel) RevokeCurrentCommitment() (*lnwire.RevokeAndAck, err // ACK'd index within the log to right at this set of pending changes. lc.remoteUpdateLog.ackTransition() - revocationMsg.ChannelPoint = *lc.channelState.ChanID + revocationMsg.ChanID = lnwire.NewChanIDFromOutPoint(lc.channelState.ChanID) return revocationMsg, nil } @@ -1954,7 +1954,7 @@ func (lc *LightningChannel) ExtendRevocationWindow() (*lnwire.RevokeAndAck, erro // InitialRevocationWindow revMsg := &lnwire.RevokeAndAck{} - revMsg.ChannelPoint = *lc.channelState.ChanID + revMsg.ChanID = lnwire.NewChanIDFromOutPoint(lc.channelState.ChanID) nextHeight := lc.revocationWindowEdge + 1 revocation, err := lc.channelState.RevocationProducer.AtIndex(nextHeight) diff --git a/lnwire/announcement_signatures.go b/lnwire/announcement_signatures.go index 404e7d1f..94b8f9ed 100644 --- a/lnwire/announcement_signatures.go +++ b/lnwire/announcement_signatures.go @@ -4,7 +4,6 @@ import ( "io" "github.com/roasbeef/btcd/btcec" - "github.com/roasbeef/btcd/wire" ) // AnnounceSignatures this is a direct message between two endpoints of a @@ -16,7 +15,7 @@ type AnnounceSignatures struct { // Channel id is better for users and debugging and short channel id is // used for quick test on existence of the particular utxo inside the // block chain, because it contains information about block. - ChannelID wire.OutPoint + ChannelID ChannelID // ShortChannelID is the unique description of the funding // transaction. It is constructed with the most significant 3 bytes diff --git a/lnwire/channel_announcement_test.go b/lnwire/channel_announcement_test.go index 1541c61b..9244f8f0 100644 --- a/lnwire/channel_announcement_test.go +++ b/lnwire/channel_announcement_test.go @@ -13,7 +13,7 @@ func TestChannelAnnoucementEncodeDecode(t *testing.T) { ca := &ChannelAnnouncement{ NodeSig1: someSig, NodeSig2: someSig, - ShortChannelID: someChannelID, + ShortChannelID: someShortChannelID, BitcoinSig1: someSig, BitcoinSig2: someSig, NodeID1: pubKey, @@ -65,7 +65,7 @@ func TestChannelAnnoucementValidation(t *testing.T) { secondBitcoinSig, _ := secondBitcoinPrivKey.Sign(hash) ca := &ChannelAnnouncement{ - ShortChannelID: someChannelID, + ShortChannelID: someShortChannelID, BitcoinSig1: firstBitcoinSig, BitcoinSig2: secondBitcoinSig, NodeID1: firstNodePubKey, diff --git a/lnwire/channel_update_announcement_test.go b/lnwire/channel_update_announcement_test.go index 3aa269fb..eea9c30e 100644 --- a/lnwire/channel_update_announcement_test.go +++ b/lnwire/channel_update_announcement_test.go @@ -9,7 +9,7 @@ import ( func TestChannelUpdateAnnouncementEncodeDecode(t *testing.T) { cua := &ChannelUpdateAnnouncement{ Signature: someSig, - ShortChannelID: someChannelID, + ShortChannelID: someShortChannelID, Timestamp: maxUint32, Flags: maxUint16, TimeLockDelta: maxUint16, diff --git a/lnwire/close_request.go b/lnwire/close_request.go index b5ce49de..ca844ebf 100644 --- a/lnwire/close_request.go +++ b/lnwire/close_request.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/roasbeef/btcd/btcec" - "github.com/roasbeef/btcd/wire" "github.com/roasbeef/btcutil" "io" @@ -21,8 +20,8 @@ import ( // both sides are able to arrive at an identical closure transaction as they // know the order of the inputs/outputs. type CloseRequest struct { - // ChannelPoint serves to identify which channel is to be closed. - ChannelPoint wire.OutPoint + // ChanID serves to identify which channel is to be closed. + ChanID ChannelID // RequesterCloseSig is the signature of the requester for the fully // assembled closing transaction. @@ -36,10 +35,10 @@ type CloseRequest struct { } // NewCloseRequest creates a new CloseRequest. -func NewCloseRequest(cp wire.OutPoint, sig *btcec.Signature) *CloseRequest { +func NewCloseRequest(cid ChannelID, sig *btcec.Signature) *CloseRequest { // TODO(roasbeef): update once fees aren't hardcoded return &CloseRequest{ - ChannelPoint: cp, + ChanID: cid, RequesterCloseSig: sig, } } @@ -53,12 +52,8 @@ var _ Message = (*CloseRequest)(nil) // // This is part of the lnwire.Message interface. func (c *CloseRequest) Decode(r io.Reader, pver uint32) error { - // ChannelPoint (8) - // RequesterCloseSig (73) - // First byte length then sig - // Fee (8) return readElements(r, - &c.ChannelPoint, + &c.ChanID, &c.RequesterCloseSig, &c.Fee) } @@ -68,11 +63,8 @@ func (c *CloseRequest) Decode(r io.Reader, pver uint32) error { // // This is part of the lnwire.Message interface. func (c *CloseRequest) Encode(w io.Writer, pver uint32) error { - // ChannelID - // RequesterCloseSig - // Fee return writeElements(w, - c.ChannelPoint, + c.ChanID, c.RequesterCloseSig, c.Fee) } diff --git a/lnwire/commit_sig.go b/lnwire/commit_sig.go index f51d35e3..b268bfe5 100644 --- a/lnwire/commit_sig.go +++ b/lnwire/commit_sig.go @@ -4,7 +4,6 @@ import ( "io" "github.com/roasbeef/btcd/btcec" - "github.com/roasbeef/btcd/wire" ) // CommitSig is sent by either side to stage any pending HTLC's in the @@ -15,9 +14,9 @@ import ( // order to batch add several HTLC's with a single signature covering all // implicitly accepted HTLC's. type CommitSig struct { - // ChannelPoint uniquely identifies to which currently active channel - // this CommitSig applies to. - ChannelPoint wire.OutPoint + // ChanID uniquely identifies to which currently active channel this + // CommitSig applies to. + ChanID ChannelID // CommitSig is Alice's signature for Bob's new commitment transaction. // Alice is able to send this signature without requesting any @@ -44,10 +43,8 @@ var _ Message = (*CommitSig)(nil) // // This is part of the lnwire.Message interface. func (c *CommitSig) Decode(r io.Reader, pver uint32) error { - // ChannelPoint(8) - // RequesterCommitSig(73max+2) return readElements(r, - &c.ChannelPoint, + &c.ChanID, &c.CommitSig, ) } @@ -58,7 +55,7 @@ func (c *CommitSig) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *CommitSig) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelPoint, + c.ChanID, c.CommitSig, ) } @@ -76,8 +73,8 @@ func (c *CommitSig) Command() uint32 { // // This is part of the lnwire.Message interface. func (c *CommitSig) MaxPayloadLength(uint32) uint32 { - // 36 + 73 - return 109 + // 32 + 64 + return 96 } // Validate performs any necessary sanity checks to ensure all fields present diff --git a/lnwire/commit_sig_test.go b/lnwire/commit_sig_test.go index 4dca7c8a..c59a0f4b 100644 --- a/lnwire/commit_sig_test.go +++ b/lnwire/commit_sig_test.go @@ -8,8 +8,8 @@ import ( func TestCommitSigEncodeDecode(t *testing.T) { commitSignature := &CommitSig{ - ChannelPoint: *outpoint1, - CommitSig: commitSig, + ChanID: ChannelID(revHash), + CommitSig: commitSig, } // Next encode the CS message into an empty bytes buffer. diff --git a/lnwire/funding_locked.go b/lnwire/funding_locked.go index eed4bc01..f8dc1e4f 100644 --- a/lnwire/funding_locked.go +++ b/lnwire/funding_locked.go @@ -5,53 +5,44 @@ import ( "io" "github.com/roasbeef/btcd/btcec" - "github.com/roasbeef/btcd/wire" ) // FundingLocked is the message that both parties to a new channel creation -// send once they have observed the funding transaction being confirmed on -// the blockchain. FundingLocked contains the signatures necessary for the -// channel participants to advertise the existence of the channel to the -// rest of the network. +// send once they have observed the funding transaction being confirmed on the +// blockchain. FundingLocked contains the signatures necessary for the channel +// participants to advertise the existence of the channel to the rest of the +// network. type FundingLocked struct { - // ChannelOutpoint is the outpoint of the channel's funding - // transaction. This can be used to query for the channel in the - // database. - ChannelOutpoint wire.OutPoint + // ChanID is the outpoint of the channel's funding transaction. This + // can be used to query for the channel in the database. + ChanID ChannelID - // ChannelId serves to uniquely identify the channel created by the - // current channel funding workflow. - ChannelID ShortChannelID - - // NextPerCommitmentPoint is the secret that can be used to revoke - // the next commitment transaction for the channel. + // NextPerCommitmentPoint is the secret that can be used to revoke the + // next commitment transaction for the channel. NextPerCommitmentPoint *btcec.PublicKey } -// NewFundingLocked creates a new FundingLocked message, populating it with -// the necessary IDs and revocation secret.. -func NewFundingLocked(op wire.OutPoint, cid ShortChannelID, - npcp *btcec.PublicKey) *FundingLocked { +// NewFundingLocked creates a new FundingLocked message, populating it with the +// necessary IDs and revocation secret. +func NewFundingLocked(cid ChannelID, npcp *btcec.PublicKey) *FundingLocked { return &FundingLocked{ - ChannelOutpoint: op, - ChannelID: cid, + ChanID: cid, NextPerCommitmentPoint: npcp, } } -// A compile time check to ensure FundingLocked implements the -// lnwire.Message interface. +// A compile time check to ensure FundingLocked implements the lnwire.Message +// interface. var _ Message = (*FundingLocked)(nil) -// Decode deserializes the serialized FundingLocked message stored in the passed -// io.Reader into the target FundingLocked using the deserialization +// Decode deserializes the serialized FundingLocked message stored in the +// passed io.Reader into the target FundingLocked using the deserialization // rules defined by the passed protocol version. // // This is part of the lnwire.Message interface. func (c *FundingLocked) Decode(r io.Reader, pver uint32) error { return readElements(r, - &c.ChannelOutpoint, - &c.ChannelID, + &c.ChanID, &c.NextPerCommitmentPoint) } @@ -62,8 +53,7 @@ func (c *FundingLocked) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *FundingLocked) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelOutpoint, - c.ChannelID, + c.ChanID, c.NextPerCommitmentPoint) } @@ -83,15 +73,13 @@ func (c *FundingLocked) Command() uint32 { func (c *FundingLocked) MaxPayloadLength(uint32) uint32 { var length uint32 - // ChannelOutpoint - 36 bytes - length += 36 - - // ChannelID - 8 bytes - length += 8 + // ChanID - 32 bytes + length += 32 // NextPerCommitmentPoint - 33 bytes length += 33 + // 65 bytes return length } diff --git a/lnwire/funding_locked_test.go b/lnwire/funding_locked_test.go index 5ea08b26..45d69d01 100644 --- a/lnwire/funding_locked_test.go +++ b/lnwire/funding_locked_test.go @@ -8,7 +8,7 @@ import ( func TestFundingLockedWire(t *testing.T) { // First create a new FundingLocked message. - fl := NewFundingLocked(*outpoint1, someChannelID, pubKey) + fl := NewFundingLocked(ChannelID(revHash), pubKey) // Next encode the FundingLocked message into an empty bytes buffer. var b bytes.Buffer diff --git a/lnwire/lnwire.go b/lnwire/lnwire.go index c2f58800..d37df071 100644 --- a/lnwire/lnwire.go +++ b/lnwire/lnwire.go @@ -250,26 +250,29 @@ func writeElement(w io.Writer, element interface{}) error { } case wire.OutPoint: - // TODO(roasbeef): consolidate with above - // First write out the previous txid. var h [32]byte copy(h[:], e.Hash[:]) if _, err := w.Write(h[:]); err != nil { return err } - // Then the exact index of this output. - var idx [4]byte - binary.BigEndian.PutUint32(idx[:], e.Index) + var idx [2]byte + binary.BigEndian.PutUint16(idx[:], uint16(e.Index)) if _, err := w.Write(idx[:]); err != nil { return err } - // TODO(roasbeef): *MsgTx + case int64, float64: err := binary.Write(w, binary.BigEndian, e) if err != nil { return err } + + case ChannelID: + if _, err := w.Write(e[:]); err != nil { + return err + } + case ShortChannelID: // Check that field fit in 3 bytes and write the blockHeight if e.BlockHeight > ((1 << 24) - 1) { @@ -573,7 +576,6 @@ func readElement(r io.Reader, element interface{}) error { (*e).PreviousOutPoint.Index = binary.BigEndian.Uint32(idxBytes[:]) return nil case *wire.OutPoint: - // TODO(roasbeef): consolidate with above var h [32]byte if _, err = io.ReadFull(r, h[:]); err != nil { return err @@ -582,20 +584,29 @@ func readElement(r io.Reader, element interface{}) error { if err != nil { return err } - // Index - var idxBytes [4]byte + + var idxBytes [2]byte _, err = io.ReadFull(r, idxBytes[:]) if err != nil { return err } - index := binary.BigEndian.Uint32(idxBytes[:]) + index := binary.BigEndian.Uint16(idxBytes[:]) - *e = wire.OutPoint{Hash: *hash, Index: index} + *e = wire.OutPoint{ + Hash: *hash, + Index: uint32(index), + } case *int64, *float64: err := binary.Read(r, binary.BigEndian, e) if err != nil { return err } + + case *ChannelID: + if _, err := io.ReadFull(r, e[:]); err != nil { + return err + } + case *ShortChannelID: var blockHeight [4]byte if _, err = io.ReadFull(r, blockHeight[1:]); err != nil { diff --git a/lnwire/lnwire_test.go b/lnwire/lnwire_test.go index 5be7c8ba..0f2fbedd 100644 --- a/lnwire/lnwire_test.go +++ b/lnwire/lnwire_test.go @@ -64,7 +64,7 @@ var ( maxUint24 uint32 = (1 << 24) - 1 maxUint16 uint16 = (1 << 16) - 1 - someChannelID = ShortChannelID{ + someShortChannelID = ShortChannelID{ BlockHeight: maxUint24, TxIndex: maxUint24, TxPosition: maxUint16, diff --git a/lnwire/revoke_and_ack.go b/lnwire/revoke_and_ack.go index 205d4c46..da96c34c 100644 --- a/lnwire/revoke_and_ack.go +++ b/lnwire/revoke_and_ack.go @@ -4,7 +4,6 @@ import ( "io" "github.com/roasbeef/btcd/btcec" - "github.com/roasbeef/btcd/wire" ) // RevokeAndAck is sent by either side once a CommitSig message has been @@ -17,9 +16,9 @@ import ( // Alice to send the next CommitSig message modifying Bob's commitment // transaction without first asking for a revocation hash initially. type RevokeAndAck struct { - // ChannelPoint uniquely identifies to which currently active channel - // this RevokeAndAck applies to. - ChannelPoint wire.OutPoint + // ChanID uniquely identifies to which currently active channel this + // RevokeAndAck applies to. + ChanID ChannelID // Revocation is the preimage to the revocation hash of the now prior // commitment transaction. @@ -58,12 +57,8 @@ var _ Message = (*RevokeAndAck)(nil) // // This is part of the lnwire.Message interface. func (c *RevokeAndAck) Decode(r io.Reader, pver uint32) error { - // ChannelPoint (8) - // Revocation (32) - // NextRevocationKey (33) - // NextRevocationHash (32) return readElements(r, - &c.ChannelPoint, + &c.ChanID, c.Revocation[:], &c.NextRevocationKey, c.NextRevocationHash[:], @@ -76,7 +71,7 @@ func (c *RevokeAndAck) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *RevokeAndAck) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelPoint, + c.ChanID, c.Revocation[:], c.NextRevocationKey, c.NextRevocationHash[:], @@ -96,8 +91,8 @@ func (c *RevokeAndAck) Command() uint32 { // // This is part of the lnwire.Message interface. func (c *RevokeAndAck) MaxPayloadLength(uint32) uint32 { - // 36 + 32 + 33 + 32 - return 133 + // 32 + 32 + 33 + 32 + return 129 } // Validate performs any necessary sanity checks to ensure all fields present diff --git a/lnwire/revoke_and_ack_test.go b/lnwire/revoke_and_ack_test.go index 830a107a..673e2ce1 100644 --- a/lnwire/revoke_and_ack_test.go +++ b/lnwire/revoke_and_ack_test.go @@ -8,7 +8,7 @@ import ( func TestRevokeAndAckEncodeDecode(t *testing.T) { cr := &RevokeAndAck{ - ChannelPoint: *outpoint1, + ChanID: ChannelID(revHash), Revocation: revHash, NextRevocationKey: pubKey, NextRevocationHash: revHash, diff --git a/lnwire/single_funding_complete.go b/lnwire/single_funding_complete.go index a86e8f26..f74a621a 100644 --- a/lnwire/single_funding_complete.go +++ b/lnwire/single_funding_complete.go @@ -15,10 +15,9 @@ import ( // required for him to generate a signature for Alice's version of the // commitment transaction. type SingleFundingComplete struct { - // ChannelID serves to uniquely identify the future channel created by - // the initiated single funder workflow. - // TODO(roasbeef): change all to PendingChannelID, document schema - ChannelID uint64 + // PendingChannelID serves to uniquely identify the future channel + // created by the initiated single funder workflow. + PendingChannelID [32]byte // FundingOutPoint is the outpoint (txid:index) of the funding // transaction. With this value, Bob will be able to generate a @@ -46,12 +45,12 @@ type SingleFundingComplete struct { // NewSingleFundingComplete creates, and returns a new empty // SingleFundingResponse. -func NewSingleFundingComplete(chanID uint64, fundingPoint wire.OutPoint, +func NewSingleFundingComplete(pChanID [32]byte, fundingPoint wire.OutPoint, commitSig *btcec.Signature, revokeKey *btcec.PublicKey, obsfucator [6]byte) *SingleFundingComplete { return &SingleFundingComplete{ - ChannelID: chanID, + PendingChannelID: pChanID, FundingOutPoint: fundingPoint, CommitSignature: commitSig, RevocationKey: revokeKey, @@ -65,12 +64,8 @@ func NewSingleFundingComplete(chanID uint64, fundingPoint wire.OutPoint, // // This is part of the lnwire.Message interface. func (s *SingleFundingComplete) Decode(r io.Reader, pver uint32) error { - // ChannelID (8) - // FundingOutPoint (36) - // CommitmentSignature (73) - // RevocationKey (33) return readElements(r, - &s.ChannelID, + s.PendingChannelID[:], &s.FundingOutPoint, &s.CommitSignature, &s.RevocationKey, @@ -83,12 +78,8 @@ func (s *SingleFundingComplete) Decode(r io.Reader, pver uint32) error { // // This is part of the lnwire.Message interface. func (s *SingleFundingComplete) Encode(w io.Writer, pver uint32) error { - // ChannelID (8) - // FundingOutPoint (36) - // Commitment Signature (73) - // RevocationKey (33) return writeElements(w, - s.ChannelID, + s.PendingChannelID[:], s.FundingOutPoint, s.CommitSignature, s.RevocationKey, @@ -105,12 +96,12 @@ func (s *SingleFundingComplete) Command() uint32 { // MaxPayloadLength returns the maximum allowed payload length for a // SingleFundingComplete. This is calculated by summing the max length of all -// the fields within a SingleFundingComplete. Therefore, the final breakdown -// is: 8 + 36 + 33 + 73 + 4 = 154 +// the fields within a SingleFundingComplete. // // This is part of the lnwire.Message interface. func (s *SingleFundingComplete) MaxPayloadLength(uint32) uint32 { - return 154 + // 32 + 36 + 64 + 33 + 6 + return 171 } // Validate examines each populated field within the SingleFundingComplete for diff --git a/lnwire/single_funding_complete_test.go b/lnwire/single_funding_complete_test.go index 43dfc999..f9354c21 100644 --- a/lnwire/single_funding_complete_test.go +++ b/lnwire/single_funding_complete_test.go @@ -11,7 +11,7 @@ func TestSingleFundingCompleteWire(t *testing.T) { copy(obsfucator[:], bytes.Repeat([]byte("k"), 6)) // First create a new SFC message. - sfc := NewSingleFundingComplete(22, *outpoint1, commitSig1, pubKey, + sfc := NewSingleFundingComplete(revHash, *outpoint1, commitSig1, pubKey, obsfucator) // Next encode the SFC message into an empty bytes buffer. diff --git a/lnwire/single_funding_request.go b/lnwire/single_funding_request.go index fa0f8ec0..50e9e617 100644 --- a/lnwire/single_funding_request.go +++ b/lnwire/single_funding_request.go @@ -20,9 +20,9 @@ import ( // to provide the responder with an SPV proof of funding transaction inclusion // after a sufficient number of confirmations. type SingleFundingRequest struct { - // ChannelID serves to uniquely identify the future channel created by - // the initiated single funder workflow. - ChannelID uint64 + // PendingChannelID serves to uniquely identify the future channel + // created by the initiated single funder workflow. + PendingChannelID [32]byte // ChannelType represents the type of channel this request would like // to open. At this point, the only supported channels are type 0 @@ -84,14 +84,14 @@ type SingleFundingRequest struct { } // NewSingleFundingRequest creates, and returns a new empty SingleFundingRequest. -func NewSingleFundingRequest(chanID uint64, chanType uint8, coinType uint64, +func NewSingleFundingRequest(chanID [32]byte, chanType uint8, coinType uint64, fee btcutil.Amount, amt btcutil.Amount, delay uint32, ck, cdp *btcec.PublicKey, deliveryScript PkScript, dustLimit btcutil.Amount, pushSat btcutil.Amount, confDepth uint32) *SingleFundingRequest { return &SingleFundingRequest{ - ChannelID: chanID, + PendingChannelID: chanID, ChannelType: chanType, CoinType: coinType, FeePerKb: fee, @@ -113,7 +113,7 @@ func NewSingleFundingRequest(chanID uint64, chanType uint8, coinType uint64, // This is part of the lnwire.Message interface. func (c *SingleFundingRequest) Decode(r io.Reader, pver uint32) error { return readElements(r, - &c.ChannelID, + c.PendingChannelID[:], &c.ChannelType, &c.CoinType, &c.FeePerKb, @@ -134,7 +134,7 @@ func (c *SingleFundingRequest) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *SingleFundingRequest) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelID, + c.PendingChannelID[:], c.ChannelType, c.CoinType, c.FeePerKb, @@ -165,8 +165,8 @@ func (c *SingleFundingRequest) Command() uint32 { func (c *SingleFundingRequest) MaxPayloadLength(uint32) uint32 { var length uint32 - // ChannelID - 8 bytes - length += 8 + // PendingChannelID - 32 bytes + length += 32 // ChannelType - 1 byte length++ @@ -224,17 +224,6 @@ func (c *SingleFundingRequest) Validate() error { " CSV delay") } - // The channel derivation point must be non-nil, and have an odd - // y-coordinate. - if c.ChannelDerivationPoint == nil { - return fmt.Errorf("the channel derivation point must be " + - "non-nil") - } - //if c.ChannelDerivationPoint.Y.Bit(0) != 1 { - //return fmt.Errorf("The channel derivation point must have an odd " + - //"y-coordinate") - //} - // The delivery pkScript must be amongst the supported script // templates. if !isValidPkScript(c.DeliveryPkScript) { diff --git a/lnwire/single_funding_request_test.go b/lnwire/single_funding_request_test.go index c9c85a68..67689d84 100644 --- a/lnwire/single_funding_request_test.go +++ b/lnwire/single_funding_request_test.go @@ -10,7 +10,7 @@ func TestSingleFundingRequestWire(t *testing.T) { // First create a new SFR message. cdp := pubKey delivery := PkScript(bytes.Repeat([]byte{0x02}, 25)) - sfr := NewSingleFundingRequest(20, 21, 22, 23, 5, 5, cdp, cdp, + sfr := NewSingleFundingRequest(revHash, 21, 22, 23, 5, 5, cdp, cdp, delivery, 540, 10000, 6) // Next encode the SFR message into an empty bytes buffer. diff --git a/lnwire/single_funding_response.go b/lnwire/single_funding_response.go index 6f56dc62..31c78f00 100644 --- a/lnwire/single_funding_response.go +++ b/lnwire/single_funding_response.go @@ -10,12 +10,12 @@ import ( // SingleFundingResponse is the message Bob sends to Alice after she initiates // the single funder channel workflow via a SingleFundingRequest message. Once -// Alice receives Bob's reponse, then she has all the items neccessary to +// Alice receives Bob's response, then she has all the items necessary to // construct the funding transaction, and both commitment transactions. type SingleFundingResponse struct { - // ChannelID serves to uniquely identify the future channel created by - // the initiated single funder workflow. - ChannelID uint64 + // PendingChannelID serves to uniquely identify the future channel + // created by the initiated single funder workflow. + PendingChannelID [32]byte // ChannelDerivationPoint is an secp256k1 point which will be used to // derive the public key the responder will use for the half of the @@ -60,12 +60,12 @@ type SingleFundingResponse struct { // NewSingleFundingResponse creates, and returns a new empty // SingleFundingResponse. -func NewSingleFundingResponse(chanID uint64, rk, ck, cdp *btcec.PublicKey, +func NewSingleFundingResponse(chanID [32]byte, rk, ck, cdp *btcec.PublicKey, delay uint32, deliveryScript PkScript, dustLimit btcutil.Amount, confDepth uint32) *SingleFundingResponse { return &SingleFundingResponse{ - ChannelID: chanID, + PendingChannelID: chanID, ChannelDerivationPoint: cdp, CommitmentKey: ck, RevocationKey: rk, @@ -86,16 +86,8 @@ var _ Message = (*SingleFundingResponse)(nil) // // This is part of the lnwire.Message interface. func (c *SingleFundingResponse) Decode(r io.Reader, pver uint32) error { - // ChannelID (8) - // ChannelDerivationPoint (33) - // CommitmentKey (33) - // RevocationKey (33) - // CsvDelay (4) - // DeliveryPkScript (final delivery) - // DustLimit (8) - // ConfirmationDepth (4) return readElements(r, - &c.ChannelID, + c.PendingChannelID[:], &c.ChannelDerivationPoint, &c.CommitmentKey, &c.RevocationKey, @@ -112,7 +104,7 @@ func (c *SingleFundingResponse) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *SingleFundingResponse) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelID, + c.PendingChannelID[:], c.ChannelDerivationPoint, c.CommitmentKey, c.RevocationKey, @@ -139,8 +131,8 @@ func (c *SingleFundingResponse) Command() uint32 { func (c *SingleFundingResponse) MaxPayloadLength(uint32) uint32 { var length uint32 - // ChannelID - 8 bytes - length += 8 + // PendingChannelID - 32 bytes + length += 32 // ChannelDerivationPoint - 33 bytes length += 33 @@ -177,10 +169,6 @@ func (c *SingleFundingResponse) Validate() error { if c.ChannelDerivationPoint == nil { return fmt.Errorf("The channel derivation point must be non-nil") } - //if c.ChannelDerivationPoint.Y.Bit(0) != 1 { - // return fmt.Errorf("The channel derivation point must have an odd " + - // "y-coordinate") - //} // The delivery pkScript must be amongst the supported script // templates. diff --git a/lnwire/single_funding_response_test.go b/lnwire/single_funding_response_test.go index 64737286..61ed2ab1 100644 --- a/lnwire/single_funding_response_test.go +++ b/lnwire/single_funding_response_test.go @@ -9,7 +9,7 @@ import ( func TestSingleFundingResponseWire(t *testing.T) { // First create a new SFR message. delivery := PkScript(bytes.Repeat([]byte{0x02}, 25)) - sfr := NewSingleFundingResponse(22, pubKey, pubKey, pubKey, 5, + sfr := NewSingleFundingResponse(revHash, pubKey, pubKey, pubKey, 5, delivery, 540, 4) // Next encode the SFR message into an empty bytes buffer. diff --git a/lnwire/single_funding_signcomplete.go b/lnwire/single_funding_signcomplete.go index 5ec96a0b..322df896 100644 --- a/lnwire/single_funding_signcomplete.go +++ b/lnwire/single_funding_signcomplete.go @@ -12,9 +12,9 @@ import ( // message is received and processed by Alice, she is free to broadcast the // funding transaction. type SingleFundingSignComplete struct { - // ChannelID serves to uniquely identify the future channel created by - // the initiated single funder workflow. - ChannelID uint64 + // PendingChannelID serves to uniquely identify the future channel + // created by the initiated single funder workflow. + PendingChannelID [32]byte // CommitSignature is Bobs's signature for Alice's version of the // commitment transaction. @@ -23,12 +23,12 @@ type SingleFundingSignComplete struct { // NewSingleFundingSignComplete creates a new empty SingleFundingSignComplete // message. -func NewSingleFundingSignComplete(chanID uint64, +func NewSingleFundingSignComplete(chanID [32]byte, sig *btcec.Signature) *SingleFundingSignComplete { return &SingleFundingSignComplete{ - ChannelID: chanID, - CommitSignature: sig, + PendingChannelID: chanID, + CommitSignature: sig, } } @@ -38,10 +38,8 @@ func NewSingleFundingSignComplete(chanID uint64, // // This is part of the lnwire.Message interface. func (c *SingleFundingSignComplete) Decode(r io.Reader, pver uint32) error { - // ChannelID (8) - // CommitmentSignature (73) return readElements(r, - &c.ChannelID, + c.PendingChannelID[:], &c.CommitSignature) } @@ -52,7 +50,7 @@ func (c *SingleFundingSignComplete) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *SingleFundingSignComplete) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelID, + c.PendingChannelID[:], c.CommitSignature) } @@ -65,13 +63,13 @@ func (c *SingleFundingSignComplete) Command() uint32 { } // MaxPayloadLength returns the maximum allowed payload length for a -// SingleFundingSignComplete. This is calculated by summing the max length of all -// the fields within a SingleFundingSignComplete. The final breakdown -// is: 8 + 73 = 81 +// SingleFundingSignComplete. This is calculated by summing the max length of +// all the fields within a SingleFundingSignComplete. // // This is part of the lnwire.Message interface. func (c *SingleFundingSignComplete) MaxPayloadLength(uint32) uint32 { - return 81 + // 32 + 64 + return 96 } // Validate examines each populated field within the SingleFundingSignComplete diff --git a/lnwire/single_funding_signcomplete_test.go b/lnwire/single_funding_signcomplete_test.go index c0001c33..6b4889c6 100644 --- a/lnwire/single_funding_signcomplete_test.go +++ b/lnwire/single_funding_signcomplete_test.go @@ -12,7 +12,7 @@ import ( func TestSingleFundingSignCompleteWire(t *testing.T) { // First create a new SFSC message. sfsc := NewSingleFundingSignComplete( - 22, + revHash, &btcec.Signature{ R: new(big.Int).SetInt64(9), S: new(big.Int).SetInt64(11), diff --git a/lnwire/update_add_htlc.go b/lnwire/update_add_htlc.go index 8079a1db..435a0272 100644 --- a/lnwire/update_add_htlc.go +++ b/lnwire/update_add_htlc.go @@ -4,7 +4,6 @@ import ( "fmt" "io" - "github.com/roasbeef/btcd/wire" "github.com/roasbeef/btcutil" ) @@ -20,9 +19,9 @@ const OnionPacketSize = 1254 // CommitSig message will move the pending HTLC to the newly created commitment // transaction, marking them as "staged". type UpdateAddHTLC struct { - // ChannelPoint is the particular active channel that this + // ChanID is the particular active channel that this // UpdateAddHTLC is binded to. - ChannelPoint wire.OutPoint + ChanID ChannelID // ID is the identification server for this HTLC. This value is // explicitly included as it allows nodes to survive single-sided @@ -70,14 +69,8 @@ var _ Message = (*UpdateAddHTLC)(nil) // // This is part of the lnwire.Message interface. func (c *UpdateAddHTLC) Decode(r io.Reader, pver uint32) error { - // ChannelPoint(8) - // ID(4) - // Expiry(4) - // Amount(8) - // PaymentHash(32) - // OnionBlob(1254) return readElements(r, - &c.ChannelPoint, + &c.ChanID, &c.ID, &c.Expiry, &c.Amount, @@ -92,7 +85,7 @@ func (c *UpdateAddHTLC) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *UpdateAddHTLC) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelPoint, + c.ChanID, c.ID, c.Expiry, c.Amount, @@ -114,8 +107,8 @@ func (c *UpdateAddHTLC) Command() uint32 { // // This is part of the lnwire.Message interface. func (c *UpdateAddHTLC) MaxPayloadLength(uint32) uint32 { - // 1342 - return 36 + 8 + 4 + 8 + 32 + 1254 + // 1338 + return 32 + 8 + 4 + 8 + 32 + 1254 } // Validate performs any necessary sanity checks to ensure all fields present @@ -128,6 +121,7 @@ func (c *UpdateAddHTLC) Validate() error { // negative payments. Maybe for some wallets, but not this one! return fmt.Errorf("amount paid cannot be negative") } + // We're good! return nil } diff --git a/lnwire/update_add_htlc_test.go b/lnwire/update_add_htlc_test.go index 3fa84abe..37d9f73e 100644 --- a/lnwire/update_add_htlc_test.go +++ b/lnwire/update_add_htlc_test.go @@ -11,11 +11,11 @@ import ( func TestUpdateAddHTLCEncodeDecode(t *testing.T) { // First create a new UPAH message. addReq := &UpdateAddHTLC{ - ChannelPoint: *outpoint1, - ID: 99, - Expiry: uint32(144), - Amount: btcutil.Amount(123456000), - PaymentHash: revHash, + ChanID: ChannelID(revHash), + ID: 99, + Expiry: uint32(144), + Amount: btcutil.Amount(123456000), + PaymentHash: revHash, } copy(addReq.OnionBlob[:], bytes.Repeat([]byte{23}, OnionPacketSize)) diff --git a/lnwire/update_fail_htlc.go b/lnwire/update_fail_htlc.go index 82c76f1c..cb6275d7 100644 --- a/lnwire/update_fail_htlc.go +++ b/lnwire/update_fail_htlc.go @@ -1,10 +1,6 @@ package lnwire -import ( - "io" - - "github.com/roasbeef/btcd/wire" -) +import "io" // FailCode specifies the precise reason that an upstream HTLC was cancelled. // Each UpdateFailHTLC message carries a FailCode which is to be passed back @@ -82,8 +78,8 @@ type OpaqueReason []byte // the route to fully undo the HTLC. type UpdateFailHTLC struct { // ChannelPoint is the particular active channel that this - // UpdateFailHTLC is binded to. - ChannelPoint wire.OutPoint + // UpdateFailHTLC is bound to. + ChanID ChannelID // ID references which HTLC on the remote node's commitment transaction // has timed out. @@ -105,11 +101,8 @@ var _ Message = (*UpdateFailHTLC)(nil) // // This is part of the lnwire.Message interface. func (c *UpdateFailHTLC) Decode(r io.Reader, pver uint32) error { - // ChannelPoint(8) - // HTLCKey(8) - // Reason(??) return readElements(r, - &c.ChannelPoint, + &c.ChanID, &c.ID, &c.Reason, ) @@ -121,7 +114,7 @@ func (c *UpdateFailHTLC) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *UpdateFailHTLC) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelPoint, + c.ChanID, c.ID, c.Reason, ) @@ -140,8 +133,8 @@ func (c *UpdateFailHTLC) Command() uint32 { // // This is part of the lnwire.Message interface. func (c *UpdateFailHTLC) MaxPayloadLength(uint32) uint32 { - // 36 + 8 + 154 - return 198 + // 32 + 8 + 154 + return 194 } // Validate performs any necessary sanity checks to ensure all fields present diff --git a/lnwire/update_fail_htlc_test.go b/lnwire/update_fail_htlc_test.go index dfce45b8..46111c56 100644 --- a/lnwire/update_fail_htlc_test.go +++ b/lnwire/update_fail_htlc_test.go @@ -9,8 +9,8 @@ import ( func TestUpdateFailHTLC(t *testing.T) { // First create a new UFH message. cancelMsg := &UpdateFailHTLC{ - ChannelPoint: *outpoint1, - ID: 22, + ChanID: ChannelID(revHash), + ID: 22, } cancelMsg.Reason = []byte{byte(UnknownDestination)} diff --git a/lnwire/update_fulfill_htlc.go b/lnwire/update_fulfill_htlc.go index 07699590..c33cd75c 100644 --- a/lnwire/update_fulfill_htlc.go +++ b/lnwire/update_fulfill_htlc.go @@ -1,10 +1,6 @@ package lnwire -import ( - "io" - - "github.com/roasbeef/btcd/wire" -) +import "io" // UpdateFufillHTLC is sent by Alice to Bob when she wishes to settle a // particular HTLC referenced by its HTLCKey within a specific active channel @@ -12,9 +8,9 @@ import ( // Alice to "lock-in" the removal of the specified HTLC, possible containing a // batch signature covering several settled HTLC's. type UpdateFufillHTLC struct { - // ChannelPoint references an active channel which holds the HTLC to be + // ChanID references an active channel which holds the HTLC to be // settled. - ChannelPoint wire.OutPoint + ChanID ChannelID // ID denotes the exact HTLC stage within the receiving node's // commitment transaction to be removed. @@ -26,11 +22,11 @@ type UpdateFufillHTLC struct { } // NewUpdateFufillHTLC returns a new empty UpdateFufillHTLC. -func NewUpdateFufillHTLC(chanPoint wire.OutPoint, id uint64, +func NewUpdateFufillHTLC(chanID ChannelID, id uint64, preimage [32]byte) *UpdateFufillHTLC { return &UpdateFufillHTLC{ - ChannelPoint: chanPoint, + ChanID: chanID, ID: id, PaymentPreimage: preimage, } @@ -45,11 +41,8 @@ var _ Message = (*UpdateFufillHTLC)(nil) // // This is part of the lnwire.Message interface. func (c *UpdateFufillHTLC) Decode(r io.Reader, pver uint32) error { - // ChannelPoint(8) - // ID(8) - // PaymentPreimage(32) return readElements(r, - &c.ChannelPoint, + &c.ChanID, &c.ID, c.PaymentPreimage[:], ) @@ -61,7 +54,7 @@ func (c *UpdateFufillHTLC) Decode(r io.Reader, pver uint32) error { // This is part of the lnwire.Message interface. func (c *UpdateFufillHTLC) Encode(w io.Writer, pver uint32) error { return writeElements(w, - c.ChannelPoint, + c.ChanID, c.ID, c.PaymentPreimage[:], ) @@ -80,8 +73,8 @@ func (c *UpdateFufillHTLC) Command() uint32 { // // This is part of the lnwire.Message interface. func (c *UpdateFufillHTLC) MaxPayloadLength(uint32) uint32 { - // 36 + 8 + (32 * 15) - return 524 + // 32 + 8 + 32 + return 72 } // Validate performs any necessary sanity checks to ensure all fields present diff --git a/lnwire/update_fulfill_htlc_test.go b/lnwire/update_fulfill_htlc_test.go index 51d41307..62a680fc 100644 --- a/lnwire/update_fulfill_htlc_test.go +++ b/lnwire/update_fulfill_htlc_test.go @@ -8,7 +8,7 @@ import ( func TestUpdateFufillHTLCEncodeDecode(t *testing.T) { // First create a new HTLCSR message. - settleReq := NewUpdateFufillHTLC(*outpoint1, 23, revHash) + settleReq := NewUpdateFufillHTLC(ChannelID(revHash), 23, revHash) // Next encode the HTLCSR message into an empty bytes buffer. var b bytes.Buffer