Skip to content

Commit 6b24c8d

Browse files
authored
Merge pull request #387 from OffchainLabs/v1.14.4-deterministic-fix
Fix deterministic flag in geth v1.14.4 merge
2 parents e5e4c51 + 126a2d4 commit 6b24c8d

File tree

2 files changed

+16
-27
lines changed

2 files changed

+16
-27
lines changed

arbitrum/recordingdb.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,19 @@ type RecordingKV struct {
3232
inner *triedb.Database
3333
diskDb ethdb.KeyValueStore
3434
readDbEntries map[common.Hash][]byte
35+
mutex sync.Mutex
3536
enableBypass bool
3637
}
3738

3839
func newRecordingKV(inner *triedb.Database, diskDb ethdb.KeyValueStore) *RecordingKV {
39-
return &RecordingKV{inner, diskDb, make(map[common.Hash][]byte), false}
40+
return &RecordingKV{inner, diskDb, make(map[common.Hash][]byte), sync.Mutex{}, false}
4041
}
4142

4243
func (db *RecordingKV) Has(key []byte) (bool, error) {
4344
return false, errors.New("recording KV doesn't support Has")
4445
}
4546

47+
// Get may be called concurrently with other Get calls
4648
func (db *RecordingKV) Get(key []byte) ([]byte, error) {
4749
var hash common.Hash
4850
var res []byte
@@ -66,6 +68,8 @@ func (db *RecordingKV) Get(key []byte) ([]byte, error) {
6668
if crypto.Keccak256Hash(res) != hash {
6769
return nil, fmt.Errorf("recording KV attempted to access non-hash key %v", hash)
6870
}
71+
db.mutex.Lock()
72+
defer db.mutex.Unlock()
6973
db.readDbEntries[hash] = res
7074
return res, nil
7175
}

core/state/statedb.go

+11-26
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package state
1919

2020
import (
21-
"bytes"
2221
"errors"
2322
"fmt"
2423
"maps"
@@ -898,32 +897,15 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
898897
// later time.
899898
workers.SetLimit(1)
900899
}
901-
if s.deterministic {
902-
addressesToUpdate := make([]common.Address, 0, len(s.mutations))
903-
for addr := range s.mutations {
904-
addressesToUpdate = append(addressesToUpdate, addr)
905-
}
906-
sort.Slice(addressesToUpdate, func(i, j int) bool { return bytes.Compare(addressesToUpdate[i][:], addressesToUpdate[j][:]) < 0 })
907-
for _, addr := range addressesToUpdate {
908-
if obj := s.mutations[addr]; !obj.applied && !obj.isDelete() {
909-
obj := s.stateObjects[addr] // closure for the task runner below
910-
workers.Go(func() error {
911-
obj.updateRoot()
912-
return nil
913-
})
914-
}
915-
}
916-
} else {
917-
for addr, op := range s.mutations {
918-
if op.applied || op.isDelete() {
919-
continue
920-
}
921-
obj := s.stateObjects[addr] // closure for the task runner below
922-
workers.Go(func() error {
923-
obj.updateRoot()
924-
return nil
925-
})
900+
for addr, op := range s.mutations {
901+
if op.applied || op.isDelete() {
902+
continue
926903
}
904+
obj := s.stateObjects[addr] // closure for the task runner below
905+
workers.Go(func() error {
906+
obj.updateRoot()
907+
return nil
908+
})
927909
}
928910
workers.Wait()
929911
s.StorageUpdates += time.Since(start)
@@ -968,6 +950,9 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
968950
}
969951
usedAddrs = append(usedAddrs, common.CopyBytes(addr[:])) // Copy needed for closure
970952
}
953+
if s.deterministic {
954+
sort.Slice(deletedAddrs, func(i, j int) bool { return deletedAddrs[i].Cmp(deletedAddrs[j]) < 0 })
955+
}
971956
for _, deletedAddr := range deletedAddrs {
972957
s.deleteStateObject(deletedAddr)
973958
s.AccountDeleted += 1

0 commit comments

Comments
 (0)