nimbus-eth1/tests/persistBlockTestGen.nim
Jacek Sieka 0b32078c4b
Consolidate block type for block processing (#2325)
This PR consolidates the split header-body sequences into a single EthBlock
sequence and cleans up the fallout from that which significantly reduces
block processing overhead during import thanks to less garbage collection
and fewer copies of things all around.

Notably, since the number of headers must always match the number of bodies,
we also get rid of a pointless degree of freedom that in the future could
introduce unnecessary bugs.

* only read header and body from era file
* avoid several unnecessary copies along the block processing way
* simplify signatures, cleaning up unused arguemnts and returns
* use `stew/assign2` in a few strategic places where the generated
  nim assignent is slow and add a few `move` to work around poor
  analysis in nim 1.6 (will need to be revisited for 2.0)

```
stats-20240607_2223-a814aa0b.csv vs stats-20240608_0714-21c1d0a9.csv
                       bps_x     bps_y     tps_x        tps_y    bpsd    tpsd    timed
block_number
(498305, 713245]    1,540.52  1,809.73  2,361.58  2775.340189  17.63%  17.63%  -14.92%
(713245, 928185]      730.36    865.26  1,715.90  2028.973852  18.01%  18.01%  -15.21%
(928185, 1143126]     663.03    789.10  2,529.26  3032.490771  19.79%  19.79%  -16.28%
(1143126, 1358066]    393.46    508.05  2,152.50  2777.578119  29.13%  29.13%  -22.50%
(1358066, 1573007]    370.88    440.72  2,351.31  2791.896052  18.81%  18.81%  -15.80%
(1573007, 1787947]    283.65    335.11  2,068.93  2441.373402  17.60%  17.60%  -14.91%
(1787947, 2002888]    287.29    342.11  2,078.39  2474.179448  18.99%  18.99%  -15.91%
(2002888, 2217828]    293.38    343.16  2,208.83   2584.77457  17.16%  17.16%  -14.61%
(2217828, 2432769]    140.09    167.86  1,081.87  1296.336926  18.82%  18.82%  -15.80%

blocks: 1934464, baseline: 3h13m1s, contender: 2h43m47s
bpsd (mean): 19.55%
tpsd (mean): 19.55%
Time (total): -29m13s, -15.14%
```
2024-06-09 16:32:20 +02:00

118 lines
3.9 KiB
Nim

# Nimbus
# Copyright (c) 2019-2024 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
json, stint,
results,
../nimbus/[tracer, config],
../nimbus/core/chain,
../nimbus/common/common,
../nimbus/db/opts,
../nimbus/db/core_db/persistent
proc dumpTest(com: CommonRef, blockNumber: int) =
let
blockNumber = blockNumber.u256
parentNumber = blockNumber - 1
var
capture = com.db.newCapture.value
captureCom = com.clone(capture.recorder)
let
parent = captureCom.db.getBlockHeader(parentNumber)
blk = captureCom.db.getEthBlock(blockNumber)
chain = newChain(captureCom)
discard captureCom.db.setHead(parent, true)
discard chain.persistBlocks([blk])
var metaData = %{
"blockNumber": %blockNumber.toHex
}
metaData.dumpMemoryDB(capture)
writeFile("block" & $blockNumber & ".json", metaData.pretty())
proc main() {.used.} =
# 97 block with uncles
# 46147 block with first transaction
# 46400 block with transaction
# 46402 block with first contract: failed
# 47205 block with first success contract
# 48712 block with 5 transactions
# 48915 block with contract
# 49018 first problematic block
# 52029 first block with receipts logs
# 66407 failed transaction
# nimbus --rpcapi: eth, debug --prune: archive
var conf = makeConfig()
let db = newCoreDbRef(
DefaultDbPersistent, string conf.dataDir, DbOptions.init())
let com = CommonRef.new(db)
com.dumpTest(97)
com.dumpTest(98) # no uncles and no tx
com.dumpTest(46147)
com.dumpTest(46400)
com.dumpTest(46402)
com.dumpTest(47205)
com.dumpTest(48712)
com.dumpTest(48915)
com.dumpTest(49018)
com.dumpTest(49439) # call opcode bug
com.dumpTest(49891) # number opcode bug
com.dumpTest(50111) # apply message bug
com.dumpTest(78458 )
com.dumpTest(81383 ) # tracer gas cost, stop opcode
com.dumpTest(81666 ) # create opcode
com.dumpTest(85858 ) # call oog
com.dumpTest(116524) # codecall address
com.dumpTest(146675) # precompiled contracts ecRecover
com.dumpTest(196647) # not enough gas to call
com.dumpTest(226147) # create return gas
com.dumpTest(226522) # return
com.dumpTest(231501) # selfdestruct
com.dumpTest(243826) # create contract self destruct
com.dumpTest(248032) # signextend over/undeflow
com.dumpTest(299804) # GasInt overflow
com.dumpTest(420301) # computation gas cost LTE(<=) 0 to LT(<) 0
com.dumpTest(512335) # create apply message
com.dumpTest(47216) # regression
com.dumpTest(652148) # contract transfer bug
com.dumpTest(668910) # uncleared logs bug
com.dumpTest(1_017_395) # sha256 and ripemd precompiles wordcount bug
com.dumpTest(1_149_150) # need to swallow precompiles errors
com.dumpTest(1_155_095) # homestead codeCost OOG
com.dumpTest(1_317_742) # CREATE childmsg sender
com.dumpTest(1_352_922) # first ecrecover precompile with 0x0 input
com.dumpTest(1_368_834) # writepadded regression padding len
com.dumpTest(1_417_555) # writepadded regression zero len
com.dumpTest(1_431_916) # deep recursion stack overflow problem
com.dumpTest(1_487_668) # getScore uint64 vs uint256 overflow
com.dumpTest(1_920_000) # the DAO fork
com.dumpTest(1_927_662) # fork comparison bug in postExecuteVM
# too big and too slow, we can skip it
# because it already covered by GST
#chainDB.dumpTest(2_283_416) # first DDOS spam attack block
com.dumpTest(2_463_413) # tangerine call* gas cost bug
com.dumpTest(2_675_000) # spurious dragon first block
com.dumpTest(2_675_002) # EIP155 tx.getSender
com.dumpTest(4_370_000) # Byzantium first block
when isMainModule:
try:
main()
except:
echo getCurrentExceptionMsg()