mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-22 22:25:24 +01:00
Merge pull request #7976 from w3irdrobot/serialize-deserialize-amp
Serialize/deserialize AMP struct in hop
This commit is contained in:
commit
59feec44ca
5 changed files with 63 additions and 1 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Add table
Reference in a new issue