github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/ledger/partial/ptrie/node.go (about)

     1  package ptrie
     2  
     3  import (
     4  	"encoding/hex"
     5  
     6  	"github.com/onflow/flow-go/ledger"
     7  	"github.com/onflow/flow-go/ledger/common/hash"
     8  )
     9  
    10  // Root hash of a node
    11  type Root hash.Hash
    12  
    13  func (r Root) String() string {
    14  	return hex.EncodeToString(r[:])
    15  }
    16  
    17  // node is a struct for constructing our Tree.
    18  // Height Definition: the height of a node v in a tree is the number
    19  // of edges on the longest downward path between v and a tree leaf.
    20  type node struct {
    21  	lChild    *node           // Left Child
    22  	rChild    *node           // Right Child
    23  	height    int             // Height where the node is at
    24  	payload   *ledger.Payload // payload
    25  	hashValue hash.Hash       // hash value
    26  }
    27  
    28  // newNode creates a new node with the provided height and hash
    29  func newNode(v hash.Hash, height int) *node {
    30  	n := new(node)
    31  	n.hashValue = v
    32  	n.height = height
    33  	n.lChild = nil
    34  	n.rChild = nil
    35  	return n
    36  }
    37  
    38  // Hash returns the node's pre-computed hash value
    39  func (n *node) Hash() hash.Hash { return n.hashValue }
    40  
    41  // forceComputeHash computes (and updates) the hashes of _all interim nodes_
    42  // of this sub-trie. Caution: this is an expensive operation!
    43  func (n *node) forceComputeHash() hash.Hash {
    44  	// leaf node
    45  	if n.lChild == nil && n.rChild == nil {
    46  		return n.hashValue
    47  	}
    48  	// otherwise compute
    49  	var h1, h2 hash.Hash
    50  	if n.lChild != nil {
    51  		h1 = n.lChild.forceComputeHash()
    52  	} else {
    53  		h1 = ledger.GetDefaultHashForHeight(n.height - 1)
    54  	}
    55  
    56  	if n.rChild != nil {
    57  		h2 = n.rChild.forceComputeHash()
    58  	} else {
    59  		h2 = ledger.GetDefaultHashForHeight(n.height - 1)
    60  	}
    61  	n.hashValue = hash.HashInterNode(h1, h2)
    62  	return n.hashValue
    63  }