code: func (it *nodeIterator) do(fn func() error) {
  	var lasthash common.Hash
  	for {
  		it.err = fn()
  		missing, ok := it.err.(*trie.MissingNodeError)
  		if !ok {
  			return
  		}
  		if missing.NodeHash == lasthash {
  			it.err = fmt.Errorf("retrieve loop for trie node %x", missing.NodeHash)
  			return
  		}
  		lasthash = missing.NodeHash
  		r := &TrieRequest{Id: it.t.id, Key: nibblesToKey(missing.Path)}
  		if it.err = it.t.db.backend.Retrieve(it.t.db.ctx, r); it.err != nil {
  			return
  		}
  	}
  }
docs: // do runs fn and attempts to fill in missing nodes by retrieving.