deals with EIP170 error
This commit is contained in:
parent
c325ce1863
commit
90c2ede43b
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue