diff --git a/trie/bintrie/internal_node.go b/trie/bintrie/internal_node.go index 866db88c52..dd6aa4b85c 100644 --- a/trie/bintrie/internal_node.go +++ b/trie/bintrie/internal_node.go @@ -34,16 +34,6 @@ func keyToPath(depth int, key []byte) ([]byte, error) { return path, nil } -// makeKeyPath is like keyToPath but panics on invalid depth. -func makeKeyPath(depth int, key []byte) []byte { - path := make([]byte, 0, depth+1) - for i := range depth + 1 { - bit := key[i/8] >> (7 - (i % 8)) & 1 - path = append(path, bit) - } - return path -} - type InternalNode struct { left, right NodeRef depth uint8 diff --git a/trie/bintrie/store_ops.go b/trie/bintrie/store_ops.go index 15c39b527c..eea9c01a70 100644 --- a/trie/bintrie/store_ops.go +++ b/trie/bintrie/store_ops.go @@ -71,7 +71,10 @@ func (s *NodeStore) getSingle(ref NodeRef, stem []byte, suffix byte, resolver No } hn := s.getHashed(cur.Index()) parentNode := s.getInternal(parentIdx) - path := makeKeyPath(int(parentNode.depth), stem) + path, err := keyToPath(int(parentNode.depth), stem) + if err != nil { + return nil, fmt.Errorf("getSingle path error: %w", err) + } data, err := resolver(path, hn.Hash()) if err != nil { return nil, fmt.Errorf("getSingle resolve error: %w", err) @@ -142,7 +145,10 @@ func (s *NodeStore) getValuesAtStem(ref NodeRef, stem []byte, resolver NodeResol } hn := s.getHashed(cur.Index()) parentNode := s.getInternal(parentIdx) - path := makeKeyPath(int(parentNode.depth), stem) + path, err := keyToPath(int(parentNode.depth), stem) + if err != nil { + return nil, fmt.Errorf("getValuesAtStem path error: %w", err) + } data, err := resolver(path, hn.Hash()) if err != nil { return nil, fmt.Errorf("getValuesAtStem resolve error: %w", err) @@ -250,7 +256,10 @@ func (s *NodeStore) insertSingleInternal(stem []byte, suffix byte, value []byte, p := pathStack[pathLen-1] parentNode := s.getInternal(p.internalIdx) hn := s.getHashed(cur.Index()) - path := makeKeyPath(int(parentNode.depth), stem) + path, err := keyToPath(int(parentNode.depth), stem) + if err != nil { + return fmt.Errorf("insertSingle path error: %w", err) + } data, err := resolver(path, hn.Hash()) if err != nil { return fmt.Errorf("insertSingle resolve error: %w", err) @@ -369,7 +378,10 @@ func (s *NodeStore) insertValuesAtStem(ref NodeRef, stem []byte, values [][]byte return ref, errors.New("insertValuesAtStem: cannot resolve hashed node without resolver") } hn := s.getHashed(node.left.Index()) - path := makeKeyPath(int(node.depth), stem) + path, err := keyToPath(int(node.depth), stem) + if err != nil { + return ref, fmt.Errorf("InsertValuesAtStem path error: %w", err) + } data, err := resolver(path, hn.Hash()) if err != nil { return ref, fmt.Errorf("InsertValuesAtStem resolve error: %w", err) @@ -392,7 +404,10 @@ func (s *NodeStore) insertValuesAtStem(ref NodeRef, stem []byte, values [][]byte return ref, errors.New("insertValuesAtStem: cannot resolve hashed node without resolver") } hn := s.getHashed(node.right.Index()) - path := makeKeyPath(int(node.depth), stem) + path, err := keyToPath(int(node.depth), stem) + if err != nil { + return ref, fmt.Errorf("InsertValuesAtStem path error: %w", err) + } data, err := resolver(path, hn.Hash()) if err != nil { return ref, fmt.Errorf("InsertValuesAtStem resolve error: %w", err)