lnrpc/peers: handle color changes in updateNodeAnnouncement

This commit is contained in:
positiveblue 2022-01-20 15:01:44 -08:00
parent ce4813940d
commit aacb2565f5
No known key found for this signature in database
GPG key ID: 4FFF2510928804DC
4 changed files with 37 additions and 1 deletions

View file

@ -9,6 +9,7 @@ import (
"sync/atomic"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"github.com/lightningnetwork/lnd/lncfg"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/netann"
@ -177,7 +178,25 @@ func (s *Server) UpdateNodeAnnouncement(_ context.Context,
// TODO(positiveblue): apply feature bit modifications
// TODO(positiveblue): apply color modifications
if req.Color != "" {
color, err := lncfg.ParseHexColor(req.Color)
if err != nil {
return nil, fmt.Errorf("unable to parse color: %v", err)
}
if color != currentNodeAnn.RGBColor {
resp.Ops = append(resp.Ops, &lnrpc.Op{
Entity: "color",
Actions: []string{
fmt.Sprintf("changed to %v", color),
},
})
nodeModifiers = append(
nodeModifiers,
netann.NodeAnnSetColor(color),
)
}
}
if req.Alias != "" {
alias, err := lnwire.NewNodeAlias(req.Alias)

View file

@ -1862,6 +1862,9 @@ func assertAnchorOutputLost(t *harnessTest, node *lntest.HarnessNode,
func assertNodeAnnouncement(t *harnessTest, n1, n2 *lnrpc.NodeUpdate) {
// Alias should match.
require.Equal(t.t, n1.Alias, n2.Alias, "alias don't match")
// Color should match.
require.Equal(t.t, n1.Color, n2.Color, "color don't match")
}
// assertUpdateNodeAnnouncementResponse is a helper function to assert

View file

@ -821,6 +821,7 @@ func testUpdateNodeAnnouncement(net *lntest.NetworkHarness, t *harnessTest) {
defaultDaveNodeAnn := &lnrpc.NodeUpdate{
Alias: resp.Alias,
Color: resp.Color,
}
// Dave must have an open channel before he can send a node
@ -866,15 +867,18 @@ func testUpdateNodeAnnouncement(net *lntest.NetworkHarness, t *harnessTest) {
// Update Node.
newAlias := "new-alias"
newColor := "#2288ee"
nodeAnnReq := &peersrpc.NodeAnnouncementUpdateRequest{
Alias: newAlias,
Color: newColor,
}
response, err := dave.UpdateNodeAnnouncement(ctxt, nodeAnnReq)
require.NoError(t.t, err, "unable to update dave's node announcement")
expectedOps := map[string]int{
"color": 1,
"alias": 1,
}
assertUpdateNodeAnnouncementResponse(t, response, expectedOps)
@ -883,6 +887,7 @@ func testUpdateNodeAnnouncement(net *lntest.NetworkHarness, t *harnessTest) {
// the requested color, requested alias and the new added addresses.
newDaveNodeAnn := &lnrpc.NodeUpdate{
Alias: newAlias,
Color: newColor,
}
// We'll then wait for Alice to receive dave's node announcement

View file

@ -1,6 +1,7 @@
package netann
import (
"image/color"
"net"
"time"
@ -29,6 +30,14 @@ func NodeAnnSetAddrs(addrs []net.Addr) func(*lnwire.NodeAnnouncement) {
}
}
// NodeAnnSetColor is a functional option that sets the color of the
// given node announcment.
func NodeAnnSetColor(newColor color.RGBA) func(*lnwire.NodeAnnouncement) {
return func(nodeAnn *lnwire.NodeAnnouncement) {
nodeAnn.RGBColor = newColor
}
}
// NodeAnnSetTimestamp is a functional option that sets the timestamp of the
// announcement to the current time, or increments it if the timestamp is
// already in the future.