Files
lnd/payments/db/migration1/route.go
T
ziggie 6c28cc4d0b payments/migration1: freeze lnwire and record dependency
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.
2026-02-27 09:25:21 +01:00

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()
}