diff --git a/.gitignore b/.gitignore index 346ef9afa..ad0c3c152 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Cargo.lock *.pk *.sk *.raw_keypairs +eth2/state_processing/yaml_utils/specs/*.yaml diff --git a/Cargo.toml b/Cargo.toml index cb070cc2d..94b2af017 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "eth2/block_proposer", "eth2/fork_choice", "eth2/state_processing", + "eth2/state_processing/yaml_utils", "eth2/types", "eth2/utils/bls", "eth2/utils/boolean-bitfield", diff --git a/eth2/state_processing/Cargo.toml b/eth2/state_processing/Cargo.toml index 4e37fce0c..62722aac8 100644 --- a/eth2/state_processing/Cargo.toml +++ b/eth2/state_processing/Cargo.toml @@ -14,6 +14,7 @@ env_logger = "0.6.0" serde = "1.0" serde_derive = "1.0" serde_yaml = "0.8" +yaml-utils = { path = "yaml_utils" } [dependencies] bls = { path = "../utils/bls" } diff --git a/eth2/state_processing/specs/example.yml b/eth2/state_processing/specs/example.yml deleted file mode 100644 index 982f0b0dd..000000000 --- a/eth2/state_processing/specs/example.yml +++ /dev/null @@ -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 diff --git a/eth2/state_processing/tests/tests.rs b/eth2/state_processing/tests/tests.rs index b6aa3e76f..39882cafb 100644 --- a/eth2/state_processing/tests/tests.rs +++ b/eth2/state_processing/tests/tests.rs @@ -1,5 +1,7 @@ use serde_derive::Deserialize; use types::*; +#[allow(unused_imports)] +use yaml_utils; #[derive(Debug, Deserialize)] pub struct TestCase { @@ -23,9 +25,10 @@ fn yaml() { use serde_yaml; use std::{fs::File, io::prelude::*, path::PathBuf}; + // Test sanity-check_small-config_32-vals.yaml let mut file = { 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() }; @@ -34,7 +37,23 @@ fn yaml() { 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(); } diff --git a/eth2/state_processing/yaml_utils/Cargo.toml b/eth2/state_processing/yaml_utils/Cargo.toml new file mode 100644 index 000000000..4a7ae5b89 --- /dev/null +++ b/eth2/state_processing/yaml_utils/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "yaml-utils" +version = "0.1.0" +authors = ["Kirk Baird "] +edition = "2018" + +[build-dependencies] +reqwest = "0.9" +tempdir = "0.3" + +[dependencies] + +[lib] +name = "yaml_utils" +path = "src/lib.rs" diff --git a/eth2/state_processing/yaml_utils/build.rs b/eth2/state_processing/yaml_utils/build.rs new file mode 100644 index 000000000..3b7f31471 --- /dev/null +++ b/eth2/state_processing/yaml_utils/build.rs @@ -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(); + } +} diff --git a/eth2/state_processing/yaml_utils/src/lib.rs b/eth2/state_processing/yaml_utils/src/lib.rs new file mode 100644 index 000000000..644ea434b --- /dev/null +++ b/eth2/state_processing/yaml_utils/src/lib.rs @@ -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 diff --git a/eth2/types/src/test_utils/serde_utils.rs b/eth2/types/src/test_utils/serde_utils.rs index e0e88fbec..761aee523 100644 --- a/eth2/types/src/test_utils/serde_utils.rs +++ b/eth2/types/src/test_utils/serde_utils.rs @@ -1,6 +1,8 @@ use serde::de::Error; use serde::{Deserialize, Deserializer}; +pub const FORK_BYTES_LEN: usize = 4; + pub fn u8_from_hex_str<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, @@ -10,14 +12,18 @@ where 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 D: Deserializer<'de>, { 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 = 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() { if i > decoded.len() { break; diff --git a/eth2/utils/bls/src/aggregate_signature.rs b/eth2/utils/bls/src/aggregate_signature.rs index 7b80d3bbf..922fae4f6 100644 --- a/eth2/utils/bls/src/aggregate_signature.rs +++ b/eth2/utils/bls/src/aggregate_signature.rs @@ -1,30 +1,39 @@ -use super::{AggregatePublicKey, Signature}; +use super::{AggregatePublicKey, Signature, BLS_AGG_SIG_BYTE_SIZE}; use bls_aggregates::{ AggregatePublicKey as RawAggregatePublicKey, AggregateSignature as RawAggregateSignature, }; use serde::de::{Deserialize, Deserializer}; use serde::ser::{Serialize, Serializer}; use serde_hex::{encode as hex_encode, PrefixedHexVisitor}; -use ssz::{ - decode_ssz_list, hash, ssz_encode, Decodable, DecodeError, Encodable, SszStream, TreeHash, -}; +use ssz::{decode_ssz_list, hash, Decodable, DecodeError, Encodable, SszStream, TreeHash}; /// A BLS aggregate signature. /// /// This struct is a wrapper upon a base type and provides helper functions (e.g., SSZ /// serialization). #[derive(Debug, PartialEq, Clone, Default, Eq)] -pub struct AggregateSignature(RawAggregateSignature); +pub struct AggregateSignature { + aggregate_signature: RawAggregateSignature, + is_empty: bool, +} impl AggregateSignature { /// Instantiate a new AggregateSignature. + /// + /// is_empty is false + /// AggregateSiganture is point at infinity pub fn new() -> Self { - AggregateSignature(RawAggregateSignature::new()) + Self { + aggregate_signature: RawAggregateSignature::new(), + is_empty: false, + } } /// Add (aggregate) a signature to the `AggregateSignature`. 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`. @@ -37,7 +46,11 @@ impl AggregateSignature { domain: u64, aggregate_public_key: &AggregatePublicKey, ) -> 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. @@ -50,6 +63,9 @@ impl AggregateSignature { domain: u64, aggregate_public_keys: &[&AggregatePublicKey], ) -> bool { + if self.is_empty { + return false; + } let aggregate_public_keys: Vec<&RawAggregatePublicKey> = aggregate_public_keys.iter().map(|pk| pk.as_raw()).collect(); @@ -59,14 +75,53 @@ impl AggregateSignature { msg.extend_from_slice(message); } - self.0 + self.aggregate_signature .verify_multiple(&msg[..], domain, &aggregate_public_keys[..]) } + + /// Return AggregateSiganture as bytes + pub fn as_bytes(&self) -> Vec { + 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 { + 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 { 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> { let (sig_bytes, i) = decode_ssz_list(bytes, i)?; let raw_sig = - RawAggregateSignature::from_bytes(&sig_bytes).map_err(|_| DecodeError::TooShort)?; - Ok((AggregateSignature(raw_sig), i)) + RawAggregateSignature::from_bytes(&sig_bytes).map_err(|_| DecodeError::Invalid)?; + Ok(( + Self { + aggregate_signature: raw_sig, + is_empty: false, + }, + i, + )) } } impl Serialize for AggregateSignature { + /// Serde serialization is compliant the Ethereum YAML test format. fn serialize(&self, serializer: S) -> Result where S: Serializer, { - serializer.serialize_str(&hex_encode(ssz_encode(self))) + serializer.serialize_str(&hex_encode(self.as_bytes())) } } impl<'de> Deserialize<'de> for AggregateSignature { + /// Serde serialization is compliant the Ethereum YAML test format. fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { 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)))?; - Ok(obj) + Ok(agg_sig) } } impl TreeHash for AggregateSignature { fn hash_tree_root(&self) -> Vec { - hash(&self.0.as_bytes()) + hash(&self.as_bytes()) } } diff --git a/eth2/utils/bls/src/lib.rs b/eth2/utils/bls/src/lib.rs index 38a129908..77fd531f7 100644 --- a/eth2/utils/bls/src/lib.rs +++ b/eth2/utils/bls/src/lib.rs @@ -17,6 +17,7 @@ pub use crate::secret_key::SecretKey; pub use crate::signature::Signature; pub const BLS_AGG_SIG_BYTE_SIZE: usize = 96; +pub const BLS_SIG_BYTE_SIZE: usize = 96; use hashing::hash; use ssz::ssz_encode; diff --git a/eth2/utils/bls/src/signature.rs b/eth2/utils/bls/src/signature.rs index 8a080e56d..42c307cbe 100644 --- a/eth2/utils/bls/src/signature.rs +++ b/eth2/utils/bls/src/signature.rs @@ -1,5 +1,5 @@ use super::serde_vistors::HexVisitor; -use super::{PublicKey, SecretKey}; +use super::{PublicKey, SecretKey, BLS_SIG_BYTE_SIZE}; use bls_aggregates::Signature as RawSignature; use hex::encode as hex_encode; use serde::de::{Deserialize, Deserializer}; @@ -63,7 +63,7 @@ impl Signature { /// Returns a new empty signature. pub fn empty_signature() -> Self { // Set RawSignature = infinity - let mut empty: Vec = vec![0; 96]; + let mut empty: Vec = vec![0; BLS_SIG_BYTE_SIZE]; empty[0] += u8::pow(2, 6) + u8::pow(2, 7); Signature { signature: RawSignature::from_bytes(&empty).unwrap(), @@ -121,6 +121,7 @@ impl TreeHash for Signature { } impl Serialize for Signature { + /// Serde serialization is compliant the Ethereum YAML test format. fn serialize(&self, serializer: S) -> Result where S: Serializer, @@ -130,14 +131,15 @@ impl Serialize for Signature { } impl<'de> Deserialize<'de> for Signature { + /// Serde serialization is compliant the Ethereum YAML test format. fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - let bytes = deserializer.deserialize_str(HexVisitor)?; - let (pubkey, _) = <_>::ssz_decode(&bytes[..], 0) + let bytes: Vec = deserializer.deserialize_str(HexVisitor)?; + let signature = Signature::from_bytes(&bytes[..]) .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 = 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() { if i == 0 { assert_eq!(*one_byte, u8::pow(2, 6) + u8::pow(2, 7)); diff --git a/eth2/utils/boolean-bitfield/src/lib.rs b/eth2/utils/boolean-bitfield/src/lib.rs index 443cd06da..161b365bb 100644 --- a/eth2/utils/boolean-bitfield/src/lib.rs +++ b/eth2/utils/boolean-bitfield/src/lib.rs @@ -186,7 +186,7 @@ impl Serialize for BooleanBitfield { where S: Serializer, { - serializer.serialize_str(&encode(&ssz::ssz_encode(self))) + serializer.serialize_str(&encode(&self.to_bytes())) } } @@ -197,9 +197,7 @@ impl<'de> Deserialize<'de> for BooleanBitfield { D: Deserializer<'de>, { let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?; - let (bitfield, _) = <_>::ssz_decode(&bytes[..], 0) - .map_err(|e| serde::de::Error::custom(format!("invalid ssz ({:?})", e)))?; - Ok(bitfield) + Ok(BooleanBitfield::from_bytes(&bytes)) } }