@@ -47,6 +47,11 @@ type addrSlot struct {
47
47
slot common.Hash
48
48
}
49
49
50
+ type doubleHash struct {
51
+ origin common.Hash
52
+ prev common.Hash
53
+ }
54
+
50
55
// scopedJournal represents all changes within a single callscope. These changes
51
56
// are either all reverted, or all committed -- they cannot be partially applied.
52
57
type scopedJournal struct {
@@ -57,7 +62,7 @@ type scopedJournal struct {
57
62
accessListAddresses []common.Address
58
63
accessListAddrSlots []addrSlot
59
64
60
- storageChanges map [common.Address ]map [common.Hash ]common. Hash
65
+ storageChanges map [common.Address ]map [common.Hash ]doubleHash
61
66
tStorageChanges map [common.Address ]map [common.Hash ]common.Hash
62
67
}
63
68
@@ -79,7 +84,7 @@ func (j *scopedJournal) deepCopy() *scopedJournal {
79
84
accessListAddrSlots : slices .Clone (j .accessListAddrSlots ),
80
85
}
81
86
if j .storageChanges != nil {
82
- cpy .storageChanges = make (map [common.Address ]map [common.Hash ]common. Hash )
87
+ cpy .storageChanges = make (map [common.Address ]map [common.Hash ]doubleHash )
83
88
for addr , changes := range j .storageChanges {
84
89
cpy .storageChanges [addr ] = maps .Clone (changes )
85
90
}
@@ -147,18 +152,18 @@ func (j *scopedJournal) journalAccessListAddSlot(addr common.Address, slot commo
147
152
j .accessListAddrSlots = append (j .accessListAddrSlots , addrSlot {addr , slot })
148
153
}
149
154
150
- func (j * scopedJournal ) journalSetState (addr common.Address , key common. Hash , prev common.Hash ) {
155
+ func (j * scopedJournal ) journalSetState (addr common.Address , key , prev , origin common.Hash ) {
151
156
if j .storageChanges == nil {
152
- j .storageChanges = make (map [common.Address ]map [common.Hash ]common. Hash )
157
+ j .storageChanges = make (map [common.Address ]map [common.Hash ]doubleHash )
153
158
}
154
159
changes , ok := j .storageChanges [addr ]
155
160
if ! ok {
156
- changes = make (map [common.Hash ]common. Hash )
161
+ changes = make (map [common.Hash ]doubleHash )
157
162
j .storageChanges [addr ] = changes
158
163
}
159
164
// Do not overwrite a previous value!
160
165
if _ , ok := changes [key ]; ! ok {
161
- changes [key ] = prev
166
+ changes [key ] = doubleHash { origin : origin , prev : prev }
162
167
}
163
168
}
164
169
@@ -186,10 +191,7 @@ func (j *scopedJournal) revert(s *StateDB) {
186
191
for addr , changes := range j .storageChanges {
187
192
obj := s .getStateObject (addr )
188
193
for key , val := range changes {
189
- // OBS!
190
- // TODO @holiman, it's not correct to pass empty hash here!
191
- // OBS!
192
- obj .setState (key , val , common.Hash {})
194
+ obj .setState (key , val .prev , val .origin )
193
195
}
194
196
}
195
197
// Revert t-store changes
@@ -449,8 +451,8 @@ func (j *sparseJournal) accessListAddSlot(addr common.Address, slot common.Hash)
449
451
j .entries [len (j .entries )- 1 ].journalAccessListAddSlot (addr , slot )
450
452
}
451
453
452
- func (j * sparseJournal ) storageChange (addr common.Address , key common. Hash , prev common. Hash , origin common.Hash ) {
453
- j .entries [len (j .entries )- 1 ].journalSetState (addr , key , prev )
454
+ func (j * sparseJournal ) storageChange (addr common.Address , key , prev , origin common.Hash ) {
455
+ j .entries [len (j .entries )- 1 ].journalSetState (addr , key , prev , origin )
454
456
}
455
457
456
458
func (j * sparseJournal ) transientStateChange (addr common.Address , key , prev common.Hash ) {
0 commit comments