Also freeze the lnwire and record packages used by the migration. Copy the minimal subset of lnwire files (16) into payments/db/migration1/lnwire/ and all record files (6) into payments/db/migration1/record/. Three lnwire files are trimmed to avoid pulling in the full message-type dispatch tree — all changes are purely subtractive and can be verified with: diff lnwire/message.go payments/db/migration1/lnwire/message.go diff lnwire/writer.go payments/db/migration1/lnwire/writer.go diff lnwire/lnwire.go payments/db/migration1/lnwire/lnwire.go All migration1 files now import only the frozen packages, removing the live dependency on lnwire and record so future changes to those packages cannot affect migration correctness.
139 lines
4.3 KiB
Go
139 lines
4.3 KiB
Go
package migration1
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/btcsuite/btcd/btcec/v2"
|
|
"github.com/lightningnetwork/lnd/payments/db/migration1/lnwire"
|
|
"github.com/lightningnetwork/lnd/payments/db/migration1/record"
|
|
"github.com/lightningnetwork/lnd/tlv"
|
|
)
|
|
|
|
// Vertex is a frozen local type representing a 33-byte compressed public key,
|
|
// equivalent to route.Vertex at the time this migration was written.
|
|
type Vertex [33]byte
|
|
|
|
// NewVertex returns a new Vertex from a compressed public key.
|
|
func NewVertex(pub *btcec.PublicKey) Vertex {
|
|
var v Vertex
|
|
copy(v[:], pub.SerializeCompressed())
|
|
|
|
return v
|
|
}
|
|
|
|
// NewVertexFromBytes returns a new Vertex from a serialized compressed public
|
|
// key byte slice.
|
|
func NewVertexFromBytes(b []byte) (Vertex, error) {
|
|
if len(b) != 33 {
|
|
return Vertex{}, fmt.Errorf("invalid vertex length %d, "+
|
|
"expected 33", len(b))
|
|
}
|
|
|
|
var v Vertex
|
|
copy(v[:], b)
|
|
|
|
return v, nil
|
|
}
|
|
|
|
// Hop is a frozen local snapshot of route.Hop, containing exactly the fields
|
|
// that existed at the time this migration was written. This ensures the
|
|
// migration's serialization boundary is independent of future changes to
|
|
// route.Hop, in particular the planned removal of LegacyPayload once the KV
|
|
// backend is phased out.
|
|
type Hop struct {
|
|
// PubKeyBytes is the raw bytes of the public key of the target node.
|
|
PubKeyBytes Vertex
|
|
|
|
// ChannelID is the unique channel ID for the channel.
|
|
ChannelID uint64
|
|
|
|
// OutgoingTimeLock is the timelock value that should be used when
|
|
// crafting the _outgoing_ HTLC from this hop.
|
|
OutgoingTimeLock uint32
|
|
|
|
// AmtToForward is the amount that this hop will forward to the next
|
|
// hop.
|
|
AmtToForward lnwire.MilliSatoshi
|
|
|
|
// MPP encapsulates the data required for option_mpp. This field should
|
|
// only be set for the final hop.
|
|
MPP *record.MPP
|
|
|
|
// AMP encapsulates the data required for option_amp. This field should
|
|
// only be set for the final hop.
|
|
AMP *record.AMP
|
|
|
|
// CustomRecords if non-nil are a set of additional TLV records that
|
|
// should be included in the forwarding instructions for this node.
|
|
CustomRecords record.CustomSet
|
|
|
|
// LegacyPayload signals that this node doesn't understand the new TLV
|
|
// payload, so the legacy payload format must be used.
|
|
//
|
|
// NOTE: This field is preserved here even though it is marked for
|
|
// removal in the live route.Hop, because old KV data may have been
|
|
// serialized with LegacyPayload=true and the migration must be able to
|
|
// deserialize it correctly.
|
|
LegacyPayload bool
|
|
|
|
// Metadata is additional data sent along with the payment to the
|
|
// payee.
|
|
Metadata []byte
|
|
|
|
// EncryptedData is an encrypted data blob included for hops that are
|
|
// part of a blinded route.
|
|
EncryptedData []byte
|
|
|
|
// BlindingPoint is an ephemeral public key used by introduction nodes
|
|
// in blinded routes.
|
|
BlindingPoint *btcec.PublicKey
|
|
|
|
// TotalAmtMsat is the total amount for a blinded payment. This field
|
|
// should only be set for the final hop in a blinded path.
|
|
TotalAmtMsat lnwire.MilliSatoshi
|
|
}
|
|
|
|
// Route is a frozen local snapshot of route.Route, containing exactly the
|
|
// fields that existed at the time this migration was written.
|
|
type Route struct {
|
|
// TotalTimeLock is the cumulative (final) time lock across the entire
|
|
// route.
|
|
TotalTimeLock uint32
|
|
|
|
// TotalAmount is the total amount of funds required to complete a
|
|
// payment over this route, including fees.
|
|
TotalAmount lnwire.MilliSatoshi
|
|
|
|
// SourcePubKey is the pubkey of the node where this route originates.
|
|
SourcePubKey Vertex
|
|
|
|
// Hops contains details concerning the specific forwarding details at
|
|
// each hop.
|
|
Hops []*Hop
|
|
|
|
// FirstHopAmount is the amount that should actually be sent to the
|
|
// first hop. Only differs from TotalAmount for custom channels.
|
|
FirstHopAmount tlv.RecordT[
|
|
tlv.TlvType0, tlv.BigSizeT[lnwire.MilliSatoshi],
|
|
]
|
|
|
|
// FirstHopWireCustomRecords is a set of custom TLV records to include
|
|
// in the wire message sent to the first hop.
|
|
FirstHopWireCustomRecords lnwire.CustomRecords
|
|
}
|
|
|
|
// FinalHop returns the last hop in the route.
|
|
func (r *Route) FinalHop() *Hop {
|
|
return r.Hops[len(r.Hops)-1]
|
|
}
|
|
|
|
// ReceiverAmt returns the amount forwarded to the final hop.
|
|
func (r *Route) ReceiverAmt() lnwire.MilliSatoshi {
|
|
return r.FinalHop().AmtToForward
|
|
}
|
|
|
|
// TotalFees returns the total fees paid along the route.
|
|
func (r *Route) TotalFees() lnwire.MilliSatoshi {
|
|
return r.TotalAmount - r.ReceiverAmt()
|
|
}
|