Fixes related to Prague execution requests (#2847)
* Fixes related to Prague execution requests Turn out the specs are changed: - WITHDRAWAL_REQUEST_ADDRESS -> WITHDRAWAL_QUEUE_ADDRESS - CONSOLIDATION_REQUEST_ADDRESS -> CONSOLIDATION_QUEUE_ADDRESS - DEPOSIT_CONTRACT_ADDRESS -> only mainnet - depositContractAddress can be configurable Also fix bugs related to t8n tool * Fix for evmc
This commit is contained in:
parent
c15647075d
commit
666f8d2cf1
|
@ -445,7 +445,9 @@ func chainConfigForNetwork*(id: NetworkId): ChainConfig =
|
|||
|
||||
result = case id
|
||||
of MainNet:
|
||||
const mainNetTTD = parse("58750000000000000000000",UInt256)
|
||||
const
|
||||
mainNetTTD = parse("58750000000000000000000",UInt256)
|
||||
MAINNET_DEPOSIT_CONTRACT_ADDRESS = address"0x00000000219ab540356cbb839cbe05303d7705fa"
|
||||
ChainConfig(
|
||||
chainId: MainNet.ChainId,
|
||||
# Genesis (Frontier): # 2015-07-30 15:26:13 UTC
|
||||
|
@ -470,6 +472,7 @@ func chainConfigForNetwork*(id: NetworkId): ChainConfig =
|
|||
terminalTotalDifficulty: Opt.some(mainNetTTD),
|
||||
shanghaiTime: Opt.some(1_681_338_455.EthTime), # 2023-04-12 10:27:35 UTC
|
||||
cancunTime: Opt.some(1_710_338_135.EthTime), # 2024-03-13 13:55:35 UTC
|
||||
depositContractAddress: Opt.some(MAINNET_DEPOSIT_CONTRACT_ADDRESS),
|
||||
)
|
||||
of SepoliaNet:
|
||||
const sepoliaTTD = parse("17000000000000000",UInt256)
|
||||
|
|
|
@ -328,6 +328,9 @@ proc proofOfStake*(com: CommonRef, header: Header): bool =
|
|||
# This costly check is only executed from test suite
|
||||
com.isBlockAfterTtd(header)
|
||||
|
||||
func depositContractAddress*(com: CommonRef): Address =
|
||||
com.config.depositContractAddress.get(default(Address))
|
||||
|
||||
proc syncReqNewHead*(com: CommonRef; header: Header)
|
||||
{.gcsafe, raises: [].} =
|
||||
## Used by RPC updater
|
||||
|
|
|
@ -176,6 +176,7 @@ type
|
|||
|
||||
terminalTotalDifficulty*: Opt[UInt256]
|
||||
terminalTotalDifficultyPassed*: Opt[bool]
|
||||
depositContractAddress*: Opt[Address]
|
||||
|
||||
# These are used for checking that the values of the fields
|
||||
# are in a valid order.
|
||||
|
|
|
@ -108,7 +108,6 @@ const
|
|||
initAddress(3)
|
||||
|
||||
HISTORY_STORAGE_ADDRESS* = address"0x0aae40965e6800cd9b1f4b05ff21581047e3f91e"
|
||||
DEPOSIT_CONTRACT_ADDRESS* = address"0x00000000219ab540356cbb839cbe05303d7705fa"
|
||||
WITHDRAWAL_REQUEST_ADDRESS* = address"0x00A3ca265EBcb825B45F985A16CEFB49958cE017"
|
||||
CONSOLIDATION_REQUEST_ADDRESS* = address"0x00b42dbF2194e931E80326D950320f7d9Dbeac02"
|
||||
WITHDRAWAL_QUEUE_ADDRESS* = address"0x09Fc772D0857550724b07B850a4323f39112aAaA"
|
||||
CONSOLIDATION_QUEUE_ADDRESS* = address"0x01aBEa29659e5e97C95107F20bb753cD3e09bBBb"
|
||||
# End
|
||||
|
|
|
@ -14,8 +14,7 @@ import
|
|||
eth/common/receipts,
|
||||
stew/assign2,
|
||||
stew/arrayops,
|
||||
results,
|
||||
../constants
|
||||
results
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Private helpers
|
||||
|
@ -71,14 +70,13 @@ func depositLogToRequest(data: openArray[byte]): DepositRequest =
|
|||
# Public functions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
func parseDepositLogs*(logs: openArray[Log]): Result[seq[byte], string] =
|
||||
var res = newSeq[byte](logs.len*depositRequestSize)
|
||||
func parseDepositLogs*(logs: openArray[Log], depositContractAddress: Address): Result[seq[byte], string] =
|
||||
var res = newSeqOfCap[byte](logs.len*depositRequestSize)
|
||||
for i, log in logs:
|
||||
if log.address == DEPOSIT_CONTRACT_ADDRESS:
|
||||
if log.data.len != 576:
|
||||
return err("deposit wrong length: want 576, have " & $log.data.len)
|
||||
let offset = i*depositRequestSize
|
||||
assign(res.toOpenArray(offset, offset+depositRequestSize-1),
|
||||
depositLogToRequest(log.data))
|
||||
if log.address != depositContractAddress:
|
||||
continue
|
||||
if log.data.len != 576:
|
||||
return err("deposit wrong length: want 576, have " & $log.data.len)
|
||||
res.add depositLogToRequest(log.data)
|
||||
|
||||
ok(move(res))
|
||||
|
|
|
@ -191,7 +191,7 @@ proc procBlkEpilogue(
|
|||
|
||||
if header.requestsHash.isSome:
|
||||
let
|
||||
depositReqs = ?parseDepositLogs(vmState.allLogs)
|
||||
depositReqs = ?parseDepositLogs(vmState.allLogs, vmState.com.depositContractAddress)
|
||||
requestsHash = calcRequestsHash(depositReqs, withdrawalReqs, consolidationReqs)
|
||||
|
||||
if header.requestsHash.get != requestsHash:
|
||||
|
|
|
@ -197,7 +197,7 @@ proc processDequeueWithdrawalRequests*(vmState: BaseVMState): seq[byte] =
|
|||
sender : SYSTEM_ADDRESS,
|
||||
gasLimit : 30_000_000.GasInt,
|
||||
gasPrice : 0.GasInt,
|
||||
to : WITHDRAWAL_REQUEST_ADDRESS,
|
||||
to : WITHDRAWAL_QUEUE_ADDRESS,
|
||||
|
||||
# It's a systemCall, no need for other knicks knacks
|
||||
sysCall : true,
|
||||
|
@ -221,7 +221,7 @@ proc processDequeueConsolidationRequests*(vmState: BaseVMState): seq[byte] =
|
|||
sender : SYSTEM_ADDRESS,
|
||||
gasLimit : 30_000_000.GasInt,
|
||||
gasPrice : 0.GasInt,
|
||||
to : CONSOLIDATION_REQUEST_ADDRESS,
|
||||
to : CONSOLIDATION_QUEUE_ADDRESS,
|
||||
|
||||
# It's a systemCall, no need for other knicks knacks
|
||||
sysCall : true,
|
||||
|
|
|
@ -269,7 +269,7 @@ proc vmExecCommit(pst: var TxPacker): Result[void, string] =
|
|||
if vmState.fork >= FkPrague:
|
||||
pst.withdrawalReqs = processDequeueWithdrawalRequests(vmState)
|
||||
pst.consolidationReqs = processDequeueConsolidationRequests(vmState)
|
||||
pst.depositReqs = ?parseDepositLogs(vmState.allLogs)
|
||||
pst.depositReqs = ?parseDepositLogs(vmState.allLogs, vmState.com.depositContractAddress)
|
||||
|
||||
# Finish up, then vmState.stateDB.stateRoot may be accessed
|
||||
stateDB.persist(clearEmptyAccount = vmState.fork >= FkSpurious)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
{.push gcsafe, raises: [].}
|
||||
|
||||
import
|
||||
std/[algorithm, sequtils],
|
||||
std/[sequtils],
|
||||
chronicles,
|
||||
eth/[common, rlp],
|
||||
stew/byteutils,
|
||||
|
|
|
@ -57,9 +57,8 @@ func storageCostSpec(): array[EVMFork, StorageCostSpec] {.compileTime.} =
|
|||
netCost: true, warmAccess: WarmStorageReadCost, sset: 20000,
|
||||
reset: 5000 - ColdSloadCost, clear: 4800)
|
||||
|
||||
result[FkParis] = result[FkLondon]
|
||||
result[FkShanghai] = result[FkLondon]
|
||||
result[FkCancun] = result[FkLondon]
|
||||
for fork in FkParis..EVMFork.high:
|
||||
result[fork] = result[FkLondon]
|
||||
|
||||
proc legacySStoreCost(e: var SstoreCosts,
|
||||
c: StorageCostSpec) {.compileTime.} =
|
||||
|
|
|
@ -37,6 +37,7 @@ template handleStopDirective(cpt: VmCpt, tracingEnabled: bool) =
|
|||
if not cpt.code.atEnd():
|
||||
# we only trace `REAL STOP` and ignore `FAKE STOP`
|
||||
cpt.opIndex = cpt.traceOpCodeStarted(Stop)
|
||||
?cpt.opcodeGasCost(Stop, 0, tracingEnabled, reason = $Stop)
|
||||
cpt.traceOpCodeEnded(Stop, cpt.opIndex)
|
||||
|
||||
template handleFixedGasCostsDirective(
|
||||
|
|
|
@ -115,7 +115,7 @@ proc showEvmcArgsExpr(fn: NimNode, callName: string): auto =
|
|||
if (types[i].repr == "ptr byte" or types[i].repr == "ptr HostTopic") and
|
||||
(i < args.len-1 and types[i+1].repr == "HostSize"):
|
||||
skip = i+1
|
||||
arg = newPar(args[i], args[i+1])
|
||||
arg = newNimNode(nnkTupleConstr).add(args[i], args[i+1])
|
||||
msgExpr = quote do:
|
||||
`msgExpr` & `argNameString` & $(`arg`)
|
||||
return (msgExpr, args)
|
||||
|
|
|
@ -191,6 +191,7 @@ proc readValue*(r: var JsonReader[T8Conv], val: var EnvStruct)
|
|||
of "blockHashes": r.readValue(val.blockHashes)
|
||||
of "ommers": r.readValue(val.ommers)
|
||||
of "withdrawals": r.readValue(val.withdrawals)
|
||||
of "depositContractAddress": r.readValue(val.depositContractAddress)
|
||||
else: discard r.readValue(JsonString)
|
||||
|
||||
if not currentCoinbaseParsed:
|
||||
|
@ -235,10 +236,10 @@ proc parseTxJson(txo: TxObject, chainId: ChainId): Result[Transaction, string] =
|
|||
required(value)
|
||||
required(input, payload)
|
||||
tx.to = txo.to
|
||||
tx.chainId = chainId
|
||||
|
||||
case tx.txType
|
||||
of TxLegacy:
|
||||
tx.chainId = chainId
|
||||
required(gasPrice)
|
||||
of TxEip2930:
|
||||
required(gasPrice)
|
||||
|
@ -263,6 +264,9 @@ proc parseTxJson(txo: TxObject, chainId: ChainId): Result[Transaction, string] =
|
|||
optional(accessList)
|
||||
required(authorizationList)
|
||||
|
||||
if tx.chainId != chainId:
|
||||
return err("invalid chain id: have " & $tx.chainId & " want " & $chainId)
|
||||
|
||||
let eip155 = txo.protected.get(true)
|
||||
if txo.secretKey.isSome:
|
||||
let secretKey = PrivateKey.fromRaw(txo.secretKey.get).valueOr:
|
||||
|
@ -274,13 +278,17 @@ proc parseTxJson(txo: TxObject, chainId: ChainId): Result[Transaction, string] =
|
|||
required(s, S)
|
||||
ok(tx)
|
||||
|
||||
proc readNestedTx(rlp: var Rlp): Result[Transaction, string] =
|
||||
proc readNestedTx(rlp: var Rlp, chainId: ChainId): Result[Transaction, string] =
|
||||
try:
|
||||
ok if rlp.isList:
|
||||
let tx = if rlp.isList:
|
||||
rlp.read(Transaction)
|
||||
else:
|
||||
var rr = rlpFromBytes(rlp.read(seq[byte]))
|
||||
rr.read(Transaction)
|
||||
if tx.chainId == chainId:
|
||||
ok(tx)
|
||||
else:
|
||||
err("invalid chain id: have " & $tx.chainId & " want " & $chainId)
|
||||
except RlpError as exc:
|
||||
err(exc.msg)
|
||||
|
||||
|
@ -301,7 +309,7 @@ proc parseTxs*(ctx: var TransContext, chainId: ChainId)
|
|||
|
||||
if ctx.txsRlp.len > 0:
|
||||
for item in rlp:
|
||||
ctx.txList.add rlp.readNestedTx()
|
||||
ctx.txList.add rlp.readNestedTx(chainId)
|
||||
|
||||
proc filterGoodTransactions*(ctx: TransContext): seq[Transaction] =
|
||||
for txRes in ctx.txList:
|
||||
|
@ -433,6 +441,11 @@ proc `@@`[T](x: seq[T]): JsonNode =
|
|||
for c in x:
|
||||
result.add @@(c)
|
||||
|
||||
proc `@@`[N, T](x: array[N, T]): JsonNode =
|
||||
result = newJArray()
|
||||
for c in x:
|
||||
result.add @@(c)
|
||||
|
||||
proc `@@`[T](x: Opt[T]): JsonNode =
|
||||
if x.isNone:
|
||||
newJNull()
|
||||
|
@ -462,3 +475,5 @@ proc `@@`*(x: ExecutionResult): JsonNode =
|
|||
result["blobGasUsed"] = @@(x.blobGasUsed)
|
||||
if x.requestsHash.isSome:
|
||||
result["requestsHash"] = @@(x.requestsHash)
|
||||
if x.requests.isSome:
|
||||
result["requests"] = @@(x.requests)
|
||||
|
|
|
@ -20,6 +20,7 @@ type
|
|||
inEnv : string
|
||||
stFork : string
|
||||
stReward: string
|
||||
chainid : string
|
||||
|
||||
T8nOutput = object
|
||||
alloc : bool
|
||||
|
@ -39,13 +40,15 @@ type
|
|||
path: string
|
||||
error: string
|
||||
|
||||
proc t8nInput(alloc, txs, env, fork, reward: string): T8nInput =
|
||||
proc t8nInput(alloc, txs, env, fork: string;
|
||||
reward = "0"; chainid = ""): T8nInput =
|
||||
T8nInput(
|
||||
inAlloc : alloc,
|
||||
inTxs : txs,
|
||||
inEnv : env,
|
||||
stFork : fork,
|
||||
stReward: reward
|
||||
stReward: reward,
|
||||
chainid : chainid,
|
||||
)
|
||||
|
||||
proc get(opt: T8nInput, base : string): string =
|
||||
|
@ -55,6 +58,8 @@ proc get(opt: T8nInput, base : string): string =
|
|||
result.add(" --state.fork " & opt.stFork)
|
||||
if opt.stReward.len > 0:
|
||||
result.add(" --state.reward " & opt.stReward)
|
||||
if opt.chainid.len > 0:
|
||||
result.add(" --state.chainid " & opt.chainid)
|
||||
|
||||
proc get(opt: T8nOutput): string =
|
||||
if opt.alloc and not opt.trace:
|
||||
|
@ -165,14 +170,19 @@ proc runTest(appDir: string, spec: TestSpec): bool =
|
|||
if spec.expOut.len > 0:
|
||||
if spec.expOut.endsWith(".json"):
|
||||
let path = base / spec.expOut
|
||||
let want = json.parseFile(path)
|
||||
let have = json.parseJson(res)
|
||||
var jsc = JsonComparator()
|
||||
if not jsc.cmp(want, have, "root") and notRejectedError(jsc.path):
|
||||
echo "test $1: output wrong, have \n$2\nwant\n$3\n" %
|
||||
[spec.name, have.pretty, want.pretty]
|
||||
echo "path: $1, error: $2" %
|
||||
[jsc.path, jsc.error]
|
||||
try:
|
||||
let want = json.parseFile(path)
|
||||
let have = json.parseJson(res)
|
||||
var jsc = JsonComparator()
|
||||
if not jsc.cmp(want, have, "root") and notRejectedError(jsc.path):
|
||||
echo "test $1: output wrong, have \n$2\nwant\n$3\n" %
|
||||
[spec.name, have.pretty, want.pretty]
|
||||
echo "path: $1, error: $2" %
|
||||
[jsc.path, jsc.error]
|
||||
return false
|
||||
except JsonParsingError as exc:
|
||||
echo "test $1: ERROR: $2" % [spec.name, exc.msg]
|
||||
echo "test $1: OUTPUT: $2" % [spec.name, res]
|
||||
return false
|
||||
else:
|
||||
# compare as regular text
|
||||
|
@ -460,7 +470,7 @@ const
|
|||
name : "Revert In Create In Init Create2",
|
||||
base : "testdata/00-512",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0"
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0", "0"
|
||||
),
|
||||
output: T8nOutput(alloc: true, result: true),
|
||||
expOut: "exp.json",
|
||||
|
@ -469,7 +479,7 @@ const
|
|||
name : "Revert In Create In Init",
|
||||
base : "testdata/00-513",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0"
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0", "0"
|
||||
),
|
||||
output: T8nOutput(alloc: true, result: true),
|
||||
expOut: "exp.json",
|
||||
|
@ -478,7 +488,7 @@ const
|
|||
name : "Init collision 3",
|
||||
base : "testdata/00-514",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0"
|
||||
"alloc.json", "txs.rlp", "env.json", "Berlin", "0", "0"
|
||||
),
|
||||
output: T8nOutput(alloc: true, result: true),
|
||||
expOut: "exp.json",
|
||||
|
@ -496,7 +506,7 @@ const
|
|||
name : "GasUsedHigherThanBlockGasLimitButNotWithRefundsSuicideLast_Frontier",
|
||||
base : "testdata/00-516",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Frontier", "5000000000000000000",
|
||||
"alloc.json", "txs.rlp", "env.json", "Frontier", "5000000000000000000", "0"
|
||||
),
|
||||
output: T8nOutput(alloc: true, result: true),
|
||||
expOut: "exp.json",
|
||||
|
@ -609,6 +619,33 @@ const
|
|||
output: T8nOutput(result: true),
|
||||
expOut: "exp.json",
|
||||
),
|
||||
TestSpec(
|
||||
name : "Different --state.chainid and tx.chainid",
|
||||
base : "testdata/00-525",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Prague",
|
||||
),
|
||||
output: T8nOutput(result: true),
|
||||
expOut: "exp1.json",
|
||||
),
|
||||
TestSpec(
|
||||
name : "Prague execution requests",
|
||||
base : "testdata/00-525",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env.json", "Prague", "", "7078815900"
|
||||
),
|
||||
output: T8nOutput(result: true),
|
||||
expOut: "exp2.json",
|
||||
),
|
||||
TestSpec(
|
||||
name : "Prague depositContractAddress",
|
||||
base : "testdata/00-525",
|
||||
input : t8nInput(
|
||||
"alloc.json", "txs.rlp", "env_dca.json", "Prague", "", "7078815900"
|
||||
),
|
||||
output: T8nOutput(result: true),
|
||||
expOut: "exp3.json",
|
||||
),
|
||||
]
|
||||
|
||||
proc main() =
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"blockHashes": {
|
||||
},
|
||||
"currentBaseFee": "0x7",
|
||||
"currentBlobGasUsed": "0x0",
|
||||
"currentCoinbase": "0xf97e180c050e5ab072211ad2c213eb5aee4df134",
|
||||
"currentDifficulty": "0x0",
|
||||
"currentExcessBlobGas": "0x2b80000",
|
||||
"currentGasLimit": "0x1c9c380",
|
||||
"currentNumber": "0x1",
|
||||
"currentRandom": "0x89e03b95990c23f0dbc63247c17d9699464d25d10f9d24a676265bdd82bfb18a",
|
||||
"currentTimestamp": "0x672bc100",
|
||||
"parentBaseFee": "0x7",
|
||||
"parentBeaconBlockRoot": "0x4368de4abb7ed9d11d92d42713a3b3c6e0a271e20d6de882161c2ae1b3a9051f",
|
||||
"parentBlobGasUsed": "0xc0000",
|
||||
"parentDifficulty": "0x0",
|
||||
"parentExcessBlobGas": "0x2b20000",
|
||||
"parentGasLimit": "0x1c9c380",
|
||||
"parentGasUsed": "0x430f97",
|
||||
"parentTimestamp": "0x672bc0f4",
|
||||
"withdrawals": [
|
||||
]
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"blockHashes": {
|
||||
},
|
||||
"currentBaseFee": "0x7",
|
||||
"currentBlobGasUsed": "0x0",
|
||||
"currentCoinbase": "0xf97e180c050e5ab072211ad2c213eb5aee4df134",
|
||||
"currentDifficulty": "0x0",
|
||||
"currentExcessBlobGas": "0x2b80000",
|
||||
"currentGasLimit": "0x1c9c380",
|
||||
"currentNumber": "0x1",
|
||||
"currentRandom": "0x89e03b95990c23f0dbc63247c17d9699464d25d10f9d24a676265bdd82bfb18a",
|
||||
"currentTimestamp": "0x672bc100",
|
||||
"parentBaseFee": "0x7",
|
||||
"parentBeaconBlockRoot": "0x4368de4abb7ed9d11d92d42713a3b3c6e0a271e20d6de882161c2ae1b3a9051f",
|
||||
"parentBlobGasUsed": "0xc0000",
|
||||
"parentDifficulty": "0x0",
|
||||
"parentExcessBlobGas": "0x2b20000",
|
||||
"parentGasLimit": "0x1c9c380",
|
||||
"parentGasUsed": "0x430f97",
|
||||
"parentTimestamp": "0x672bc0f4",
|
||||
"withdrawals": [
|
||||
],
|
||||
"depositContractAddress": "0x4242424242424242424242424242424242424242"
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"result": {
|
||||
"stateRoot": "0x08fd46faf1bc68f8f3b6c78710d91b825cb22375aa8a3db99ddd9084cbbbfd75",
|
||||
"txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
|
||||
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"receipts": [],
|
||||
"currentDifficulty": null,
|
||||
"gasUsed": "0x0",
|
||||
"rejected": [
|
||||
{
|
||||
"index": 0,
|
||||
"error": "invalid chain id: have 7078815900 want 1"
|
||||
}
|
||||
],
|
||||
"currentBaseFee": "0x7",
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"currentExcessBlobGas": "0x2b80000",
|
||||
"blobGasUsed": "0x0",
|
||||
"requestsHash": "0x6036c41849da9c076ed79654d434017387a88fb833c2856b32e18218b3341c5f",
|
||||
"requests": [
|
||||
"0x",
|
||||
"0x",
|
||||
"0x"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"result": {
|
||||
"stateRoot": "0xdbeeef4c53f45167aea35bccfa9329f4a9b59fa7b115dc2f6462eea7316c2600",
|
||||
"txRoot": "0xe67cc7032923c32bc107773c80dbe2afc754eeed4203ccee50605b9fe15a5bb5",
|
||||
"receiptsRoot": "0xead5884f735e5e8e703878f0c89b54919d06c2cee8e373d632e730d42b380e0c",
|
||||
"logsHash": "0x6fb31d3ef4580565e54b679a3bb580d1a4c345faab2cfc7868304e0e5da23f4c",
|
||||
"logsBloom": "0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000",
|
||||
"receipts": [
|
||||
{
|
||||
"root": "0x",
|
||||
"status": "0x1",
|
||||
"cumulativeGasUsed": "0x14aea",
|
||||
"logsBloom": "0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000",
|
||||
"logs": [
|
||||
{
|
||||
"address": "0x4242424242424242424242424242424242424242",
|
||||
"topics": [
|
||||
"0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5"
|
||||
],
|
||||
"data": "0x00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003081521c60874daf5b425c21e44caf045c4d475e8b33a557a28cee3c46ef9cf9bd95b4c75a0bb629981b40d0102452dd4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020020000000000000000000000332e43696a505ef45b9319973785f837ce5267b90000000000000000000000000000000000000000000000000000000000000008000065cd1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608c8f2647f342d2c3e8fd07c6b3b9b16383ac11c4be6a6962c7fc18a789daee5fac20ee0bbe4a10383759aaffacacb72b0d67f998730cdf4995fe73afe434dfce2803b343606f67fc4995597c0af9e0fe9ed00006e5889bec29171f670e7d9be200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
],
|
||||
"transactionHash": "0x75b5508fdcec7682f238fb1ccdc9a087f3f8b601fd52d5c0684123698d89f0a6",
|
||||
"contractAddress": "0x0000000000000000000000000000000000000000",
|
||||
"gasUsed": "0x14aea",
|
||||
"blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"transactionIndex": "0x0",
|
||||
"type": "0x2"
|
||||
}
|
||||
],
|
||||
"currentDifficulty": null,
|
||||
"gasUsed": "0x14aea",
|
||||
"currentBaseFee": "0x7",
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"currentExcessBlobGas": "0x2b80000",
|
||||
"blobGasUsed": "0x0",
|
||||
"requestsHash": "0x6036c41849da9c076ed79654d434017387a88fb833c2856b32e18218b3341c5f",
|
||||
"requests": [
|
||||
"0x",
|
||||
"0x",
|
||||
"0x"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"result": {
|
||||
"stateRoot": "0xdbeeef4c53f45167aea35bccfa9329f4a9b59fa7b115dc2f6462eea7316c2600",
|
||||
"txRoot": "0xe67cc7032923c32bc107773c80dbe2afc754eeed4203ccee50605b9fe15a5bb5",
|
||||
"receiptsRoot": "0xead5884f735e5e8e703878f0c89b54919d06c2cee8e373d632e730d42b380e0c",
|
||||
"logsHash": "0x6fb31d3ef4580565e54b679a3bb580d1a4c345faab2cfc7868304e0e5da23f4c",
|
||||
"logsBloom": "0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000",
|
||||
"receipts": [
|
||||
{
|
||||
"root": "0x",
|
||||
"status": "0x1",
|
||||
"cumulativeGasUsed": "0x14aea",
|
||||
"logsBloom": "0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000",
|
||||
"logs": [
|
||||
{
|
||||
"address": "0x4242424242424242424242424242424242424242",
|
||||
"topics": [
|
||||
"0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5"
|
||||
],
|
||||
"data": "0x00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003081521c60874daf5b425c21e44caf045c4d475e8b33a557a28cee3c46ef9cf9bd95b4c75a0bb629981b40d0102452dd4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020020000000000000000000000332e43696a505ef45b9319973785f837ce5267b90000000000000000000000000000000000000000000000000000000000000008000065cd1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608c8f2647f342d2c3e8fd07c6b3b9b16383ac11c4be6a6962c7fc18a789daee5fac20ee0bbe4a10383759aaffacacb72b0d67f998730cdf4995fe73afe434dfce2803b343606f67fc4995597c0af9e0fe9ed00006e5889bec29171f670e7d9be200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
],
|
||||
"transactionHash": "0x75b5508fdcec7682f238fb1ccdc9a087f3f8b601fd52d5c0684123698d89f0a6",
|
||||
"contractAddress": "0x0000000000000000000000000000000000000000",
|
||||
"gasUsed": "0x14aea",
|
||||
"blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"transactionIndex": "0x0",
|
||||
"type": "0x2"
|
||||
}
|
||||
],
|
||||
"currentDifficulty": null,
|
||||
"gasUsed": "0x14aea",
|
||||
"currentBaseFee": "0x7",
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"currentExcessBlobGas": "0x2b80000",
|
||||
"blobGasUsed": "0x0",
|
||||
"requestsHash": "0xa5c19ed76c01fe25a67b7ef8c227caa34951e8c7e74168408b5be0861dac686d",
|
||||
"requests": [
|
||||
"0x81521c60874daf5b425c21e44caf045c4d475e8b33a557a28cee3c46ef9cf9bd95b4c75a0bb629981b40d0102452dd4c020000000000000000000000332e43696a505ef45b9319973785f837ce5267b9000065cd1d0000008c8f2647f342d2c3e8fd07c6b3b9b16383ac11c4be6a6962c7fc18a789daee5fac20ee0bbe4a10383759aaffacacb72b0d67f998730cdf4995fe73afe434dfce2803b343606f67fc4995597c0af9e0fe9ed00006e5889bec29171f670e7d9be20000000000000000",
|
||||
"0x",
|
||||
"0x"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
"0xf90226b9022302f9021f8501a5ee289c07840e07899f840e07899f8302c0c19442424242424242424242424242424242424242428906f05b59d3b2000000b901a422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001206c240a071b7048221c3f53bb0e66debee5330def076d51c9958c776e3f13d5d4000000000000000000000000000000000000000000000000000000000000003081521c60874daf5b425c21e44caf045c4d475e8b33a557a28cee3c46ef9cf9bd95b4c75a0bb629981b40d0102452dd4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020020000000000000000000000332e43696a505ef45b9319973785f837ce5267b900000000000000000000000000000000000000000000000000000000000000608c8f2647f342d2c3e8fd07c6b3b9b16383ac11c4be6a6962c7fc18a789daee5fac20ee0bbe4a10383759aaffacacb72b0d67f998730cdf4995fe73afe434dfce2803b343606f67fc4995597c0af9e0fe9ed00006e5889bec29171f670e7d9be2c001a0e36549b612e7fd2c1b0635025782f6c4841317a1a4b4614b3a39b95754fca7f6a014ca51a1714612ee97e1b5a785bd0c8e388f46539d36cc8ef014127a0bfcf05a"
|
|
@ -150,7 +150,7 @@ proc defaultTraceStreamFilename(conf: T8NConf,
|
|||
txIndex: int,
|
||||
txHash: Hash32): (string, string) =
|
||||
let
|
||||
txHash = "0x" & toLowerAscii($txHash)
|
||||
txHash = toLowerAscii($txHash)
|
||||
baseDir = if conf.outputBaseDir.len > 0:
|
||||
conf.outputBaseDir
|
||||
else:
|
||||
|
@ -167,8 +167,9 @@ proc traceToFileStream(path: string, txIndex: int): Stream =
|
|||
# replace whatever `.ext` to `-${txIndex}.jsonl`
|
||||
let
|
||||
file = path.splitFile
|
||||
fName = "$1/$2-$3.jsonl" % [file.dir, file.name, $txIndex]
|
||||
createDir(file.dir)
|
||||
folder = if file.dir.len == 0: "." else: file.dir
|
||||
fName = "$1/$2-$3.jsonl" % [folder, file.name, $txIndex]
|
||||
if file.dir.len > 0: createDir(file.dir)
|
||||
newFileStream(fName, fmWrite)
|
||||
|
||||
proc setupTrace(conf: T8NConf, txIndex: int, txHash: Hash32, vmState: BaseVMState): bool =
|
||||
|
@ -355,10 +356,11 @@ proc exec(ctx: TransContext,
|
|||
for rec in result.result.receipts:
|
||||
allLogs.add rec.logs
|
||||
let
|
||||
depositReqs = parseDepositLogs(allLogs).valueOr:
|
||||
depositReqs = parseDepositLogs(allLogs, vmState.com.depositContractAddress).valueOr:
|
||||
raise newError(ErrorEVM, error)
|
||||
requestsHash = calcRequestsHash(depositReqs, withdrawalReqs, consolidationReqs)
|
||||
result.result.requestsHash = Opt.some(requestsHash)
|
||||
result.result.requests = Opt.some([depositReqs, withdrawalReqs, consolidationReqs])
|
||||
|
||||
template wrapException(body: untyped) =
|
||||
when wrapExceptionEnabled:
|
||||
|
@ -424,11 +426,6 @@ proc transitionAction*(ctx: var TransContext, conf: T8NConf) =
|
|||
if conf.inputAlloc.len == 0 and conf.inputEnv.len == 0 and conf.inputTxs.len == 0:
|
||||
raise newError(ErrorConfig, "either one of input is needeed(alloc, txs, or env)")
|
||||
|
||||
let config = parseChainConfig(conf.stateFork)
|
||||
config.chainId = conf.stateChainId.ChainId
|
||||
|
||||
let com = CommonRef.new(newCoreDbRef DefaultDbMemory, config)
|
||||
|
||||
# We need to load three things: alloc, env and transactions.
|
||||
# May be either in stdin input or in files.
|
||||
|
||||
|
@ -446,7 +443,7 @@ proc transitionAction*(ctx: var TransContext, conf: T8NConf) =
|
|||
if conf.inputTxs != stdinSelector and conf.inputTxs.len > 0:
|
||||
if conf.inputTxs.endsWith(".rlp"):
|
||||
let data = readFile(conf.inputTxs)
|
||||
ctx.parseTxsRlp(data.strip(chars={'"'}))
|
||||
ctx.parseTxsRlp(data.strip(chars={'"', ' ', '\r', '\n', '\t'}))
|
||||
else:
|
||||
ctx.parseTxsJson(conf.inputTxs)
|
||||
|
||||
|
@ -465,6 +462,12 @@ proc transitionAction*(ctx: var TransContext, conf: T8NConf) =
|
|||
excessBlobGas: ctx.env.parentExcessBlobGas,
|
||||
)
|
||||
|
||||
let config = parseChainConfig(conf.stateFork)
|
||||
config.depositContractAddress = ctx.env.depositContractAddress
|
||||
config.chainId = conf.stateChainId.ChainId
|
||||
|
||||
let com = CommonRef.new(newCoreDbRef DefaultDbMemory, config)
|
||||
|
||||
# Sanity check, to not `panic` in state_transition
|
||||
if com.isLondonOrLater(ctx.env.currentNumber):
|
||||
if ctx.env.currentBaseFee.isSome:
|
||||
|
|
|
@ -52,6 +52,7 @@ type
|
|||
parentBlobGasUsed*: Opt[uint64]
|
||||
parentExcessBlobGas*: Opt[uint64]
|
||||
parentBeaconBlockRoot*: Opt[Hash32]
|
||||
depositContractAddress*: Opt[Address]
|
||||
|
||||
TxObject* = object
|
||||
`type`*: Opt[uint64]
|
||||
|
@ -117,6 +118,7 @@ type
|
|||
blobGasUsed*: Opt[uint64]
|
||||
currentExcessBlobGas*: Opt[uint64]
|
||||
requestsHash*: Opt[Hash32]
|
||||
requests*: Opt[array[3, seq[byte]]]
|
||||
|
||||
const
|
||||
ErrorEVM* = 2.T8NExitCode
|
||||
|
|
Loading…
Reference in New Issue