Fix vmflags for witness generation 1934. (#1961)
* Fix issue causing vmflags to be reset during call to processBlocks and enable witness generation in test_blockchain_json test. * Fix copyright notice on updated files.
This commit is contained in:
parent
84e7c680dd
commit
e60e5801da
|
@ -1,5 +1,5 @@
|
||||||
# Nimbus
|
# Nimbus
|
||||||
# Copyright (c) 2018-2023 Status Research & Development GmbH
|
# Copyright (c) 2018-2024 Status Research & Development GmbH
|
||||||
# Licensed under either of
|
# Licensed under either of
|
||||||
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0)
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
@ -27,7 +27,8 @@ proc init(
|
||||||
blockCtx: BlockContext;
|
blockCtx: BlockContext;
|
||||||
com: CommonRef;
|
com: CommonRef;
|
||||||
tracer: TracerRef,
|
tracer: TracerRef,
|
||||||
asyncFactory: AsyncOperationFactory = AsyncOperationFactory(maybeDataSource: none[AsyncDataSource]()))
|
asyncFactory: AsyncOperationFactory = AsyncOperationFactory(maybeDataSource: none[AsyncDataSource]()),
|
||||||
|
flags: set[VMFlag] = self.flags)
|
||||||
{.gcsafe.} =
|
{.gcsafe.} =
|
||||||
## Initialisation helper
|
## Initialisation helper
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
@ -37,6 +38,7 @@ proc init(
|
||||||
self.tracer = tracer
|
self.tracer = tracer
|
||||||
self.stateDB = ac
|
self.stateDB = ac
|
||||||
self.asyncFactory = asyncFactory
|
self.asyncFactory = asyncFactory
|
||||||
|
self.flags = flags
|
||||||
|
|
||||||
func blockCtx(com: CommonRef, header: BlockHeader):
|
func blockCtx(com: CommonRef, header: BlockHeader):
|
||||||
BlockContext {.gcsafe, raises: [CatchableError].} =
|
BlockContext {.gcsafe, raises: [CatchableError].} =
|
||||||
|
@ -102,13 +104,15 @@ proc reinit*(self: BaseVMState; ## Object descriptor
|
||||||
db = com.db
|
db = com.db
|
||||||
ac = if self.stateDB.rootHash == parent.stateRoot: self.stateDB
|
ac = if self.stateDB.rootHash == parent.stateRoot: self.stateDB
|
||||||
else: com.ledgerType.init(db, parent.stateRoot, com.pruneTrie)
|
else: com.ledgerType.init(db, parent.stateRoot, com.pruneTrie)
|
||||||
|
flags = self.flags
|
||||||
self[].reset
|
self[].reset
|
||||||
self.init(
|
self.init(
|
||||||
ac = ac,
|
ac = ac,
|
||||||
parent = parent,
|
parent = parent,
|
||||||
blockCtx = blockCtx,
|
blockCtx = blockCtx,
|
||||||
com = com,
|
com = com,
|
||||||
tracer = tracer)
|
tracer = tracer,
|
||||||
|
flags = flags)
|
||||||
return true
|
return true
|
||||||
# else: false
|
# else: false
|
||||||
|
|
||||||
|
@ -292,6 +296,10 @@ proc buildWitness*(vmState: BaseVMState): seq[byte]
|
||||||
let mkeys = vmState.stateDB.makeMultiKeys()
|
let mkeys = vmState.stateDB.makeMultiKeys()
|
||||||
let flags = if vmState.fork >= FkSpurious: {wfEIP170} else: {}
|
let flags = if vmState.fork >= FkSpurious: {wfEIP170} else: {}
|
||||||
|
|
||||||
|
# A valid block having no transactions should return an empty witness
|
||||||
|
if mkeys.keys.len() == 0:
|
||||||
|
return @[]
|
||||||
|
|
||||||
# build witness from tree
|
# build witness from tree
|
||||||
var wb = initWitnessBuilder(vmState.com.db, rootHash, flags)
|
var wb = initWitnessBuilder(vmState.com.db, rootHash, flags)
|
||||||
wb.buildWitness(mkeys)
|
wb.buildWitness(mkeys)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Nimbus
|
# Nimbus
|
||||||
# Copyright (c) 2018-2023 Status Research & Development GmbH
|
# Copyright (c) 2018-2024 Status Research & Development GmbH
|
||||||
# Licensed under either of
|
# Licensed under either of
|
||||||
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0)
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
@ -176,6 +176,12 @@ proc parseTestCtx(fixture: JsonNode, testStatusIMPL: var TestStatus): TestCtx =
|
||||||
proc blockWitness(vmState: BaseVMState, chainDB: CoreDbRef) =
|
proc blockWitness(vmState: BaseVMState, chainDB: CoreDbRef) =
|
||||||
let rootHash = vmState.stateDB.rootHash
|
let rootHash = vmState.stateDB.rootHash
|
||||||
let witness = vmState.buildWitness()
|
let witness = vmState.buildWitness()
|
||||||
|
|
||||||
|
if witness.len() == 0:
|
||||||
|
if vmState.stateDB.makeMultiKeys().keys.len() != 0:
|
||||||
|
raise newException(ValidationError, "Invalid trie generated from block witness")
|
||||||
|
return
|
||||||
|
|
||||||
let fork = vmState.fork
|
let fork = vmState.fork
|
||||||
let flags = if fork >= FKSpurious: {wfEIP170} else: {}
|
let flags = if fork >= FKSpurious: {wfEIP170} else: {}
|
||||||
|
|
||||||
|
@ -221,6 +227,7 @@ proc importBlock(ctx: var TestCtx, com: CommonRef,
|
||||||
com,
|
com,
|
||||||
tracerInst,
|
tracerInst,
|
||||||
)
|
)
|
||||||
|
ctx.vmState.generateWitness = true # Enable saving witness data
|
||||||
|
|
||||||
let
|
let
|
||||||
chain = newChain(com, extraValidation = true, ctx.vmState)
|
chain = newChain(com, extraValidation = true, ctx.vmState)
|
||||||
|
@ -229,8 +236,7 @@ proc importBlock(ctx: var TestCtx, com: CommonRef,
|
||||||
if res == ValidationResult.Error:
|
if res == ValidationResult.Error:
|
||||||
raise newException(ValidationError, "persistBlocks validation")
|
raise newException(ValidationError, "persistBlocks validation")
|
||||||
else:
|
else:
|
||||||
if ctx.vmState.generateWitness():
|
blockWitness(chain.vmState, com.db)
|
||||||
blockWitness(ctx.vmState, com.db)
|
|
||||||
|
|
||||||
proc applyFixtureBlockToChain(ctx: var TestCtx, tb: var TestBlock,
|
proc applyFixtureBlockToChain(ctx: var TestCtx, tb: var TestBlock,
|
||||||
com: CommonRef, checkSeal: bool) =
|
com: CommonRef, checkSeal: bool) =
|
||||||
|
|
Loading…
Reference in New Issue