mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-06-27 01:02:56 +02:00
channeldb: add new FetchOtherNode method to ChannelEdgeInfo
In this commit, we add a new method to the ChannelEdgeInfo that will allow the path finding logic to get the node opposite the pivot node without first creating a new db transaction. The new method is able to use an existing db transaction, or create a new one if needed.
This commit is contained in:
parent
ce7bfae4f7
commit
0f3c0ccf85
@ -2051,6 +2051,55 @@ func (c *ChannelEdgeInfo) OtherNodeKeyBytes(thisNodeKey []byte) (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FetchOtherNode attempts to fetch the full LightningNode that's opposite of
|
||||||
|
// the target node in the channel. This is useful when one knows the pubkey of
|
||||||
|
// one of the nodes, and wishes to obtain the full LightningNode for the other
|
||||||
|
// end of the channel.
|
||||||
|
func (c *ChannelEdgeInfo) FetchOtherNode(tx *bolt.Tx, thisNodeKey []byte) (*LightningNode, error) {
|
||||||
|
|
||||||
|
// Ensure that the node passed in is actually a member of the channel.
|
||||||
|
var targetNodeBytes [33]byte
|
||||||
|
switch {
|
||||||
|
case bytes.Equal(c.NodeKey1Bytes[:], thisNodeKey):
|
||||||
|
targetNodeBytes = c.NodeKey2Bytes
|
||||||
|
case bytes.Equal(c.NodeKey2Bytes[:], thisNodeKey):
|
||||||
|
targetNodeBytes = c.NodeKey1Bytes
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("node not participating in this channel")
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetNode *LightningNode
|
||||||
|
fetchNodeFunc := func(tx *bolt.Tx) error {
|
||||||
|
// First grab the nodes bucket which stores the mapping from
|
||||||
|
// pubKey to node information.
|
||||||
|
nodes := tx.Bucket(nodeBucket)
|
||||||
|
if nodes == nil {
|
||||||
|
return ErrGraphNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
node, err := fetchLightningNode(nodes, targetNodeBytes[:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
node.db = c.db
|
||||||
|
|
||||||
|
targetNode = &node
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the transaction is nil, then we'll need to create a new one,
|
||||||
|
// otherwise we can use the existing db transaction.
|
||||||
|
var err error
|
||||||
|
if tx == nil {
|
||||||
|
err = c.db.View(fetchNodeFunc)
|
||||||
|
} else {
|
||||||
|
err = fetchNodeFunc(tx)
|
||||||
|
}
|
||||||
|
|
||||||
|
return targetNode, err
|
||||||
|
}
|
||||||
|
|
||||||
// ChannelAuthProof is the authentication proof (the signature portion) for a
|
// ChannelAuthProof is the authentication proof (the signature portion) for a
|
||||||
// channel. Using the four signatures contained in the struct, and some
|
// channel. Using the four signatures contained in the struct, and some
|
||||||
// auxiliary knowledge (the funding script, node identities, and outpoint) nodes
|
// auxiliary knowledge (the funding script, node identities, and outpoint) nodes
|
||||||
|
Loading…
x
Reference in New Issue
Block a user