186 lines
5.2 KiB
Nim
186 lines
5.2 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2022 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed except
|
|
# according to those terms.
|
|
|
|
import
|
|
std/[options, os, strutils],
|
|
confutils, stint,
|
|
./types
|
|
|
|
export
|
|
options, stint
|
|
|
|
func combineForks(): string =
|
|
for x in low(TestFork)..high(TestFork):
|
|
result.add "- " & $x & "\n"
|
|
|
|
const
|
|
availableForks = combineForks()
|
|
|
|
type
|
|
HexOrInt* = distinct uint64
|
|
|
|
T8NConf* = object of RootObj
|
|
traceEnabled* {.
|
|
desc: "Output full trace logs to files trace-<txIndex>-<txhash>.jsonl"
|
|
defaultValue: false
|
|
name: "trace" }: bool
|
|
|
|
traceMemory* {.
|
|
desc: "Enable full memory dump in traces"
|
|
defaultValue: false
|
|
name: "trace.memory" }: bool
|
|
|
|
traceNostack* {.
|
|
desc: "Disable stack output in traces"
|
|
defaultValue: false
|
|
name: "trace.nostack" }: bool
|
|
|
|
traceReturnData* {.
|
|
desc: "Enable return data output in traces"
|
|
defaultValue: false
|
|
name: "trace.returndata" }: bool
|
|
|
|
outputBaseDir* {.
|
|
desc: "Specifies where output files are placed. Will be created if it does not exist"
|
|
defaultValue: ""
|
|
name: "output.basedir" }: string
|
|
|
|
outputBody* {.
|
|
desc: "If set, the RLP of the transactions (block body) will be written to this file"
|
|
defaultValue: ""
|
|
name: "output.body" }: string
|
|
|
|
outputAlloc* {.
|
|
desc: "Determines where to put the `alloc` of the post-state."
|
|
longDesc:
|
|
"`stdout` - into the stdout output\n" &
|
|
"`stderr` - into the stderr output\n" &
|
|
"<file> - into the file <file>\n"
|
|
defaultValue: "alloc.json"
|
|
name: "output.alloc" }: string
|
|
|
|
outputResult* {.
|
|
desc: "Determines where to put the `result` (stateroot, txroot etc) of the post-state."
|
|
longDesc:
|
|
"`stdout` - into the stdout output\n" &
|
|
"`stderr` - into the stderr output\n" &
|
|
"<file> - into the file <file>\n"
|
|
defaultValue: "result.json"
|
|
name: "output.result" }: string
|
|
|
|
inputAlloc* {.
|
|
desc: "`stdin` or file name of where to find the prestate alloc to use."
|
|
defaultValue: "alloc.json"
|
|
name: "input.alloc" }: string
|
|
|
|
inputEnv* {.
|
|
desc: "`stdin` or file name of where to find the prestate env to use."
|
|
defaultValue: "env.json"
|
|
name: "input.env" }: string
|
|
|
|
inputTxs* {.
|
|
desc: "`stdin` or file name of where to find the transactions to apply. " &
|
|
"If the file 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."
|
|
defaultValue: "txs.json"
|
|
name: "input.txs" }: string
|
|
|
|
stateReward* {.
|
|
desc: "Mining reward. Set to -1 to disable"
|
|
defaultValue: some(0.u256)
|
|
defaultValueDesc: "-1"
|
|
name: "state.reward" }: Option[UInt256]
|
|
|
|
stateChainId* {.
|
|
desc: "ChainID to use"
|
|
defaultValue: 1
|
|
name: "state.chainid" }: HexOrInt
|
|
|
|
stateFork* {.
|
|
desc: "Name of ruleset to use."
|
|
longDesc: $availableForks
|
|
defaultValue: "GrayGlacier"
|
|
name: "state.fork" }: string
|
|
|
|
verbosity* {.
|
|
desc: "sets the verbosity level"
|
|
longDesc:
|
|
"0 = silent, 1 = error, 2 = warn, 3 = info, 4 = debug, 5 = detail"
|
|
defaultValue: 3
|
|
name: "verbosity" }: int
|
|
|
|
proc parseCmdArg(T: type Option[UInt256], p: TaintedString): T =
|
|
if p.string == "-1":
|
|
none(UInt256)
|
|
elif startsWith(p.string, "0x"):
|
|
some(parse(p.string, UInt256, 16))
|
|
else:
|
|
some(parse(p.string, UInt256, 10))
|
|
|
|
proc completeCmdArg(T: type Option[UInt256], val: TaintedString): seq[string] =
|
|
return @[]
|
|
|
|
proc parseCmdArg(T: type HexOrInt, p: TaintedString): T =
|
|
if startsWith(p.string, "0x"):
|
|
parseHexInt(p.string).T
|
|
else:
|
|
parseInt(p.string).T
|
|
|
|
proc completeCmdArg(T: type HexOrInt, val: TaintedString): seq[string] =
|
|
return @[]
|
|
|
|
proc notCmd(x: string): bool =
|
|
if x.len == 0: return true
|
|
|
|
# negative number
|
|
if x.len >= 2 and
|
|
x[0] == '-' and
|
|
x[1].isDigit: return true
|
|
|
|
# else
|
|
x[0] != '-'
|
|
|
|
proc convertToNimStyle(cmds: openArray[string]): seq[string] =
|
|
# convert something like '--key value' to '--key=value'
|
|
var i = 0
|
|
while i < cmds.len:
|
|
if notCmd(cmds[i]) or i == cmds.len-1:
|
|
result.add cmds[i]
|
|
inc i
|
|
continue
|
|
|
|
if i < cmds.len and notCmd(cmds[i+1]):
|
|
result.add cmds[i] & "=" & cmds[i+1]
|
|
inc i
|
|
else:
|
|
result.add cmds[i]
|
|
|
|
inc i
|
|
|
|
const
|
|
Copyright = "Copyright (c) 2022 Status Research & Development GmbH"
|
|
Version = "Nimbus-t8n 0.1.2"
|
|
|
|
# force the compiler to instantiate T8NConf.load
|
|
# rather than have to export parseCmdArg
|
|
# because it will use wrong parseCmdArg from nimbus/config.nim
|
|
# when evmc_enabled
|
|
proc initT8NConf(cmdLine: openArray[string]): T8NConf =
|
|
{.push warning[ProveInit]: off.}
|
|
result = T8NConf.load(
|
|
cmdLine.convertToNimStyle,
|
|
version = Version,
|
|
copyrightBanner = Version & "\n" & Copyright
|
|
)
|
|
{.pop.}
|
|
|
|
proc init*(_: type T8NConf, cmdLine = commandLineParams()): T8NConf =
|
|
initT8NConf(cmdLine)
|