You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
package netann |
|
|
|
import ( |
|
"net" |
|
"time" |
|
|
|
"github.com/btcsuite/btcd/btcec" |
|
"github.com/lightningnetwork/lnd/lnwallet" |
|
"github.com/lightningnetwork/lnd/lnwire" |
|
) |
|
|
|
// NodeAnnModifier is a closure that makes in-place modifications to an |
|
// lnwire.NodeAnnouncement. |
|
type NodeAnnModifier func(*lnwire.NodeAnnouncement) |
|
|
|
// NodeAnnSetAddrs is a functional option that allows updating the addresses of |
|
// the given node announcement. |
|
func NodeAnnSetAddrs(addrs []net.Addr) func(*lnwire.NodeAnnouncement) { |
|
return func(nodeAnn *lnwire.NodeAnnouncement) { |
|
nodeAnn.Addresses = addrs |
|
} |
|
} |
|
|
|
// 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. |
|
func NodeAnnSetTimestamp(nodeAnn *lnwire.NodeAnnouncement) { |
|
newTimestamp := uint32(time.Now().Unix()) |
|
if newTimestamp <= nodeAnn.Timestamp { |
|
// Increment the prior value to ensure the timestamp |
|
// monotonically increases, otherwise the announcement won't |
|
// propagate. |
|
newTimestamp = nodeAnn.Timestamp + 1 |
|
} |
|
nodeAnn.Timestamp = newTimestamp |
|
} |
|
|
|
// SignNodeAnnouncement applies the given modifies to the passed |
|
// lnwire.NodeAnnouncement, then signs the resulting announcement. The provided |
|
// update should be the most recent, valid update, otherwise the timestamp may |
|
// not monotonically increase from the prior. |
|
func SignNodeAnnouncement(signer lnwallet.MessageSigner, |
|
pubKey *btcec.PublicKey, nodeAnn *lnwire.NodeAnnouncement, |
|
mods ...NodeAnnModifier) error { |
|
|
|
// Apply the requested changes to the node announcement. |
|
for _, modifier := range mods { |
|
modifier(nodeAnn) |
|
} |
|
|
|
// Create the DER-encoded ECDSA signature over the message digest. |
|
sig, err := SignAnnouncement(signer, pubKey, nodeAnn) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
// Parse the DER-encoded signature into a fixed-size 64-byte array. |
|
nodeAnn.Signature, err = lnwire.NewSigFromSignature(sig) |
|
return err |
|
}
|
|
|