diff --git a/substrate/core/client/src/light/backend.rs b/substrate/core/client/src/light/backend.rs index fcc58e0ad7..ca5c84cae2 100644 --- a/substrate/core/client/src/light/backend.rs +++ b/substrate/core/client/src/light/backend.rs @@ -130,6 +130,16 @@ impl ClientBackend for Backend where operation.leaf_state, operation.aux_ops, )?; + } else { + for (key, maybe_val) in operation.aux_ops { + match maybe_val { + Some(val) => self.blockchain.storage().insert_aux( + &[(&key[..], &val[..])], + ::std::iter::empty(), + )?, + None => self.blockchain.storage().insert_aux(::std::iter::empty(), &[&key[..]])?, + } + } } Ok(()) @@ -311,3 +321,21 @@ where None } } + +#[cfg(test)] +mod tests { + use primitives::Blake2Hasher; + use test_client::runtime::Block; + use crate::light::blockchain::tests::{DummyBlockchain, DummyStorage}; + use super::*; + + #[test] + fn light_aux_store_is_updated_via_non_importing_op() { + let backend = Backend::new(Arc::new(DummyBlockchain::new(DummyStorage::new()))); + let mut op = ClientBackend::::begin_operation(&backend).unwrap(); + BlockImportOperation::::insert_aux(&mut op, vec![(vec![1], Some(vec![2]))]).unwrap(); + ClientBackend::::commit_operation(&backend, op).unwrap(); + + assert_eq!(AuxStore::get_aux(&backend, &[1]).unwrap(), Some(vec![2])); + } +} diff --git a/substrate/core/client/src/light/blockchain.rs b/substrate/core/client/src/light/blockchain.rs index 82fff6be6f..6cad6c6841 100644 --- a/substrate/core/client/src/light/blockchain.rs +++ b/substrate/core/client/src/light/blockchain.rs @@ -174,12 +174,14 @@ pub mod tests { pub struct DummyStorage { pub changes_tries_cht_roots: HashMap, + pub aux_store: Mutex, Vec>>, } impl DummyStorage { pub fn new() -> Self { DummyStorage { changes_tries_cht_roots: HashMap::new(), + aux_store: Mutex::new(HashMap::new()), } } } @@ -213,12 +215,15 @@ pub mod tests { 'c: 'a, I: IntoIterator, D: IntoIterator, - >(&self, _insert: I, _delete: D) -> ClientResult<()> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + >(&self, insert: I, _delete: D) -> ClientResult<()> { + for (k, v) in insert.into_iter() { + self.aux_store.lock().insert(k.to_vec(), v.to_vec()); + } + Ok(()) } - fn get_aux(&self, _key: &[u8]) -> ClientResult>> { - Err(ClientErrorKind::Backend("Test error".into()).into()) + fn get_aux(&self, key: &[u8]) -> ClientResult>> { + Ok(self.aux_store.lock().get(key).cloned()) } }