diff --git a/beacon-chain/forkchoice/interfaces.go b/beacon-chain/forkchoice/interfaces.go index 810c38be748..3cc7601343f 100644 --- a/beacon-chain/forkchoice/interfaces.go +++ b/beacon-chain/forkchoice/interfaces.go @@ -38,5 +38,6 @@ type Pruner interface { // Getter returns fork choice related information. type Getter interface { Nodes() []*protoarray.Node + Node([32]byte) *protoarray.Node HasNode([32]byte) bool } diff --git a/beacon-chain/forkchoice/protoarray/helpers.go b/beacon-chain/forkchoice/protoarray/helpers.go index 6d7e9b24e7b..36be34c214c 100644 --- a/beacon-chain/forkchoice/protoarray/helpers.go +++ b/beacon-chain/forkchoice/protoarray/helpers.go @@ -70,3 +70,24 @@ func computeDeltas( return deltas, votes, nil } + +// This return a copy of the proto array node object. +func copyNode(node *Node) *Node { + if node == nil { + return &Node{} + } + + copiedRoot := [32]byte{} + copy(copiedRoot[:], node.root[:]) + + return &Node{ + Slot: node.Slot, + root: copiedRoot, + Parent: node.Parent, + justifiedEpoch: node.justifiedEpoch, + finalizedEpoch: node.finalizedEpoch, + Weight: node.Weight, + bestChild: node.bestChild, + BestDescendent: node.BestDescendent, + } +} diff --git a/beacon-chain/forkchoice/protoarray/store.go b/beacon-chain/forkchoice/protoarray/store.go index 8734c504cfb..c24f5a36581 100644 --- a/beacon-chain/forkchoice/protoarray/store.go +++ b/beacon-chain/forkchoice/protoarray/store.go @@ -106,6 +106,19 @@ func (f *ForkChoice) Nodes() []*Node { return cpy } +// Node returns the copied node in the fork choice store. +func (f *ForkChoice) Node(root [32]byte) *Node { + f.store.nodeIndicesLock.RLock() + defer f.store.nodeIndicesLock.RUnlock() + + index, ok := f.store.nodeIndices[root] + if !ok { + return nil + } + + return copyNode(f.store.nodes[index]) +} + // HasNode returns true if the node exists in fork choice store, // false else wise. func (f *ForkChoice) HasNode(root [32]byte) bool {