Skip to content

Commit bbc3f00

Browse files
authored
Handle system refcounts for pallet-evm managed contracts (paritytech#288)
1 parent b4ce6ec commit bbc3f00

File tree

3 files changed

+20
-91
lines changed

3 files changed

+20
-91
lines changed

frame/evm/src/backend.rs

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -141,93 +141,3 @@ impl<'vicinity, T: Trait> BackendT for Backend<'vicinity, T> {
141141
AccountStorages::get(address, index)
142142
}
143143
}
144-
145-
impl<'vicinity, T: Trait> ApplyBackend for Backend<'vicinity, T> {
146-
fn apply<A, I, L>(
147-
&mut self,
148-
values: A,
149-
logs: L,
150-
delete_empty: bool,
151-
) where
152-
A: IntoIterator<Item=Apply<I>>,
153-
I: IntoIterator<Item=(H256, H256)>,
154-
L: IntoIterator<Item=evm::backend::Log>,
155-
{
156-
for apply in values {
157-
match apply {
158-
Apply::Modify {
159-
address, basic, code, storage, reset_storage,
160-
} => {
161-
Module::<T>::mutate_account_basic(&address, Account {
162-
nonce: basic.nonce,
163-
balance: basic.balance,
164-
});
165-
166-
if let Some(code) = code {
167-
debug::debug!(
168-
target: "evm",
169-
"Inserting code ({} bytes) at {:?}",
170-
code.len(),
171-
address
172-
);
173-
AccountCodes::insert(address, code);
174-
}
175-
176-
if reset_storage {
177-
AccountStorages::remove_prefix(address);
178-
}
179-
180-
for (index, value) in storage {
181-
if value == H256::default() {
182-
debug::debug!(
183-
target: "evm",
184-
"Removing storage for {:?} [index: {:?}]",
185-
address,
186-
index
187-
);
188-
AccountStorages::remove(address, index);
189-
} else {
190-
debug::debug!(
191-
target: "evm",
192-
"Updating storage for {:?} [index: {:?}, value: {:?}]",
193-
address,
194-
index,
195-
value
196-
);
197-
AccountStorages::insert(address, index, value);
198-
}
199-
}
200-
201-
if delete_empty {
202-
Module::<T>::remove_account_if_empty(&address);
203-
}
204-
},
205-
Apply::Delete { address } => {
206-
debug::debug!(
207-
target: "evm",
208-
"Deleting account at {:?}",
209-
address
210-
);
211-
Module::<T>::remove_account(&address)
212-
},
213-
}
214-
}
215-
216-
for log in logs {
217-
debug::trace!(
218-
target: "evm",
219-
"Inserting log for {:?}, topics ({}) {:?}, data ({}): {:?}]",
220-
log.address,
221-
log.topics.len(),
222-
log.topics,
223-
log.data.len(),
224-
log.data
225-
);
226-
Module::<T>::deposit_event(Event::<T>::Log(Log {
227-
address: log.address,
228-
topics: log.topics,
229-
data: log.data,
230-
}));
231-
}
232-
}
233-
}

frame/evm/src/lib.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,29 @@ impl<T: Config> Module<T> {
522522

523523
/// Remove an account.
524524
pub fn remove_account(address: &H160) {
525+
if AccountCodes::contains_key(address) {
526+
let account_id = T::AddressMapping::into_account_id(*address);
527+
frame_system::Module::<T>::dec_ref(&account_id);
528+
}
529+
525530
AccountCodes::remove(address);
526531
AccountStorages::remove_prefix(address);
527532
}
528533

534+
/// Create an account.
535+
pub fn create_account(address: H160, code: Vec<u8>) {
536+
if code.is_empty() {
537+
return
538+
}
539+
540+
if !AccountCodes::contains_key(&address) {
541+
let account_id = T::AddressMapping::into_account_id(address);
542+
frame_system::Module::<T>::inc_ref(&account_id);
543+
}
544+
545+
AccountCodes::insert(address, code);
546+
}
547+
529548
/// Get the account basic in EVM format.
530549
pub fn account_basic(address: &H160) -> Account {
531550
let account_id = T::AddressMapping::into_account_id(*address);

frame/evm/src/runner/stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ impl<'vicinity, 'config, T: Config> StackStateT<'config> for SubstrateStackState
483483
code.len(),
484484
address
485485
);
486-
AccountCodes::insert(address, code);
486+
Module::<T>::create_account(address, code);
487487
}
488488

489489
fn transfer(&mut self, transfer: Transfer) -> Result<(), ExitError> {

0 commit comments

Comments
 (0)