mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-25 05:55:42 +00:00
contracts: Remove OnKilledAccount implementation (#5397)
* contracts: Remove OnKilledAccount implementation Contracts now longer rely on this callback to tell them when they are removed. Instead, they can only self destruct using `ext_terminate`. * Fix account removal test * Fix account storage removal
This commit is contained in:
committed by
GitHub
parent
b0d2f4b173
commit
7cbadd73be
@@ -146,16 +146,8 @@ impl<T: Trait> AccountDb<T> for DirectAccountDb {
|
|||||||
let mut total_imbalance = SignedImbalance::zero();
|
let mut total_imbalance = SignedImbalance::zero();
|
||||||
for (address, changed) in s.into_iter() {
|
for (address, changed) in s.into_iter() {
|
||||||
if let Some(balance) = changed.balance() {
|
if let Some(balance) = changed.balance() {
|
||||||
let existed = !T::Currency::total_balance(&address).is_zero();
|
|
||||||
let imbalance = T::Currency::make_free_balance_be(&address, balance);
|
let imbalance = T::Currency::make_free_balance_be(&address, balance);
|
||||||
let exists = !T::Currency::total_balance(&address).is_zero();
|
|
||||||
total_imbalance = total_imbalance.merge(imbalance);
|
total_imbalance = total_imbalance.merge(imbalance);
|
||||||
if existed && !exists {
|
|
||||||
// Account killed. This will ultimately lead to calling `OnKilledAccount` callback
|
|
||||||
// which will make removal of CodeHashOf and AccountStorage for this account.
|
|
||||||
// In order to avoid writing over the deleted properties we `continue` here.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if changed.code_hash().is_some()
|
if changed.code_hash().is_some()
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ use frame_support::{
|
|||||||
parameter_types, IsSubType,
|
parameter_types, IsSubType,
|
||||||
weights::DispatchInfo,
|
weights::DispatchInfo,
|
||||||
};
|
};
|
||||||
use frame_support::traits::{OnKilledAccount, OnUnbalanced, Currency, Get, Time, Randomness};
|
use frame_support::traits::{OnUnbalanced, Currency, Get, Time, Randomness};
|
||||||
use frame_system::{self as system, ensure_signed, RawOrigin, ensure_root};
|
use frame_system::{self as system, ensure_signed, RawOrigin, ensure_root};
|
||||||
use sp_core::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX;
|
use sp_core::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX;
|
||||||
use pallet_contracts_primitives::{RentProjection, ContractAccessError};
|
use pallet_contracts_primitives::{RentProjection, ContractAccessError};
|
||||||
@@ -941,18 +941,6 @@ decl_storage! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this should be removed in favour of a self-destruct contract host function allowing the
|
|
||||||
// contract to delete all storage and the `ContractInfoOf` key and transfer remaining balance to
|
|
||||||
// some other account. As it stands, it's an economic insecurity on any smart-contract chain.
|
|
||||||
// https://github.com/paritytech/substrate/issues/4952
|
|
||||||
impl<T: Trait> OnKilledAccount<T::AccountId> for Module<T> {
|
|
||||||
fn on_killed_account(who: &T::AccountId) {
|
|
||||||
if let Some(ContractInfo::Alive(info)) = <ContractInfoOf<T>>::take(who) {
|
|
||||||
child::kill_storage(&info.trie_id, info.child_trie_unique_id());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// In-memory cache of configuration values.
|
/// In-memory cache of configuration values.
|
||||||
///
|
///
|
||||||
/// We assume that these values can't be changed in the
|
/// We assume that these values can't be changed in the
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ impl frame_system::Trait for Test {
|
|||||||
type ModuleToIndex = ();
|
type ModuleToIndex = ();
|
||||||
type AccountData = pallet_balances::AccountData<u64>;
|
type AccountData = pallet_balances::AccountData<u64>;
|
||||||
type OnNewAccount = ();
|
type OnNewAccount = ();
|
||||||
type OnKilledAccount = Contracts;
|
type OnKilledAccount = ();
|
||||||
}
|
}
|
||||||
impl pallet_balances::Trait for Test {
|
impl pallet_balances::Trait for Test {
|
||||||
type Balance = u64;
|
type Balance = u64;
|
||||||
@@ -308,7 +308,7 @@ fn refunds_unused_gas() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn account_removal_removes_storage() {
|
fn account_removal_does_not_remove_storage() {
|
||||||
ExtBuilder::default().existential_deposit(100).build().execute_with(|| {
|
ExtBuilder::default().existential_deposit(100).build().execute_with(|| {
|
||||||
let trie_id1 = <Test as Trait>::TrieIdGenerator::trie_id(&1);
|
let trie_id1 = <Test as Trait>::TrieIdGenerator::trie_id(&1);
|
||||||
let trie_id2 = <Test as Trait>::TrieIdGenerator::trie_id(&2);
|
let trie_id2 = <Test as Trait>::TrieIdGenerator::trie_id(&2);
|
||||||
@@ -351,14 +351,22 @@ fn account_removal_removes_storage() {
|
|||||||
// Transfer funds from account 1 of such amount that after this transfer
|
// Transfer funds from account 1 of such amount that after this transfer
|
||||||
// the balance of account 1 will be below the existential threshold.
|
// the balance of account 1 will be below the existential threshold.
|
||||||
//
|
//
|
||||||
// This should lead to the removal of all storage associated with this account.
|
// This does not remove the contract storage as we are not notified about a
|
||||||
|
// account removal. This cannot happen in reality because a contract can only
|
||||||
|
// remove itself by `ext_terminate`. There is no external event that can remove
|
||||||
|
// the account appart from that.
|
||||||
assert_ok!(Balances::transfer(Origin::signed(1), 2, 20));
|
assert_ok!(Balances::transfer(Origin::signed(1), 2, 20));
|
||||||
|
|
||||||
// Verify that all entries from account 1 is removed, while
|
// Verify that no entries are removed.
|
||||||
// entries from account 2 is in place.
|
|
||||||
{
|
{
|
||||||
assert!(<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none());
|
assert_eq!(
|
||||||
assert!(<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none());
|
<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1),
|
||||||
|
Some(b"1".to_vec())
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2),
|
||||||
|
Some(b"2".to_vec())
|
||||||
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1),
|
<dyn AccountDb<Test>>::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1),
|
||||||
|
|||||||
Reference in New Issue
Block a user