1#![warn(missing_docs)]
21#![cfg_attr(not(feature = "std"), no_std)]
22
23extern crate alloc;
24
25pub mod backend;
26#[cfg(not(substrate_runtime))]
27mod basic;
28mod error;
29mod ext;
30#[cfg(feature = "fuzzing")]
31pub mod fuzzing;
32#[cfg(not(substrate_runtime))]
33mod in_memory_backend;
34pub(crate) mod overlayed_changes;
35#[cfg(not(substrate_runtime))]
36mod read_only;
37mod stats;
38#[cfg(feature = "std")]
39mod testing;
40mod trie_backend;
41mod trie_backend_essence;
42
43pub use trie_backend::TrieCacheProvider;
44
45#[cfg(feature = "std")]
46pub use std_reexport::*;
47
48#[cfg(feature = "std")]
49pub use execution::*;
50#[cfg(feature = "std")]
51pub use log::{debug, error as log_error, warn};
52#[cfg(feature = "std")]
53pub use tracing::trace;
54
55#[cfg(not(feature = "std"))]
58#[macro_export]
59macro_rules! warn {
60 (target: $target:expr, $message:expr $( , $arg:ident )* $( , )?) => {
61 {
62 $(
63 let _ = &$arg;
64 )*
65 }
66 };
67 ($message:expr, $( $arg:expr, )*) => {
68 {
69 $(
70 let _ = &$arg;
71 )*
72 }
73 };
74}
75
76#[cfg(not(feature = "std"))]
79#[macro_export]
80macro_rules! debug {
81 (target: $target:expr, $message:expr $( , $arg:ident )* $( , )?) => {
82 {
83 $(
84 let _ = &$arg;
85 )*
86 }
87 };
88}
89
90#[cfg(not(feature = "std"))]
93#[macro_export]
94macro_rules! trace {
95 (target: $target:expr, $($arg:tt)+) => {
96 ()
97 };
98 ($($arg:tt)+) => {
99 ()
100 };
101}
102
103#[cfg(not(feature = "std"))]
106#[macro_export]
107macro_rules! log_error {
108 (target: $target:expr, $($arg:tt)+) => {
109 ()
110 };
111 ($($arg:tt)+) => {
112 ()
113 };
114}
115
116#[cfg(feature = "std")]
118pub type DefaultError = String;
119#[cfg(not(feature = "std"))]
121#[derive(Debug, Default, Clone, Copy, Eq, PartialEq)]
122pub struct DefaultError;
123
124#[cfg(not(feature = "std"))]
125impl core::fmt::Display for DefaultError {
126 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
127 write!(f, "DefaultError")
128 }
129}
130
131pub use crate::{
132 backend::{Backend, BackendTransaction, IterArgs, KeysIter, PairsIter, StorageIterator},
133 error::{Error, ExecutionError},
134 ext::Ext,
135 overlayed_changes::{
136 ChildStorageCollection, IndexOperation, OffchainChangesCollection,
137 OffchainOverlayedChanges, OverlayedChanges, StorageChanges, StorageCollection, StorageKey,
138 StorageValue,
139 },
140 stats::{StateMachineStats, UsageInfo, UsageUnit},
141 trie_backend::{TrieBackend, TrieBackendBuilder},
142 trie_backend_essence::{Storage, TrieBackendStorage},
143};
144
145#[cfg(not(substrate_runtime))]
146pub use crate::{
147 basic::BasicExternalities,
148 in_memory_backend::new_in_mem,
149 read_only::{InspectState, ReadOnlyExternalities},
150};
151
152#[cfg(feature = "std")]
153mod std_reexport {
154 pub use crate::{testing::TestExternalities, trie_backend::create_proof_check_backend};
155 pub use sp_trie::{
156 trie_types::{TrieDBMutV0, TrieDBMutV1},
157 CompactProof, DBValue, LayoutV0, LayoutV1, MemoryDB, StorageProof, TrieMut,
158 };
159}
160
161#[cfg(feature = "std")]
162mod execution {
163 use crate::backend::AsTrieBackend;
164
165 use super::*;
166 use codec::Codec;
167 use hash_db::Hasher;
168 use smallvec::SmallVec;
169 use sp_core::{
170 hexdisplay::HexDisplay,
171 storage::{ChildInfo, ChildType, PrefixedStorageKey},
172 traits::{CallContext, CodeExecutor, RuntimeCode},
173 };
174 use sp_externalities::Extensions;
175 use sp_trie::PrefixedMemoryDB;
176 use std::collections::{HashMap, HashSet};
177
178 pub(crate) type CallResult<E> = Result<Vec<u8>, E>;
179
180 pub type DefaultHandler<E> = fn(CallResult<E>, CallResult<E>) -> CallResult<E>;
182
183 pub type InMemoryBackend<H> = TrieBackend<PrefixedMemoryDB<H>, H>;
185
186 #[derive(Debug, Clone)]
188 pub enum BackendTrustLevel {
189 Trusted,
191 Untrusted,
195 }
196
197 pub struct StateMachine<'a, B, H, Exec>
199 where
200 H: Hasher,
201 B: Backend<H>,
202 {
203 backend: &'a B,
204 exec: &'a Exec,
205 method: &'a str,
206 call_data: &'a [u8],
207 overlay: &'a mut OverlayedChanges<H>,
208 extensions: &'a mut Extensions,
209 runtime_code: &'a RuntimeCode<'a>,
210 stats: StateMachineStats,
211 parent_hash: Option<H::Out>,
215 context: CallContext,
216 }
217
218 impl<'a, B, H, Exec> Drop for StateMachine<'a, B, H, Exec>
219 where
220 H: Hasher,
221 B: Backend<H>,
222 {
223 fn drop(&mut self) {
224 self.backend.register_overlay_stats(&self.stats);
225 }
226 }
227
228 impl<'a, B, H, Exec> StateMachine<'a, B, H, Exec>
229 where
230 H: Hasher,
231 H::Out: Ord + 'static + codec::Codec,
232 Exec: CodeExecutor + Clone + 'static,
233 B: Backend<H>,
234 {
235 pub fn new(
237 backend: &'a B,
238 overlay: &'a mut OverlayedChanges<H>,
239 exec: &'a Exec,
240 method: &'a str,
241 call_data: &'a [u8],
242 extensions: &'a mut Extensions,
243 runtime_code: &'a RuntimeCode,
244 context: CallContext,
245 ) -> Self {
246 Self {
247 backend,
248 exec,
249 method,
250 call_data,
251 extensions,
252 overlay,
253 runtime_code,
254 stats: StateMachineStats::default(),
255 parent_hash: None,
256 context,
257 }
258 }
259
260 pub fn set_parent_hash(mut self, parent_hash: H::Out) -> Self {
264 self.parent_hash = Some(parent_hash);
265 self
266 }
267
268 pub fn execute(&mut self) -> Result<Vec<u8>, Box<dyn Error>> {
277 self.overlay
278 .enter_runtime()
279 .expect("StateMachine is never called from the runtime; qed");
280
281 let mut ext = Ext::new(self.overlay, self.backend, Some(self.extensions));
282
283 let ext_id = ext.id;
284
285 trace!(
286 target: "state",
287 ext_id = %HexDisplay::from(&ext_id.to_le_bytes()),
288 method = %self.method,
289 parent_hash = %self.parent_hash.map(|h| format!("{:?}", h)).unwrap_or_else(|| String::from("None")),
290 input = ?HexDisplay::from(&self.call_data),
291 "Call",
292 );
293
294 let result = self
295 .exec
296 .call(&mut ext, self.runtime_code, self.method, self.call_data, self.context)
297 .0;
298
299 self.overlay
300 .exit_runtime()
301 .expect("Runtime is not able to call this function in the overlay; qed");
302
303 trace!(
304 target: "state",
305 ext_id = %HexDisplay::from(&ext_id.to_le_bytes()),
306 ?result,
307 "Return",
308 );
309
310 result.map_err(|e| Box::new(e) as Box<_>)
311 }
312 }
313
314 pub fn prove_execution<B, H, Exec>(
316 backend: &mut B,
317 overlay: &mut OverlayedChanges<H>,
318 exec: &Exec,
319 method: &str,
320 call_data: &[u8],
321 runtime_code: &RuntimeCode,
322 ) -> Result<(Vec<u8>, StorageProof), Box<dyn Error>>
323 where
324 B: AsTrieBackend<H>,
325 H: Hasher,
326 H::Out: Ord + 'static + codec::Codec,
327 Exec: CodeExecutor + Clone + 'static,
328 {
329 let trie_backend = backend.as_trie_backend();
330 prove_execution_on_trie_backend::<_, _, _>(
331 trie_backend,
332 overlay,
333 exec,
334 method,
335 call_data,
336 runtime_code,
337 &mut Default::default(),
338 )
339 }
340
341 pub fn prove_execution_on_trie_backend<S, H, Exec>(
351 trie_backend: &TrieBackend<S, H>,
352 overlay: &mut OverlayedChanges<H>,
353 exec: &Exec,
354 method: &str,
355 call_data: &[u8],
356 runtime_code: &RuntimeCode,
357 extensions: &mut Extensions,
358 ) -> Result<(Vec<u8>, StorageProof), Box<dyn Error>>
359 where
360 S: trie_backend_essence::TrieBackendStorage<H>,
361 H: Hasher,
362 H::Out: Ord + 'static + codec::Codec,
363 Exec: CodeExecutor + 'static + Clone,
364 {
365 let proving_backend =
366 TrieBackendBuilder::wrap(trie_backend).with_recorder(Default::default()).build();
367
368 let result = StateMachine::<_, H, Exec>::new(
369 &proving_backend,
370 overlay,
371 exec,
372 method,
373 call_data,
374 extensions,
375 runtime_code,
376 CallContext::Offchain,
377 )
378 .execute()?;
379
380 let proof = proving_backend
381 .extract_proof()
382 .expect("A recorder was set and thus, a storage proof can be extracted; qed");
383
384 Ok((result, proof))
385 }
386
387 pub fn execution_proof_check<H, Exec>(
389 root: H::Out,
390 proof: StorageProof,
391 overlay: &mut OverlayedChanges<H>,
392 exec: &Exec,
393 method: &str,
394 call_data: &[u8],
395 runtime_code: &RuntimeCode,
396 ) -> Result<Vec<u8>, Box<dyn Error>>
397 where
398 H: Hasher + 'static,
399 Exec: CodeExecutor + Clone + 'static,
400 H::Out: Ord + 'static + codec::Codec,
401 {
402 let trie_backend = create_proof_check_backend::<H>(root, proof)?;
403 execution_proof_check_on_trie_backend::<_, _>(
404 &trie_backend,
405 overlay,
406 exec,
407 method,
408 call_data,
409 runtime_code,
410 )
411 }
412
413 pub fn execution_proof_check_on_trie_backend<H, Exec>(
415 trie_backend: &TrieBackend<MemoryDB<H>, H>,
416 overlay: &mut OverlayedChanges<H>,
417 exec: &Exec,
418 method: &str,
419 call_data: &[u8],
420 runtime_code: &RuntimeCode,
421 ) -> Result<Vec<u8>, Box<dyn Error>>
422 where
423 H: Hasher,
424 H::Out: Ord + 'static + codec::Codec,
425 Exec: CodeExecutor + Clone + 'static,
426 {
427 StateMachine::<_, H, Exec>::new(
428 trie_backend,
429 overlay,
430 exec,
431 method,
432 call_data,
433 &mut Extensions::default(),
434 runtime_code,
435 CallContext::Offchain,
436 )
437 .execute()
438 }
439
440 pub fn prove_read<B, H, I>(backend: B, keys: I) -> Result<StorageProof, Box<dyn Error>>
442 where
443 B: AsTrieBackend<H>,
444 H: Hasher,
445 H::Out: Ord + Codec,
446 I: IntoIterator,
447 I::Item: AsRef<[u8]>,
448 {
449 let trie_backend = backend.as_trie_backend();
450 prove_read_on_trie_backend(trie_backend, keys)
451 }
452
453 pub const MAX_NESTED_TRIE_DEPTH: usize = 2;
456
457 #[derive(PartialEq, Eq, Clone)]
460 pub struct KeyValueStates(pub Vec<KeyValueStorageLevel>);
461
462 #[derive(PartialEq, Eq, Clone)]
464 pub struct KeyValueStorageLevel {
465 pub state_root: Vec<u8>,
468 pub parent_storage_keys: Vec<Vec<u8>>,
471 pub key_values: Vec<(Vec<u8>, Vec<u8>)>,
473 }
474
475 impl<I> From<I> for KeyValueStates
476 where
477 I: IntoIterator<Item = (Vec<u8>, (Vec<(Vec<u8>, Vec<u8>)>, Vec<Vec<u8>>))>,
478 {
479 fn from(b: I) -> Self {
480 let mut result = Vec::new();
481 for (state_root, (key_values, storage_paths)) in b.into_iter() {
482 result.push(KeyValueStorageLevel {
483 state_root,
484 key_values,
485 parent_storage_keys: storage_paths,
486 })
487 }
488 KeyValueStates(result)
489 }
490 }
491
492 impl KeyValueStates {
493 pub fn len(&self) -> usize {
495 self.0.iter().fold(0, |nb, state| nb + state.key_values.len())
496 }
497
498 pub fn update_last_key(
500 &self,
501 stopped_at: usize,
502 last: &mut SmallVec<[Vec<u8>; 2]>,
503 ) -> bool {
504 if stopped_at == 0 || stopped_at > MAX_NESTED_TRIE_DEPTH {
505 return false;
506 }
507 match stopped_at {
508 1 => {
509 let top_last =
510 self.0.get(0).and_then(|s| s.key_values.last().map(|kv| kv.0.clone()));
511 if let Some(top_last) = top_last {
512 match last.len() {
513 0 => {
514 last.push(top_last);
515 return true;
516 },
517 2 => {
518 last.pop();
519 },
520 _ => (),
521 }
522 last[0] = top_last;
524 return true;
525 } else {
526 last.truncate(1);
529 return true;
530 }
531 },
532 2 => {
533 let top_last =
534 self.0.get(0).and_then(|s| s.key_values.last().map(|kv| kv.0.clone()));
535 let child_last =
536 self.0.last().and_then(|s| s.key_values.last().map(|kv| kv.0.clone()));
537
538 if let Some(child_last) = child_last {
539 if last.is_empty() {
540 if let Some(top_last) = top_last {
541 last.push(top_last)
542 } else {
543 return false;
544 }
545 } else if let Some(top_last) = top_last {
546 last[0] = top_last;
547 }
548 if last.len() == 2 {
549 last.pop();
550 }
551 last.push(child_last);
552 return true;
553 } else {
554 return false;
556 }
557 },
558 _ => (),
559 }
560 false
561 }
562 }
563
564 pub fn prove_range_read_with_child_with_size<B, H>(
572 backend: B,
573 size_limit: usize,
574 start_at: &[Vec<u8>],
575 ) -> Result<(StorageProof, u32), Box<dyn Error>>
576 where
577 B: AsTrieBackend<H>,
578 H: Hasher,
579 H::Out: Ord + Codec,
580 {
581 let trie_backend = backend.as_trie_backend();
582 prove_range_read_with_child_with_size_on_trie_backend(trie_backend, size_limit, start_at)
583 }
584
585 pub fn prove_range_read_with_child_with_size_on_trie_backend<S, H>(
589 trie_backend: &TrieBackend<S, H>,
590 size_limit: usize,
591 start_at: &[Vec<u8>],
592 ) -> Result<(StorageProof, u32), Box<dyn Error>>
593 where
594 S: trie_backend_essence::TrieBackendStorage<H>,
595 H: Hasher,
596 H::Out: Ord + Codec,
597 {
598 if start_at.len() > MAX_NESTED_TRIE_DEPTH {
599 return Err(Box::new("Invalid start of range."));
600 }
601
602 let recorder = sp_trie::recorder::Recorder::default();
603 let proving_backend =
604 TrieBackendBuilder::wrap(trie_backend).with_recorder(recorder.clone()).build();
605 let mut count = 0;
606
607 let mut child_roots = HashSet::new();
608 let (mut child_key, mut start_at) = if start_at.len() == 2 {
609 let storage_key = start_at.get(0).expect("Checked length.").clone();
610 if let Some(state_root) = proving_backend
611 .storage(&storage_key)
612 .map_err(|e| Box::new(e) as Box<dyn Error>)?
613 {
614 child_roots.insert(state_root);
615 } else {
616 return Err(Box::new("Invalid range start child trie key."));
617 }
618
619 (Some(storage_key), start_at.get(1).cloned())
620 } else {
621 (None, start_at.get(0).cloned())
622 };
623
624 loop {
625 let (child_info, depth) = if let Some(storage_key) = child_key.as_ref() {
626 let storage_key = PrefixedStorageKey::new_ref(storage_key);
627 (
628 Some(match ChildType::from_prefixed_key(storage_key) {
629 Some((ChildType::ParentKeyId, storage_key)) => {
630 ChildInfo::new_default(storage_key)
631 },
632 None => return Err(Box::new("Invalid range start child trie key.")),
633 }),
634 2,
635 )
636 } else {
637 (None, 1)
638 };
639
640 let start_at_ref = start_at.as_ref().map(AsRef::as_ref);
641 let mut switch_child_key = None;
642 let mut iter = proving_backend
643 .pairs(IterArgs {
644 child_info,
645 start_at: start_at_ref,
646 start_at_exclusive: true,
647 ..IterArgs::default()
648 })
649 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
650
651 while let Some(item) = iter.next() {
652 let (key, value) = item.map_err(|e| Box::new(e) as Box<dyn Error>)?;
653
654 if depth < MAX_NESTED_TRIE_DEPTH &&
655 sp_core::storage::well_known_keys::is_child_storage_key(key.as_slice())
656 {
657 count += 1;
658 if !child_roots.contains(value.as_slice()) {
660 child_roots.insert(value);
661 switch_child_key = Some(key);
662 break;
663 }
664 } else if recorder.estimate_encoded_size() <= size_limit {
665 count += 1;
666 } else {
667 break;
668 }
669 }
670
671 let completed = iter.was_complete();
672
673 if switch_child_key.is_none() {
674 if depth == 1 {
675 break;
676 } else if completed {
677 start_at = child_key.take();
678 } else {
679 break;
680 }
681 } else {
682 child_key = switch_child_key;
683 start_at = None;
684 }
685 }
686
687 let proof = proving_backend
688 .extract_proof()
689 .expect("A recorder was set and thus, a storage proof can be extracted; qed");
690 Ok((proof, count))
691 }
692
693 pub fn prove_range_read_with_size<B, H>(
695 backend: B,
696 child_info: Option<&ChildInfo>,
697 prefix: Option<&[u8]>,
698 size_limit: usize,
699 start_at: Option<&[u8]>,
700 ) -> Result<(StorageProof, u32), Box<dyn Error>>
701 where
702 B: AsTrieBackend<H>,
703 H: Hasher,
704 H::Out: Ord + Codec,
705 {
706 let trie_backend = backend.as_trie_backend();
707 prove_range_read_with_size_on_trie_backend(
708 trie_backend,
709 child_info,
710 prefix,
711 size_limit,
712 start_at,
713 )
714 }
715
716 pub fn prove_range_read_with_size_on_trie_backend<S, H>(
718 trie_backend: &TrieBackend<S, H>,
719 child_info: Option<&ChildInfo>,
720 prefix: Option<&[u8]>,
721 size_limit: usize,
722 start_at: Option<&[u8]>,
723 ) -> Result<(StorageProof, u32), Box<dyn Error>>
724 where
725 S: trie_backend_essence::TrieBackendStorage<H>,
726 H: Hasher,
727 H::Out: Ord + Codec,
728 {
729 let recorder = sp_trie::recorder::Recorder::default();
730 let proving_backend =
731 TrieBackendBuilder::wrap(trie_backend).with_recorder(recorder.clone()).build();
732 let mut count = 0;
733 let iter = proving_backend
734 .pairs(IterArgs {
738 child_info: child_info.cloned(),
739 prefix,
740 start_at,
741 ..IterArgs::default()
742 })
743 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
744
745 for item in iter {
746 item.map_err(|e| Box::new(e) as Box<dyn Error>)?;
747 if count == 0 || recorder.estimate_encoded_size() <= size_limit {
748 count += 1;
749 } else {
750 break;
751 }
752 }
753
754 let proof = proving_backend
755 .extract_proof()
756 .expect("A recorder was set and thus, a storage proof can be extracted; qed");
757 Ok((proof, count))
758 }
759
760 pub fn prove_child_read<B, H, I>(
762 backend: B,
763 child_info: &ChildInfo,
764 keys: I,
765 ) -> Result<StorageProof, Box<dyn Error>>
766 where
767 B: AsTrieBackend<H>,
768 H: Hasher,
769 H::Out: Ord + Codec,
770 I: IntoIterator,
771 I::Item: AsRef<[u8]>,
772 {
773 let trie_backend = backend.as_trie_backend();
774 prove_child_read_on_trie_backend(trie_backend, child_info, keys)
775 }
776
777 pub fn prove_read_on_trie_backend<S, H, I>(
779 trie_backend: &TrieBackend<S, H>,
780 keys: I,
781 ) -> Result<StorageProof, Box<dyn Error>>
782 where
783 S: trie_backend_essence::TrieBackendStorage<H>,
784 H: Hasher,
785 H::Out: Ord + Codec,
786 I: IntoIterator,
787 I::Item: AsRef<[u8]>,
788 {
789 let proving_backend =
790 TrieBackendBuilder::wrap(trie_backend).with_recorder(Default::default()).build();
791 for key in keys.into_iter() {
792 proving_backend
793 .storage(key.as_ref())
794 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
795 }
796
797 Ok(proving_backend
798 .extract_proof()
799 .expect("A recorder was set and thus, a storage proof can be extracted; qed"))
800 }
801
802 pub fn prove_child_read_on_trie_backend<S, H, I>(
804 trie_backend: &TrieBackend<S, H>,
805 child_info: &ChildInfo,
806 keys: I,
807 ) -> Result<StorageProof, Box<dyn Error>>
808 where
809 S: trie_backend_essence::TrieBackendStorage<H>,
810 H: Hasher,
811 H::Out: Ord + Codec,
812 I: IntoIterator,
813 I::Item: AsRef<[u8]>,
814 {
815 let proving_backend =
816 TrieBackendBuilder::wrap(trie_backend).with_recorder(Default::default()).build();
817 for key in keys.into_iter() {
818 proving_backend
819 .child_storage(child_info, key.as_ref())
820 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
821 }
822
823 Ok(proving_backend
824 .extract_proof()
825 .expect("A recorder was set and thus, a storage proof can be extracted; qed"))
826 }
827
828 pub fn read_proof_check<H, I>(
830 root: H::Out,
831 proof: StorageProof,
832 keys: I,
833 ) -> Result<HashMap<Vec<u8>, Option<Vec<u8>>>, Box<dyn Error>>
834 where
835 H: Hasher + 'static,
836 H::Out: Ord + Codec,
837 I: IntoIterator,
838 I::Item: AsRef<[u8]>,
839 {
840 let proving_backend = create_proof_check_backend::<H>(root, proof)?;
841 let mut result = HashMap::new();
842 for key in keys.into_iter() {
843 let value = read_proof_check_on_proving_backend(&proving_backend, key.as_ref())?;
844 result.insert(key.as_ref().to_vec(), value);
845 }
846 Ok(result)
847 }
848
849 pub fn read_range_proof_check_with_child<H>(
855 root: H::Out,
856 proof: StorageProof,
857 start_at: &[Vec<u8>],
858 ) -> Result<(KeyValueStates, usize), Box<dyn Error>>
859 where
860 H: Hasher + 'static,
861 H::Out: Ord + Codec,
862 {
863 let proving_backend = create_proof_check_backend::<H>(root, proof)?;
864 read_range_proof_check_with_child_on_proving_backend(&proving_backend, start_at)
865 }
866
867 pub fn read_range_proof_check<H>(
869 root: H::Out,
870 proof: StorageProof,
871 child_info: Option<&ChildInfo>,
872 prefix: Option<&[u8]>,
873 count: Option<u32>,
874 start_at: Option<&[u8]>,
875 ) -> Result<(Vec<(Vec<u8>, Vec<u8>)>, bool), Box<dyn Error>>
876 where
877 H: Hasher + 'static,
878 H::Out: Ord + Codec,
879 {
880 let proving_backend = create_proof_check_backend::<H>(root, proof)?;
881 read_range_proof_check_on_proving_backend(
882 &proving_backend,
883 child_info,
884 prefix,
885 count,
886 start_at,
887 )
888 }
889
890 pub fn read_child_proof_check<H, I>(
892 root: H::Out,
893 proof: StorageProof,
894 child_info: &ChildInfo,
895 keys: I,
896 ) -> Result<HashMap<Vec<u8>, Option<Vec<u8>>>, Box<dyn Error>>
897 where
898 H: Hasher + 'static,
899 H::Out: Ord + Codec,
900 I: IntoIterator,
901 I::Item: AsRef<[u8]>,
902 {
903 let proving_backend = create_proof_check_backend::<H>(root, proof)?;
904 let mut result = HashMap::new();
905 for key in keys.into_iter() {
906 let value = read_child_proof_check_on_proving_backend(
907 &proving_backend,
908 child_info,
909 key.as_ref(),
910 )?;
911 result.insert(key.as_ref().to_vec(), value);
912 }
913 Ok(result)
914 }
915
916 pub fn read_proof_check_on_proving_backend<H>(
918 proving_backend: &TrieBackend<MemoryDB<H>, H>,
919 key: &[u8],
920 ) -> Result<Option<Vec<u8>>, Box<dyn Error>>
921 where
922 H: Hasher,
923 H::Out: Ord + Codec,
924 {
925 proving_backend.storage(key).map_err(|e| Box::new(e) as Box<dyn Error>)
926 }
927
928 pub fn read_child_proof_check_on_proving_backend<H>(
930 proving_backend: &TrieBackend<MemoryDB<H>, H>,
931 child_info: &ChildInfo,
932 key: &[u8],
933 ) -> Result<Option<Vec<u8>>, Box<dyn Error>>
934 where
935 H: Hasher,
936 H::Out: Ord + Codec,
937 {
938 proving_backend
939 .child_storage(child_info, key)
940 .map_err(|e| Box::new(e) as Box<dyn Error>)
941 }
942
943 pub fn read_range_proof_check_on_proving_backend<H>(
948 proving_backend: &TrieBackend<MemoryDB<H>, H>,
949 child_info: Option<&ChildInfo>,
950 prefix: Option<&[u8]>,
951 count: Option<u32>,
952 start_at: Option<&[u8]>,
953 ) -> Result<(Vec<(Vec<u8>, Vec<u8>)>, bool), Box<dyn Error>>
954 where
955 H: Hasher,
956 H::Out: Ord + Codec,
957 {
958 let mut values = Vec::new();
959 let mut iter = proving_backend
960 .pairs(IterArgs {
961 child_info: child_info.cloned(),
962 prefix,
963 start_at,
964 stop_on_incomplete_database: true,
965 ..IterArgs::default()
966 })
967 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
968
969 while let Some(item) = iter.next() {
970 let (key, value) = item.map_err(|e| Box::new(e) as Box<dyn Error>)?;
971 values.push((key, value));
972 if !count.as_ref().map_or(true, |c| (values.len() as u32) < *c) {
973 break;
974 }
975 }
976
977 Ok((values, iter.was_complete()))
978 }
979
980 pub fn read_range_proof_check_with_child_on_proving_backend<H>(
984 proving_backend: &TrieBackend<MemoryDB<H>, H>,
985 start_at: &[Vec<u8>],
986 ) -> Result<(KeyValueStates, usize), Box<dyn Error>>
987 where
988 H: Hasher,
989 H::Out: Ord + Codec,
990 {
991 let mut result = vec![KeyValueStorageLevel {
992 state_root: Default::default(),
993 key_values: Default::default(),
994 parent_storage_keys: Default::default(),
995 }];
996 if start_at.len() > MAX_NESTED_TRIE_DEPTH {
997 return Err(Box::new("Invalid start of range."));
998 }
999
1000 let mut child_roots = HashSet::new();
1001 let (mut child_key, mut start_at) = if start_at.len() == 2 {
1002 let storage_key = start_at.get(0).expect("Checked length.").clone();
1003 let child_key = if let Some(state_root) = proving_backend
1004 .storage(&storage_key)
1005 .map_err(|e| Box::new(e) as Box<dyn Error>)?
1006 {
1007 child_roots.insert(state_root.clone());
1008 Some((storage_key, state_root))
1009 } else {
1010 return Err(Box::new("Invalid range start child trie key."));
1011 };
1012
1013 (child_key, start_at.get(1).cloned())
1014 } else {
1015 (None, start_at.get(0).cloned())
1016 };
1017
1018 let completed = loop {
1019 let (child_info, depth) = if let Some((storage_key, state_root)) = child_key.as_ref() {
1020 result.push(KeyValueStorageLevel {
1021 state_root: state_root.clone(),
1022 key_values: Default::default(),
1023 parent_storage_keys: Default::default(),
1024 });
1025
1026 let storage_key = PrefixedStorageKey::new_ref(storage_key);
1027 (
1028 Some(match ChildType::from_prefixed_key(storage_key) {
1029 Some((ChildType::ParentKeyId, storage_key)) => {
1030 ChildInfo::new_default(storage_key)
1031 },
1032 None => return Err(Box::new("Invalid range start child trie key.")),
1033 }),
1034 2,
1035 )
1036 } else {
1037 (None, 1)
1038 };
1039
1040 let values = if child_info.is_some() {
1041 &mut result.last_mut().expect("Added above").key_values
1042 } else {
1043 &mut result[0].key_values
1044 };
1045 let start_at_ref = start_at.as_ref().map(AsRef::as_ref);
1046 let mut switch_child_key = None;
1047
1048 let mut iter = proving_backend
1049 .pairs(IterArgs {
1050 child_info,
1051 start_at: start_at_ref,
1052 start_at_exclusive: true,
1053 stop_on_incomplete_database: true,
1054 ..IterArgs::default()
1055 })
1056 .map_err(|e| Box::new(e) as Box<dyn Error>)?;
1057
1058 while let Some(item) = iter.next() {
1059 let (key, value) = item.map_err(|e| Box::new(e) as Box<dyn Error>)?;
1060 values.push((key.to_vec(), value.to_vec()));
1061
1062 if depth < MAX_NESTED_TRIE_DEPTH &&
1063 sp_core::storage::well_known_keys::is_child_storage_key(key.as_slice())
1064 {
1065 if !child_roots.contains(value.as_slice()) {
1067 child_roots.insert(value.clone());
1068 switch_child_key = Some((key, value));
1069 break;
1070 }
1071 }
1072 }
1073
1074 let completed = iter.was_complete();
1075
1076 if switch_child_key.is_none() {
1077 if !completed {
1078 break depth;
1079 }
1080 if depth == 1 {
1081 break 0;
1082 } else {
1083 start_at = child_key.take().map(|entry| entry.0);
1084 }
1085 } else {
1086 child_key = switch_child_key;
1087 start_at = None;
1088 }
1089 };
1090 Ok((KeyValueStates(result), completed))
1091 }
1092}
1093
1094#[cfg(test)]
1095mod tests {
1096 use super::{backend::AsTrieBackend, ext::Ext, *};
1097 use crate::{execution::CallResult, in_memory_backend::new_in_mem};
1098 use assert_matches::assert_matches;
1099 use codec::Encode;
1100 use sp_core::{
1101 map,
1102 storage::{ChildInfo, StateVersion},
1103 traits::{CallContext, CodeExecutor, Externalities, RuntimeCode},
1104 H256,
1105 };
1106 use sp_runtime::traits::BlakeTwo256;
1107 use sp_trie::{
1108 trie_types::{TrieDBMutBuilderV0, TrieDBMutBuilderV1},
1109 KeySpacedDBMut, PrefixedMemoryDB,
1110 };
1111 use std::collections::{BTreeMap, HashMap};
1112
1113 #[derive(Clone)]
1114 struct DummyCodeExecutor {
1115 native_available: bool,
1116 native_succeeds: bool,
1117 fallback_succeeds: bool,
1118 }
1119
1120 impl CodeExecutor for DummyCodeExecutor {
1121 type Error = u8;
1122
1123 fn call(
1124 &self,
1125 ext: &mut dyn Externalities,
1126 _: &RuntimeCode,
1127 _method: &str,
1128 _data: &[u8],
1129 _: CallContext,
1130 ) -> (CallResult<Self::Error>, bool) {
1131 let using_native = self.native_available;
1132 match (using_native, self.native_succeeds, self.fallback_succeeds) {
1133 (true, true, _) | (false, _, true) => (
1134 Ok(vec![
1135 ext.storage(b"value1").unwrap()[0] + ext.storage(b"value2").unwrap()[0],
1136 ]),
1137 using_native,
1138 ),
1139 _ => (Err(0), using_native),
1140 }
1141 }
1142 }
1143
1144 impl sp_core::traits::ReadRuntimeVersion for DummyCodeExecutor {
1145 fn read_runtime_version(
1146 &self,
1147 _: &[u8],
1148 _: &mut dyn Externalities,
1149 ) -> std::result::Result<Vec<u8>, String> {
1150 unimplemented!("Not required in tests.")
1151 }
1152 }
1153
1154 #[test]
1155 fn execute_works() {
1156 execute_works_inner(StateVersion::V0);
1157 execute_works_inner(StateVersion::V1);
1158 }
1159 fn execute_works_inner(state_version: StateVersion) {
1160 let backend = trie_backend::tests::test_trie(state_version, None, None);
1161 let mut overlayed_changes = Default::default();
1162 let wasm_code = RuntimeCode::empty();
1163 let mut execution_extensions = &mut Default::default();
1164
1165 let mut state_machine = StateMachine::new(
1166 &backend,
1167 &mut overlayed_changes,
1168 &DummyCodeExecutor {
1169 native_available: true,
1170 native_succeeds: true,
1171 fallback_succeeds: true,
1172 },
1173 "test",
1174 &[],
1175 &mut execution_extensions,
1176 &wasm_code,
1177 CallContext::Offchain,
1178 );
1179
1180 assert_eq!(state_machine.execute().unwrap(), vec![66]);
1181 }
1182
1183 #[test]
1184 fn execute_works_with_native_else_wasm() {
1185 execute_works_with_native_else_wasm_inner(StateVersion::V0);
1186 execute_works_with_native_else_wasm_inner(StateVersion::V1);
1187 }
1188 fn execute_works_with_native_else_wasm_inner(state_version: StateVersion) {
1189 let backend = trie_backend::tests::test_trie(state_version, None, None);
1190 let mut overlayed_changes = Default::default();
1191 let wasm_code = RuntimeCode::empty();
1192 let mut execution_extensions = &mut Default::default();
1193
1194 let mut state_machine = StateMachine::new(
1195 &backend,
1196 &mut overlayed_changes,
1197 &DummyCodeExecutor {
1198 native_available: true,
1199 native_succeeds: true,
1200 fallback_succeeds: true,
1201 },
1202 "test",
1203 &[],
1204 &mut execution_extensions,
1205 &wasm_code,
1206 CallContext::Offchain,
1207 );
1208
1209 assert_eq!(state_machine.execute().unwrap(), vec![66]);
1210 }
1211
1212 #[test]
1213 fn prove_execution_and_proof_check_works() {
1214 prove_execution_and_proof_check_works_inner(StateVersion::V0);
1215 prove_execution_and_proof_check_works_inner(StateVersion::V1);
1216 }
1217 fn prove_execution_and_proof_check_works_inner(state_version: StateVersion) {
1218 let executor = DummyCodeExecutor {
1219 native_available: true,
1220 native_succeeds: true,
1221 fallback_succeeds: true,
1222 };
1223
1224 let mut remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1226 let remote_root = remote_backend.storage_root(std::iter::empty(), state_version).0;
1227 let (remote_result, remote_proof) = prove_execution(
1228 &mut remote_backend,
1229 &mut Default::default(),
1230 &executor,
1231 "test",
1232 &[],
1233 &RuntimeCode::empty(),
1234 )
1235 .unwrap();
1236
1237 let local_result = execution_proof_check::<BlakeTwo256, _>(
1239 remote_root,
1240 remote_proof,
1241 &mut Default::default(),
1242 &executor,
1243 "test",
1244 &[],
1245 &RuntimeCode::empty(),
1246 )
1247 .unwrap();
1248
1249 assert_eq!(remote_result, vec![66]);
1251 assert_eq!(remote_result, local_result);
1252 }
1253
1254 #[test]
1255 fn clear_prefix_in_ext_works() {
1256 let initial: BTreeMap<_, _> = map![
1257 b"aaa".to_vec() => b"0".to_vec(),
1258 b"abb".to_vec() => b"1".to_vec(),
1259 b"abc".to_vec() => b"2".to_vec(),
1260 b"bbb".to_vec() => b"3".to_vec()
1261 ];
1262 let state = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
1263 let backend = state.as_trie_backend();
1264
1265 let mut overlay = OverlayedChanges::default();
1266 overlay.set_storage(b"aba".to_vec(), Some(b"1312".to_vec()));
1267 overlay.set_storage(b"bab".to_vec(), Some(b"228".to_vec()));
1268 overlay.start_transaction();
1269 overlay.set_storage(b"abd".to_vec(), Some(b"69".to_vec()));
1270 overlay.set_storage(b"bbd".to_vec(), Some(b"42".to_vec()));
1271
1272 let overlay_limit = overlay.clone();
1273 {
1274 let mut ext = Ext::new(&mut overlay, backend, None);
1275 let _ = ext.clear_prefix(b"ab", None, None);
1276 }
1277 overlay.commit_transaction().unwrap();
1278
1279 assert_eq!(
1280 overlay
1281 .changes_mut()
1282 .map(|(k, v)| (k.clone(), v.value().cloned()))
1283 .collect::<HashMap<_, _>>(),
1284 map![
1285 b"abc".to_vec() => None,
1286 b"abb".to_vec() => None,
1287 b"aba".to_vec() => None,
1288 b"abd".to_vec() => None,
1289
1290 b"bab".to_vec() => Some(b"228".to_vec()),
1291 b"bbd".to_vec() => Some(b"42".to_vec())
1292 ],
1293 );
1294
1295 let mut overlay = overlay_limit;
1296 {
1297 let mut ext = Ext::new(&mut overlay, backend, None);
1298 assert_matches!(
1299 ext.clear_prefix(b"ab", Some(1), None).deconstruct(),
1300 (Some(_), 1, 3, 1)
1301 );
1302 }
1303 overlay.commit_transaction().unwrap();
1304
1305 assert_eq!(
1306 overlay
1307 .changes_mut()
1308 .map(|(k, v)| (k.clone(), v.value().cloned()))
1309 .collect::<HashMap<_, _>>(),
1310 map![
1311 b"abb".to_vec() => None,
1312 b"aba".to_vec() => None,
1313 b"abd".to_vec() => None,
1314
1315 b"bab".to_vec() => Some(b"228".to_vec()),
1316 b"bbd".to_vec() => Some(b"42".to_vec())
1317 ],
1318 );
1319 }
1320
1321 #[test]
1322 fn limited_child_kill_works() {
1323 let child_info = ChildInfo::new_default(b"sub1");
1324 let initial: HashMap<_, BTreeMap<_, _>> = map![
1325 Some(child_info.clone()) => map![
1326 b"a".to_vec() => b"0".to_vec(),
1327 b"b".to_vec() => b"1".to_vec(),
1328 b"c".to_vec() => b"2".to_vec(),
1329 b"d".to_vec() => b"3".to_vec()
1330 ],
1331 ];
1332 let backend = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
1333
1334 let mut overlay = OverlayedChanges::default();
1335 overlay.set_child_storage(&child_info, b"1".to_vec(), Some(b"1312".to_vec()));
1336 overlay.set_child_storage(&child_info, b"2".to_vec(), Some(b"1312".to_vec()));
1337 overlay.set_child_storage(&child_info, b"3".to_vec(), Some(b"1312".to_vec()));
1338 overlay.set_child_storage(&child_info, b"4".to_vec(), Some(b"1312".to_vec()));
1339
1340 {
1341 let mut ext = Ext::new(&mut overlay, &backend, None);
1342 let r = ext.kill_child_storage(&child_info, Some(2), None);
1343 assert_matches!(r.deconstruct(), (Some(_), 2, 6, 2));
1344 }
1345
1346 assert_eq!(
1347 overlay
1348 .children_mut()
1349 .flat_map(|(iter, _child_info)| iter)
1350 .map(|(k, v)| (k.clone(), v.value()))
1351 .collect::<BTreeMap<_, _>>(),
1352 map![
1353 b"1".to_vec() => None,
1354 b"2".to_vec() => None,
1355 b"3".to_vec() => None,
1356 b"4".to_vec() => None,
1357 b"a".to_vec() => None,
1358 b"b".to_vec() => None,
1359 ],
1360 );
1361 }
1362
1363 #[test]
1364 fn limited_child_kill_off_by_one_works() {
1365 let child_info = ChildInfo::new_default(b"sub1");
1366 let initial: HashMap<_, BTreeMap<_, _>> = map![
1367 Some(child_info.clone()) => map![
1368 b"a".to_vec() => b"0".to_vec(),
1369 b"b".to_vec() => b"1".to_vec(),
1370 b"c".to_vec() => b"2".to_vec(),
1371 b"d".to_vec() => b"3".to_vec()
1372 ],
1373 ];
1374 let backend = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
1375 let mut overlay = OverlayedChanges::default();
1376 let mut ext = Ext::new(&mut overlay, &backend, None);
1377 let r = ext.kill_child_storage(&child_info, Some(0), None).deconstruct();
1378 assert_matches!(r, (Some(_), 0, 0, 0));
1379 let r = ext
1380 .kill_child_storage(&child_info, Some(1), r.0.as_ref().map(|x| &x[..]))
1381 .deconstruct();
1382 assert_matches!(r, (Some(_), 1, 1, 1));
1383 let r = ext
1384 .kill_child_storage(&child_info, Some(4), r.0.as_ref().map(|x| &x[..]))
1385 .deconstruct();
1386 assert_matches!(r, (None, 3, 3, 3));
1388 let r = ext.kill_child_storage(&child_info, Some(1), None).deconstruct();
1389 assert_matches!(r, (Some(_), 0, 0, 1));
1390 }
1391
1392 #[test]
1393 fn limited_child_kill_off_by_one_works_without_limit() {
1394 let child_info = ChildInfo::new_default(b"sub1");
1395 let initial: HashMap<_, BTreeMap<_, _>> = map![
1396 Some(child_info.clone()) => map![
1397 b"a".to_vec() => b"0".to_vec(),
1398 b"b".to_vec() => b"1".to_vec(),
1399 b"c".to_vec() => b"2".to_vec(),
1400 b"d".to_vec() => b"3".to_vec()
1401 ],
1402 ];
1403 let backend = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
1404 let mut overlay = OverlayedChanges::default();
1405 let mut ext = Ext::new(&mut overlay, &backend, None);
1406 assert_eq!(ext.kill_child_storage(&child_info, None, None).deconstruct(), (None, 4, 4, 4));
1407 }
1408
1409 #[test]
1410 fn set_child_storage_works() {
1411 let child_info = ChildInfo::new_default(b"sub1");
1412 let child_info = &child_info;
1413 let state = new_in_mem::<BlakeTwo256>();
1414 let backend = state.as_trie_backend();
1415 let mut overlay = OverlayedChanges::default();
1416 let mut ext = Ext::new(&mut overlay, backend, None);
1417
1418 ext.set_child_storage(child_info, b"abc".to_vec(), b"def".to_vec());
1419 assert_eq!(ext.child_storage(child_info, b"abc"), Some(b"def".to_vec()));
1420 let _ = ext.kill_child_storage(child_info, None, None);
1421 assert_eq!(ext.child_storage(child_info, b"abc"), None);
1422 }
1423
1424 #[test]
1425 fn append_storage_works() {
1426 let reference_data = vec![b"data1".to_vec(), b"2".to_vec(), b"D3".to_vec(), b"d4".to_vec()];
1427 let key = b"key".to_vec();
1428 let state = new_in_mem::<BlakeTwo256>();
1429 let backend = state.as_trie_backend();
1430 let mut overlay = OverlayedChanges::default();
1431 {
1432 let mut ext = Ext::new(&mut overlay, backend, None);
1433
1434 ext.storage_append(key.clone(), reference_data[0].encode());
1435 assert_eq!(ext.storage(key.as_slice()), Some(vec![reference_data[0].clone()].encode()));
1436 }
1437 overlay.start_transaction();
1438 {
1439 let mut ext = Ext::new(&mut overlay, backend, None);
1440
1441 for i in reference_data.iter().skip(1) {
1442 ext.storage_append(key.clone(), i.encode());
1443 }
1444 assert_eq!(ext.storage(key.as_slice()), Some(reference_data.encode()));
1445 }
1446 overlay.rollback_transaction().unwrap();
1447 {
1448 let mut ext = Ext::new(&mut overlay, backend, None);
1449 assert_eq!(ext.storage(key.as_slice()), Some(vec![reference_data[0].clone()].encode()));
1450 }
1451 }
1452
1453 #[test]
1457 fn commit_merges_append_with_parent() {
1458 #[derive(codec::Encode, codec::Decode)]
1459 enum Item {
1460 Item1,
1461 Item2,
1462 }
1463
1464 let key = b"events".to_vec();
1465 let state = new_in_mem::<BlakeTwo256>();
1466 let backend = state.as_trie_backend();
1467 let mut overlay = OverlayedChanges::default();
1468
1469 overlay.start_transaction();
1471 {
1472 let mut ext = Ext::new(&mut overlay, backend, None);
1473 ext.clear_storage(key.as_slice());
1474 ext.storage_append(key.clone(), Item::Item1.encode());
1475 }
1476
1477 overlay.start_transaction();
1479 {
1480 let mut ext = Ext::new(&mut overlay, backend, None);
1481
1482 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::Item1].encode()));
1483
1484 ext.storage_append(key.clone(), Item::Item2.encode());
1485
1486 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::Item1, Item::Item2].encode()),);
1487 }
1488
1489 overlay.start_transaction();
1491 {
1492 let mut ext = Ext::new(&mut overlay, backend, None);
1493
1494 ext.place_storage(key.clone(), None);
1495
1496 assert_eq!(ext.storage(key.as_slice()), None);
1497 }
1498
1499 overlay.commit_transaction().unwrap();
1501 {
1502 let mut ext = Ext::new(&mut overlay, backend, None);
1503 assert_eq!(ext.storage(key.as_slice()), None,);
1504 }
1505
1506 overlay.rollback_transaction().unwrap();
1508 {
1509 let mut ext = Ext::new(&mut overlay, backend, None);
1510 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::Item1].encode()));
1511 }
1512
1513 overlay.commit_transaction().unwrap();
1514 {
1515 let mut ext = Ext::new(&mut overlay, backend, None);
1516 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::Item1].encode()));
1517 }
1518 }
1519
1520 #[test]
1521 fn remove_with_append_then_rollback_appended_then_append_again() {
1522 #[derive(codec::Encode, codec::Decode)]
1523 enum Item {
1524 InitializationItem,
1525 DiscardedItem,
1526 CommittedItem,
1527 }
1528
1529 let key = b"events".to_vec();
1530 let state = new_in_mem::<BlakeTwo256>();
1531 let backend = state.as_trie_backend();
1532 let mut overlay = OverlayedChanges::default();
1533
1534 {
1536 let mut ext = Ext::new(&mut overlay, backend, None);
1537 ext.clear_storage(key.as_slice());
1538 ext.storage_append(key.clone(), Item::InitializationItem.encode());
1539 }
1540 overlay.start_transaction();
1541
1542 {
1544 let mut ext = Ext::new(&mut overlay, backend, None);
1545
1546 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::InitializationItem].encode()));
1547
1548 ext.storage_append(key.clone(), Item::DiscardedItem.encode());
1549
1550 assert_eq!(
1551 ext.storage(key.as_slice()),
1552 Some(vec![Item::InitializationItem, Item::DiscardedItem].encode()),
1553 );
1554 }
1555 overlay.rollback_transaction().unwrap();
1556
1557 {
1559 let mut ext = Ext::new(&mut overlay, backend, None);
1560
1561 assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::InitializationItem].encode()));
1562
1563 ext.storage_append(key.clone(), Item::CommittedItem.encode());
1564
1565 assert_eq!(
1566 ext.storage(key.as_slice()),
1567 Some(vec![Item::InitializationItem, Item::CommittedItem].encode()),
1568 );
1569 }
1570 overlay.start_transaction();
1571
1572 {
1574 let mut ext = Ext::new(&mut overlay, backend, None);
1575 assert_eq!(
1576 ext.storage(key.as_slice()),
1577 Some(vec![Item::InitializationItem, Item::CommittedItem].encode()),
1578 );
1579 }
1580 }
1581
1582 fn test_compact(remote_proof: StorageProof, remote_root: &sp_core::H256) -> StorageProof {
1583 let compact_remote_proof =
1584 remote_proof.into_compact_proof::<BlakeTwo256>(*remote_root).unwrap();
1585 compact_remote_proof
1586 .to_storage_proof::<BlakeTwo256>(Some(remote_root))
1587 .unwrap()
1588 .0
1589 }
1590
1591 #[test]
1592 fn prove_read_and_proof_check_works() {
1593 prove_read_and_proof_check_works_inner(StateVersion::V0);
1594 prove_read_and_proof_check_works_inner(StateVersion::V1);
1595 }
1596 fn prove_read_and_proof_check_works_inner(state_version: StateVersion) {
1597 let child_info = ChildInfo::new_default(b"sub1");
1598 let missing_child_info = ChildInfo::new_default(b"sub1sub2"); let child_info = &child_info;
1600 let missing_child_info = &missing_child_info;
1601 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1603 let remote_root = remote_backend.storage_root(std::iter::empty(), state_version).0;
1604 let remote_proof = prove_read(remote_backend, &[b"value2"]).unwrap();
1605 let remote_proof = test_compact(remote_proof, &remote_root);
1606 let local_result1 =
1608 read_proof_check::<BlakeTwo256, _>(remote_root, remote_proof.clone(), &[b"value2"])
1609 .unwrap();
1610 let local_result2 =
1611 read_proof_check::<BlakeTwo256, _>(remote_root, remote_proof, &[&[0xff]]).is_ok();
1612 assert_eq!(
1614 local_result1.into_iter().collect::<Vec<_>>(),
1615 vec![(b"value2".to_vec(), Some(vec![24]))],
1616 );
1617 assert_eq!(local_result2, false);
1618 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1620 let remote_root = remote_backend.storage_root(std::iter::empty(), state_version).0;
1621 let remote_proof = prove_child_read(remote_backend, child_info, &[b"value3"]).unwrap();
1622 let remote_proof = test_compact(remote_proof, &remote_root);
1623 let local_result1 = read_child_proof_check::<BlakeTwo256, _>(
1624 remote_root,
1625 remote_proof.clone(),
1626 child_info,
1627 &[b"value3"],
1628 )
1629 .unwrap();
1630 let local_result2 = read_child_proof_check::<BlakeTwo256, _>(
1631 remote_root,
1632 remote_proof.clone(),
1633 child_info,
1634 &[b"value2"],
1635 )
1636 .unwrap();
1637 let local_result3 = read_child_proof_check::<BlakeTwo256, _>(
1638 remote_root,
1639 remote_proof,
1640 missing_child_info,
1641 &[b"dummy"],
1642 )
1643 .unwrap();
1644
1645 assert_eq!(
1646 local_result1.into_iter().collect::<Vec<_>>(),
1647 vec![(b"value3".to_vec(), Some(vec![142; 33]))],
1648 );
1649 assert_eq!(local_result2.into_iter().collect::<Vec<_>>(), vec![(b"value2".to_vec(), None)]);
1650 assert_eq!(local_result3.into_iter().collect::<Vec<_>>(), vec![(b"dummy".to_vec(), None)]);
1651 }
1652
1653 #[test]
1654 fn child_read_compact_stress_test() {
1655 use rand::{rngs::SmallRng, RngCore, SeedableRng};
1656 let mut storage: HashMap<Option<ChildInfo>, BTreeMap<StorageKey, StorageValue>> =
1657 Default::default();
1658 let mut seed = [0; 32];
1659 for i in 0..50u32 {
1660 let mut child_infos = Vec::new();
1661 let seed_partial = &mut seed[0..4];
1662 seed_partial.copy_from_slice(&i.to_be_bytes()[..]);
1663 let mut rand = SmallRng::from_seed(seed);
1664
1665 let nb_child_trie = rand.next_u32() as usize % 25;
1666 for _ in 0..nb_child_trie {
1667 let key_len = 1 + (rand.next_u32() % 10);
1668 let mut key = vec![0; key_len as usize];
1669 rand.fill_bytes(&mut key[..]);
1670 let child_info = ChildInfo::new_default(key.as_slice());
1671 let nb_item = 1 + rand.next_u32() % 25;
1672 let mut items = BTreeMap::new();
1673 for item in 0..nb_item {
1674 let key_len = 1 + (rand.next_u32() % 10);
1675 let mut key = vec![0; key_len as usize];
1676 rand.fill_bytes(&mut key[..]);
1677 let value = vec![item as u8; item as usize + 28];
1678 items.insert(key, value);
1679 }
1680 child_infos.push(child_info.clone());
1681 storage.insert(Some(child_info), items);
1682 }
1683
1684 let trie: InMemoryBackend<BlakeTwo256> =
1685 (storage.clone(), StateVersion::default()).into();
1686 let trie_root = *trie.root();
1687 let backend = TrieBackendBuilder::wrap(&trie).with_recorder(Default::default()).build();
1688 let mut queries = Vec::new();
1689 for c in 0..(5 + nb_child_trie / 2) {
1690 let child_info = if c < 5 {
1692 let key_len = 1 + (rand.next_u32() % 10);
1694 let mut key = vec![0; key_len as usize];
1695 rand.fill_bytes(&mut key[..]);
1696 ChildInfo::new_default(key.as_slice())
1697 } else {
1698 child_infos[rand.next_u32() as usize % nb_child_trie].clone()
1699 };
1700
1701 if let Some(values) = storage.get(&Some(child_info.clone())) {
1702 for _ in 0..(1 + values.len() / 2) {
1703 let ix = rand.next_u32() as usize % values.len();
1704 for (i, (key, value)) in values.iter().enumerate() {
1705 if i == ix {
1706 assert_eq!(
1707 &backend
1708 .child_storage(&child_info, key.as_slice())
1709 .unwrap()
1710 .unwrap(),
1711 value
1712 );
1713 queries.push((
1714 child_info.clone(),
1715 key.clone(),
1716 Some(value.clone()),
1717 ));
1718 break;
1719 }
1720 }
1721 }
1722 }
1723 for _ in 0..4 {
1724 let key_len = 1 + (rand.next_u32() % 10);
1725 let mut key = vec![0; key_len as usize];
1726 rand.fill_bytes(&mut key[..]);
1727 let result = backend.child_storage(&child_info, key.as_slice()).unwrap();
1728 queries.push((child_info.clone(), key, result));
1729 }
1730 }
1731
1732 let storage_proof = backend.extract_proof().expect("Failed to extract proof");
1733 let remote_proof = test_compact(storage_proof, &trie_root);
1734 let proof_check =
1735 create_proof_check_backend::<BlakeTwo256>(trie_root, remote_proof).unwrap();
1736
1737 for (child_info, key, expected) in queries {
1738 assert_eq!(
1739 proof_check.child_storage(&child_info, key.as_slice()).unwrap(),
1740 expected,
1741 );
1742 }
1743 }
1744 }
1745
1746 #[test]
1747 fn prove_read_with_size_limit_works() {
1748 let state_version = StateVersion::V0;
1749 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1750 let remote_root = remote_backend.storage_root(::std::iter::empty(), state_version).0;
1751 let (proof, count) =
1752 prove_range_read_with_size(remote_backend, None, None, 0, None).unwrap();
1753 assert_eq!(proof.to_memory_db::<BlakeTwo256>().drain().len(), 3);
1755 assert_eq!(count, 1);
1756 assert_eq!(proof.encoded_size(), 443);
1757
1758 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1759 let (proof, count) =
1760 prove_range_read_with_size(remote_backend, None, None, 800, Some(&[])).unwrap();
1761 assert_eq!(proof.to_memory_db::<BlakeTwo256>().drain().len(), 9);
1762 assert_eq!(count, 85);
1763 assert_eq!(proof.encoded_size(), 857);
1764 let (results, completed) = read_range_proof_check::<BlakeTwo256>(
1765 remote_root,
1766 proof.clone(),
1767 None,
1768 None,
1769 Some(count),
1770 None,
1771 )
1772 .unwrap();
1773 assert_eq!(results.len() as u32, count);
1774 assert_eq!(completed, false);
1775 let (results, completed) =
1777 read_range_proof_check::<BlakeTwo256>(remote_root, proof, None, None, None, None)
1778 .unwrap();
1779 assert_eq!(results.len() as u32, 101);
1780 assert_eq!(completed, false);
1781
1782 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1783 let (proof, count) =
1784 prove_range_read_with_size(remote_backend, None, None, 50000, Some(&[])).unwrap();
1785 assert_eq!(proof.to_memory_db::<BlakeTwo256>().drain().len(), 11);
1786 assert_eq!(count, 132);
1787 assert_eq!(proof.encoded_size(), 990);
1788
1789 let (results, completed) =
1790 read_range_proof_check::<BlakeTwo256>(remote_root, proof, None, None, None, None)
1791 .unwrap();
1792 assert_eq!(results.len() as u32, count);
1793 assert_eq!(completed, true);
1794 }
1795
1796 #[test]
1797 fn prove_read_with_size_limit_proof_size() {
1798 let mut root = H256::default();
1799 let mut mdb = PrefixedMemoryDB::<BlakeTwo256>::default();
1800 {
1801 let mut mdb = KeySpacedDBMut::new(&mut mdb, b"");
1802 let mut trie = TrieDBMutBuilderV1::new(&mut mdb, &mut root).build();
1803 trie.insert(b"value1", &[123; 1]).unwrap();
1804 trie.insert(b"value2", &[123; 10]).unwrap();
1805 trie.insert(b"value3", &[123; 100]).unwrap();
1806 trie.insert(b"value4", &[123; 1000]).unwrap();
1807 }
1808
1809 let remote_backend: TrieBackend<PrefixedMemoryDB<BlakeTwo256>, BlakeTwo256> =
1810 TrieBackendBuilder::new(mdb, root)
1811 .with_optional_cache(None)
1812 .with_optional_recorder(None)
1813 .build();
1814
1815 let (proof, count) =
1816 prove_range_read_with_size(remote_backend, None, None, 1000, None).unwrap();
1817
1818 assert_eq!(proof.encoded_size(), 1267);
1819 assert_eq!(count, 3);
1820 }
1821
1822 #[test]
1823 fn inner_state_versioning_switch_proofs() {
1824 let mut state_version = StateVersion::V0;
1825 let (mut mdb, mut root) = trie_backend::tests::test_db(state_version);
1826 {
1827 let mut trie = TrieDBMutBuilderV0::from_existing(&mut mdb, &mut root).build();
1828 trie.insert(b"foo", vec![1u8; 1_000].as_slice()) .expect("insert failed");
1830 trie.insert(b"foo2", vec![3u8; 16].as_slice()) .expect("insert failed");
1832 trie.insert(b"foo222", vec![5u8; 100].as_slice()) .expect("insert failed");
1834 }
1835
1836 let check_proof = |mdb, root, state_version| -> StorageProof {
1837 let remote_backend = TrieBackendBuilder::new(mdb, root).build();
1838 let remote_root = remote_backend.storage_root(std::iter::empty(), state_version).0;
1839 let remote_proof = prove_read(remote_backend, &[b"foo222"]).unwrap();
1840 let local_result1 =
1842 read_proof_check::<BlakeTwo256, _>(remote_root, remote_proof.clone(), &[b"foo222"])
1843 .unwrap();
1844 assert_eq!(
1846 local_result1.into_iter().collect::<Vec<_>>(),
1847 vec![(b"foo222".to_vec(), Some(vec![5u8; 100]))],
1848 );
1849 remote_proof
1850 };
1851
1852 let remote_proof = check_proof(mdb.clone(), root, state_version);
1853 assert!(remote_proof.encode().len() > 1_100);
1855 assert!(remote_proof.encoded_size() > 1_100);
1856 let root1 = root;
1857
1858 state_version = StateVersion::V1;
1860 {
1861 let mut trie = TrieDBMutBuilderV1::from_existing(&mut mdb, &mut root).build();
1862 trie.insert(b"foo222", vec![5u8; 100].as_slice()) .expect("insert failed");
1864 trie.insert(b"foo", vec![1u8; 1000].as_slice()) .expect("insert failed");
1867 }
1868 let root3 = root;
1869 assert!(root1 != root3);
1870 let remote_proof = check_proof(mdb.clone(), root, state_version);
1871 assert!(remote_proof.encode().len() < 1000);
1873 assert!(remote_proof.encoded_size() < 1000);
1874 assert_eq!(remote_proof.encode().len(), remote_proof.encoded_size());
1875 }
1876
1877 #[test]
1878 fn prove_range_with_child_works() {
1879 let state_version = StateVersion::V0;
1880 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1881 let remote_root = remote_backend.storage_root(std::iter::empty(), state_version).0;
1882 let mut start_at = smallvec::SmallVec::<[Vec<u8>; 2]>::new();
1883 let trie_backend = remote_backend.as_trie_backend();
1884 let max_iter = 1000;
1885 let mut nb_loop = 0;
1886 loop {
1887 nb_loop += 1;
1888 if max_iter == nb_loop {
1889 panic!("Too many loop in prove range");
1890 }
1891 let (proof, count) = prove_range_read_with_child_with_size_on_trie_backend(
1892 trie_backend,
1893 1,
1894 start_at.as_slice(),
1895 )
1896 .unwrap();
1897 assert!(proof.to_memory_db::<BlakeTwo256>().drain().len() > 0);
1899 assert!(count < 3); let (result, completed_depth) = read_range_proof_check_with_child::<BlakeTwo256>(
1902 remote_root,
1903 proof.clone(),
1904 start_at.as_slice(),
1905 )
1906 .unwrap();
1907
1908 if completed_depth == 0 {
1909 break;
1910 }
1911 assert!(result.update_last_key(completed_depth, &mut start_at));
1912 }
1913
1914 assert_eq!(nb_loop, 10);
1915 }
1916
1917 #[test]
1918 fn compact_multiple_child_trie() {
1919 let size_no_inner_hash = compact_multiple_child_trie_inner(StateVersion::V0);
1920 let size_inner_hash = compact_multiple_child_trie_inner(StateVersion::V1);
1921 assert!(size_inner_hash < size_no_inner_hash);
1922 }
1923 fn compact_multiple_child_trie_inner(state_version: StateVersion) -> usize {
1924 let child_info1 = ChildInfo::new_default(b"sub1");
1926 let child_info2 = ChildInfo::new_default(b"sub2");
1928 let child_info3 = ChildInfo::new_default(b"sub");
1930 let remote_backend = trie_backend::tests::test_trie(state_version, None, None);
1931 let long_vec: Vec<u8> = (0..1024usize).map(|_| 8u8).collect();
1932 let (remote_root, transaction) = remote_backend.full_storage_root(
1933 std::iter::empty(),
1934 vec![
1935 (
1936 &child_info1,
1937 vec![
1938 (&b"k"[..], Some(&long_vec[..])),
1940 (&b"key1"[..], Some(&vec![5u8; 32][..])),
1944 (&b"key2"[..], Some(&b"val3"[..])),
1945 ]
1946 .into_iter(),
1947 ),
1948 (
1949 &child_info2,
1950 vec![(&b"key3"[..], Some(&b"val4"[..])), (&b"key4"[..], Some(&b"val5"[..]))]
1951 .into_iter(),
1952 ),
1953 (
1954 &child_info3,
1955 vec![(&b"key5"[..], Some(&b"val6"[..])), (&b"key6"[..], Some(&b"val7"[..]))]
1956 .into_iter(),
1957 ),
1958 ]
1959 .into_iter(),
1960 state_version,
1961 );
1962 let mut remote_storage = remote_backend.backend_storage().clone();
1963 remote_storage.consolidate(transaction);
1964 let remote_backend = TrieBackendBuilder::new(remote_storage, remote_root).build();
1965 let remote_proof = prove_child_read(remote_backend, &child_info1, &[b"key1"]).unwrap();
1966 let size = remote_proof.encoded_size();
1967 let remote_proof = test_compact(remote_proof, &remote_root);
1968 let local_result1 = read_child_proof_check::<BlakeTwo256, _>(
1969 remote_root,
1970 remote_proof,
1971 &child_info1,
1972 &[b"key1"],
1973 )
1974 .unwrap();
1975 assert_eq!(local_result1.len(), 1);
1976 assert_eq!(local_result1.get(&b"key1"[..]), Some(&Some(vec![5u8; 32])));
1977 size
1978 }
1979
1980 #[test]
1981 fn child_storage_uuid() {
1982 let state_version = StateVersion::V0;
1983 let child_info_1 = ChildInfo::new_default(b"sub_test1");
1984 let child_info_2 = ChildInfo::new_default(b"sub_test2");
1985
1986 use crate::trie_backend::tests::test_trie;
1987 let mut overlay = OverlayedChanges::default();
1988
1989 let mut transaction = {
1990 let backend = test_trie(state_version, None, None);
1991 let mut ext = Ext::new(&mut overlay, &backend, None);
1992 ext.set_child_storage(&child_info_1, b"abc".to_vec(), b"def".to_vec());
1993 ext.set_child_storage(&child_info_2, b"abc".to_vec(), b"def".to_vec());
1994 ext.storage_root(state_version);
1995 overlay.drain_storage_changes(&backend, state_version).unwrap().transaction
1996 };
1997 let mut duplicate = false;
1998 for (k, (value, rc)) in transaction.drain().iter() {
1999 if *rc == 2 {
2001 duplicate = true;
2002 println!("test duplicate for {:?} {:?}", k, value);
2003 }
2004 }
2005 assert!(!duplicate);
2006 }
2007
2008 #[test]
2009 fn set_storage_empty_allowed() {
2010 let initial: BTreeMap<_, _> = map![
2011 b"aaa".to_vec() => b"0".to_vec(),
2012 b"bbb".to_vec() => b"".to_vec()
2013 ];
2014 let state = InMemoryBackend::<BlakeTwo256>::from((initial, StateVersion::default()));
2015 let backend = state.as_trie_backend();
2016
2017 let mut overlay = OverlayedChanges::default();
2018 overlay.start_transaction();
2019 overlay.set_storage(b"ccc".to_vec(), Some(b"".to_vec()));
2020 assert_eq!(overlay.storage(b"ccc"), Some(Some(&[][..])));
2021 overlay.commit_transaction().unwrap();
2022 overlay.start_transaction();
2023 assert_eq!(overlay.storage(b"ccc"), Some(Some(&[][..])));
2024 assert_eq!(overlay.storage(b"bbb"), None);
2025
2026 {
2027 let mut ext = Ext::new(&mut overlay, backend, None);
2028 assert_eq!(ext.storage(b"bbb"), Some(vec![]));
2029 assert_eq!(ext.storage(b"ccc"), Some(vec![]));
2030 ext.clear_storage(b"ccc");
2031 assert_eq!(ext.storage(b"ccc"), None);
2032 }
2033 overlay.commit_transaction().unwrap();
2034 assert_eq!(overlay.storage(b"ccc"), Some(None));
2035 }
2036}