mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-09 05:52:45 +00:00
61538fa581
Replace shuffling function with zrnt version - `get_shuffled_seq` in particular puts more strain on the GC by allocating superfluous seq's which turns out to have a significant impact on block processing (when replaying blocks for example) - 4x improvement on non-epoch, 1.5x on epoch blocks (replay is done without signature checking) Medalla, first 10k slots - pre: ``` Loaded 68973 blocks, head slot 117077 All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 76855.848, 0.000, 76855.848, 76855.848, 1, Initialize DB 1.073, 0.914, 0.071, 12.454, 7831, Load block from database 31.382, 0.000, 31.382, 31.382, 1, Load state from database 85.644, 30.350, 3.056, 466.136, 7519, Apply block 506.569, 91.129, 130.654, 874.786, 312, Apply epoch block ``` post: ``` Loaded 68973 blocks, head slot 117077 All time are ms Average, StdDev, Min, Max, Samples, Test Validation is turned off meaning that no BLS operations are performed 72457.303, 0.000, 72457.303, 72457.303, 1, Initialize DB 1.015, 0.858, 0.070, 11.231, 7831, Load block from database 28.983, 0.000, 28.983, 28.983, 1, Load state from database 21.725, 17.461, 2.659, 393.217, 7519, Apply block 324.012, 33.954, 45.452, 440.532, 312, Apply epoch block ```
67 lines
2.2 KiB
Nim
67 lines
2.2 KiB
Nim
# beacon_chain
|
|
# Copyright (c) 2018-Present Status Research & Development GmbH
|
|
# Licensed and distributed under either of
|
|
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
|
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
import
|
|
# Standard library
|
|
os, strutils, typetraits,
|
|
# Internals
|
|
../../beacon_chain/ssz,
|
|
../../beacon_chain/spec/[datatypes, crypto],
|
|
# Status libs
|
|
stew/byteutils,
|
|
serialization, json_serialization
|
|
|
|
export # Workaround:
|
|
# - https://github.com/status-im/nim-serialization/issues/4
|
|
# - https://github.com/status-im/nim-serialization/issues/5
|
|
# - https://github.com/nim-lang/Nim/issues/11225
|
|
serialization.readValue,
|
|
Json, ssz, crypto
|
|
|
|
# Process current EF test format
|
|
# ---------------------------------------------
|
|
|
|
# #######################
|
|
# JSON deserialization
|
|
|
|
proc readValue*(r: var JsonReader, a: var seq[byte]) {.inline.} =
|
|
## Custom deserializer for seq[byte]
|
|
a = hexToSeqByte(r.readValue(string))
|
|
|
|
# #######################
|
|
# Test helpers
|
|
|
|
type
|
|
UnconsumedInput* = object of CatchableError
|
|
TestSizeError* = object of ValueError
|
|
|
|
const
|
|
FixturesDir* =
|
|
currentSourcePath.rsplit(DirSep, 1)[0] / ".." / ".." / "vendor" / "nim-eth2-scenarios"
|
|
SszTestsDir* = FixturesDir / "tests-v" & SPEC_VERSION
|
|
|
|
proc parseTest*(path: string, Format: typedesc[Json or SSZ], T: typedesc): T =
|
|
try:
|
|
# debugEcho " [Debug] Loading file: \"", path, '\"'
|
|
result = Format.loadFile(path, T)
|
|
except SerializationError as err:
|
|
writeStackTrace()
|
|
stderr.write $Format & " load issue for file \"", path, "\"\n"
|
|
stderr.write err.formatMsg(path), "\n"
|
|
quit 1
|
|
|
|
template readFileBytes*(path: string): seq[byte] =
|
|
cast[seq[byte]](readFile(path))
|
|
|
|
proc sszDecodeEntireInput*(input: openarray[byte], Decoded: type): Decoded =
|
|
var stream = unsafeMemoryInput(input)
|
|
var reader = init(SszReader, stream)
|
|
reader.readValue(result)
|
|
|
|
if stream.readable:
|
|
raise newException(UnconsumedInput, "Remaining bytes in the input")
|