code: func (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) {
  	if len(it.stack) == 0 {
  		// Initialize the iterator if we've just started.
  		root := it.trie.Hash()
  		state := &nodeIteratorState{node: it.trie.root, index: -1}
  		if root != emptyRoot {
  			state.hash = root
  		}
  		err := state.resolve(it.trie, nil)
  		return state, nil, nil, err
  	}
  	if !descend {
  		// If we're skipping children, pop the current node first
  		it.pop()
  	}
  
  	// Continue iteration to the next child
  	for len(it.stack) > 0 {
  		parent := it.stack[len(it.stack)-1]
  		ancestor := parent.hash
  		if (ancestor == common.Hash{}) {
  			ancestor = parent.parent
  		}
  		state, path, ok := it.nextChild(parent, ancestor)
  		if ok {
  			if err := state.resolve(it.trie, path); err != nil {
  				return parent, &parent.index, path, err
  			}
  			return state, &parent.index, path, nil
  		}
  		// No more child nodes, move back up.
  		it.pop()
  	}
  	return nil, nil, nil, errIteratorEnd
  }
docs: // peek creates the next state of the iterator.