2019-09-03 03:12:09 +00:00
|
|
|
# beacon_chain
|
|
|
|
# Copyright (c) 2018-Present Status Research & Development GmbH
|
|
|
|
# Licensed and distributed under either of
|
2019-11-25 15:30:02 +00:00
|
|
|
# * 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).
|
2019-09-03 03:12:09 +00:00
|
|
|
# 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,
|
2020-10-22 18:53:40 +00:00
|
|
|
../../beacon_chain/spec/[datatypes, crypto, state_transition_epoch],
|
2019-09-03 03:12:09 +00:00
|
|
|
# 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,
|
speed up shuffling
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
```
2020-08-21 10:06:26 +00:00
|
|
|
Json, ssz, crypto
|
2019-09-03 03:12:09 +00:00
|
|
|
|
2020-01-27 10:56:32 +00:00
|
|
|
# Process current EF test format
|
2019-09-03 03:12:09 +00:00
|
|
|
# ---------------------------------------------
|
|
|
|
|
|
|
|
# #######################
|
|
|
|
# JSON deserialization
|
|
|
|
|
2020-11-20 10:00:22 +00:00
|
|
|
proc readValue*(r: var JsonReader, a: var seq[byte]) =
|
2019-09-03 03:12:09 +00:00
|
|
|
## Custom deserializer for seq[byte]
|
|
|
|
a = hexToSeqByte(r.readValue(string))
|
|
|
|
|
|
|
|
# #######################
|
|
|
|
# Test helpers
|
|
|
|
|
2020-05-11 16:27:44 +00:00
|
|
|
type
|
|
|
|
UnconsumedInput* = object of CatchableError
|
|
|
|
TestSizeError* = object of ValueError
|
|
|
|
|
2019-09-03 03:12:09 +00:00
|
|
|
const
|
2020-06-16 15:12:59 +00:00
|
|
|
FixturesDir* =
|
|
|
|
currentSourcePath.rsplit(DirSep, 1)[0] / ".." / ".." / "vendor" / "nim-eth2-scenarios"
|
|
|
|
SszTestsDir* = FixturesDir / "tests-v" & SPEC_VERSION
|
2019-09-03 03:12:09 +00:00
|
|
|
|
|
|
|
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
|
2020-05-11 16:27:44 +00:00
|
|
|
|
|
|
|
template readFileBytes*(path: string): seq[byte] =
|
|
|
|
cast[seq[byte]](readFile(path))
|
|
|
|
|
2020-10-28 18:35:31 +00:00
|
|
|
proc sszDecodeEntireInput*(input: openArray[byte], Decoded: type): Decoded =
|
2020-05-11 16:27:44 +00:00
|
|
|
var stream = unsafeMemoryInput(input)
|
2020-05-28 12:36:37 +00:00
|
|
|
var reader = init(SszReader, stream)
|
2020-05-27 15:04:43 +00:00
|
|
|
reader.readValue(result)
|
2020-05-11 16:27:44 +00:00
|
|
|
|
|
|
|
if stream.readable:
|
|
|
|
raise newException(UnconsumedInput, "Remaining bytes in the input")
|
2020-10-22 18:53:40 +00:00
|
|
|
|
|
|
|
proc process_justification_and_finalization*(state: var BeaconState) =
|
|
|
|
var cache = StateCache()
|
|
|
|
|
|
|
|
var validator_statuses = ValidatorStatuses.init(state)
|
|
|
|
validator_statuses.process_attestations(state, cache)
|
|
|
|
process_justification_and_finalization(state, validator_statuses.total_balances)
|
|
|
|
|
|
|
|
proc process_slashings*(state: var BeaconState) =
|
|
|
|
var cache = StateCache()
|
|
|
|
var validator_statuses = ValidatorStatuses.init(state)
|
|
|
|
validator_statuses.process_attestations(state, cache)
|
|
|
|
process_slashings(state, validator_statuses.total_balances.current_epoch)
|