@@ -11,7 +11,7 @@ use evm_interpreter::{
11
11
} ;
12
12
use primitive_types:: { H160 , H256 , U256 } ;
13
13
14
- use crate :: { backend:: TransactionalBackend , MergeStrategy } ;
14
+ use crate :: { backend:: TransactionalBackend , standard :: Config , MergeStrategy } ;
15
15
16
16
#[ derive( Clone , Debug ) ]
17
17
pub struct OverlayedChangeSet {
@@ -25,18 +25,24 @@ pub struct OverlayedChangeSet {
25
25
pub deletes : BTreeSet < H160 > ,
26
26
}
27
27
28
- pub struct OverlayedBackend < B > {
28
+ pub struct OverlayedBackend < ' config , B > {
29
29
backend : B ,
30
30
substate : Box < Substate > ,
31
31
accessed : BTreeSet < ( H160 , Option < H256 > ) > ,
32
+ config : & ' config Config ,
32
33
}
33
34
34
- impl < B > OverlayedBackend < B > {
35
- pub fn new ( backend : B , accessed : BTreeSet < ( H160 , Option < H256 > ) > ) -> Self {
35
+ impl < ' config , B > OverlayedBackend < ' config , B > {
36
+ pub fn new (
37
+ backend : B ,
38
+ accessed : BTreeSet < ( H160 , Option < H256 > ) > ,
39
+ config : & ' config Config ,
40
+ ) -> Self {
36
41
Self {
37
42
backend,
38
43
substate : Box :: new ( Substate :: new ( ) ) ,
39
44
accessed,
45
+ config,
40
46
}
41
47
}
42
48
@@ -57,7 +63,7 @@ impl<B> OverlayedBackend<B> {
57
63
}
58
64
}
59
65
60
- impl < B : RuntimeEnvironment > RuntimeEnvironment for OverlayedBackend < B > {
66
+ impl < B : RuntimeEnvironment > RuntimeEnvironment for OverlayedBackend < ' _ , B > {
61
67
fn block_hash ( & self , number : U256 ) -> H256 {
62
68
self . backend . block_hash ( number)
63
69
}
@@ -95,7 +101,7 @@ impl<B: RuntimeEnvironment> RuntimeEnvironment for OverlayedBackend<B> {
95
101
}
96
102
}
97
103
98
- impl < B : RuntimeBaseBackend > RuntimeBaseBackend for OverlayedBackend < B > {
104
+ impl < B : RuntimeBaseBackend > RuntimeBaseBackend for OverlayedBackend < ' _ , B > {
99
105
fn balance ( & self , address : H160 ) -> U256 {
100
106
if let Some ( balance) = self . substate . known_balance ( address) {
101
107
balance
@@ -145,11 +151,15 @@ impl<B: RuntimeBaseBackend> RuntimeBaseBackend for OverlayedBackend<B> {
145
151
}
146
152
}
147
153
148
- impl < B : RuntimeBaseBackend > RuntimeBackend for OverlayedBackend < B > {
154
+ impl < B : RuntimeBaseBackend > RuntimeBackend for OverlayedBackend < ' _ , B > {
149
155
fn original_storage ( & self , address : H160 , index : H256 ) -> H256 {
150
156
self . backend . storage ( address, index)
151
157
}
152
158
159
+ fn created ( & self , address : H160 ) -> bool {
160
+ self . substate . created ( address)
161
+ }
162
+
153
163
fn deleted ( & self , address : H160 ) -> bool {
154
164
self . substate . deleted ( address)
155
165
}
@@ -184,8 +194,20 @@ impl<B: RuntimeBaseBackend> RuntimeBackend for OverlayedBackend<B> {
184
194
Ok ( ( ) )
185
195
}
186
196
187
- fn mark_delete ( & mut self , address : H160 ) {
188
- self . substate . deletes . insert ( address) ;
197
+ fn mark_delete_reset ( & mut self , address : H160 ) {
198
+ if self . config . suicide_only_in_same_tx {
199
+ if self . created ( address) {
200
+ self . substate . deletes . insert ( address) ;
201
+ self . substate . storage_resets . insert ( address) ;
202
+ }
203
+ } else {
204
+ self . substate . deletes . insert ( address) ;
205
+ self . substate . storage_resets . insert ( address) ;
206
+ }
207
+ }
208
+
209
+ fn mark_create ( & mut self , address : H160 ) {
210
+ self . substate . creates . insert ( address) ;
189
211
}
190
212
191
213
fn reset_storage ( & mut self , address : H160 ) {
@@ -238,7 +260,7 @@ impl<B: RuntimeBaseBackend> RuntimeBackend for OverlayedBackend<B> {
238
260
}
239
261
}
240
262
241
- impl < B : RuntimeBaseBackend > TransactionalBackend for OverlayedBackend < B > {
263
+ impl < ' config , B : RuntimeBaseBackend > TransactionalBackend for OverlayedBackend < ' config , B > {
242
264
fn push_substate ( & mut self ) {
243
265
let mut parent = Box :: new ( Substate :: new ( ) ) ;
244
266
mem:: swap ( & mut parent, & mut self . substate ) ;
@@ -278,6 +300,9 @@ impl<B: RuntimeBaseBackend> TransactionalBackend for OverlayedBackend<B> {
278
300
for address in child. deletes {
279
301
self . substate . deletes . insert ( address) ;
280
302
}
303
+ for address in child. creates {
304
+ self . substate . creates . insert ( address) ;
305
+ }
281
306
}
282
307
MergeStrategy :: Revert | MergeStrategy :: Discard => { }
283
308
}
@@ -294,6 +319,7 @@ struct Substate {
294
319
storages : BTreeMap < ( H160 , H256 ) , H256 > ,
295
320
transient_storage : BTreeMap < ( H160 , H256 ) , H256 > ,
296
321
deletes : BTreeSet < H160 > ,
322
+ creates : BTreeSet < H160 > ,
297
323
}
298
324
299
325
impl Substate {
@@ -308,6 +334,7 @@ impl Substate {
308
334
storages : Default :: default ( ) ,
309
335
transient_storage : Default :: default ( ) ,
310
336
deletes : Default :: default ( ) ,
337
+ creates : Default :: default ( ) ,
311
338
}
312
339
}
313
340
@@ -385,4 +412,14 @@ impl Substate {
385
412
false
386
413
}
387
414
}
415
+
416
+ pub fn created ( & self , address : H160 ) -> bool {
417
+ if self . creates . contains ( & address) {
418
+ true
419
+ } else if let Some ( parent) = self . parent . as_ref ( ) {
420
+ parent. created ( address)
421
+ } else {
422
+ false
423
+ }
424
+ }
388
425
}
0 commit comments