2021-09-11 08:01:05 +00:00
|
|
|
# beacon_chain
|
2022-01-05 08:42:56 +00:00
|
|
|
# Copyright (c) 2018-2022 Status Research & Development GmbH
|
2021-09-11 08:01:05 +00:00
|
|
|
# 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.
|
|
|
|
|
|
|
|
{.used.}
|
|
|
|
|
|
|
|
import
|
|
|
|
# Third-party
|
|
|
|
yaml,
|
|
|
|
# Beacon chain internals
|
2022-01-07 17:10:40 +00:00
|
|
|
../../beacon_chain/spec/datatypes/bellatrix,
|
2021-09-11 08:01:05 +00:00
|
|
|
# Status libraries
|
|
|
|
snappy,
|
|
|
|
# Test utilities
|
|
|
|
../../testutil, ../fixtures_utils
|
|
|
|
|
2022-12-14 17:30:56 +00:00
|
|
|
from std/os import dirExists, pcDir, walkDir, `/`
|
|
|
|
from std/streams import close, openFileStream
|
|
|
|
from std/strformat import `&`
|
|
|
|
from std/strutils import toLowerAscii
|
|
|
|
|
2021-09-11 08:01:05 +00:00
|
|
|
# SSZ tests of consensus objects (minimal/mainnet preset specific)
|
|
|
|
|
|
|
|
# Parsing definitions
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
|
|
|
|
const
|
2022-01-03 17:43:00 +00:00
|
|
|
SSZDir = SszTestsDir/const_preset/"bellatrix"/"ssz_static"
|
2021-09-11 08:01:05 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
SSZHashTreeRoot = object
|
|
|
|
# The test files have the values at the "root"
|
|
|
|
# so we **must** use "root" as a field name
|
|
|
|
root: string
|
|
|
|
# Some have a signing_root field
|
|
|
|
signing_root {.defaultVal: "".}: string
|
|
|
|
|
|
|
|
# Note this only tracks HashTreeRoot
|
|
|
|
# Checking the values against the yaml file is TODO (require more flexible Yaml parser)
|
|
|
|
|
2022-01-07 17:10:40 +00:00
|
|
|
proc checkSSZ(T: type bellatrix.SignedBeaconBlock, dir: string, expectedHash: SSZHashTreeRoot) =
|
2021-09-11 08:01:05 +00:00
|
|
|
# Deserialize into a ref object to not fill Nim stack
|
|
|
|
let encoded = snappy.decode(
|
|
|
|
readFileBytes(dir/"serialized.ssz_snappy"), MaxObjectSize)
|
2021-09-27 14:22:58 +00:00
|
|
|
let deserialized = newClone(sszDecodeEntireInput(encoded, T))
|
2021-09-11 08:01:05 +00:00
|
|
|
|
|
|
|
# SignedBeaconBlocks usually not hashed because they're identified by
|
|
|
|
# htr(BeaconBlock), so do it manually
|
2022-04-14 10:47:14 +00:00
|
|
|
check: expectedHash.root == "0x" & toLowerAscii($hash_tree_root(
|
2021-09-11 08:01:05 +00:00
|
|
|
[hash_tree_root(deserialized.message),
|
|
|
|
hash_tree_root(deserialized.signature)]))
|
|
|
|
|
|
|
|
check deserialized.root == hash_tree_root(deserialized.message)
|
|
|
|
check SSZ.encode(deserialized[]) == encoded
|
|
|
|
check sszSize(deserialized[]) == encoded.len
|
|
|
|
|
|
|
|
# TODO check the value (requires YAML loader)
|
|
|
|
|
|
|
|
proc checkSSZ(T: type, dir: string, expectedHash: SSZHashTreeRoot) =
|
|
|
|
# Deserialize into a ref object to not fill Nim stack
|
|
|
|
let encoded = snappy.decode(
|
|
|
|
readFileBytes(dir/"serialized.ssz_snappy"), MaxObjectSize)
|
2021-09-27 14:22:58 +00:00
|
|
|
let deserialized = newClone(sszDecodeEntireInput(encoded, T))
|
2021-09-11 08:01:05 +00:00
|
|
|
|
2022-04-14 10:47:14 +00:00
|
|
|
check: expectedHash.root == "0x" & toLowerAscii($hash_tree_root(deserialized[]))
|
2021-09-11 08:01:05 +00:00
|
|
|
|
|
|
|
check SSZ.encode(deserialized[]) == encoded
|
|
|
|
check sszSize(deserialized[]) == encoded.len
|
|
|
|
|
|
|
|
# TODO check the value (requires YAML loader)
|
|
|
|
|
|
|
|
proc loadExpectedHashTreeRoot(dir: string): SSZHashTreeRoot =
|
2022-02-20 20:13:06 +00:00
|
|
|
let s = openFileStream(dir/"roots.yaml")
|
2021-09-11 08:01:05 +00:00
|
|
|
yaml.load(s, result)
|
|
|
|
s.close()
|
|
|
|
|
|
|
|
# Test runner
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
|
2022-01-05 08:42:56 +00:00
|
|
|
suite "EF - Bellatrix - SSZ consensus objects " & preset():
|
2022-03-24 00:38:48 +00:00
|
|
|
doAssert dirExists(SSZDir), "You need to run the \"download_test_vectors.sh\" script to retrieve the consensus spec test vectors."
|
2021-09-11 08:01:05 +00:00
|
|
|
for pathKind, sszType in walkDir(SSZDir, relative = true, checkDir = true):
|
|
|
|
doAssert pathKind == pcDir
|
|
|
|
|
|
|
|
test &" Testing {sszType}":
|
|
|
|
let path = SSZDir/sszType
|
|
|
|
for pathKind, sszTestKind in walkDir(
|
|
|
|
path, relative = true, checkDir = true):
|
|
|
|
doAssert pathKind == pcDir
|
|
|
|
let path = SSZDir/sszType/sszTestKind
|
|
|
|
for pathKind, sszTestCase in walkDir(
|
|
|
|
path, relative = true, checkDir = true):
|
|
|
|
let path = SSZDir/sszType/sszTestKind/sszTestCase
|
|
|
|
let hash = loadExpectedHashTreeRoot(path)
|
|
|
|
|
|
|
|
case sszType:
|
|
|
|
of "AggregateAndProof": checkSSZ(AggregateAndProof, path, hash)
|
|
|
|
of "Attestation": checkSSZ(Attestation, path, hash)
|
|
|
|
of "AttestationData": checkSSZ(AttestationData, path, hash)
|
|
|
|
of "AttesterSlashing": checkSSZ(AttesterSlashing, path, hash)
|
2022-01-07 17:10:40 +00:00
|
|
|
of "BeaconBlock": checkSSZ(bellatrix.BeaconBlock, path, hash)
|
|
|
|
of "BeaconBlockBody": checkSSZ(bellatrix.BeaconBlockBody, path, hash)
|
2021-09-11 08:01:05 +00:00
|
|
|
of "BeaconBlockHeader": checkSSZ(BeaconBlockHeader, path, hash)
|
2022-01-07 17:10:40 +00:00
|
|
|
of "BeaconState": checkSSZ(bellatrix.BeaconState, path, hash)
|
2021-09-11 08:01:05 +00:00
|
|
|
of "Checkpoint": checkSSZ(Checkpoint, path, hash)
|
|
|
|
of "ContributionAndProof": checkSSZ(ContributionAndProof, path, hash)
|
|
|
|
of "Deposit": checkSSZ(Deposit, path, hash)
|
|
|
|
of "DepositData": checkSSZ(DepositData, path, hash)
|
|
|
|
of "DepositMessage": checkSSZ(DepositMessage, path, hash)
|
|
|
|
of "Eth1Block": checkSSZ(Eth1Block, path, hash)
|
|
|
|
of "Eth1Data": checkSSZ(Eth1Data, path, hash)
|
|
|
|
of "ExecutionPayload": checkSSZ(ExecutionPayload, path, hash)
|
|
|
|
of "ExecutionPayloadHeader":
|
|
|
|
checkSSZ(ExecutionPayloadHeader, path, hash)
|
|
|
|
of "Fork": checkSSZ(Fork, path, hash)
|
|
|
|
of "ForkData": checkSSZ(ForkData, path, hash)
|
|
|
|
of "HistoricalBatch": checkSSZ(HistoricalBatch, path, hash)
|
|
|
|
of "IndexedAttestation": checkSSZ(IndexedAttestation, path, hash)
|
2022-05-23 12:02:54 +00:00
|
|
|
of "LightClientBootstrap":
|
|
|
|
checkSSZ(LightClientBootstrap, path, hash)
|
|
|
|
of "LightClientUpdate":
|
2022-08-17 17:50:28 +00:00
|
|
|
checkSSZ(LightClientUpdate, path, hash)
|
2022-05-23 12:02:54 +00:00
|
|
|
of "LightClientFinalityUpdate":
|
|
|
|
checkSSZ(LightClientFinalityUpdate, path, hash)
|
|
|
|
of "LightClientOptimisticUpdate":
|
|
|
|
checkSSZ(LightClientOptimisticUpdate, path, hash)
|
2021-09-11 08:01:05 +00:00
|
|
|
of "PendingAttestation": checkSSZ(PendingAttestation, path, hash)
|
2021-09-28 04:28:33 +00:00
|
|
|
of "PowBlock": checkSSZ(PowBlock, path, hash)
|
2021-09-11 08:01:05 +00:00
|
|
|
of "ProposerSlashing": checkSSZ(ProposerSlashing, path, hash)
|
|
|
|
of "SignedAggregateAndProof":
|
|
|
|
checkSSZ(SignedAggregateAndProof, path, hash)
|
2022-01-07 17:10:40 +00:00
|
|
|
of "SignedBeaconBlock":
|
|
|
|
checkSSZ(bellatrix.SignedBeaconBlock, path, hash)
|
2021-09-11 08:01:05 +00:00
|
|
|
of "SignedBeaconBlockHeader":
|
|
|
|
checkSSZ(SignedBeaconBlockHeader, path, hash)
|
|
|
|
of "SignedContributionAndProof":
|
|
|
|
checkSSZ(SignedContributionAndProof, path, hash)
|
|
|
|
of "SignedVoluntaryExit": checkSSZ(SignedVoluntaryExit, path, hash)
|
|
|
|
of "SigningData": checkSSZ(SigningData, path, hash)
|
|
|
|
of "SyncAggregate": checkSSZ(SyncAggregate, path, hash)
|
|
|
|
of "SyncAggregatorSelectionData":
|
|
|
|
checkSSZ(SyncAggregatorSelectionData, path, hash)
|
|
|
|
of "SyncCommittee": checkSSZ(SyncCommittee, path, hash)
|
|
|
|
of "SyncCommitteeContribution":
|
|
|
|
checkSSZ(SyncCommitteeContribution, path, hash)
|
|
|
|
of "SyncCommitteeMessage": checkSSZ(SyncCommitteeMessage, path, hash)
|
|
|
|
of "Validator": checkSSZ(Validator, path, hash)
|
|
|
|
of "VoluntaryExit": checkSSZ(VoluntaryExit, path, hash)
|
|
|
|
else:
|
|
|
|
raise newException(ValueError, "Unsupported test: " & sszType)
|