code: func (t *odrTrie) do(key []byte, fn func() error) error {
  	for {
  		var err error
  		if t.trie == nil {
  			t.trie, err = trie.New(t.id.Root, trie.NewDatabase(t.db.backend.Database()))
  		}
  		if err == nil {
  			err = fn()
  		}
  		if _, ok := err.(*trie.MissingNodeError); !ok {
  			return err
  		}
  		r := &TrieRequest{Id: t.id, Key: key}
  		if err := t.db.backend.Retrieve(t.db.ctx, r); err != nil {
  			return err
  		}
  	}
  }
docs: // do tries and retries to execute a function until it returns with no error or
  // an error type other than MissingNodeError