Merge branch 'little-endian-ssz' into cached-tree-hash
This commit is contained in:
commit
31e9853463
@ -4,6 +4,7 @@ members = [
|
|||||||
"eth2/block_proposer",
|
"eth2/block_proposer",
|
||||||
"eth2/fork_choice",
|
"eth2/fork_choice",
|
||||||
"eth2/state_processing",
|
"eth2/state_processing",
|
||||||
|
"eth2/state_processing/yaml_utils",
|
||||||
"eth2/types",
|
"eth2/types",
|
||||||
"eth2/utils/bls",
|
"eth2/utils/bls",
|
||||||
"eth2/utils/boolean-bitfield",
|
"eth2/utils/boolean-bitfield",
|
||||||
|
@ -14,6 +14,7 @@ env_logger = "0.6.0"
|
|||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_yaml = "0.8"
|
serde_yaml = "0.8"
|
||||||
|
yaml-utils = { path = "yaml_utils" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bls = { path = "../utils/bls" }
|
bls = { path = "../utils/bls" }
|
||||||
|
@ -1,708 +0,0 @@
|
|||||||
title: Sanity tests -- small config -- 32 validators
|
|
||||||
summary: Basic sanity checks from phase 0 spec pythonization using a small state configuration and 32 validators.
|
|
||||||
All tests are run with `verify_signatures` as set to False.
|
|
||||||
Tests generated via https://github.com/ethereum/research/blob/master/spec_pythonizer/sanity_check.py
|
|
||||||
test_suite: beacon_state
|
|
||||||
fork: phase0-0.5.0
|
|
||||||
test_cases:
|
|
||||||
- name: test_empty_block_transition
|
|
||||||
config:
|
|
||||||
SHARD_COUNT: 8
|
|
||||||
TARGET_COMMITTEE_SIZE: 4
|
|
||||||
MAX_BALANCE_CHURN_QUOTIENT: 32
|
|
||||||
MAX_INDICES_PER_SLASHABLE_VOTE: 4096
|
|
||||||
MAX_EXIT_DEQUEUES_PER_EPOCH: 4
|
|
||||||
SHUFFLE_ROUND_COUNT: 90
|
|
||||||
DEPOSIT_CONTRACT_TREE_DEPTH: 32
|
|
||||||
MIN_DEPOSIT_AMOUNT: 1000000000
|
|
||||||
MAX_DEPOSIT_AMOUNT: 32000000000
|
|
||||||
FORK_CHOICE_BALANCE_INCREMENT: 1000000000
|
|
||||||
EJECTION_BALANCE: 16000000000
|
|
||||||
GENESIS_FORK_VERSION: 0
|
|
||||||
GENESIS_SLOT: 4294967296
|
|
||||||
GENESIS_EPOCH: 536870912
|
|
||||||
GENESIS_START_SHARD: 0
|
|
||||||
BLS_WITHDRAWAL_PREFIX_BYTE: '0x00'
|
|
||||||
SECONDS_PER_SLOT: 6
|
|
||||||
MIN_ATTESTATION_INCLUSION_DELAY: 2
|
|
||||||
SLOTS_PER_EPOCH: 8
|
|
||||||
MIN_SEED_LOOKAHEAD: 1
|
|
||||||
ACTIVATION_EXIT_DELAY: 4
|
|
||||||
EPOCHS_PER_ETH1_VOTING_PERIOD: 16
|
|
||||||
SLOTS_PER_HISTORICAL_ROOT: 64
|
|
||||||
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
|
|
||||||
PERSISTENT_COMMITTEE_PERIOD: 2048
|
|
||||||
LATEST_RANDAO_MIXES_LENGTH: 64
|
|
||||||
LATEST_ACTIVE_INDEX_ROOTS_LENGTH: 64
|
|
||||||
LATEST_SLASHED_EXIT_LENGTH: 64
|
|
||||||
BASE_REWARD_QUOTIENT: 32
|
|
||||||
WHISTLEBLOWER_REWARD_QUOTIENT: 512
|
|
||||||
ATTESTATION_INCLUSION_REWARD_QUOTIENT: 8
|
|
||||||
INACTIVITY_PENALTY_QUOTIENT: 16777216
|
|
||||||
MIN_PENALTY_QUOTIENT: 32
|
|
||||||
MAX_PROPOSER_SLASHINGS: 16
|
|
||||||
MAX_ATTESTER_SLASHINGS: 1
|
|
||||||
MAX_ATTESTATIONS: 128
|
|
||||||
MAX_DEPOSITS: 16
|
|
||||||
MAX_VOLUNTARY_EXITS: 16
|
|
||||||
MAX_TRANSFERS: 16
|
|
||||||
DOMAIN_BEACON_BLOCK: 0
|
|
||||||
DOMAIN_RANDAO: 1
|
|
||||||
DOMAIN_ATTESTATION: 2
|
|
||||||
DOMAIN_DEPOSIT: 3
|
|
||||||
DOMAIN_VOLUNTARY_EXIT: 4
|
|
||||||
DOMAIN_TRANSFER: 5
|
|
||||||
verify_signatures: false
|
|
||||||
initial_state:
|
|
||||||
slot: 4294967296
|
|
||||||
genesis_time: 0
|
|
||||||
fork:
|
|
||||||
previous_version: '0x00000000'
|
|
||||||
current_version: '0x00000000'
|
|
||||||
epoch: 536870912
|
|
||||||
validator_registry:
|
|
||||||
- pubkey: '0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000001'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000002'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x89ece308f9d1f0131765212deca99697b112d61f9be9a5f1f3780a51335b3ff981747a0b2ca2179b96d2c0c9024e5224'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000003'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xac9b60d5afcbd5663a8a44b7c5a02f19e9a77ab0a35bd65809bb5c67ec582c897feb04decc694b13e08587f3ff9b5b60'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000004'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb0e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000005'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa6e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb909'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000006'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb928f3beb93519eecf0145da903b40a4c97dca00b21f12ac0df3be9116ef2ef27b2ae6bcd4c5bc2d54ef5a70627efcb7'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000007'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa85ae765588126f5e860d019c0e26235f567a9c0c0b2d8ff30f3e8d436b1082596e5e7462d20f5be3764fd473e57f9cf'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000008'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x99cdf3807146e68e041314ca93e1fee0991224ec2a74beb2866816fd0826ce7b6263ee31e953a86d1b72cc2215a57793'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000009'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xaf81da25ecf1c84b577fefbedd61077a81dc43b00304015b2b596ab67f00e41c86bb00ebd0f90d4b125eb0539891aeed'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000a'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x80fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a55'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000b'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x8345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000c'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x851f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000d'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x99bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000e'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x8d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a41495083582'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000000f'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa73eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000010'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000011'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x9252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000012'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000013'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa272e9d1d50a4aea7d8f0583948090d0888be5777f2846800b8281139cd4aa9eee05f89b069857a3e77ccfaae1615f9c'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000014'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x9780e853f8ce7eda772c6691d25e220ca1d2ab0db51a7824b700620f7ac94c06639e91c98bb6abd78128f0ec845df8ef'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000015'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xab48aa2cc6f4a0bb63b5d67be54ac3aed10326dda304c5aeb9e942b40d6e7610478377680ab90e092ef1895e62786008'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000016'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x8c8b694b04d98a749a0763c72fc020ef61b2bb3f63ebb182cb2e568f6a8b9ca3ae013ae78317599e7e7ba2a528ec754a'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000017'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x9717182463fbe215168e6762abcbb55c5c65290f2b5a2af616f8a6f50d625b46164178a11622d21913efdfa4b800648d'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000018'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xacb58c81ae0cae2e9d4d446b730922239923c345744eee58efaadb36e9a0925545b18a987acf0bad469035b291e37269'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000019'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x81ccc19e3b938ec2405099e90022a4218baa5082a3ca0974b24be0bc8b07e5fffaed64bef0d02c4dbfb6a307829afc5c'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001a'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xab83dfefb120fab7665a607d749ef1765fbb3cc0ba5827a20a135402c09d987c701ddb5b60f0f5495026817e8ab6ea2e'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001b'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb6ad11e5d15f77c1143b1697344911b9c590110fdd8dd09df2e58bfd757269169deefe8be3544d4e049fb3776fb0bcfb'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001c'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0x8515e7f61ca0470e165a44d247a23f17f24bf6e37185467bedb7981c1003ea70bbec875703f793dd8d11e56afa7f74ba'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001d'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xad84464b3966ec5bede84aa487facfca7823af383715078da03b387cc2f5d5597cdd7d025aa07db00a38b953bdeb6e3f'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001e'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xb29043a7273d0a2dbc2b747dcf6a5eccbd7ccb44b2d72e985537b117929bc3fd3a99001481327788ad040b4077c47c0d'
|
|
||||||
withdrawal_credentials: '0x000000000000000000000000000000000000000000000000000000000000001f'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
- pubkey: '0xa72841987e4f219d54f2b6a9eac5fe6e78704644753c3579e776a3691bc123743f8c63770ed0f72a71e9e964dbf58f43'
|
|
||||||
withdrawal_credentials: '0x0000000000000000000000000000000000000000000000000000000000000020'
|
|
||||||
activation_epoch: 536870912
|
|
||||||
exit_epoch: 18446744073709551615
|
|
||||||
withdrawable_epoch: 18446744073709551615
|
|
||||||
initiated_exit: false
|
|
||||||
slashed: false
|
|
||||||
validator_balances:
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
- 32000000000
|
|
||||||
validator_registry_update_epoch: 536870912
|
|
||||||
latest_randao_mixes:
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
previous_shuffling_start_shard: 0
|
|
||||||
current_shuffling_start_shard: 0
|
|
||||||
previous_shuffling_epoch: 536870912
|
|
||||||
current_shuffling_epoch: 536870912
|
|
||||||
previous_shuffling_seed: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
current_shuffling_seed: '0x7a81d831e99dc63f9f10d4abce84c26473d4c2f65ec4acf9000684059473b072'
|
|
||||||
previous_epoch_attestations: []
|
|
||||||
current_epoch_attestations: []
|
|
||||||
previous_justified_epoch: 536870912
|
|
||||||
current_justified_epoch: 536870912
|
|
||||||
previous_justified_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
current_justified_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
justification_bitfield: 0
|
|
||||||
finalized_epoch: 536870912
|
|
||||||
finalized_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
latest_crosslinks:
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- epoch: 536870912
|
|
||||||
crosslink_data_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
latest_block_roots:
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
latest_state_roots:
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
- '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
latest_active_index_roots:
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
- '0x429a7560eb31fa5d1192496997a78ffc590e70f5b39220abff4420298061501a'
|
|
||||||
latest_slashed_balances:
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
- 0
|
|
||||||
latest_block_header:
|
|
||||||
slot: 4294967296
|
|
||||||
previous_block_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
state_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
block_body_root: '0x13f2001ff0ee4a528b3c43f63d70a997aefca990ed8eada2223ee6ec3807f7cc'
|
|
||||||
signature: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
historical_roots: []
|
|
||||||
latest_eth1_data:
|
|
||||||
deposit_root: '0x826d25bfcb9161aabc799844c5176f7b3444dc5288856f65e0b8060560488912'
|
|
||||||
block_hash: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
eth1_data_votes: []
|
|
||||||
deposit_index: 32
|
|
||||||
blocks:
|
|
||||||
- slot: 4294967297
|
|
||||||
previous_block_root: '0x2befbd4b4fe8c91f3059082c8048e3376a9b7fb309e93044fac32b7cc8849773'
|
|
||||||
state_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
body:
|
|
||||||
randao_reveal: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
eth1_data:
|
|
||||||
deposit_root: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
block_hash: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
proposer_slashings: []
|
|
||||||
attester_slashings: []
|
|
||||||
attestations: []
|
|
||||||
deposits: []
|
|
||||||
voluntary_exits: []
|
|
||||||
transfers: []
|
|
||||||
signature: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
|
|
||||||
expected_state:
|
|
||||||
slot: 4294967297
|
|
@ -1,5 +1,7 @@
|
|||||||
use serde_derive::Deserialize;
|
use serde_derive::Deserialize;
|
||||||
use types::*;
|
use types::*;
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use yaml_utils;
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct TestCase {
|
pub struct TestCase {
|
||||||
@ -23,9 +25,10 @@ fn yaml() {
|
|||||||
use serde_yaml;
|
use serde_yaml;
|
||||||
use std::{fs::File, io::prelude::*, path::PathBuf};
|
use std::{fs::File, io::prelude::*, path::PathBuf};
|
||||||
|
|
||||||
|
// Test sanity-check_small-config_32-vals.yaml
|
||||||
let mut file = {
|
let mut file = {
|
||||||
let mut file_path_buf = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
let mut file_path_buf = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
file_path_buf.push("specs/example.yml");
|
file_path_buf.push("yaml_utils/specs/sanity-check_small-config_32-vals.yaml");
|
||||||
|
|
||||||
File::open(file_path_buf).unwrap()
|
File::open(file_path_buf).unwrap()
|
||||||
};
|
};
|
||||||
@ -34,7 +37,23 @@ fn yaml() {
|
|||||||
|
|
||||||
file.read_to_string(&mut yaml_str).unwrap();
|
file.read_to_string(&mut yaml_str).unwrap();
|
||||||
|
|
||||||
let yaml_str = yaml_str.to_lowercase();
|
yaml_str = yaml_str.to_lowercase();
|
||||||
|
|
||||||
|
let _doc: TestDoc = serde_yaml::from_str(&yaml_str.as_str()).unwrap();
|
||||||
|
|
||||||
|
// Test sanity-check_default-config_100-vals.yaml
|
||||||
|
file = {
|
||||||
|
let mut file_path_buf = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
file_path_buf.push("yaml_utils/specs/sanity-check_default-config_100-vals.yaml");
|
||||||
|
|
||||||
|
File::open(file_path_buf).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
yaml_str = String::new();
|
||||||
|
|
||||||
|
file.read_to_string(&mut yaml_str).unwrap();
|
||||||
|
|
||||||
|
yaml_str = yaml_str.to_lowercase();
|
||||||
|
|
||||||
let _doc: TestDoc = serde_yaml::from_str(&yaml_str.as_str()).unwrap();
|
let _doc: TestDoc = serde_yaml::from_str(&yaml_str.as_str()).unwrap();
|
||||||
}
|
}
|
||||||
|
15
eth2/state_processing/yaml_utils/Cargo.toml
Normal file
15
eth2/state_processing/yaml_utils/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "yaml-utils"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Kirk Baird <baird.k@outlook.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
reqwest = "0.9"
|
||||||
|
tempdir = "0.3"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "yaml_utils"
|
||||||
|
path = "src/lib.rs"
|
28
eth2/state_processing/yaml_utils/build.rs
Normal file
28
eth2/state_processing/yaml_utils/build.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
extern crate reqwest;
|
||||||
|
extern crate tempdir;
|
||||||
|
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::copy;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// These test files are not to be stored in the lighthouse repo as they are quite large (32MB).
|
||||||
|
// They will be downloaded at build time by yaml-utils crate (in build.rs)
|
||||||
|
let git_path = "https://raw.githubusercontent.com/ethereum/eth2.0-tests/master/state/";
|
||||||
|
let test_names = vec![
|
||||||
|
"sanity-check_default-config_100-vals.yaml",
|
||||||
|
"sanity-check_small-config_32-vals.yaml",
|
||||||
|
];
|
||||||
|
|
||||||
|
for test in test_names {
|
||||||
|
let mut target = String::from(git_path);
|
||||||
|
target.push_str(test);
|
||||||
|
let mut response = reqwest::get(target.as_str()).unwrap();
|
||||||
|
|
||||||
|
let mut dest = {
|
||||||
|
let mut file_name = String::from("specs/");
|
||||||
|
file_name.push_str(test);
|
||||||
|
File::create(file_name).unwrap()
|
||||||
|
};
|
||||||
|
copy(&mut response, &mut dest).unwrap();
|
||||||
|
}
|
||||||
|
}
|
1
eth2/state_processing/yaml_utils/specs/.gitignore
vendored
Normal file
1
eth2/state_processing/yaml_utils/specs/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.yaml
|
1
eth2/state_processing/yaml_utils/src/lib.rs
Normal file
1
eth2/state_processing/yaml_utils/src/lib.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
// This is a place holder such that yaml-utils is now a crate hence build.rs will be run when 'cargo test' is called
|
@ -1,6 +1,8 @@
|
|||||||
use serde::de::Error;
|
use serde::de::Error;
|
||||||
use serde::{Deserialize, Deserializer};
|
use serde::{Deserialize, Deserializer};
|
||||||
|
|
||||||
|
pub const FORK_BYTES_LEN: usize = 4;
|
||||||
|
|
||||||
pub fn u8_from_hex_str<'de, D>(deserializer: D) -> Result<u8, D::Error>
|
pub fn u8_from_hex_str<'de, D>(deserializer: D) -> Result<u8, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
@ -10,14 +12,18 @@ where
|
|||||||
u8::from_str_radix(&s.as_str()[2..], 16).map_err(D::Error::custom)
|
u8::from_str_radix(&s.as_str()[2..], 16).map_err(D::Error::custom)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fork_from_hex_str<'de, D>(deserializer: D) -> Result<[u8; 4], D::Error>
|
pub fn fork_from_hex_str<'de, D>(deserializer: D) -> Result<[u8; FORK_BYTES_LEN], D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let s: String = Deserialize::deserialize(deserializer)?;
|
let s: String = Deserialize::deserialize(deserializer)?;
|
||||||
let mut array = [0 as u8; 4];
|
let mut array = [0 as u8; FORK_BYTES_LEN];
|
||||||
let decoded: Vec<u8> = hex::decode(&s.as_str()[2..]).map_err(D::Error::custom)?;
|
let decoded: Vec<u8> = hex::decode(&s.as_str()[2..]).map_err(D::Error::custom)?;
|
||||||
|
|
||||||
|
if decoded.len() > FORK_BYTES_LEN {
|
||||||
|
return Err(D::Error::custom("Fork length too long"));
|
||||||
|
}
|
||||||
|
|
||||||
for (i, item) in array.iter_mut().enumerate() {
|
for (i, item) in array.iter_mut().enumerate() {
|
||||||
if i > decoded.len() {
|
if i > decoded.len() {
|
||||||
break;
|
break;
|
||||||
|
@ -1,30 +1,39 @@
|
|||||||
use super::{AggregatePublicKey, Signature};
|
use super::{AggregatePublicKey, Signature, BLS_AGG_SIG_BYTE_SIZE};
|
||||||
use bls_aggregates::{
|
use bls_aggregates::{
|
||||||
AggregatePublicKey as RawAggregatePublicKey, AggregateSignature as RawAggregateSignature,
|
AggregatePublicKey as RawAggregatePublicKey, AggregateSignature as RawAggregateSignature,
|
||||||
};
|
};
|
||||||
use serde::de::{Deserialize, Deserializer};
|
use serde::de::{Deserialize, Deserializer};
|
||||||
use serde::ser::{Serialize, Serializer};
|
use serde::ser::{Serialize, Serializer};
|
||||||
use serde_hex::{encode as hex_encode, PrefixedHexVisitor};
|
use serde_hex::{encode as hex_encode, PrefixedHexVisitor};
|
||||||
use ssz::{
|
use ssz::{decode_ssz_list, hash, Decodable, DecodeError, Encodable, SszStream, TreeHash};
|
||||||
decode_ssz_list, hash, ssz_encode, Decodable, DecodeError, Encodable, SszStream, TreeHash,
|
|
||||||
};
|
|
||||||
|
|
||||||
/// A BLS aggregate signature.
|
/// A BLS aggregate signature.
|
||||||
///
|
///
|
||||||
/// This struct is a wrapper upon a base type and provides helper functions (e.g., SSZ
|
/// This struct is a wrapper upon a base type and provides helper functions (e.g., SSZ
|
||||||
/// serialization).
|
/// serialization).
|
||||||
#[derive(Debug, PartialEq, Clone, Default, Eq)]
|
#[derive(Debug, PartialEq, Clone, Default, Eq)]
|
||||||
pub struct AggregateSignature(RawAggregateSignature);
|
pub struct AggregateSignature {
|
||||||
|
aggregate_signature: RawAggregateSignature,
|
||||||
|
is_empty: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl AggregateSignature {
|
impl AggregateSignature {
|
||||||
/// Instantiate a new AggregateSignature.
|
/// Instantiate a new AggregateSignature.
|
||||||
|
///
|
||||||
|
/// is_empty is false
|
||||||
|
/// AggregateSiganture is point at infinity
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
AggregateSignature(RawAggregateSignature::new())
|
Self {
|
||||||
|
aggregate_signature: RawAggregateSignature::new(),
|
||||||
|
is_empty: false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add (aggregate) a signature to the `AggregateSignature`.
|
/// Add (aggregate) a signature to the `AggregateSignature`.
|
||||||
pub fn add(&mut self, signature: &Signature) {
|
pub fn add(&mut self, signature: &Signature) {
|
||||||
self.0.add(signature.as_raw())
|
if !self.is_empty {
|
||||||
|
self.aggregate_signature.add(signature.as_raw())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verify the `AggregateSignature` against an `AggregatePublicKey`.
|
/// Verify the `AggregateSignature` against an `AggregatePublicKey`.
|
||||||
@ -37,7 +46,11 @@ impl AggregateSignature {
|
|||||||
domain: u64,
|
domain: u64,
|
||||||
aggregate_public_key: &AggregatePublicKey,
|
aggregate_public_key: &AggregatePublicKey,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
self.0.verify(msg, domain, aggregate_public_key.as_raw())
|
if self.is_empty {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
self.aggregate_signature
|
||||||
|
.verify(msg, domain, aggregate_public_key.as_raw())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verify this AggregateSignature against multiple AggregatePublickeys with multiple Messages.
|
/// Verify this AggregateSignature against multiple AggregatePublickeys with multiple Messages.
|
||||||
@ -50,6 +63,9 @@ impl AggregateSignature {
|
|||||||
domain: u64,
|
domain: u64,
|
||||||
aggregate_public_keys: &[&AggregatePublicKey],
|
aggregate_public_keys: &[&AggregatePublicKey],
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
if self.is_empty {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
let aggregate_public_keys: Vec<&RawAggregatePublicKey> =
|
let aggregate_public_keys: Vec<&RawAggregatePublicKey> =
|
||||||
aggregate_public_keys.iter().map(|pk| pk.as_raw()).collect();
|
aggregate_public_keys.iter().map(|pk| pk.as_raw()).collect();
|
||||||
|
|
||||||
@ -59,14 +75,53 @@ impl AggregateSignature {
|
|||||||
msg.extend_from_slice(message);
|
msg.extend_from_slice(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.0
|
self.aggregate_signature
|
||||||
.verify_multiple(&msg[..], domain, &aggregate_public_keys[..])
|
.verify_multiple(&msg[..], domain, &aggregate_public_keys[..])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return AggregateSiganture as bytes
|
||||||
|
pub fn as_bytes(&self) -> Vec<u8> {
|
||||||
|
if self.is_empty {
|
||||||
|
return vec![0; BLS_AGG_SIG_BYTE_SIZE];
|
||||||
|
}
|
||||||
|
self.aggregate_signature.as_bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convert bytes to AggregateSiganture
|
||||||
|
pub fn from_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
||||||
|
for byte in bytes {
|
||||||
|
if *byte != 0 {
|
||||||
|
let sig =
|
||||||
|
RawAggregateSignature::from_bytes(&bytes).map_err(|_| DecodeError::Invalid)?;
|
||||||
|
return Ok(Self {
|
||||||
|
aggregate_signature: sig,
|
||||||
|
is_empty: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(Self::empty_signature())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns if the AggregateSiganture `is_empty`
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.is_empty
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new AggregateSignature
|
||||||
|
///
|
||||||
|
/// aggregate_signature set to the point infinity
|
||||||
|
/// is_empty set to true
|
||||||
|
pub fn empty_signature() -> Self {
|
||||||
|
Self {
|
||||||
|
aggregate_signature: RawAggregateSignature::new(),
|
||||||
|
is_empty: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Encodable for AggregateSignature {
|
impl Encodable for AggregateSignature {
|
||||||
fn ssz_append(&self, s: &mut SszStream) {
|
fn ssz_append(&self, s: &mut SszStream) {
|
||||||
s.append_vec(&self.0.as_bytes());
|
s.append_vec(&self.as_bytes());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,35 +129,43 @@ impl Decodable for AggregateSignature {
|
|||||||
fn ssz_decode(bytes: &[u8], i: usize) -> Result<(Self, usize), DecodeError> {
|
fn ssz_decode(bytes: &[u8], i: usize) -> Result<(Self, usize), DecodeError> {
|
||||||
let (sig_bytes, i) = decode_ssz_list(bytes, i)?;
|
let (sig_bytes, i) = decode_ssz_list(bytes, i)?;
|
||||||
let raw_sig =
|
let raw_sig =
|
||||||
RawAggregateSignature::from_bytes(&sig_bytes).map_err(|_| DecodeError::TooShort)?;
|
RawAggregateSignature::from_bytes(&sig_bytes).map_err(|_| DecodeError::Invalid)?;
|
||||||
Ok((AggregateSignature(raw_sig), i))
|
Ok((
|
||||||
|
Self {
|
||||||
|
aggregate_signature: raw_sig,
|
||||||
|
is_empty: false,
|
||||||
|
},
|
||||||
|
i,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Serialize for AggregateSignature {
|
impl Serialize for AggregateSignature {
|
||||||
|
/// Serde serialization is compliant the Ethereum YAML test format.
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
serializer.serialize_str(&hex_encode(ssz_encode(self)))
|
serializer.serialize_str(&hex_encode(self.as_bytes()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for AggregateSignature {
|
impl<'de> Deserialize<'de> for AggregateSignature {
|
||||||
|
/// Serde serialization is compliant the Ethereum YAML test format.
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?;
|
let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?;
|
||||||
let (obj, _) = <_>::ssz_decode(&bytes[..], 0)
|
let agg_sig = AggregateSignature::from_bytes(&bytes[..])
|
||||||
.map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?;
|
.map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?;
|
||||||
Ok(obj)
|
Ok(agg_sig)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TreeHash for AggregateSignature {
|
impl TreeHash for AggregateSignature {
|
||||||
fn hash_tree_root(&self) -> Vec<u8> {
|
fn hash_tree_root(&self) -> Vec<u8> {
|
||||||
hash(&self.0.as_bytes())
|
hash(&self.as_bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ pub use crate::secret_key::SecretKey;
|
|||||||
pub use crate::signature::Signature;
|
pub use crate::signature::Signature;
|
||||||
|
|
||||||
pub const BLS_AGG_SIG_BYTE_SIZE: usize = 96;
|
pub const BLS_AGG_SIG_BYTE_SIZE: usize = 96;
|
||||||
|
pub const BLS_SIG_BYTE_SIZE: usize = 96;
|
||||||
|
|
||||||
use hashing::hash;
|
use hashing::hash;
|
||||||
use ssz::ssz_encode;
|
use ssz::ssz_encode;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use super::serde_vistors::HexVisitor;
|
use super::serde_vistors::HexVisitor;
|
||||||
use super::{PublicKey, SecretKey};
|
use super::{PublicKey, SecretKey, BLS_SIG_BYTE_SIZE};
|
||||||
use bls_aggregates::Signature as RawSignature;
|
use bls_aggregates::Signature as RawSignature;
|
||||||
use hex::encode as hex_encode;
|
use hex::encode as hex_encode;
|
||||||
use serde::de::{Deserialize, Deserializer};
|
use serde::de::{Deserialize, Deserializer};
|
||||||
@ -63,7 +63,7 @@ impl Signature {
|
|||||||
/// Returns a new empty signature.
|
/// Returns a new empty signature.
|
||||||
pub fn empty_signature() -> Self {
|
pub fn empty_signature() -> Self {
|
||||||
// Set RawSignature = infinity
|
// Set RawSignature = infinity
|
||||||
let mut empty: Vec<u8> = vec![0; 96];
|
let mut empty: Vec<u8> = vec![0; BLS_SIG_BYTE_SIZE];
|
||||||
empty[0] += u8::pow(2, 6) + u8::pow(2, 7);
|
empty[0] += u8::pow(2, 6) + u8::pow(2, 7);
|
||||||
Signature {
|
Signature {
|
||||||
signature: RawSignature::from_bytes(&empty).unwrap(),
|
signature: RawSignature::from_bytes(&empty).unwrap(),
|
||||||
@ -121,6 +121,7 @@ impl TreeHash for Signature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Serialize for Signature {
|
impl Serialize for Signature {
|
||||||
|
/// Serde serialization is compliant the Ethereum YAML test format.
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
@ -130,14 +131,15 @@ impl Serialize for Signature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for Signature {
|
impl<'de> Deserialize<'de> for Signature {
|
||||||
|
/// Serde serialization is compliant the Ethereum YAML test format.
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let bytes = deserializer.deserialize_str(HexVisitor)?;
|
let bytes: Vec<u8> = deserializer.deserialize_str(HexVisitor)?;
|
||||||
let (pubkey, _) = <_>::ssz_decode(&bytes[..], 0)
|
let signature = Signature::from_bytes(&bytes[..])
|
||||||
.map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?;
|
.map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?;
|
||||||
Ok(pubkey)
|
Ok(signature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +167,7 @@ mod tests {
|
|||||||
|
|
||||||
let sig_as_bytes: Vec<u8> = sig.as_raw().as_bytes();
|
let sig_as_bytes: Vec<u8> = sig.as_raw().as_bytes();
|
||||||
|
|
||||||
assert_eq!(sig_as_bytes.len(), 96);
|
assert_eq!(sig_as_bytes.len(), BLS_SIG_BYTE_SIZE);
|
||||||
for (i, one_byte) in sig_as_bytes.iter().enumerate() {
|
for (i, one_byte) in sig_as_bytes.iter().enumerate() {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
assert_eq!(*one_byte, u8::pow(2, 6) + u8::pow(2, 7));
|
assert_eq!(*one_byte, u8::pow(2, 6) + u8::pow(2, 7));
|
||||||
|
@ -6,7 +6,7 @@ use bit_vec::BitVec;
|
|||||||
use serde::de::{Deserialize, Deserializer};
|
use serde::de::{Deserialize, Deserializer};
|
||||||
use serde::ser::{Serialize, Serializer};
|
use serde::ser::{Serialize, Serializer};
|
||||||
use serde_hex::{encode, PrefixedHexVisitor};
|
use serde_hex::{encode, PrefixedHexVisitor};
|
||||||
use ssz::Decodable;
|
use ssz::{Decodable, Encodable};
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::default;
|
use std::default;
|
||||||
|
|
||||||
@ -144,14 +144,13 @@ impl std::ops::BitAnd for BooleanBitfield {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ssz::Encodable for BooleanBitfield {
|
impl Encodable for BooleanBitfield {
|
||||||
// ssz_append encodes Self according to the `ssz` spec.
|
|
||||||
fn ssz_append(&self, s: &mut ssz::SszStream) {
|
fn ssz_append(&self, s: &mut ssz::SszStream) {
|
||||||
s.append_vec(&self.to_bytes())
|
s.append_vec(&self.to_bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ssz::Decodable for BooleanBitfield {
|
impl Decodable for BooleanBitfield {
|
||||||
fn ssz_decode(bytes: &[u8], index: usize) -> Result<(Self, usize), ssz::DecodeError> {
|
fn ssz_decode(bytes: &[u8], index: usize) -> Result<(Self, usize), ssz::DecodeError> {
|
||||||
let len = ssz::decode::decode_length(bytes, index, ssz::LENGTH_BYTES)?;
|
let len = ssz::decode::decode_length(bytes, index, ssz::LENGTH_BYTES)?;
|
||||||
if (ssz::LENGTH_BYTES + len) > bytes.len() {
|
if (ssz::LENGTH_BYTES + len) > bytes.len() {
|
||||||
@ -186,7 +185,7 @@ impl Serialize for BooleanBitfield {
|
|||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
serializer.serialize_str(&encode(&ssz::ssz_encode(self)))
|
serializer.serialize_str(&encode(&self.to_bytes()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,9 +196,7 @@ impl<'de> Deserialize<'de> for BooleanBitfield {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?;
|
let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?;
|
||||||
let (bitfield, _) = <_>::ssz_decode(&bytes[..], 0)
|
Ok(BooleanBitfield::from_bytes(&bytes))
|
||||||
.map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?;
|
|
||||||
Ok(bitfield)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user