Switch contract storage to child trie (#2002)

This commit is contained in:
cheme
2019-03-22 18:01:06 +01:00
committed by Sergei Pepyakin
parent 704d2a49c7
commit dd47be51c3
23 changed files with 363 additions and 86 deletions
+16 -8
View File
@@ -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;