From 7d062e171b2a0f7042dbd52f4f8028ec2cf396af Mon Sep 17 00:00:00 2001 From: jangko Date: Tue, 2 Jun 2020 11:24:41 +0700 Subject: [PATCH] block witness: add test for unwanted multiple identical keys when constructing witness from trie --- stateless/multi_keys.nim | 2 +- stateless/test_witness_keys.nim | 14 ++++++++++++-- stateless/tree_from_witness.nim | 4 ++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/stateless/multi_keys.nim b/stateless/multi_keys.nim index dd7df15a0..1b799e2fd 100644 --- a/stateless/multi_keys.nim +++ b/stateless/multi_keys.nim @@ -148,6 +148,6 @@ func isValidMatch(mg: MatchGroup): bool {.inline.} = result = mg.match and mg.group.first == mg.group.last proc visitMatch*(m: var MultikeysRef, mg: MatchGroup, depth: int): KeyData = - doAssert(mg.isValidMatch) + doAssert(mg.isValidMatch, "Multiple identical keys are not allowed") m.keys[mg.group.first].visited = true result = m.keys[mg.group.first] diff --git a/stateless/test_witness_keys.nim b/stateless/test_witness_keys.nim index 95904c0ac..16df0513b 100644 --- a/stateless/test_witness_keys.nim +++ b/stateless/test_witness_keys.nim @@ -65,7 +65,9 @@ proc randAccount(db: DB): AccountDef = proc randAddress(): EthAddress = discard randomBytes(result.addr, sizeof(result)) -proc runTest(numPairs: int, testStatusIMPL: var TestStatus, addInvalidKeys: static[bool] = false) = +proc runTest(numPairs: int, testStatusIMPL: var TestStatus, + addIdenticalKeys: bool = false, addInvalidKeys: static[bool] = false) = + var memDB = newMemoryDB() var trie = initSecureHexaryTrie(memDB) var addrs = newSeq[AccountKey](numPairs) @@ -82,6 +84,10 @@ proc runTest(numPairs: int, testStatusIMPL: var TestStatus, addInvalidKeys: stat let invalidAddress = randAddress() addrs.add((invalidAddress, false, MultikeysRef(nil))) + if addIdenticalKeys: + let invalidAddress = addrs[0].address + addrs.add((invalidAddress, false, MultikeysRef(nil))) + var mkeys = newMultiKeys(addrs) let rootHash = trie.rootHash @@ -146,7 +152,11 @@ proc witnessKeysMain*() = check rlpBytes.len > 32 test "invalid address ignored": - runTest(rand(1..30), testStatusIMPL, addInvalidKeys = true) + runTest(rand(1..30), testStatusIMPL, false, addInvalidKeys = true) + + test "multiple identical addresses rejected": + expect AssertionError: + runTest(rand(5..30), testStatusIMPL, true) test "case 1: all keys is a match": let keys = [ diff --git a/stateless/tree_from_witness.nim b/stateless/tree_from_witness.nim index cc75c2bd5..3566f72d3 100644 --- a/stateless/tree_from_witness.nim +++ b/stateless/tree_from_witness.nim @@ -129,7 +129,7 @@ proc readUVarint32(t: var TreeBuilder): uint32 = break inc(shift, 7) if shift > 28: - raise newException(ParsingError, "Failed when try to uvarint32") + raise newException(ParsingError, "Failed when try to parse uvarint32") proc readUVarint256(t: var TreeBuilder): UInt256 = # LEB128 varint encoding @@ -141,7 +141,7 @@ proc readUVarint256(t: var TreeBuilder): UInt256 = break inc(shift, 7) if shift > 252: - raise newException(ParsingError, "Failed when try to uvarint256") + raise newException(ParsingError, "Failed when try to parse uvarint256") proc toKeccak(r: var NodeKey, x: openArray[byte]) {.inline.} = r.data[0..31] = x[0..31]