fix t8n 0-touch reward on pre EIP150 networks

This commit is contained in:
jangko 2022-12-07 23:11:33 +07:00
parent 505091597a
commit 05584a21b9
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
3 changed files with 16 additions and 5 deletions

View File

@ -84,7 +84,7 @@ type
stateReward* {. stateReward* {.
desc: "Mining reward. Set to -1 to disable" desc: "Mining reward. Set to -1 to disable"
defaultValue: none(UInt256) defaultValue: some(0.u256)
defaultValueDesc: "-1" defaultValueDesc: "-1"
name: "state.reward" }: Option[UInt256] name: "state.reward" }: Option[UInt256]

View File

@ -56,7 +56,7 @@ The following options are available:
extension is '.rlp', then the data is interpreted as an RLP list of signed extension is '.rlp', then the data is interpreted as an RLP list of signed
transactions. The '.rlp' format is identical to the output.body format. transactions. The '.rlp' format is identical to the output.body format.
[=txs.json]. [=txs.json].
--state.reward Mining reward. Set to 0 to disable [=0]. --state.reward Mining reward. Set to -1 to disable [=0].
--state.chainid ChainID to use [=1]. --state.chainid ChainID to use [=1].
--state.fork Name of ruleset to use. [=GrayGlacier]. --state.fork Name of ruleset to use. [=GrayGlacier].
- Frontier. - Frontier.

View File

@ -1,5 +1,5 @@
import import
std/[json, strutils, times, tables, os], std/[json, strutils, times, tables, os, sets],
eth/[rlp, trie], eth/[rlp, trie],
stint, chronicles, stew/results, stint, chronicles, stew/results,
"."/[config, types, helpers], "."/[config, types, helpers],
@ -176,7 +176,7 @@ proc exec(ctx: var TransContext,
) )
includedTx.add tx includedTx.add tx
if stateReward.isSome: if stateReward.isSome and stateReward.get >= 0:
let blockReward = stateReward.get() let blockReward = stateReward.get()
var mainReward = blockReward var mainReward = blockReward
for uncle in ctx.env.ommers: for uncle in ctx.env.ommers:
@ -191,6 +191,18 @@ proc exec(ctx: var TransContext,
db.addBalance(ctx.env.currentCoinbase, mainReward) db.addBalance(ctx.env.currentCoinbase, mainReward)
db.persist(clearCache = false) db.persist(clearCache = false)
let miner = ctx.env.currentCoinbase
vmState.mutateStateDB:
if miner in vmState.selfDestructs:
db.deleteAccount miner
if vmState.com.forkGTE(Spurious):
# EIP158/161 state clearing
if db.accountExists(miner) and db.isEmptyAccount(miner):
db.deleteAccount(miner)
# do not clear cache, we need the cache when constructing
# post state
db.persist(clearCache = false)
let stateDB = vmState.stateDB let stateDB = vmState.stateDB
stateDB.postState(result.alloc) stateDB.postState(result.alloc)
result.result = ExecutionResult( result.result = ExecutionResult(
@ -232,7 +244,6 @@ proc setupAlloc(stateDB: AccountsCache, alloc: GenesisAlloc) =
method getAncestorHash(vmState: TestVMState; blockNumber: BlockNumber): Hash256 {.gcsafe.} = method getAncestorHash(vmState: TestVMState; blockNumber: BlockNumber): Hash256 {.gcsafe.} =
# we can't raise exception here, it'll mess with EVM exception handler. # we can't raise exception here, it'll mess with EVM exception handler.
# so, store the exception for later using `hashError` # so, store the exception for later using `hashError`
let num = blockNumber.truncate(uint64) let num = blockNumber.truncate(uint64)
var h = Hash256() var h = Hash256()
if vmState.blockHashes.len == 0: if vmState.blockHashes.len == 0: