@@ -194,7 +194,7 @@ func (t *Trie) get(origNode node, key []byte, pos int) (value []byte, newnode no
194194 case nil :
195195 return nil , nil , false , nil
196196 case valueNode :
197- return n , n , false , nil
197+ return n () , n , false , nil
198198 case * shortNode :
199199 if ! bytes .HasPrefix (key [pos :], n .Key ) {
200200 // key not found in trie
@@ -382,12 +382,26 @@ func (t *Trie) Update(key, value []byte) error {
382382 return t .update (key , value )
383383}
384384
385+ func (t * Trie ) UpdateAsync (key []byte , valueResolver func () []byte ) error {
386+ t .unhashed ++
387+ t .uncommitted ++
388+ k := keybytesToHex (key )
389+
390+ // NOTE: this does not support deletions (the length of the value is not known until it is resolved)
391+ _ , n , err := t .insert (t .root , nil , k , valueNode (valueResolver ))
392+ if err != nil {
393+ return err
394+ }
395+ t .root = n
396+ return nil
397+ }
398+
385399func (t * Trie ) update (key , value []byte ) error {
386400 t .unhashed ++
387401 t .uncommitted ++
388402 k := keybytesToHex (key )
389403 if len (value ) != 0 {
390- _ , n , err := t .insert (t .root , nil , k , valueNode (value ))
404+ _ , n , err := t .insert (t .root , nil , k , valueNode (func () [] byte { return value } ))
391405 if err != nil {
392406 return err
393407 }
@@ -405,7 +419,7 @@ func (t *Trie) update(key, value []byte) error {
405419func (t * Trie ) insert (n node , prefix , key []byte , value node ) (bool , node , error ) {
406420 if len (key ) == 0 {
407421 if v , ok := n .(valueNode ); ok {
408- return ! bytes .Equal (v , value .(valueNode )), value , nil
422+ return ! bytes .Equal (v () , value .(valueNode )( )), value , nil
409423 }
410424 return true , value , nil
411425 }
@@ -647,7 +661,7 @@ func copyNode(n node) node {
647661 case nil :
648662 return nil
649663 case valueNode :
650- return valueNode (common .CopyBytes (n ) )
664+ return valueNode (func () [] byte { return common .CopyBytes (n ()) } )
651665
652666 case * shortNode :
653667 return & shortNode {
0 commit comments