From 9ca2300b054165eecf0349c717c3817ec6de8815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com> Date: Fri, 31 Jul 2020 14:58:38 +0200 Subject: [PATCH] Order delta before calculating the storage root (#6780) We need to order the delta before calculating the storage root, because the order is important if the storage root is calculated using a storage proof. The problem is arises when the delta is different than at the time the storage root was recorded, because we may require a different node that is not part of the proof and so, the storage root can not be calculated. The problem is solved by always order the delta to use the same order when calculating the storage root while recording the stroage proof and when calculating the storage root using the storage proof. To prevent this bug in future again, a regression test is added. Fixes: https://github.com/paritytech/cumulus/issues/146 --- substrate/primitives/trie/src/lib.rs | 54 +++++++++++++----- .../trie/test-res/invalid-delta-order | Bin 0 -> 3476 bytes substrate/primitives/trie/test-res/proof | Bin 0 -> 4680 bytes .../primitives/trie/test-res/storage_root | 1 + .../trie/test-res/valid-delta-order | Bin 0 -> 3476 bytes 5 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 substrate/primitives/trie/test-res/invalid-delta-order create mode 100644 substrate/primitives/trie/test-res/proof create mode 100644 substrate/primitives/trie/test-res/storage_root create mode 100644 substrate/primitives/trie/test-res/valid-delta-order diff --git a/substrate/primitives/trie/src/lib.rs b/substrate/primitives/trie/src/lib.rs index 5ab06cecca6..73a4a8029b2 100644 --- a/substrate/primitives/trie/src/lib.rs +++ b/substrate/primitives/trie/src/lib.rs @@ -186,6 +186,9 @@ pub fn delta_trie_root<L: TrieConfiguration, I, A, B, DB, V>( { let mut trie = TrieDBMut::<L>::from_existing(&mut *db, &mut root)?; + let mut delta = delta.into_iter().collect::<Vec<_>>(); + delta.sort_by(|l, r| l.0.borrow().cmp(r.0.borrow())); + for (key, change) in delta { match change.borrow() { Some(val) => trie.insert(key.borrow(), val.borrow())?, @@ -259,19 +262,12 @@ pub fn child_delta_trie_root<L: TrieConfiguration, I, A, B, DB, RD, V>( // root is fetched from DB, not writable by runtime, so it's always valid. root.as_mut().copy_from_slice(root_data.as_ref()); - { - let mut db = KeySpacedDBMut::new(&mut *db, keyspace); - let mut trie = TrieDBMut::<L>::from_existing(&mut db, &mut root)?; - - for (key, change) in delta { - match change.borrow() { - Some(val) => trie.insert(key.borrow(), val.borrow())?, - None => trie.remove(key.borrow())?, - }; - } - } - - Ok(root) + let mut db = KeySpacedDBMut::new(&mut *db, keyspace); + delta_trie_root::<L, _, _, _, _, _>( + &mut db, + root, + delta, + ) } /// Call `f` for all keys in a child trie. @@ -468,7 +464,7 @@ mod trie_constants { #[cfg(test)] mod tests { use super::*; - use codec::{Encode, Compact}; + use codec::{Encode, Decode, Compact}; use sp_core::Blake2Hasher; use hash_db::{HashDB, Hasher}; use trie_db::{DBValue, TrieMut, Trie, NodeCodec as NodeCodecT}; @@ -856,4 +852,34 @@ mod tests { ).is_err() ); } + + #[test] + fn generate_storage_root_with_proof_works_independently_from_the_delta_order() { + let proof = StorageProof::decode(&mut &include_bytes!("../test-res/proof")[..]).unwrap(); + let storage_root = sp_core::H256::decode( + &mut &include_bytes!("../test-res/storage_root")[..], + ).unwrap(); + // Delta order that is "invalid" so that it would require a different proof. + let invalid_delta = Vec::<(Vec<u8>, Option<Vec<u8>>)>::decode( + &mut &include_bytes!("../test-res/invalid-delta-order")[..], + ).unwrap(); + // Delta order that is "valid" + let valid_delta = Vec::<(Vec<u8>, Option<Vec<u8>>)>::decode( + &mut &include_bytes!("../test-res/valid-delta-order")[..], + ).unwrap(); + + let proof_db = proof.into_memory_db::<Blake2Hasher>(); + let first_storage_root = delta_trie_root::<Layout, _, _, _, _, _>( + &mut proof_db.clone(), + storage_root, + valid_delta, + ).unwrap(); + let second_storage_root = delta_trie_root::<Layout, _, _, _, _, _>( + &mut proof_db.clone(), + storage_root, + invalid_delta, + ).unwrap(); + + assert_eq!(first_storage_root, second_storage_root); + } } diff --git a/substrate/primitives/trie/test-res/invalid-delta-order b/substrate/primitives/trie/test-res/invalid-delta-order new file mode 100644 index 0000000000000000000000000000000000000000..e46f280dc29bb2cbc3a28faeabe51efc747ba4af GIT binary patch literal 3476 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 X{$X-{*oOa#KRSO|AL_rmKdS!#%te!7 literal 0 HcmV?d00001 diff --git a/substrate/primitives/trie/test-res/proof b/substrate/primitives/trie/test-res/proof new file mode 100644 index 0000000000000000000000000000000000000000..278bea0bfbbc7fb16364eddbded70c884dd7ab71 GIT binary patch literal 4680 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 literal 0 HcmV?d00001 diff --git a/substrate/primitives/trie/test-res/storage_root b/substrate/primitives/trie/test-res/storage_root new file mode 100644 index 00000000000..758626802e1 --- /dev/null +++ b/substrate/primitives/trie/test-res/storage_root @@ -0,0 +1 @@ +‡=Ô[Á42%áJP¢Áh¦Kwé)Rª 0¤Ôu¿Ã \ No newline at end of file diff --git a/substrate/primitives/trie/test-res/valid-delta-order b/substrate/primitives/trie/test-res/valid-delta-order new file mode 100644 index 0000000000000000000000000000000000000000..4df6e62ec133b05cab2b53f00c8a4286eef70865 GIT binary patch literal 3476 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 See7x1`&!Nf0HpZQ^gjVW<db0l literal 0 HcmV?d00001 -- GitLab