graph/db/models: fix race conditions in ChannelEdgeInfo

Both NodeKey1 and NodeKey2 methods had the same race condition as the
Node.PubKey method, where concurrent calls could race to write to the
cached fields.

Remove the caching for the same reasons: parsing overhead is minimal
and doesn't justify the complexity and race risk.
This commit is contained in:
Elle Mouton committed 2025-12-08 11:56:36 +02:00
1 parent 9906e61774
commit 31b3e7424d
1 file changed
+2 -30
+2 -30
View File
@@ -30,11 +30,9 @@ type ChannelEdgeInfo struct {
// NodeKey1Bytes is the raw public key of the first node. // NodeKey1Bytes is the raw public key of the first node.
NodeKey1Bytes [33]byte NodeKey1Bytes [33]byte
nodeKey1 *btcec.PublicKey
// NodeKey2Bytes is the raw public key of the first node. // NodeKey2Bytes is the raw public key of the first node.
NodeKey2Bytes [33]byte NodeKey2Bytes [33]byte
nodeKey2 *btcec.PublicKey
// BitcoinKey1Bytes is the raw public key of the first node. // BitcoinKey1Bytes is the raw public key of the first node.
BitcoinKey1Bytes [33]byte BitcoinKey1Bytes [33]byte
@@ -78,42 +76,16 @@ type ChannelEdgeInfo struct {
// the creation of this channel. A node is considered "first" if the // the creation of this channel. A node is considered "first" if the
// lexicographical ordering the its serialized public key is "smaller" than // lexicographical ordering the its serialized public key is "smaller" than
// that of the other node involved in channel creation. // that of the other node involved in channel creation.
//
// NOTE: By having this method to access an attribute, we ensure we only need
// to fully deserialize the pubkey if absolutely necessary.
func (c *ChannelEdgeInfo) NodeKey1() (*btcec.PublicKey, error) { func (c *ChannelEdgeInfo) NodeKey1() (*btcec.PublicKey, error) {
if c.nodeKey1 != nil { return btcec.ParsePubKey(c.NodeKey1Bytes[:])
return c.nodeKey1, nil
}
key, err := btcec.ParsePubKey(c.NodeKey1Bytes[:])
if err != nil {
return nil, err
}
c.nodeKey1 = key
return key, nil
} }
// NodeKey2 is the identity public key of the "second" node that was involved in // NodeKey2 is the identity public key of the "second" node that was involved in
// the creation of this channel. A node is considered "second" if the // the creation of this channel. A node is considered "second" if the
// lexicographical ordering the its serialized public key is "larger" than that // lexicographical ordering the its serialized public key is "larger" than that
// of the other node involved in channel creation. // of the other node involved in channel creation.
//
// NOTE: By having this method to access an attribute, we ensure we only need
// to fully deserialize the pubkey if absolutely necessary.
func (c *ChannelEdgeInfo) NodeKey2() (*btcec.PublicKey, error) { func (c *ChannelEdgeInfo) NodeKey2() (*btcec.PublicKey, error) {
if c.nodeKey2 != nil { return btcec.ParsePubKey(c.NodeKey2Bytes[:])
return c.nodeKey2, nil
}
key, err := btcec.ParsePubKey(c.NodeKey2Bytes[:])
if err != nil {
return nil, err
}
c.nodeKey2 = key
return key, nil
} }
// OtherNodeKeyBytes returns the node key bytes of the other end of the channel. // OtherNodeKeyBytes returns the node key bytes of the other end of the channel.