Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Offchain signing #5182

Merged
merged 131 commits into from
Apr 21, 2020
Merged
Show file tree
Hide file tree
Changes from 104 commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
b92c4e1
New approach to offchain signing.
tomusdrw Feb 25, 2020
c27c7bd
Use in im-online
tomusdrw Feb 26, 2020
1b817e3
Rewrite to use Account<T>
tomusdrw Feb 26, 2020
c1e4fb1
DRY signing.
tomusdrw Feb 26, 2020
033a325
Implement send_raw_unsigned_transaction
rakanalh Feb 26, 2020
459c5dd
WiP
tomusdrw Mar 2, 2020
8f7f9ae
Merge.
tomusdrw Mar 2, 2020
f1b2d62
Expunge LocalCall
tomusdrw Mar 2, 2020
e4db565
Expunge LocalCall
tomusdrw Mar 2, 2020
3e11852
Fix compilation.
tomusdrw Mar 2, 2020
726061b
Solve call.
tomusdrw Mar 2, 2020
6bce38e
Make it compile again.
tomusdrw Mar 2, 2020
775df42
Finalize implementation.
tomusdrw Mar 2, 2020
930a7cb
Change CreateTransaction
tomusdrw Mar 2, 2020
31846d9
Clear CreateTransaction.
tomusdrw Mar 2, 2020
25896f0
Add price payload
rakanalh Mar 3, 2020
a62d00d
Send raw transaction
rakanalh Mar 3, 2020
71325fb
Submit signed payload / unsigned transaction (WIP)
rakanalh Mar 3, 2020
3324ef7
Supertrait requirements on T::Signature
rakanalh Mar 3, 2020
b58512c
Validate signature of payload on an unsigned transaction
rakanalh Mar 3, 2020
b850dfd
Fix encoding - part 1
rakanalh Mar 3, 2020
1c8281a
Merge branch 'master' into td-offchain-signing
tomusdrw Mar 3, 2020
5aa5f0f
Make it compile.
tomusdrw Mar 3, 2020
59ce1ba
Fix compilation of unsigned validator.
tomusdrw Mar 3, 2020
748d065
Pass price payload to the transaction
rakanalh Mar 3, 2020
b4e7d43
Merge branch 'td-offchain-signing' of github.com:paritytech/substrate…
rakanalh Mar 3, 2020
064812d
Make block number part of the signed payload
rakanalh Mar 3, 2020
88c95b3
Send signed transaction
rakanalh Mar 4, 2020
83fe399
Implement all_accounts, any_account
rakanalh Mar 4, 2020
e46b0ee
Fix formatting
rakanalh Mar 4, 2020
763f1d9
Implement submit_transaction
rakanalh Mar 4, 2020
eb28754
Submit signed transaction (ForAll, ForAny)
rakanalh Mar 4, 2020
2e27baa
Fix formatting
rakanalh Mar 6, 2020
5c86a37
Implement CreateSignedTransaction
rakanalh Mar 6, 2020
6c3f8b3
Move sign and verify to AppCrypto
tomusdrw Mar 6, 2020
428b3da
Sign transaction
rakanalh Mar 6, 2020
f8b8dd1
Call `use_encoded`
rakanalh Mar 6, 2020
e6b2f33
Remove SubmitAndSignTransaction
rakanalh Mar 7, 2020
1dc8bf0
Implement runtime using new SigningTypes
rakanalh Mar 7, 2020
9f66858
Adapt offchain example to changes
rakanalh Mar 7, 2020
6e14b44
Fix im-online pallet
rakanalh Mar 7, 2020
a3442cb
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 13, 2020
2c75fb5
Quick fix: rename AuthorityId2
rakanalh Mar 13, 2020
1f54eae
Fix offchain example tests
rakanalh Mar 16, 2020
887e0e9
Add a comment on why keystore is required in unsigned transaction test
rakanalh Mar 16, 2020
34afbf2
Use UintAuthorityId instead of u64
rakanalh Mar 18, 2020
d04bd9a
WIP
rakanalh Mar 18, 2020
824940a
Remove IdentifyAccount from UintAuthorityId
rakanalh Mar 18, 2020
259cb98
Implement PublicWrapper type
rakanalh Mar 18, 2020
ea0ffae
Fix im-online tests
rakanalh Mar 18, 2020
853c1f3
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 18, 2020
5fd154d
Fix runtime test
rakanalh Mar 18, 2020
f629bab
Bump spec version
rakanalh Mar 18, 2020
6951887
Fix executor tests
rakanalh Mar 18, 2020
b8702ac
Rename ImOnlineAuthId -> ImOnlineAuthorityId and formatting
rakanalh Mar 23, 2020
09820d1
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 23, 2020
670e26b
Fix merge
rakanalh Mar 23, 2020
f5939cd
Documentation
rakanalh Mar 24, 2020
0ffd1b9
Revert u64 -> UintAuthorityId conversion
rakanalh Mar 24, 2020
324d436
Fix string errors
rakanalh Mar 25, 2020
9fe4409
Document public members in offchain module
rakanalh Mar 25, 2020
dcee66a
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 25, 2020
54cfe80
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 25, 2020
686b218
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 30, 2020
884dc5c
Introduce SubmitTransaction
rakanalh Mar 31, 2020
ac8845f
Update pallets to use SubmitTransaction
rakanalh Mar 31, 2020
55f3fce
WIP
rakanalh Mar 31, 2020
c3df880
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 31, 2020
fda2dd3
Use SubmitTransaction in offchain
rakanalh Mar 31, 2020
44b0701
Use `submit_unsigned_transaction`
rakanalh Mar 31, 2020
ab6c763
Fix tests
rakanalh Mar 31, 2020
0278c8e
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Mar 31, 2020
5fbfe1a
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 1, 2020
de959d6
Update docs
rakanalh Apr 1, 2020
6d3c36b
Remove SigningTypes requirement from `SendTransactionTypes`
rakanalh Apr 2, 2020
f37c783
Fix tests
rakanalh Apr 2, 2020
7279077
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 2, 2020
df8e52c
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 6, 2020
fd70a12
Update frame/system/src/offchain.rs
rakanalh Apr 7, 2020
848adbf
Update frame/system/src/offchain.rs
rakanalh Apr 7, 2020
b4c5765
Update frame/example-offchain-worker/src/tests.rs
rakanalh Apr 7, 2020
f88c1c1
Update frame/system/src/offchain.rs
rakanalh Apr 7, 2020
13a8c84
Update frame/system/src/offchain.rs
rakanalh Apr 7, 2020
61e6987
Remove leftover from previous iterations
rakanalh Apr 7, 2020
c163b22
Change enum to struct
rakanalh Apr 7, 2020
81ba429
Remove public
rakanalh Apr 7, 2020
89b9471
Move mock to node/executor/tests
rakanalh Apr 7, 2020
9f79dc9
Merge branch 'td-offchain-signing' of github.com:paritytech/substrate…
rakanalh Apr 7, 2020
e69848e
Cleanup test-helpers
rakanalh Apr 7, 2020
ad83ed5
Make `application-crypto` `std` feature internal
bkchr Apr 7, 2020
a26379a
Merge remote-tracking branch 'upstream/bkchr-application-crypto-std' …
rakanalh Apr 7, 2020
143bfbe
Revert cargo lock update
rakanalh Apr 7, 2020
9644f85
Use TestAuthorityId from common
rakanalh Apr 7, 2020
aaae8ee
Restore members of account to public
rakanalh Apr 7, 2020
1f39e03
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 7, 2020
917b8a2
Tidy up imports
rakanalh Apr 7, 2020
cdd1af9
Fix benchmarking pallet
rakanalh Apr 7, 2020
ae477bb
Add tests demonstrating ForAll, ForAny on signer
rakanalh Apr 7, 2020
583cdc3
Move definition of AppCrypto
rakanalh Apr 7, 2020
87be138
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 8, 2020
42f4802
Cleanup stray comment
rakanalh Apr 8, 2020
536c8c3
Fix ValidTransaction
rakanalh Apr 8, 2020
2c8676f
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
rakanalh Apr 9, 2020
3253d1f
Re-fix CreateSignedTransaction
rakanalh Apr 9, 2020
27f900e
Address PR feedback
rakanalh Apr 13, 2020
40c2335
Add can_sign method to signer
Apr 14, 2020
9d72eb8
Propagate error
Apr 14, 2020
de39bed
Improve documentation
Apr 14, 2020
4001eda
Fix vec! macro not available
Apr 14, 2020
7ac2b29
Document SendTransactiontypes
Apr 14, 2020
19ce6d8
Add some docs.
tomusdrw Apr 15, 2020
cbb909a
Split signing examples
Apr 15, 2020
79f54ab
Add tests for signing examples
Apr 15, 2020
8491fbc
WIP can_sign - PR feedback
Apr 15, 2020
fe5e74f
Merge branch 'td-offchain-signing' of github.com:paritytech/substrate…
Apr 15, 2020
9d125a1
WIP
Apr 15, 2020
507ef71
Split for_any / for_all into different calls
Apr 16, 2020
5732ff1
Verify payload and signature in test
Apr 16, 2020
2dde0c0
Fix can_sign implementation
Apr 16, 2020
c216977
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
Apr 16, 2020
c378199
Fix impl_version
Apr 16, 2020
4a6d268
Import Box from sp_std
Apr 16, 2020
a94fecc
Create issues for TODOs
Apr 16, 2020
4a61334
Ignore doctest.
tomusdrw Apr 16, 2020
5722163
Add test directly to system. Adjust UintTypes.
tomusdrw Apr 16, 2020
19494c3
Add some tests to account filtering.
tomusdrw Apr 17, 2020
9bdbbc9
Remove code samples and point to example offchain worker
Apr 17, 2020
d35669b
Merge branch 'td-offchain-signing' of github.com:paritytech/substrate…
Apr 17, 2020
6a94d35
Merge remote-tracking branch 'upstream/master' into td-offchain-signing
Apr 17, 2020
2436ca7
Fix doc links
Apr 17, 2020
dec2490
Fix im-online tests using signatures.
tomusdrw Apr 20, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions bin/node/executor/tests/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,21 @@
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.

use codec::{Encode, Decode};
use frame_system::offchain::AppCrypto;
use frame_support::Hashable;
use sp_state_machine::TestExternalities as CoreTestExternalities;
use sp_core::{NeverNativeValue, NativeOrEncoded, traits::{CodeExecutor, RuntimeCode}};
use sp_runtime::{ApplyExtrinsicResult, traits::{Header as HeaderT, BlakeTwo256}};
use sp_core::{
NeverNativeValue, NativeOrEncoded,
crypto::KeyTypeId,
sr25519::Signature,
traits::{CodeExecutor, RuntimeCode},
};
use sp_runtime::{
ApplyExtrinsicResult,
MultiSigner,
MultiSignature,
traits::{Header as HeaderT, BlakeTwo256}
rakanalh marked this conversation as resolved.
Show resolved Hide resolved
};
use sc_executor::{NativeExecutor, WasmExecutionMethod};
use sc_executor::error::Result;

Expand All @@ -31,6 +42,25 @@ use node_primitives::{Hash, BlockNumber};
use node_testing::keyring::*;
use sp_externalities::Externalities;

pub const TEST_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"test");

pub mod sr25519 {
mod app_sr25519 {
use sp_application_crypto::{app_crypto, sr25519};
use super::super::TEST_KEY_TYPE_ID;
app_crypto!(sr25519, TEST_KEY_TYPE_ID);
}

pub type AuthorityId = app_sr25519::Public;
}

pub struct TestAuthorityId;
impl AppCrypto<MultiSigner, MultiSignature> for TestAuthorityId {
type RuntimeAppPublic = sr25519::AuthorityId;
type GenericSignature = Signature;
type GenericPublic = sp_core::sr25519::Public;
}

/// The wasm runtime code.
///
/// `compact` since it is after post-processing with wasm-gc which performs tree-shaking thus
Expand Down
135 changes: 93 additions & 42 deletions bin/node/executor/tests/submit_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,29 @@
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.

use node_runtime::{
Call, Executive, Indices, Runtime, TransactionSubmitterOf, UncheckedExtrinsic,
Executive, Indices, Runtime, UncheckedExtrinsic,
};
use sp_application_crypto::AppKey;
use sp_core::testing::KeyStore;
use sp_core::traits::KeystoreExt;
use sp_core::offchain::{
TransactionPoolExt,
testing::TestTransactionPoolExt,
use sp_core::{
offchain::{
TransactionPoolExt,
testing::TestTransactionPoolExt,
},
traits::KeystoreExt,
};
use frame_system::{
offchain::{
Signer,
SubmitTransaction,
SendSignedTransaction,
}
};
use frame_system::offchain::{SubmitSignedTransaction, SubmitUnsignedTransaction};
use pallet_im_online::sr25519::AuthorityPair as Key;
use codec::Decode;

pub mod common;
use self::common::*;

type SubmitTransaction = TransactionSubmitterOf<pallet_im_online::sr25519::AuthorityId>;

#[test]
fn should_submit_unsigned_transaction() {
let mut t = new_test_ext(COMPACT_CODE, false);
Expand All @@ -49,8 +54,7 @@ fn should_submit_unsigned_transaction() {
};

let call = pallet_im_online::Call::heartbeat(heartbeat_data, signature);
<SubmitTransaction as SubmitUnsignedTransaction<Runtime, Call>>
::submit_unsigned(call)
SubmitTransaction::<Runtime, pallet_im_online::Call<Runtime>>::submit_unsigned_transaction(call.into())
.unwrap();

assert_eq!(state.read().transactions.len(), 1)
Expand All @@ -66,23 +70,16 @@ fn should_submit_signed_transaction() {
t.register_extension(TransactionPoolExt::new(pool));

let keystore = KeyStore::new();
keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter2", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter3", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter3", PHRASE))).unwrap();
t.register_extension(KeystoreExt(keystore));

t.execute_with(|| {
let keys = <SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>
::find_all_local_keys();
assert_eq!(keys.len(), 3, "Missing keys: {:?}", keys);

let can_sign = <SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>
::can_sign();
assert!(can_sign, "Since there are keys, `can_sign` should return true");

let call = pallet_balances::Call::transfer(Default::default(), Default::default());
let results =
<SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>::submit_signed(call);
let results = Signer::<Runtime, TestAuthorityId>::all_accounts()
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});

let len = results.len();
assert_eq!(len, 3);
Expand All @@ -98,27 +95,26 @@ fn should_submit_signed_twice_from_the_same_account() {
t.register_extension(TransactionPoolExt::new(pool));

let keystore = KeyStore::new();
keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE))).unwrap();
t.register_extension(KeystoreExt(keystore));

t.execute_with(|| {
let call = pallet_balances::Call::transfer(Default::default(), Default::default());
let results =
<SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>::submit_signed(call);
let result = Signer::<Runtime, TestAuthorityId>::any_account()
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});

let len = results.len();
assert_eq!(len, 1);
assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len);
assert!(result.is_some());
assert_eq!(state.read().transactions.len(), 1);

// submit another one from the same account. The nonce should be incremented.
let call = pallet_balances::Call::transfer(Default::default(), Default::default());
let results =
<SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>::submit_signed(call);
let result = Signer::<Runtime, TestAuthorityId>::any_account()
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});

let len = results.len();
assert_eq!(len, 1);
assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len);
assert!(result.is_some());
assert_eq!(state.read().transactions.len(), 2);

// now check that the transaction nonces are not equal
Expand All @@ -136,6 +132,60 @@ fn should_submit_signed_twice_from_the_same_account() {
});
}

#[test]
fn should_submit_signed_twice_from_all_accounts() {
let mut t = new_test_ext(COMPACT_CODE, false);
let (pool, state) = TestTransactionPoolExt::new();
t.register_extension(TransactionPoolExt::new(pool));

let keystore = KeyStore::new();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter2", PHRASE))).unwrap();
t.register_extension(KeystoreExt(keystore));

t.execute_with(|| {
let results = Signer::<Runtime, TestAuthorityId>::all_accounts()
rakanalh marked this conversation as resolved.
Show resolved Hide resolved
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});

let len = results.len();
assert_eq!(len, 2);
assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len);
assert_eq!(state.read().transactions.len(), 2);

// submit another one from the same account. The nonce should be incremented.
let results = Signer::<Runtime, TestAuthorityId>::all_accounts()
rakanalh marked this conversation as resolved.
Show resolved Hide resolved
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});

let len = results.len();
assert_eq!(len, 2);
assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len);
assert_eq!(state.read().transactions.len(), 4);

// now check that the transaction nonces are not equal
let s = state.read();
fn nonce(tx: UncheckedExtrinsic) -> frame_system::CheckNonce<Runtime> {
let extra = tx.signature.unwrap().2;
extra.3
}
let nonce1 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[0]).unwrap());
let nonce2 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[1]).unwrap());
let nonce3 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[2]).unwrap());
let nonce4 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[3]).unwrap());
assert!(
nonce1 != nonce3,
"Transactions should have different nonces. Got: 1st tx nonce: {:?}, 2nd nonce: {:?}", nonce1, nonce3
);
assert!(
nonce2 != nonce4,
"Transactions should have different nonces. Got: 1st tx nonce: {:?}, 2nd tx nonce: {:?}", nonce2, nonce4
);
});
}

#[test]
fn submitted_transaction_should_be_valid() {
use codec::Encode;
Expand All @@ -148,13 +198,14 @@ fn submitted_transaction_should_be_valid() {
t.register_extension(TransactionPoolExt::new(pool));

let keystore = KeyStore::new();
keystore.write().sr25519_generate_new(Key::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
keystore.write().sr25519_generate_new(sr25519::AuthorityId::ID, Some(&format!("{}/hunter1", PHRASE))).unwrap();
t.register_extension(KeystoreExt(keystore));

t.execute_with(|| {
let call = pallet_balances::Call::transfer(Default::default(), Default::default());
let results =
<SubmitTransaction as SubmitSignedTransaction<Runtime, Call>>::submit_signed(call);
let results = Signer::<Runtime, TestAuthorityId>::all_accounts()
.send_signed_transaction(|_| {
pallet_balances::Call::transfer(Default::default(), Default::default())
});
let len = results.len();
assert_eq!(len, 1);
assert_eq!(results.into_iter().filter_map(|x| x.1.ok()).count(), len);
Expand Down
Loading