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