deals with EIP170 error

This commit is contained in:
andri lim 2020-04-29 12:46:50 +07:00
parent c325ce1863
commit 90c2ede43b
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
5 changed files with 59 additions and 44 deletions

View File

@ -3,7 +3,7 @@ import
eth/[common, rlp], eth/trie/[hexary, db, trie_defs], eth/[common, rlp], eth/trie/[hexary, db, trie_defs],
stew/byteutils, faststreams/input_stream, stew/byteutils, faststreams/input_stream,
../tests/[test_helpers, test_config], ../tests/[test_helpers, test_config],
../nimbus/db/accounts_cache, ../nimbus/db/accounts_cache, ./witness_types,
../stateless/[witness_from_tree, tree_from_witness] ../stateless/[witness_from_tree, tree_from_witness]
type type
@ -26,34 +26,24 @@ proc isValidBranch(branch: openArray[seq[byte]], rootHash: KeccakHash, key, valu
proc testGetBranch(tester: Tester, rootHash: KeccakHash, testStatusIMPL: var TestStatus) = proc testGetBranch(tester: Tester, rootHash: KeccakHash, testStatusIMPL: var TestStatus) =
var trie = initHexaryTrie(tester.memdb, rootHash) var trie = initHexaryTrie(tester.memdb, rootHash)
let flags = {wfEIP170}
#try: try:
for address in tester.address: for address in tester.address:
var wb = initWitnessBuilder(tester.memdb, rootHash) var wb = initWitnessBuilder(tester.memdb, rootHash, flags)
var witness = wb.buildWitness(address) var witness = wb.buildWitness(address)
var db = newMemoryDB() var db = newMemoryDB()
when defined(useInputStream): when defined(useInputStream):
var input = memoryInput(witness) var input = memoryInput(witness)
var tb = initTreeBuilder(input, db) var tb = initTreeBuilder(input, db, flags)
else: else:
var tb = initTreeBuilder(witness, db) var tb = initTreeBuilder(witness, db, flags)
var root = tb.treeNode()
check root.data == rootHash.data
#echo "ROOT: ", root.data.toHex var root = tb.treeNode()
#echo "rootHash: ", rootHash.data.toHex check root.data == rootHash.data
except ContractCodeError as e:
#var stackBranch = wb.getBranchStack(address) debugEcho "CONTRACT CODE ERROR: ", e.msg
#check recurseBranch == stackBranch
#
#var branch = wb.getBranch(address)
#let account = trie.get(address)
#check isValidBranch(branch, trie.rootHash, address, account)
#except:
#debugEcho "MSG: ", getCurrentExceptionMsg()
#quit(1)
func parseHash256(n: JsonNode, name: string): Hash256 = func parseHash256(n: JsonNode, name: string): Hash256 =
hexToByteArray(n[name].getStr(), result.data) hexToByteArray(n[name].getStr(), result.data)
@ -119,10 +109,7 @@ proc blockWitnessMain*(debugMode = false) =
let path = "tests" / "fixtures" / folder let path = "tests" / "fixtures" / folder
let n = json.parseFile(path / config.testSubject) let n = json.parseFile(path / config.testSubject)
var testStatusIMPL: TestStatus var testStatusIMPL: TestStatus
if config.legacy: testFixtureGST(n, testStatusIMPL)
testFixtureGST(n, testStatusIMPL)
else:
testFixtureBC(n, testStatusIMPL)
when isMainModule: when isMainModule:
var message: string var message: string

View File

@ -3,7 +3,7 @@ import
eth/[common, rlp], eth/trie/[hexary, db, trie_defs], eth/[common, rlp], eth/trie/[hexary, db, trie_defs],
faststreams/input_stream, nimcrypto/[utils, sysrand], faststreams/input_stream, nimcrypto/[utils, sysrand],
../stateless/[witness_from_tree, tree_from_witness], ../stateless/[witness_from_tree, tree_from_witness],
../nimbus/db/storage_types ../nimbus/db/storage_types, ./witness_types
type type
DB = TrieDatabaseRef DB = TrieDatabaseRef
@ -59,14 +59,14 @@ proc runTest(numPairs: int) =
let rootHash = trie.rootHash let rootHash = trie.rootHash
var wb = initWitnessBuilder(memDB, rootHash) var wb = initWitnessBuilder(memDB, rootHash, {wfEIP170})
var witness = wb.buildWitness(addrs[0]) var witness = wb.buildWitness(addrs[0])
var db = newMemoryDB() var db = newMemoryDB()
when defined(useInputStream): when defined(useInputStream):
var input = memoryInput(witness) var input = memoryInput(witness)
var tb = initTreeBuilder(input, db) var tb = initTreeBuilder(input, db, {wfEIP170})
else: else:
var tb = initTreeBuilder(witness, db) var tb = initTreeBuilder(witness, db, {wfEIP170})
var root = tb.treeNode() var root = tb.treeNode()
debugEcho "root: ", root.data.toHex debugEcho "root: ", root.data.toHex
debugEcho "rootHash: ", rootHash.data.toHex debugEcho "rootHash: ", rootHash.data.toHex

View File

@ -18,26 +18,30 @@ type
pos: int pos: int
db: DB db: DB
root: KeccakHash root: KeccakHash
flags: WitnessFlags
# the InputStream still unstable # the InputStream still unstable
# when using large dataset for testing # when using large dataset for testing
# or run longer # or run longer
when defined(useInputStream): when defined(useInputStream):
proc initTreeBuilder*(input: InputStream, db: DB): TreeBuilder = proc initTreeBuilder*(input: InputStream, db: DB, flags: WitnessFlags): TreeBuilder =
result.input = input result.input = input
result.db = db result.db = db
result.root = emptyRlpHash result.root = emptyRlpHash
result.flags = flags
proc initTreeBuilder*(input: openArray[byte], db: DB): TreeBuilder = proc initTreeBuilder*(input: openArray[byte], db: DB, flags: WitnessFlags): TreeBuilder =
result.input = memoryInput(input) result.input = memoryInput(input)
result.db = db result.db = db
result.root = emptyRlpHash result.root = emptyRlpHash
result.flags = flags
else: else:
proc initTreeBuilder*(input: openArray[byte], db: DB): TreeBuilder = proc initTreeBuilder*(input: openArray[byte], db: DB, flags: WitnessFlags): TreeBuilder =
result.input = @input result.input = @input
result.db = db result.db = db
result.root = emptyRlpHash result.root = emptyRlpHash
result.flags = flags
func rootHash*(t: TreeBuilder): KeccakHash {.inline.} = func rootHash*(t: TreeBuilder): KeccakHash {.inline.} =
t.root t.root
@ -216,7 +220,8 @@ proc accountNode(t: var TreeBuilder, depth: int): NodeKey =
when defined(debugHash): when defined(debugHash):
let len = t.readU32().int let len = t.readU32().int
let nodeKey = toNodeKey(t.read(len)) let node = @(t.read(len))
let nodeKey = toNodeKey(node)
when defined(debugDepth): when defined(debugDepth):
let readDepth = t.readByte.int let readDepth = t.readByte.int
@ -241,8 +246,8 @@ proc accountNode(t: var TreeBuilder, depth: int): NodeKey =
acc.storageRoot = emptyRlpHash acc.storageRoot = emptyRlpHash
else: else:
let codeLen = t.readU32() let codeLen = t.readU32()
if codeLen > EIP170_CODE_SIZE_LIMIT: if wfEIP170 in t.flags and codeLen > EIP170_CODE_SIZE_LIMIT:
raise newException(ValueError, "code len exceed EIP170 code size limit") raise newException(ContractCodeError, "code len exceed EIP170 code size limit")
acc.codeHash = t.writeCode(t.read(codeLen.int)) acc.codeHash = t.writeCode(t.read(codeLen.int))
# switch to account storage parsing mode # switch to account storage parsing mode
@ -252,9 +257,22 @@ proc accountNode(t: var TreeBuilder, depth: int): NodeKey =
acc.storageRoot.data = storageRoot.data acc.storageRoot.data = storageRoot.data
r.append rlp.encode(acc) r.append rlp.encode(acc)
result = toNodeKey(r.finish) let noderes = r.finish
result = toNodeKey(noderes)
when defined(debugHash): when defined(debugHash):
if result != nodeKey:
debugEcho "result.usedBytes: ", result.usedBytes
debugEcho "nodeKey.usedBytes: ", nodeKey.usedBytes
var rlpa = rlpFromBytes(node)
var rlpb = rlpFromBytes(noderes)
debugEcho "Expected: ", inspect(rlpa)
debugEcho "Actual: ", inspect(rlpb)
var a = rlpa.listElem(1).toBytes.decode(Account)
var b = rlpb.listElem(1).toBytes.decode(Account)
debugEcho "Expected: ", a
debugEcho "Actual: ", b
doAssert(result == nodeKey, "account node parsing error") doAssert(result == nodeKey, "account node parsing error")
proc accountStorageLeafNode(t: var TreeBuilder, depth: int): NodeKey = proc accountStorageLeafNode(t: var TreeBuilder, depth: int): NodeKey =

View File

@ -13,11 +13,13 @@ type
db*: DB db*: DB
root: KeccakHash root: KeccakHash
output: OutputStream output: OutputStream
flags: WitnessFlags
proc initWitnessBuilder*(db: DB, rootHash: KeccakHash = emptyRlpHash): WitnessBuilder = proc initWitnessBuilder*(db: DB, rootHash: KeccakHash, flags: WitnessFlags = {}): WitnessBuilder =
result.db = db result.db = db
result.root = rootHash result.root = rootHash
result.output = memoryOutput().s result.output = memoryOutput().s
result.flags = flags
template extensionNodeKey(r: Rlp): auto = template extensionNodeKey(r: Rlp): auto =
hexPrefixDecode r.listElem(0).toBytes hexPrefixDecode r.listElem(0).toBytes
@ -125,8 +127,8 @@ proc writeAccountNode(wb: var WitnessBuilder, acc: Account, nibbles: NibblesSeq,
if accountType == ExtendedAccountType: if accountType == ExtendedAccountType:
if acc.codeHash != blankStringHash: if acc.codeHash != blankStringHash:
let code = get(wb.db, contractHashKey(acc.codeHash).toOpenArray) let code = get(wb.db, contractHashKey(acc.codeHash).toOpenArray)
if code.len > EIP170_CODE_SIZE_LIMIT: if wfEIP170 in wb.flags and code.len > EIP170_CODE_SIZE_LIMIT:
raise newException(ValueError, "code len exceed EIP170 code size limit") raise newException(ContractCodeError, "code len exceed EIP170 code size limit")
wb.writeU32(code.len.uint32) wb.writeU32(code.len.uint32)
wb.output.append(code) wb.output.append(code)
else: else:

View File

@ -11,6 +11,14 @@ type
SimpleAccountType SimpleAccountType
ExtendedAccountType ExtendedAccountType
WitnessFlag* = enum
wfNoFlag
wfEIP170 # fork >= Spurious Dragon
WitnessFlags* = set[WitnessFlag]
ContractCodeError* = object of ValueError
const const
StorageLeafNodeType* = AccountNodeType StorageLeafNodeType* = AccountNodeType
BlockWitnessVersion* = 0x01 BlockWitnessVersion* = 0x01