nimbus-eth2/tests/test_ssz.nim

170 lines
4.2 KiB
Nim
Raw Normal View History

2018-09-20 15:45:02 +00:00
# beacon_chain
# Copyright (c) 2018 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).
2018-09-20 15:45:02 +00:00
# at your option. This file may not be copied, modified, or distributed except according to those terms.
{.used.}
2018-09-20 15:45:02 +00:00
import
unittest, options, json_serialization,
2020-05-20 17:05:22 +00:00
nimcrypto, eth/common, serialization/testing/generic_suite,
2019-12-05 10:27:00 +00:00
./testutil,
../beacon_chain/spec/[datatypes, digest],
2019-11-01 15:14:34 +00:00
../beacon_chain/ssz, ../beacon_chain/ssz/[navigator, dynamic_navigator]
type
SomeEnum = enum
A, B, C
Simple = object
flag: bool
# ignored {.dontSerialize.}: string
# data: array[256, bool]
template reject(stmt) =
doAssert(not compiles(stmt))
static:
doAssert isFixedSize(bool) == true
doAssert fixedPortionSize(array[10, bool]) == 10
doAssert fixedPortionSize(array[SomeEnum, uint64]) == 24
doAssert fixedPortionSize(array[3..5, List[byte, 256]]) == 12
doAssert isFixedSize(array[20, bool]) == true
doAssert isFixedSize(Simple) == true
doAssert isFixedSize(List[bool, 128]) == false
reject fixedPortionSize(int)
type
ObjWithFields = object
f0: uint8
f1: uint32
f2: EthAddress
f3: MDigest[256]
f4: seq[byte]
f5: ValidatorIndex
static:
doAssert fixedPortionSize(ObjWithFields) ==
1 + 4 + sizeof(EthAddress) + (256 div 8) + 4 + 8
executeRoundTripTests SSZ
type
Foo = object
bar: Bar
BarList = List[uint64, 128]
Bar = object
b: BarList
baz: Baz
Baz = object
i: uint64
proc toDigest[N: static int](x: array[N, byte]): Eth2Digest =
result.data[0 .. N-1] = x
2020-03-10 04:00:19 +00:00
suiteReport "SSZ navigator":
2019-12-05 10:27:00 +00:00
timedTest "simple object fields":
var foo = Foo(bar: Bar(b: BarList @[1'u64, 2, 3], baz: Baz(i: 10'u64)))
let encoded = SSZ.encode(foo)
check SSZ.decode(encoded, Foo) == foo
let mountedFoo = sszMount(encoded, Foo)
check mountedFoo.bar.b[] == BarList @[1'u64, 2, 3]
let mountedBar = mountedFoo.bar
check mountedBar.baz.i == 10'u64
2019-12-05 10:27:00 +00:00
timedTest "lists with max size":
let a = [byte 0x01, 0x02, 0x03].toDigest
let b = [byte 0x04, 0x05, 0x06].toDigest
let c = [byte 0x07, 0x08, 0x09].toDigest
2020-06-01 15:35:42 +00:00
var leaves = HashList[Eth2Digest, 1'i64 shl 3]()
leaves.add a
leaves.add b
leaves.add c
v0.8.1 tests refactor (#326) * Introduce new mocking proc to replace: - makeFakeValidatorPrivKey - hackPrivKey - getNextBeaconProposerIndex - addBlock - makeBlock * Add comments on datastructure unsynced with the spec * Add merkle tree constructor and initial mocking for deposits (missing merkle proofs) * [Mock] Implement sparse merkle tree and merkle proof builder * [Mocking] Genesis deposits * Add compact_committees_roots init + mock genesis state * [Tests] Add first deposit test using the new mocking procedures * [Tests -deposits] add at and over 32 ETH deposit tests * [Tests - deposits] Add test for validator top-up * [Tests -deposits] Mention the TODO to test for invalid conditions * [Tests] Add stub to test "is_valid_genesis_state" * [Merkle proofs] Implement round-trip checks * Deactivate roundtrips test * SSZ - use EF convention for hash_tree_root / hashTreeRoot * [Tests - Attestation] Attestation mocking + initial test * Add mocking + 3 new tests for valid attestations + mention future invalid attestation tests * Add crosslinks test (1 failing to attestations in block being duplicated in state transition) * Single attestation crosslink test - workaround https://github.com/status-im/nim-beacon-chain/issues/361 * Add test for failed crosslink penalty * Rebase fixes + add refactored tests to test suite * justif-finalization helpers first batch * Add 234 finalization tests * Fix justif test, Rule I 234 finalization does not happen with sufficient support. (Also unittest check template does not fail properly in some cases) * Add tests for all finalization rules * Properly delete nim-byteutils following https://github.com/status-im/nim-beacon-chain/commit/c91727e7e5f9c7a95a634055e94e9d3bcb6cc41a#diff-7c3613dba5171cb6027c67835dd3b9d4 * use digest helper for deposit root
2019-08-28 12:07:00 +00:00
let root = hash_tree_root(leaves)
check $root == "5248085B588FAB1DD1E03F3CD62201602B12E6560665935964F46E805977E8C5"
2020-05-29 14:08:14 +00:00
leaves.add c
check hash_tree_root(leaves) == hash_tree_root(leaves.data)
2019-11-01 15:14:34 +00:00
2020-06-01 15:35:42 +00:00
var leaves2 = HashList[Eth2Digest, 1'i64 shl 48]() # Large number!
leaves2.add a
leaves2.add b
leaves2.add c
check hash_tree_root(leaves2) == hash_tree_root(leaves2.data)
2020-03-10 04:00:19 +00:00
suiteReport "SSZ dynamic navigator":
2019-12-05 10:27:00 +00:00
timedTest "navigating fields":
var fooOrig = Foo(bar: Bar(b: BarList @[1'u64, 2, 3], baz: Baz(i: 10'u64)))
2019-11-01 15:14:34 +00:00
let fooEncoded = SSZ.encode(fooOrig)
var navFoo = DynamicSszNavigator.init(fooEncoded, Foo)
2019-11-01 15:14:34 +00:00
var navBar = navFoo.navigate("bar")
check navBar.toJson(pretty = false) == """{"b":[1,2,3],"baz":{"i":10}}"""
2019-11-01 15:14:34 +00:00
var navB = navBar.navigate("b")
check navB.toJson(pretty = false) == "[1,2,3]"
2019-11-01 15:14:34 +00:00
var navBaz = navBar.navigate("baz")
var navI = navBaz.navigate("i")
check navI.toJson == "10"
expect KeyError:
discard navBar.navigate("biz")
type
Obj = object
arr: array[8, Eth2Digest]
li: List[Eth2Digest, 8]
HashObj = object
arr: HashArray[8, Eth2Digest]
li: HashList[Eth2Digest, 8]
suiteReport "hash":
timedTest "HashArray":
var
o = Obj()
ho = HashObj()
template both(body) =
block:
template it: auto {.inject.} = o
body
block:
template it: auto {.inject.} = ho
body
let htro = hash_tree_root(o)
let htrho = hash_tree_root(ho)
check:
o.arr == ho.arr.data
o.li == ho.li.data
htro == htrho
both: it.arr[0].data[0] = byte 1
both: it.li.add Eth2Digest()
2020-05-29 14:08:14 +00:00
var y: HashArray[32, uint64]
doAssert hash_tree_root(y) == hash_tree_root(y.data)
y[4] = 42'u64
doAssert hash_tree_root(y) == hash_tree_root(y.data)