core/state: sort deleted accounts for witness determinism

This commit is contained in:
Péter Szilágyi 2024-09-20 16:52:37 +03:00
parent 9326a118c7
commit e36bcbc4f5
2 changed files with 8 additions and 0 deletions

View file

@ -20,6 +20,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"maps" "maps"
"slices"
"time" "time"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
@ -348,6 +349,9 @@ func (s *stateObject) updateTrie() (Trie, error) {
// Cache the items for preloading // Cache the items for preloading
used = append(used, common.CopyBytes(key[:])) // Copy needed for closure used = append(used, common.CopyBytes(key[:])) // Copy needed for closure
} }
// Perform deletes in sorted order to make the touched trie nodes deterministic
slices.SortFunc(deletions, func(a, b common.Hash) int { return bytes.Compare(a[:], b[:]) })
for _, key := range deletions { for _, key := range deletions {
if err := tr.DeleteStorage(s.address, key[:]); err != nil { if err := tr.DeleteStorage(s.address, key[:]); err != nil {
s.db.setError(err) s.db.setError(err)

View file

@ -18,6 +18,7 @@
package state package state
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
"maps" "maps"
@ -895,6 +896,9 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
} }
usedAddrs = append(usedAddrs, common.CopyBytes(addr[:])) // Copy needed for closure usedAddrs = append(usedAddrs, common.CopyBytes(addr[:])) // Copy needed for closure
} }
// Perform deletes in sorted order to make the touched trie nodes deterministic
slices.SortFunc(deletedAddrs, func(a, b common.Address) int { return bytes.Compare(a[:], b[:]) })
for _, deletedAddr := range deletedAddrs { for _, deletedAddr := range deletedAddrs {
s.deleteStateObject(deletedAddr) s.deleteStateObject(deletedAddr)
s.AccountDeleted += 1 s.AccountDeleted += 1