Persistent Local Storage for offchain workers. (#2894)

* WiP.

* Implement offchain storage APIs.

* Change compare_and_set to return bool.

* Add offchain http test.

* Fix tests.

* Bump spec version.

* Fix warnings and test.

* Fix compilation.

* Remove unused code.

* Introduce Local (fork-aware) and Persistent storage.

* Fix borked merge.

* Prevent warning on depreacated client.backend

* Fix long lines.

* Clean up dependencies.

* Update core/primitives/src/offchain.rs

Co-Authored-By: André Silva <andre.beat@gmail.com>

* Update core/primitives/src/offchain.rs

Co-Authored-By: André Silva <andre.beat@gmail.com>
This commit is contained in:
Tomasz Drwięga
2019-07-02 20:11:06 +02:00
committed by Gavin Wood
parent 24aa882ebc
commit 2217c1e9a1
26 changed files with 726 additions and 118 deletions
+11 -4
View File
@@ -33,7 +33,12 @@ use rstd::vec::Vec;
pub use codec;
pub use primitives::Blake2Hasher;
use primitives::offchain::{Timestamp, HttpRequestId, HttpRequestStatus, HttpError, CryptoKind, CryptoKeyId};
use primitives::offchain::{
Timestamp,
HttpRequestId, HttpRequestStatus, HttpError,
CryptoKind, CryptoKeyId,
StorageKind,
};
/// Error verifying ECDSA signature
pub enum EcdsaVerifyError {
@@ -283,23 +288,25 @@ export_api! {
///
/// Note this storage is not part of the consensus, it's only accessible by
/// offchain worker tasks running on the same machine. It IS persisted between runs.
fn local_storage_set(key: &[u8], value: &[u8]);
fn local_storage_set(kind: StorageKind, key: &[u8], value: &[u8]);
/// Sets a value in the local storage if it matches current value.
///
/// Since multiple offchain workers may be running concurrently, to prevent
/// data races use CAS to coordinate between them.
///
/// Returns `true` if the value has been set, `false` otherwise.
///
/// Note this storage is not part of the consensus, it's only accessible by
/// offchain worker tasks running on the same machine. It IS persisted between runs.
fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]);
fn local_storage_compare_and_set(kind: StorageKind, key: &[u8], old_value: &[u8], new_value: &[u8]) -> bool;
/// Gets a value from the local storage.
///
/// If the value does not exist in the storage `None` will be returned.
/// Note this storage is not part of the consensus, it's only accessible by
/// offchain worker tasks running on the same machine. It IS persisted between runs.
fn local_storage_get(key: &[u8]) -> Option<Vec<u8>>;
fn local_storage_get(kind: StorageKind, key: &[u8]) -> Option<Vec<u8>>;
/// Initiaties a http request given HTTP verb and the URL.
///
+2 -4
View File
@@ -486,9 +486,8 @@ mod tests {
#[test]
fn should_send_a_basic_request_and_get_response() {
let offchain = testing::TestOffchainExt::default();
let (offchain, state) = testing::TestOffchainExt::new();
let mut t = TestExternalities::default();
let state = offchain.0.clone();
t.set_offchain_externalities(offchain);
with_externalities(&mut t, || {
@@ -528,9 +527,8 @@ mod tests {
#[test]
fn should_send_a_post_request() {
let offchain = testing::TestOffchainExt::default();
let (offchain, state) = testing::TestOffchainExt::new();
let mut t = TestExternalities::default();
let state = offchain.0.clone();
t.set_offchain_externalities(offchain);
with_externalities(&mut t, || {