Merge pull request #7976 from w3irdrobot/serialize-deserialize-amp

Serialize/deserialize AMP struct in hop
This commit is contained in:
Yong 2024-01-29 09:48:05 +08:00 committed by GitHub
commit 59feec44ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 63 additions and 1 deletions

View file

@ -1157,6 +1157,10 @@ func serializeHop(w io.Writer, h *route.Hop) error {
)) ))
} }
if h.AMP != nil {
records = append(records, h.AMP.Record())
}
if h.Metadata != nil { if h.Metadata != nil {
records = append(records, record.NewMetadataRecord(&h.Metadata)) records = append(records, record.NewMetadataRecord(&h.Metadata))
} }
@ -1301,7 +1305,23 @@ func deserializeHop(r io.Reader) (*route.Hop, error) {
} }
} }
// If the metatdata type is present, remove it from the tlv map and ampType := uint64(record.AMPOnionType)
if ampBytes, ok := tlvMap[ampType]; ok {
delete(tlvMap, ampType)
var (
amp = &record.AMP{}
ampRec = amp.Record()
r = bytes.NewReader(ampBytes)
)
err := ampRec.Decode(r, uint64(len(ampBytes)))
if err != nil {
return nil, err
}
h.AMP = amp
}
// If the metadata type is present, remove it from the tlv map and
// populate directly on the hop. // populate directly on the hop.
metadataType := uint64(record.MetadataOnionType) metadataType := uint64(record.MetadataOnionType)
if metadata, ok := tlvMap[metadataType]; ok { if metadata, ok := tlvMap[metadataType]; ok {

View file

@ -44,11 +44,25 @@ var (
LegacyPayload: true, LegacyPayload: true,
} }
testHop3 = &route.Hop{
PubKeyBytes: route.NewVertex(pub),
ChannelID: 12345,
OutgoingTimeLock: 111,
AmtToForward: 555,
CustomRecords: record.CustomSet{
65536: []byte{},
80001: []byte{},
},
AMP: record.NewAMP([32]byte{0x69}, [32]byte{0x42}, 1),
Metadata: []byte{1, 2, 3},
}
testRoute = route.Route{ testRoute = route.Route{
TotalTimeLock: 123, TotalTimeLock: 123,
TotalAmount: 1234567, TotalAmount: 1234567,
SourcePubKey: vertex, SourcePubKey: vertex,
Hops: []*route.Hop{ Hops: []*route.Hop{
testHop3,
testHop2, testHop2,
testHop1, testHop1,
}, },

View file

@ -73,6 +73,8 @@
a `shutdown` message if there were currently HTLCs on the channel. After this a `shutdown` message if there were currently HTLCs on the channel. After this
change, the shutdown procedure should be compliant with BOLT2 requirements. change, the shutdown procedure should be compliant with BOLT2 requirements.
* The AMP struct in payment hops will [now be populated](https://github.com/lightningnetwork/lnd/pull/7976) when the AMP TLV is set.
# New Features # New Features
## Functional Enhancements ## Functional Enhancements
@ -281,6 +283,7 @@
* Amin Bashiri * Amin Bashiri
* Andras Banki-Horvath * Andras Banki-Horvath
* BitcoinerCoderBob
* Carla Kirk-Cohen * Carla Kirk-Cohen
* Elle Mouton * Elle Mouton
* ErikEk * ErikEk
@ -288,7 +291,9 @@
* Marcos Fernandez Perez * Marcos Fernandez Perez
* Matt Morehouse * Matt Morehouse
* Slyghtning * Slyghtning
* Tee8z
* Turtle * Turtle
* Ononiwu Maureen Chiamaka * Ononiwu Maureen Chiamaka
* w3irdrobot
* Yong Yu * Yong Yu
* Ziggie * Ziggie

View file

@ -410,6 +410,16 @@ func testSendPaymentAMP(ht *lntest.HarnessTest) {
if htlc.Status == lnrpc.HTLCAttempt_SUCCEEDED { if htlc.Status == lnrpc.HTLCAttempt_SUCCEEDED {
succeeded++ succeeded++
} }
// When an AMP record is expected, it will only be seen on the
// last hop of a route. So we make sure it isn't set on any of
// the hops except the last one
for _, hop := range htlc.Route.Hops[:len(htlc.Route.Hops)-1] {
require.Nil(ht, hop.AmpRecord)
}
lastHop := htlc.Route.Hops[len(htlc.Route.Hops)-1]
require.NotNil(ht, lastHop.AmpRecord)
} }
const minExpectedShards = 3 const minExpectedShards = 3

View file

@ -613,6 +613,18 @@ func (r *RouterBackend) MarshallRoute(route *route.Route) (*lnrpc.Route, error)
} }
} }
var amp *lnrpc.AMPRecord
if hop.AMP != nil {
rootShare := hop.AMP.RootShare()
setID := hop.AMP.SetID()
amp = &lnrpc.AMPRecord{
RootShare: rootShare[:],
SetId: setID[:],
ChildIndex: hop.AMP.ChildIndex(),
}
}
resp.Hops[i] = &lnrpc.Hop{ resp.Hops[i] = &lnrpc.Hop{
ChanId: hop.ChannelID, ChanId: hop.ChannelID,
ChanCapacity: int64(chanCapacity), ChanCapacity: int64(chanCapacity),
@ -627,6 +639,7 @@ func (r *RouterBackend) MarshallRoute(route *route.Route) (*lnrpc.Route, error)
CustomRecords: hop.CustomRecords, CustomRecords: hop.CustomRecords,
TlvPayload: !hop.LegacyPayload, TlvPayload: !hop.LegacyPayload,
MppRecord: mpp, MppRecord: mpp,
AmpRecord: amp,
Metadata: hop.Metadata, Metadata: hop.Metadata,
EncryptedData: hop.EncryptedData, EncryptedData: hop.EncryptedData,
TotalAmtMsat: uint64(hop.TotalAmtMsat), TotalAmtMsat: uint64(hop.TotalAmtMsat),