Make runtime api calls native when possible (#1302)

* Add simple benchmark for the runtime api

* Make the executor support native calls

* Some documentation

* Hide behind `feature = "std"`

* Rework the native calls

* Make all tests compile again

* Make every parameter using the Block serialized/deserialized in the native call

* Forward `UnwindSafe` requirement

* Remove debug stuff

* Add some documentation

* Fixes warnings

* Fixes errors after master rebase

* Fixes compilation after master rebase

* Fixes compilation after rebase
This commit is contained in:
Bastian Köcher
2019-01-21 14:32:53 +01:00
committed by Gav Wood
parent f0dbcf5401
commit 010e63116f
37 changed files with 1152 additions and 363 deletions
+88 -19
View File
@@ -58,8 +58,9 @@ mod tests {
use keyring::Keyring;
use runtime_support::{Hashable, StorageValue, StorageMap};
use state_machine::{CodeExecutor, Externalities, TestExternalities};
use primitives::{twox_128, Blake2Hasher, ChangesTrieConfiguration,
ed25519::{Public, Pair}};
use primitives::{
twox_128, Blake2Hasher, ChangesTrieConfiguration, ed25519::{Public, Pair}, NeverNativeValue
};
use node_primitives::{Hash, BlockNumber, AccountId};
use runtime_primitives::traits::{Header as HeaderT, Digest as DigestT, Hash as HashT};
use runtime_primitives::{generic, generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill};
@@ -135,10 +136,22 @@ mod tests {
twox_128(&<system::BlockHash<Runtime>>::key_for(0)).to_vec() => vec![0u8; 32]
]);
let r = executor().call(&mut t, "Core_initialise_block", &vec![].and(&from_block_number(1u64)), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_initialise_block",
&vec![].and(&from_block_number(1u64)),
true,
None,
).0;
assert!(r.is_ok());
let v = executor().call(&mut t, "BlockBuilder_apply_extrinsic", &vec![].and(&xt()), true).0.unwrap();
let r = ApplyResult::decode(&mut &v[..]).unwrap();
let v = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"BlockBuilder_apply_extrinsic",
&vec![].and(&xt()),
true,
None,
).0.unwrap();
let r = ApplyResult::decode(&mut &v.as_encoded()[..]).unwrap();
assert_eq!(r, Err(ApplyError::CantPay));
}
@@ -156,10 +169,22 @@ mod tests {
twox_128(&<system::BlockHash<Runtime>>::key_for(0)).to_vec() => vec![0u8; 32]
]);
let r = executor().call(&mut t, "Core_initialise_block", &vec![].and(&from_block_number(1u64)), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_initialise_block",
&vec![].and(&from_block_number(1u64)),
true,
None,
).0;
assert!(r.is_ok());
let v = executor().call(&mut t, "BlockBuilder_apply_extrinsic", &vec![].and(&xt()), true).0.unwrap();
let r = ApplyResult::decode(&mut &v[..]).unwrap();
let v = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"BlockBuilder_apply_extrinsic",
&vec![].and(&xt()),
true,
None,
).0.unwrap();
let r = ApplyResult::decode(&mut &v.as_encoded()[..]).unwrap();
assert_eq!(r, Err(ApplyError::CantPay));
}
@@ -177,9 +202,21 @@ mod tests {
twox_128(&<system::BlockHash<Runtime>>::key_for(0)).to_vec() => vec![0u8; 32]
]);
let r = executor().call(&mut t, "Core_initialise_block", &vec![].and(&from_block_number(1u64)), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_initialise_block",
&vec![].and(&from_block_number(1u64)),
true,
None,
).0;
assert!(r.is_ok());
let r = executor().call(&mut t, "BlockBuilder_apply_extrinsic", &vec![].and(&xt()), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"BlockBuilder_apply_extrinsic",
&vec![].and(&xt()),
true,
None,
).0;
assert!(r.is_ok());
runtime_io::with_externalities(&mut t, || {
@@ -202,9 +239,21 @@ mod tests {
twox_128(&<system::BlockHash<Runtime>>::key_for(0)).to_vec() => vec![0u8; 32]
]);
let r = executor().call(&mut t, "Core_initialise_block", &vec![].and(&from_block_number(1u64)), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_initialise_block",
&vec![].and(&from_block_number(1u64)),
true,
None,
).0;
assert!(r.is_ok());
let r = executor().call(&mut t, "BlockBuilder_apply_extrinsic", &vec![].and(&xt()), true).0;
let r = executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"BlockBuilder_apply_extrinsic",
&vec![].and(&xt()),
true,
None,
).0;
assert!(r.is_ok());
runtime_io::with_externalities(&mut t, || {
@@ -391,7 +440,13 @@ mod tests {
fn full_native_block_import_works() {
let mut t = new_test_ext(COMPACT_CODE, false);
executor().call(&mut t, "Core_execute_block", &block1(false).0, true).0.unwrap();
executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_execute_block",
&block1(false).0,
true,
None,
).0.unwrap();
runtime_io::with_externalities(&mut t, || {
assert_eq!(Balances::total_balance(&alice()), 41);
@@ -440,7 +495,13 @@ mod tests {
]);
});
executor().call(&mut t, "Core_execute_block", &block2().0, true).0.unwrap();
executor().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_execute_block",
&block2().0,
true,
None,
).0.unwrap();
runtime_io::with_externalities(&mut t, || {
assert_eq!(Balances::total_balance(&alice()), 30);
@@ -686,11 +747,12 @@ mod tests {
fn native_big_block_import_succeeds() {
let mut t = new_test_ext(COMPACT_CODE, false);
Executor::new().call(
Executor::new().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_execute_block",
&block1big().0,
true
true,
None,
).0.unwrap();
}
@@ -699,11 +761,12 @@ mod tests {
let mut t = new_test_ext(COMPACT_CODE, false);
assert!(
Executor::new().call(
Executor::new().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_execute_block",
&block1big().0,
false
false,
None,
).0.is_err()
);
}
@@ -760,7 +823,13 @@ mod tests {
#[test]
fn full_native_block_import_works_with_changes_trie() {
let mut t = new_test_ext(COMPACT_CODE, true);
Executor::new().call(&mut t, "Core_execute_block", &block1(true).0, true).0.unwrap();
Executor::new().call::<_, NeverNativeValue, fn() -> NeverNativeValue>(
&mut t,
"Core_execute_block",
&block1(true).0,
true,
None,
).0.unwrap();
assert!(t.storage_changes_root(Default::default(), 0).is_some());
}