From b0f7e355718a90b315bd122b86f472d62ef3b47e Mon Sep 17 00:00:00 2001 From: TianyueLi1227 Date: Tue, 2 Jul 2024 11:44:44 +0800 Subject: [PATCH] Feature: Add functionality of producing hashedNode --- tree.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tree.go b/tree.go index f078816..019b0c0 100644 --- a/tree.go +++ b/tree.go @@ -1845,3 +1845,40 @@ func (n *LeafNode) serializeLeafWithUncompressedCommitments(cBytes, c1Bytes, c2B return result } + +// HashNodeFromInternal hashed all the internal nodes under this node, exclude itself +func (n *InternalNode) HashNodeFromInternal() { + for i, child := range n.children { + switch childNode := child.(type) { + case *LeafNode: + n.children[i] = HashedNode{} + case *InternalNode: + childNode.HashNodeFromInternal() + n.children[i] = HashedNode{} + } + } +} + +// GetInternalNode returns the internal node at the path key, if it exists. +func (n *InternalNode) GetInternalNode(path []byte, flushDepth byte) (VerkleNode, error) { + curNode := n + + for i := byte(0); i < flushDepth; i++ { + nchild := offset2key(path, curNode.depth) + switch child := curNode.children[nchild].(type) { + case UnknownNode: + return nil, errMissingNodeInStateless + case Empty: + return nil, nil + case HashedNode: + return nil, fmt.Errorf("encounter hashedNode on path") + case *LeafNode: + return nil, nil + case *InternalNode: + curNode = child + default: + return nil, errUnknownNodeType + } + } + return curNode, nil +}