mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 23:31:07 +00:00
Switch contract storage to child trie (#2002)
This commit is contained in:
@@ -14,11 +14,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait};
|
||||
use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb};
|
||||
use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait, TrieId};
|
||||
use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb, AccountTrieIdMapping};
|
||||
use crate::gas::{GasMeter, Token, approx_gas_for_balance};
|
||||
|
||||
use rstd::prelude::*;
|
||||
use rstd::cell::RefCell;
|
||||
use rstd::rc::Rc;
|
||||
use runtime_primitives::traits::{CheckedAdd, CheckedSub, Zero};
|
||||
use srml_support::traits::{WithdrawReason, Currency};
|
||||
use timestamp;
|
||||
@@ -225,6 +227,7 @@ impl<T: Trait> Token<T> for ExecFeeToken {
|
||||
|
||||
pub struct ExecutionContext<'a, T: Trait + 'a, V, L> {
|
||||
pub self_account: T::AccountId,
|
||||
pub self_trieid: TrieId,
|
||||
pub overlay: OverlayAccountDb<'a, T>,
|
||||
pub depth: usize,
|
||||
pub events: Vec<Event<T>>,
|
||||
@@ -244,9 +247,11 @@ where
|
||||
///
|
||||
/// The specified `origin` address will be used as `sender` for
|
||||
pub fn top_level(origin: T::AccountId, cfg: &'a Config<T>, vm: &'a V, loader: &'a L) -> Self {
|
||||
let overlay = OverlayAccountDb::<T>::new(&DirectAccountDb);
|
||||
let overlay = OverlayAccountDb::<T>::new(&DirectAccountDb, Rc::new(RefCell::new(AccountTrieIdMapping::new())), true);
|
||||
let self_trieid = overlay.get_or_create_trieid(&origin);
|
||||
ExecutionContext {
|
||||
self_account: origin,
|
||||
self_trieid,
|
||||
depth: 0,
|
||||
overlay,
|
||||
events: Vec::new(),
|
||||
@@ -258,9 +263,11 @@ where
|
||||
}
|
||||
|
||||
fn nested(&self, overlay: OverlayAccountDb<'a, T>, dest: T::AccountId) -> Self {
|
||||
let self_trieid = overlay.get_or_create_trieid(&dest);
|
||||
ExecutionContext {
|
||||
overlay: overlay,
|
||||
overlay,
|
||||
self_account: dest,
|
||||
self_trieid,
|
||||
depth: self.depth + 1,
|
||||
events: Vec::new(),
|
||||
calls: Vec::new(),
|
||||
@@ -295,7 +302,7 @@ where
|
||||
|
||||
let (change_set, events, calls) = {
|
||||
let mut nested = self.nested(
|
||||
OverlayAccountDb::new(&self.overlay),
|
||||
OverlayAccountDb::new(&self.overlay, self.overlay.reg_cache_new_rc(), false),
|
||||
dest.clone()
|
||||
);
|
||||
|
||||
@@ -370,7 +377,8 @@ where
|
||||
}
|
||||
|
||||
let (change_set, events, calls) = {
|
||||
let mut overlay = OverlayAccountDb::new(&self.overlay);
|
||||
let mut overlay = OverlayAccountDb::new(&self.overlay, self.overlay.reg_cache_new_rc(), false);
|
||||
|
||||
overlay.set_code(&dest, Some(code_hash.clone()));
|
||||
let mut nested = self.nested(overlay, dest.clone());
|
||||
|
||||
@@ -554,7 +562,7 @@ where
|
||||
type T = T;
|
||||
|
||||
fn get_storage(&self, key: &[u8]) -> Option<Vec<u8>> {
|
||||
self.ctx.overlay.get_storage(&self.ctx.self_account, key)
|
||||
self.ctx.overlay.get_storage(&self.ctx.self_trieid, key)
|
||||
}
|
||||
|
||||
fn set_storage(&mut self, key: &[u8], value: Option<Vec<u8>>) {
|
||||
@@ -639,9 +647,9 @@ mod tests {
|
||||
use crate::{CodeHash, Config};
|
||||
use runtime_io::with_externalities;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use std::collections::HashMap;
|
||||
use std::marker::PhantomData;
|
||||
use std::rc::Rc;
|
||||
use assert_matches::assert_matches;
|
||||
|
||||
const ALICE: u64 = 1;
|
||||
|
||||
Reference in New Issue
Block a user