From 047e14b8a0190d132e8320a59bc3a8dfccbab145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kapka?= Date: Mon, 10 Jan 2022 12:50:36 +0100 Subject: [PATCH] Add state-proto directory (#10058) --- beacon-chain/blockchain/BUILD.bazel | 8 +- beacon-chain/blockchain/chain_info.go | 5 +- .../blockchain/chain_info_norace_test.go | 2 +- beacon-chain/blockchain/chain_info_test.go | 6 +- beacon-chain/blockchain/head.go | 4 +- .../blockchain/head_sync_committee_info.go | 5 +- .../head_sync_committee_info_test.go | 11 +- beacon-chain/blockchain/head_test.go | 4 +- beacon-chain/blockchain/info_test.go | 2 +- beacon-chain/blockchain/metrics.go | 4 +- beacon-chain/blockchain/mock_test.go | 4 +- beacon-chain/blockchain/options.go | 4 +- .../blockchain/process_attestation_helpers.go | 2 +- .../blockchain/process_attestation_test.go | 4 +- beacon-chain/blockchain/process_block.go | 2 +- .../blockchain/process_block_helpers.go | 2 +- beacon-chain/blockchain/process_block_test.go | 6 +- .../blockchain/receive_attestation.go | 2 +- beacon-chain/blockchain/receive_block_test.go | 2 +- beacon-chain/blockchain/service.go | 10 +- beacon-chain/blockchain/service_test.go | 20 +- .../blockchain/state_balance_cache.go | 4 +- .../blockchain/state_balance_cache_test.go | 4 +- beacon-chain/blockchain/testing/BUILD.bazel | 4 +- beacon-chain/blockchain/testing/mock.go | 10 +- beacon-chain/cache/BUILD.bazel | 16 +- beacon-chain/cache/active_balance.go | 4 +- beacon-chain/cache/active_balance_disabled.go | 2 +- beacon-chain/cache/active_balance_test.go | 2 +- beacon-chain/cache/checkpoint_state.go | 2 +- beacon-chain/cache/checkpoint_state_test.go | 12 +- beacon-chain/cache/skip_slot_cache.go | 2 +- beacon-chain/cache/skip_slot_cache_test.go | 6 +- beacon-chain/cache/sync_committee.go | 2 +- beacon-chain/cache/sync_committee_disabled.go | 2 +- .../cache/sync_committee_head_state.go | 8 +- .../cache/sync_committee_head_state_test.go | 8 +- beacon-chain/core/altair/BUILD.bazel | 10 +- beacon-chain/core/altair/attestation.go | 2 +- beacon-chain/core/altair/attestation_test.go | 4 +- beacon-chain/core/altair/block.go | 5 +- beacon-chain/core/altair/deposit.go | 2 +- beacon-chain/core/altair/deposit_fuzz_test.go | 2 +- beacon-chain/core/altair/deposit_test.go | 2 +- beacon-chain/core/altair/epoch_precompute.go | 2 +- .../core/altair/epoch_precompute_test.go | 6 +- beacon-chain/core/altair/epoch_spec.go | 2 +- beacon-chain/core/altair/epoch_spec_test.go | 2 +- beacon-chain/core/altair/reward.go | 2 +- beacon-chain/core/altair/reward_test.go | 2 +- beacon-chain/core/altair/sync_committee.go | 2 +- .../core/altair/sync_committee_test.go | 2 +- beacon-chain/core/altair/transition.go | 2 +- beacon-chain/core/altair/upgrade.go | 108 +-- beacon-chain/core/altair/upgrade_test.go | 2 +- beacon-chain/core/blocks/BUILD.bazel | 6 +- beacon-chain/core/blocks/attestation.go | 5 +- .../blocks/attestation_regression_test.go | 2 +- beacon-chain/core/blocks/attestation_test.go | 12 +- beacon-chain/core/blocks/attester_slashing.go | 2 +- .../core/blocks/attester_slashing_test.go | 11 +- .../core/blocks/block_operations_fuzz_test.go | 5 +- .../core/blocks/block_regression_test.go | 3 +- beacon-chain/core/blocks/deposit.go | 2 +- beacon-chain/core/blocks/deposit_test.go | 2 +- beacon-chain/core/blocks/eth1_data.go | 2 +- beacon-chain/core/blocks/eth1_data_test.go | 2 +- beacon-chain/core/blocks/exit.go | 5 +- beacon-chain/core/blocks/exit_test.go | 2 +- beacon-chain/core/blocks/header.go | 2 +- beacon-chain/core/blocks/payload.go | 2 +- beacon-chain/core/blocks/proposer_slashing.go | 2 +- .../proposer_slashing_regression_test.go | 2 +- .../core/blocks/proposer_slashing_test.go | 7 +- beacon-chain/core/blocks/randao.go | 2 +- beacon-chain/core/blocks/randao_test.go | 3 +- beacon-chain/core/blocks/signature.go | 21 +- beacon-chain/core/blocks/signature_test.go | 6 +- beacon-chain/core/epoch/BUILD.bazel | 7 +- beacon-chain/core/epoch/epoch_processing.go | 9 +- .../core/epoch/epoch_processing_fuzz_test.go | 2 +- .../core/epoch/epoch_processing_test.go | 6 +- .../core/epoch/precompute/BUILD.bazel | 6 +- .../core/epoch/precompute/attestation.go | 2 +- .../core/epoch/precompute/attestation_test.go | 10 +- .../precompute/justification_finalization.go | 2 +- .../justification_finalization_test.go | 2 +- beacon-chain/core/epoch/precompute/new.go | 2 +- .../core/epoch/precompute/new_test.go | 2 +- .../core/epoch/precompute/reward_penalty.go | 2 +- .../epoch/precompute/reward_penalty_test.go | 4 +- .../core/epoch/precompute/slashing.go | 2 +- .../core/epoch/precompute/slashing_test.go | 2 +- beacon-chain/core/execution/BUILD.bazel | 5 +- beacon-chain/core/execution/upgrade.go | 148 ++-- beacon-chain/core/helpers/BUILD.bazel | 8 +- beacon-chain/core/helpers/attestation_test.go | 2 +- beacon-chain/core/helpers/beacon_committee.go | 2 +- .../core/helpers/beacon_committee_test.go | 2 +- beacon-chain/core/helpers/block.go | 6 +- beacon-chain/core/helpers/block_test.go | 2 +- beacon-chain/core/helpers/genesis.go | 2 +- beacon-chain/core/helpers/randao.go | 4 +- beacon-chain/core/helpers/randao_test.go | 2 +- .../core/helpers/rewards_penalties.go | 2 +- .../core/helpers/rewards_penalties_test.go | 2 +- beacon-chain/core/helpers/sync_committee.go | 2 +- .../core/helpers/sync_committee_test.go | 4 +- beacon-chain/core/helpers/validators.go | 2 +- beacon-chain/core/helpers/validators_test.go | 2 +- .../core/helpers/weak_subjectivity.go | 2 +- .../core/helpers/weak_subjectivity_test.go | 2 +- beacon-chain/core/signing/BUILD.bazel | 4 +- beacon-chain/core/signing/signing_root.go | 8 +- .../core/signing/signing_root_test.go | 2 +- beacon-chain/core/time/BUILD.bazel | 4 +- beacon-chain/core/time/slot_epoch.go | 2 +- beacon-chain/core/time/slot_epoch_test.go | 2 +- beacon-chain/core/transition/BUILD.bazel | 13 +- .../altair_transition_no_verify_sig_test.go | 2 +- ...bellatrix_transition_no_verify_sig_test.go | 2 +- .../core/transition/benchmarks_test.go | 8 +- .../core/transition/interop/BUILD.bazel | 2 +- .../transition/interop/write_state_to_disk.go | 2 +- .../core/transition/skip_slot_cache.go | 2 +- .../core/transition/skip_slot_cache_test.go | 18 +- beacon-chain/core/transition/state.go | 203 ++--- .../core/transition/state_fuzz_test.go | 2 +- beacon-chain/core/transition/state_test.go | 15 +- .../core/transition/stateutils/BUILD.bazel | 2 +- .../stateutils/validator_index_map_test.go | 2 +- .../transition/trailing_slot_state_cache.go | 2 +- beacon-chain/core/transition/transition.go | 2 +- .../core/transition/transition_fuzz_test.go | 30 +- .../transition/transition_no_verify_sig.go | 2 +- .../core/transition/transition_test.go | 19 +- beacon-chain/core/validators/BUILD.bazel | 4 +- beacon-chain/core/validators/validator.go | 2 +- .../core/validators/validator_test.go | 2 +- beacon-chain/db/iface/BUILD.bazel | 2 +- beacon-chain/db/iface/interface.go | 2 +- beacon-chain/db/kv/BUILD.bazel | 16 +- beacon-chain/db/kv/genesis.go | 4 +- .../db/kv/migration_state_validators_test.go | 14 +- beacon-chain/db/kv/state.go | 28 +- beacon-chain/db/kv/state_test.go | 36 +- beacon-chain/db/kv/wss.go | 2 +- .../deterministic-genesis/BUILD.bazel | 4 +- beacon-chain/deterministic-genesis/service.go | 4 +- beacon-chain/monitor/BUILD.bazel | 6 +- beacon-chain/monitor/process_attestation.go | 2 +- beacon-chain/monitor/process_block.go | 2 +- .../monitor/process_sync_committee.go | 2 +- beacon-chain/monitor/service.go | 4 +- beacon-chain/monitor/service_test.go | 2 +- beacon-chain/node/BUILD.bazel | 4 +- beacon-chain/node/node.go | 4 +- beacon-chain/operations/slashings/BUILD.bazel | 4 +- beacon-chain/operations/slashings/mock.go | 2 +- beacon-chain/operations/slashings/service.go | 2 +- .../slashings/service_attester_test.go | 2 +- beacon-chain/operations/slashings/types.go | 2 +- .../operations/voluntaryexits/BUILD.bazel | 4 +- .../operations/voluntaryexits/mock.go | 2 +- .../operations/voluntaryexits/service.go | 2 +- .../operations/voluntaryexits/service_test.go | 2 +- beacon-chain/p2p/BUILD.bazel | 1 - beacon-chain/p2p/encoder/ssz_test.go | 2 +- .../p2p/gossip_scoring_params_test.go | 5 +- beacon-chain/powchain/BUILD.bazel | 8 +- beacon-chain/powchain/log_processing.go | 4 +- beacon-chain/powchain/options.go | 4 +- beacon-chain/powchain/service.go | 8 +- beacon-chain/powchain/service_test.go | 2 +- beacon-chain/powchain/testing/BUILD.bazel | 4 +- .../powchain/testing/mock_faulty_powchain.go | 4 +- .../powchain/testing/mock_powchain.go | 2 +- beacon-chain/rpc/BUILD.bazel | 2 +- beacon-chain/rpc/eth/beacon/BUILD.bazel | 10 +- beacon-chain/rpc/eth/beacon/pool.go | 3 +- beacon-chain/rpc/eth/beacon/pool_test.go | 53 +- beacon-chain/rpc/eth/beacon/server.go | 2 +- beacon-chain/rpc/eth/beacon/state.go | 2 +- beacon-chain/rpc/eth/beacon/state_test.go | 21 +- beacon-chain/rpc/eth/beacon/sync_committee.go | 2 +- .../rpc/eth/beacon/sync_committee_test.go | 2 +- beacon-chain/rpc/eth/beacon/validator.go | 4 +- beacon-chain/rpc/eth/beacon/validator_test.go | 4 +- beacon-chain/rpc/eth/debug/BUILD.bazel | 4 +- beacon-chain/rpc/eth/debug/debug.go | 4 +- beacon-chain/rpc/eth/helpers/BUILD.bazel | 4 +- .../rpc/eth/helpers/validator_status.go | 2 +- .../rpc/eth/helpers/validator_status_test.go | 2 +- beacon-chain/rpc/eth/validator/BUILD.bazel | 8 +- beacon-chain/rpc/eth/validator/validator.go | 4 +- .../rpc/eth/validator/validator_test.go | 50 +- .../rpc/prysm/v1alpha1/beacon/BUILD.bazel | 10 +- .../prysm/v1alpha1/beacon/assignments_test.go | 2 +- .../v1alpha1/beacon/attestations_test.go | 14 +- .../rpc/prysm/v1alpha1/beacon/blocks_test.go | 4 +- .../prysm/v1alpha1/beacon/committees_test.go | 11 +- .../rpc/prysm/v1alpha1/beacon/server.go | 2 +- .../rpc/prysm/v1alpha1/beacon/validators.go | 2 +- .../v1alpha1/beacon/validators_stream.go | 2 +- .../prysm/v1alpha1/beacon/validators_test.go | 8 +- .../rpc/prysm/v1alpha1/debug/BUILD.bazel | 6 +- .../rpc/prysm/v1alpha1/debug/block.go | 2 +- .../rpc/prysm/v1alpha1/debug/block_test.go | 2 +- .../rpc/prysm/v1alpha1/debug/server.go | 2 +- .../rpc/prysm/v1alpha1/debug/state_test.go | 2 +- .../rpc/prysm/v1alpha1/validator/BUILD.bazel | 10 +- .../v1alpha1/validator/aggregator_test.go | 4 +- .../prysm/v1alpha1/validator/assignments.go | 2 +- .../prysm/v1alpha1/validator/attester_test.go | 30 +- .../rpc/prysm/v1alpha1/validator/exit.go | 3 +- .../validator/proposer_attestations.go | 2 +- .../v1alpha1/validator/proposer_deposits.go | 2 +- .../v1alpha1/validator/proposer_eth1data.go | 2 +- .../v1alpha1/validator/proposer_phase0.go | 3 +- .../prysm/v1alpha1/validator/proposer_test.go | 8 +- .../rpc/prysm/v1alpha1/validator/server.go | 5 +- .../prysm/v1alpha1/validator/server_test.go | 4 +- .../rpc/prysm/v1alpha1/validator/status.go | 2 +- .../prysm/v1alpha1/validator/status_test.go | 6 +- beacon-chain/rpc/service.go | 2 +- beacon-chain/rpc/statefetcher/BUILD.bazel | 7 +- beacon-chain/rpc/statefetcher/fetcher.go | 10 +- beacon-chain/rpc/statefetcher/fetcher_test.go | 23 +- beacon-chain/rpc/testutil/BUILD.bazel | 2 +- .../rpc/testutil/mock_state_fetcher.go | 2 +- beacon-chain/sharedstate/BUILD.bazel | 12 + beacon-chain/sharedstate/prometheus.go | 13 + beacon-chain/slasher/BUILD.bazel | 6 +- .../slasher/detect_attestations_test.go | 3 +- beacon-chain/slasher/detect_blocks_test.go | 5 +- beacon-chain/slasher/process_slashings.go | 2 +- .../slasher/process_slashings_test.go | 8 +- beacon-chain/slasher/service.go | 2 +- .../{state => state-native}/BUILD.bazel | 2 +- .../{state => state-native}/altair.go | 0 .../custom-types/BUILD.bazel | 2 +- .../custom-types/state_arrays.go | 0 .../custom-types/state_arrays_test.go | 0 .../fieldtrie/BUILD.bazel | 12 +- .../fieldtrie/field_trie.go | 4 +- .../fieldtrie/field_trie_helpers.go | 40 +- .../fieldtrie/field_trie_test.go | 32 +- .../state-native/fieldtrie/helpers_test.go | 85 ++ beacon-chain/state-native/genesis/BUILD.bazel | 24 + beacon-chain/state-native/genesis/genesis.go | 39 + .../state-native/genesis/genesis_test.go | 32 + .../genesis/mainnet.ssz.snappy | Bin .../{state => state-native}/phase0.go | 32 +- .../state-native/stategen/BUILD.bazel | 83 ++ .../stategen/epoch_boundary_state_cache.go | 2 +- .../epoch_boundary_state_cache_test.go | 4 +- .../stategen/errors.go | 0 .../stategen/getter.go | 2 +- .../stategen/getter_test.go | 16 +- .../stategen/hot_state_cache.go | 2 +- .../stategen/hot_state_cache_test.go | 34 + .../stategen/init_test.go | 0 .../{state => state-native}/stategen/log.go | 0 .../stategen/metrics.go | 0 .../stategen/migrate.go | 2 +- .../stategen/migrate_test.go | 2 +- .../{state => state-native}/stategen/mock.go | 2 +- .../stategen/replay.go | 2 +- .../stategen/replay_test.go | 4 +- .../stategen/service.go | 2 +- .../stategen/service_test.go | 2 +- .../stategen/setter.go | 2 +- .../stategen/setter_test.go | 0 .../stateutil/BUILD.bazel | 5 +- .../stateutil/benchmark_test.go | 0 .../stateutil/block_header_root.go | 0 .../stateutil/eth1_root.go | 0 .../stateutil/field_root_attestation.go | 0 .../stateutil/field_root_eth1.go | 0 .../stateutil/field_root_test.go | 0 .../stateutil/field_root_validator.go | 0 .../stateutil/field_root_vector.go | 0 .../stateutil/participation_bit_root.go | 0 .../stateutil/pending_attestation_root.go | 0 .../stateutil/reference.go | 0 .../stateutil/reference_bench_test.go | 0 .../stateutil/state_hasher.go | 0 .../stateutil/state_root_test.go | 0 .../stateutil/stateutil_test.go | 0 .../stateutil/sync_committee.root.go | 0 .../stateutil/trie_helpers.go | 0 .../stateutil/trie_helpers_test.go | 21 +- .../stateutil/validator_map_handler.go | 0 .../stateutil/validator_root.go | 0 .../stateutil/validator_root_test.go | 22 + beacon-chain/state-native/types/BUILD.bazel | 19 + .../{state => state-native}/types/types.go | 0 .../types/types_test.go | 0 .../{state => state-native}/v1/BUILD.bazel | 21 +- .../v1/beacon_state_mainnet.go | 8 +- .../v1/beacon_state_minimal.go | 8 +- .../{state => state-native}/v1/doc.go | 0 .../{state => state-native}/v1/field_roots.go | 2 +- .../v1/generated.ssz.go | 0 .../v1/getters_attestation.go | 0 .../v1/getters_attestation_test.go | 0 .../v1/getters_block.go | 23 +- .../v1/getters_block_test.go | 6 +- .../v1/getters_checkpoint.go | 0 .../v1/getters_eth1.go | 0 .../v1/getters_misc.go | 17 +- .../v1/getters_randao.go | 24 +- .../v1/getters_state.go | 35 +- .../v1/getters_test.go | 0 .../v1/getters_validator.go | 2 +- .../state-native/v1/getters_validator_test.go | 20 + .../{state => state-native}/v1/proofs.go | 2 +- beacon-chain/state-native/v1/proofs_test.go | 34 + .../v1/readonly_validator.go | 2 +- .../v1/readonly_validator_test.go | 73 ++ .../v1/references_test.go | 134 ++- .../v1/setters_attestation.go | 2 +- .../v1/setters_attestation_test.go | 2 +- .../v1/setters_block.go | 13 +- .../v1/setters_checkpoint.go | 0 .../v1/setters_eth1.go | 2 +- .../v1/setters_misc.go | 17 +- .../v1/setters_randao.go | 17 +- .../v1/setters_state.go | 13 +- .../v1/setters_validator.go | 2 +- .../{state => state-native}/v1/state_test.go | 2 +- .../{state => state-native}/v1/state_trie.go | 28 +- .../v1/state_trie_test.go | 12 +- .../{state => state-native}/v1/types.go | 4 +- .../{state => state-native}/v1/types_test.go | 4 +- .../v1/unsupported_getters.go | 0 .../v1/unsupported_setters.go | 0 .../{state => state-native}/v2/BUILD.bazel | 23 +- .../v2/beacon_state_mainnet.go | 8 +- .../v2/beacon_state_minimal.go | 8 +- .../v2/deprecated_getters.go | 0 .../v2/deprecated_getters_test.go | 0 .../v2/deprecated_setters.go | 0 .../v2/deprecated_setters_test.go | 0 .../{state => state-native}/v2/field_roots.go | 2 +- .../v2/generated.ssz.go | 0 .../v2/getters_block.go | 23 +- .../v2/getters_block_test.go | 6 +- .../v2/getters_checkpoint.go | 0 .../v2/getters_eth1.go | 0 .../v2/getters_misc.go | 16 +- .../v2/getters_participation.go | 0 .../v2/getters_randao.go | 24 +- .../v2/getters_state.go | 35 +- .../v2/getters_sync_committee.go | 0 .../v2/getters_test.go | 0 .../v2/getters_validator.go | 4 +- .../state-native/v2/getters_validator_test.go | 20 + .../{state => state-native}/v2/proofs.go | 2 +- beacon-chain/state-native/v2/proofs_test.go | 75 ++ .../v2/setters_block.go | 13 +- .../v2/setters_checkpoint.go | 0 .../v2/setters_eth1.go | 2 +- .../v2/setters_misc.go | 17 +- .../v2/setters_participation.go | 2 +- .../v2/setters_randao.go | 17 +- .../v2/setters_state.go | 13 +- .../v2/setters_sync_committee.go | 0 .../v2/setters_test.go | 4 +- .../v2/setters_validator.go | 2 +- .../{state => state-native}/v2/state_trie.go | 28 +- .../state-native/v2/state_trie_test.go | 168 ++++ .../{state => state-native}/v2/types.go | 2 +- .../{state => state-native}/v3/BUILD.bazel | 23 +- .../v3/beacon_state_mainnet.go | 8 +- .../v3/beacon_state_minimal.go | 8 +- .../v3/deprecated_getters.go | 0 .../v3/deprecated_getters_test.go | 0 .../v3/deprecated_setters.go | 0 .../v3/deprecated_setters_test.go | 0 .../{state => state-native}/v3/field_roots.go | 2 +- .../v3/generated.ssz.go | 0 .../v3/getters_block.go | 23 +- .../v3/getters_block_test.go | 6 +- .../v3/getters_checkpoint.go | 0 .../v3/getters_eth1.go | 0 .../v3/getters_misc.go | 17 +- .../v3/getters_participation.go | 0 .../v3/getters_payload_header.go | 0 .../v3/getters_randao.go | 24 +- .../v3/getters_state.go | 35 +- .../v3/getters_sync_committee.go | 0 .../v3/getters_test.go | 0 .../v3/getters_validator.go | 4 +- .../state-native/v3/getters_validator_test.go | 20 + .../{state => state-native}/v3/proofs.go | 2 +- beacon-chain/state-native/v3/proofs_test.go | 75 ++ .../v3/setters_block.go | 13 +- .../v3/setters_checkpoint.go | 0 .../v3/setters_eth1.go | 2 +- .../v3/setters_misc.go | 17 +- .../v3/setters_participation.go | 2 +- .../v3/setters_payload_header.go | 0 .../v3/setters_randao.go | 17 +- .../v3/setters_state.go | 13 +- .../v3/setters_sync_committee.go | 0 .../v3/setters_test.go | 4 +- .../v3/setters_validator.go | 2 +- .../{state => state-native}/v3/state_trie.go | 28 +- .../state-native/v3/state_trie_test.go | 167 ++++ .../{state => state-native}/v3/types.go | 2 +- .../state-proto/fieldtrie/BUILD.bazel | 40 + .../state-proto/fieldtrie/field_trie.go | 200 +++++ .../fieldtrie/field_trie_helpers.go | 295 +++++++ .../state-proto/fieldtrie/field_trie_test.go | 79 ++ .../fieldtrie/helpers_test.go | 4 +- .../genesis/BUILD.bazel | 4 +- .../{state => state-proto}/genesis/genesis.go | 2 +- .../genesis/genesis_test.go | 2 +- .../state-proto/genesis/mainnet.ssz.snappy | Bin 0 -> 1809174 bytes .../stategen/BUILD.bazel | 8 +- .../stategen/epoch_boundary_state_cache.go | 155 ++++ .../epoch_boundary_state_cache_test.go | 71 ++ beacon-chain/state-proto/stategen/errors.go | 7 + beacon-chain/state-proto/stategen/getter.go | 306 +++++++ .../state-proto/stategen/getter_test.go | 596 ++++++++++++++ .../state-proto/stategen/hot_state_cache.go | 87 ++ .../stategen/hot_state_cache_test.go | 6 +- .../state-proto/stategen/init_test.go | 12 + beacon-chain/state-proto/stategen/log.go | 5 + beacon-chain/state-proto/stategen/metrics.go | 16 + beacon-chain/state-proto/stategen/migrate.go | 119 +++ .../state-proto/stategen/migrate_test.go | 137 +++ beacon-chain/state-proto/stategen/mock.go | 126 +++ beacon-chain/state-proto/stategen/replay.go | 326 ++++++++ .../state-proto/stategen/replay_test.go | 777 ++++++++++++++++++ beacon-chain/state-proto/stategen/service.go | 140 ++++ .../state-proto/stategen/service_test.go | 37 + beacon-chain/state-proto/stategen/setter.go | 135 +++ .../state-proto/stategen/setter_test.go | 204 +++++ .../state-proto/stateutil/BUILD.bazel | 101 +++ .../state-proto/stateutil/benchmark_test.go | 30 + .../stateutil/block_header_root.go | 34 + .../state-proto/stateutil/eth1_root.go | 116 +++ .../stateutil/field_root_attestation.go | 83 ++ .../state-proto/stateutil/field_root_eth1.go | 58 ++ .../state-proto/stateutil/field_root_test.go | 23 + .../stateutil/field_root_validator.go | 88 ++ .../stateutil/field_root_vector.go | 156 ++++ .../stateutil/participation_bit_root.go | 69 ++ .../stateutil/pending_attestation_root.go | 138 ++++ .../state-proto/stateutil/reference.go | 45 + .../stateutil/reference_bench_test.go | 15 + .../state-proto/stateutil/state_hasher.go | 548 ++++++++++++ .../state-proto/stateutil/state_root_test.go | 82 ++ .../state-proto/stateutil/stateutil_test.go | 13 + .../stateutil/sync_committee.root.go | 49 ++ .../state-proto/stateutil/trie_helpers.go | 296 +++++++ .../stateutil/trie_helpers_test.go | 122 +++ .../stateutil/validator_map_handler.go | 72 ++ .../state-proto/stateutil/validator_root.go | 128 +++ .../stateutil/validator_root_test.go | 2 +- .../{state => state-proto}/types/BUILD.bazel | 2 +- beacon-chain/state-proto/types/types.go | 144 ++++ beacon-chain/state-proto/types/types_test.go | 36 + beacon-chain/state-proto/v1/BUILD.bazel | 106 +++ beacon-chain/state-proto/v1/doc.go | 40 + beacon-chain/state-proto/v1/field_roots.go | 18 + .../state-proto/v1/getters_attestation.go | 55 ++ .../v1/getters_attestation_test.go | 46 ++ beacon-chain/state-proto/v1/getters_block.go | 99 +++ .../state-proto/v1/getters_block_test.go | 59 ++ .../state-proto/v1/getters_checkpoint.go | 160 ++++ beacon-chain/state-proto/v1/getters_eth1.go | 91 ++ beacon-chain/state-proto/v1/getters_misc.go | 163 ++++ beacon-chain/state-proto/v1/getters_randao.go | 85 ++ beacon-chain/state-proto/v1/getters_state.go | 123 +++ beacon-chain/state-proto/v1/getters_test.go | 215 +++++ .../state-proto/v1/getters_validator.go | 297 +++++++ .../v1/getters_validator_test.go | 2 +- beacon-chain/state-proto/v1/proofs.go | 47 ++ .../{state => state-proto}/v1/proofs_test.go | 2 +- .../state-proto/v1/readonly_validator.go | 88 ++ .../v1/readonly_validator_test.go | 2 +- .../state-proto/v1/references_test.go | 354 ++++++++ .../state-proto/v1/setters_attestation.go | 98 +++ .../v1/setters_attestation_test.go | 72 ++ beacon-chain/state-proto/v1/setters_block.go | 68 ++ .../state-proto/v1/setters_checkpoint.go | 58 ++ beacon-chain/state-proto/v1/setters_eth1.go | 74 ++ beacon-chain/state-proto/v1/setters_misc.go | 187 +++++ beacon-chain/state-proto/v1/setters_randao.go | 53 ++ beacon-chain/state-proto/v1/setters_state.go | 59 ++ .../state-proto/v1/setters_validator.go | 228 +++++ beacon-chain/state-proto/v1/state_test.go | 193 +++++ beacon-chain/state-proto/v1/state_trie.go | 418 ++++++++++ .../state-proto/v1/state_trie_test.go | 260 ++++++ beacon-chain/state-proto/v1/types.go | 78 ++ beacon-chain/state-proto/v1/types_test.go | 231 ++++++ .../state-proto/v1/unsupported_getters.go | 36 + .../state-proto/v1/unsupported_setters.go | 51 ++ beacon-chain/state-proto/v2/BUILD.bazel | 92 +++ .../state-proto/v2/deprecated_getters.go | 21 + .../state-proto/v2/deprecated_getters_test.go | 19 + .../state-proto/v2/deprecated_setters.go | 36 + .../state-proto/v2/deprecated_setters_test.go | 27 + beacon-chain/state-proto/v2/field_roots.go | 18 + beacon-chain/state-proto/v2/getters_block.go | 99 +++ .../state-proto/v2/getters_block_test.go | 60 ++ .../state-proto/v2/getters_checkpoint.go | 160 ++++ beacon-chain/state-proto/v2/getters_eth1.go | 91 ++ beacon-chain/state-proto/v2/getters_misc.go | 212 +++++ .../state-proto/v2/getters_participation.go | 53 ++ beacon-chain/state-proto/v2/getters_randao.go | 85 ++ beacon-chain/state-proto/v2/getters_state.go | 126 +++ .../state-proto/v2/getters_sync_committee.go | 69 ++ beacon-chain/state-proto/v2/getters_test.go | 192 +++++ .../state-proto/v2/getters_validator.go | 328 ++++++++ .../v2/getters_validator_test.go | 2 +- beacon-chain/state-proto/v2/proofs.go | 60 ++ .../{state => state-proto}/v2/proofs_test.go | 2 +- beacon-chain/state-proto/v2/setters_block.go | 68 ++ .../state-proto/v2/setters_checkpoint.go | 58 ++ beacon-chain/state-proto/v2/setters_eth1.go | 74 ++ beacon-chain/state-proto/v2/setters_misc.go | 186 +++++ .../state-proto/v2/setters_participation.go | 89 ++ beacon-chain/state-proto/v2/setters_randao.go | 53 ++ beacon-chain/state-proto/v2/setters_state.go | 59 ++ .../state-proto/v2/setters_sync_committee.go | 31 + beacon-chain/state-proto/v2/setters_test.go | 161 ++++ .../state-proto/v2/setters_validator.go | 265 ++++++ beacon-chain/state-proto/v2/state_trie.go | 428 ++++++++++ .../v2/state_trie_test.go | 2 +- beacon-chain/state-proto/v2/types.go | 78 ++ beacon-chain/state-proto/v3/BUILD.bazel | 92 +++ .../state-proto/v3/deprecated_getters.go | 16 + .../state-proto/v3/deprecated_getters_test.go | 19 + .../state-proto/v3/deprecated_setters.go | 31 + .../state-proto/v3/deprecated_setters_test.go | 27 + beacon-chain/state-proto/v3/field_roots.go | 19 + beacon-chain/state-proto/v3/getters_block.go | 99 +++ .../state-proto/v3/getters_block_test.go | 59 ++ .../state-proto/v3/getters_checkpoint.go | 160 ++++ beacon-chain/state-proto/v3/getters_eth1.go | 91 ++ beacon-chain/state-proto/v3/getters_misc.go | 211 +++++ .../state-proto/v3/getters_participation.go | 53 ++ .../state-proto/v3/getters_payload_header.go | 30 + beacon-chain/state-proto/v3/getters_randao.go | 85 ++ beacon-chain/state-proto/v3/getters_state.go | 127 +++ .../state-proto/v3/getters_sync_committee.go | 69 ++ beacon-chain/state-proto/v3/getters_test.go | 192 +++++ .../state-proto/v3/getters_validator.go | 328 ++++++++ .../v3/getters_validator_test.go | 2 +- beacon-chain/state-proto/v3/proofs.go | 60 ++ .../{state => state-proto}/v3/proofs_test.go | 2 +- beacon-chain/state-proto/v3/setters_block.go | 68 ++ .../state-proto/v3/setters_checkpoint.go | 58 ++ beacon-chain/state-proto/v3/setters_eth1.go | 74 ++ beacon-chain/state-proto/v3/setters_misc.go | 186 +++++ .../state-proto/v3/setters_participation.go | 89 ++ .../state-proto/v3/setters_payload_header.go | 16 + beacon-chain/state-proto/v3/setters_randao.go | 53 ++ beacon-chain/state-proto/v3/setters_state.go | 59 ++ .../state-proto/v3/setters_sync_committee.go | 31 + beacon-chain/state-proto/v3/setters_test.go | 184 +++++ .../state-proto/v3/setters_validator.go | 265 ++++++ beacon-chain/state-proto/v3/state_trie.go | 390 +++++++++ .../v3/state_trie_test.go | 2 +- beacon-chain/state-proto/v3/types.go | 77 ++ beacon-chain/sync/BUILD.bazel | 10 +- beacon-chain/sync/initial-sync/BUILD.bazel | 4 +- beacon-chain/sync/options.go | 2 +- .../sync/pending_attestations_queue_test.go | 9 +- .../sync/pending_blocks_queue_test.go | 2 +- beacon-chain/sync/rpc_status_test.go | 2 +- beacon-chain/sync/service.go | 2 +- beacon-chain/sync/service_test.go | 2 +- .../sync/subscriber_beacon_blocks_test.go | 3 +- beacon-chain/sync/validate_aggregate_proof.go | 8 +- .../sync/validate_aggregate_proof_test.go | 12 +- .../sync/validate_attester_slashing_test.go | 5 +- .../sync/validate_beacon_attestation.go | 2 +- .../sync/validate_beacon_attestation_test.go | 3 +- .../sync/validate_beacon_blocks_test.go | 2 +- .../sync/validate_proposer_slashing_test.go | 4 +- .../validate_sync_committee_message_test.go | 8 +- .../validate_sync_contribution_proof_test.go | 33 +- beacon-chain/sync/validate_voluntary_exit.go | 3 +- .../sync/validate_voluntary_exit_test.go | 4 +- encoding/bytesutil/bytes.go | 15 + nogo_config.json | 9 +- proto/eth/v1/BUILD.bazel | 4 +- proto/eth/v2/BUILD.bazel | 4 +- proto/migration/BUILD.bazel | 5 +- proto/migration/v1alpha1_to_v1.go | 33 +- proto/migration/v1alpha1_to_v1_test.go | 89 +- proto/migration/v1alpha1_to_v2.go | 33 +- proto/prysm/v1alpha1/BUILD.bazel | 4 +- proto/testing/BUILD.bazel | 4 +- runtime/interop/BUILD.bazel | 2 +- runtime/interop/generate_genesis_state.go | 4 +- testing/benchmark/BUILD.bazel | 4 +- testing/benchmark/pregen.go | 4 +- testing/endtoend/BUILD.bazel | 2 +- .../endtoend/slasher_simulator_e2e_test.go | 2 +- testing/fuzz/BUILD.bazel | 10 +- testing/fuzz/block_fuzz.go | 4 +- testing/fuzz/state_fuzz.go | 4 +- testing/slasher/simulator/BUILD.bazel | 6 +- .../simulator/attestation_generator.go | 5 +- testing/slasher/simulator/block_generator.go | 5 +- testing/slasher/simulator/simulator.go | 2 +- testing/slasher/simulator/simulator_test.go | 2 +- .../altair/epoch_processing/BUILD.bazel | 4 +- .../effective_balance_updates.go | 2 +- .../epoch_processing/eth1_data_reset.go | 2 +- .../shared/altair/epoch_processing/helpers.go | 8 +- .../historical_roots_update.go | 2 +- .../epoch_processing/inactivity_updates.go | 2 +- .../justification_and_finalization.go | 2 +- .../participation_flag_updates.go | 2 +- .../epoch_processing/randao_mixes_reset.go | 2 +- .../epoch_processing/registry_updates.go | 2 +- .../epoch_processing/rewards_and_penalties.go | 2 +- .../altair/epoch_processing/slashings.go | 2 +- .../epoch_processing/slashings_reset.go | 2 +- .../shared/altair/finality/BUILD.bazel | 4 +- .../shared/altair/finality/finality.go | 6 +- .../spectest/shared/altair/fork/BUILD.bazel | 6 +- .../spectest/shared/altair/fork/transition.go | 8 +- .../shared/altair/fork/upgrade_to_altair.go | 6 +- .../shared/altair/operations/BUILD.bazel | 4 +- .../shared/altair/operations/attestation.go | 2 +- .../altair/operations/attester_slashing.go | 2 +- .../shared/altair/operations/block_header.go | 6 +- .../shared/altair/operations/deposit.go | 2 +- .../shared/altair/operations/helpers.go | 8 +- .../altair/operations/proposer_slashing.go | 2 +- .../altair/operations/sync_committee.go | 2 +- .../altair/operations/voluntary_exit.go | 2 +- .../shared/altair/rewards/BUILD.bazel | 2 +- .../altair/rewards/rewards_penalties.go | 2 +- .../spectest/shared/altair/sanity/BUILD.bazel | 4 +- .../shared/altair/sanity/block_processing.go | 8 +- .../shared/altair/sanity/slot_processing.go | 4 +- .../shared/altair/ssz_static/BUILD.bazel | 2 +- .../shared/altair/ssz_static/ssz_static.go | 2 +- .../phase0/epoch_processing/BUILD.bazel | 4 +- .../effective_balance_updates.go | 2 +- .../epoch_processing/eth1_data_reset.go | 2 +- .../shared/phase0/epoch_processing/helpers.go | 6 +- .../historical_roots_update.go | 2 +- .../justification_and_finalization.go | 2 +- .../participation_record_updates.go | 2 +- .../epoch_processing/randao_mixes_reset.go | 2 +- .../epoch_processing/registry_updates.go | 2 +- .../epoch_processing/rewards_and_penalties.go | 2 +- .../phase0/epoch_processing/slashings.go | 2 +- .../epoch_processing/slashings_reset.go | 2 +- .../shared/phase0/finality/BUILD.bazel | 4 +- .../spectest/shared/phase0/finality/runner.go | 8 +- .../shared/phase0/operations/BUILD.bazel | 4 +- .../shared/phase0/operations/attestation.go | 2 +- .../phase0/operations/attester_slashing.go | 2 +- .../shared/phase0/operations/block_header.go | 6 +- .../shared/phase0/operations/deposit.go | 2 +- .../shared/phase0/operations/helpers.go | 8 +- .../phase0/operations/proposer_slashing.go | 2 +- .../phase0/operations/voluntary_exit.go | 2 +- .../shared/phase0/rewards/BUILD.bazel | 2 +- .../phase0/rewards/rewards_penalties.go | 2 +- .../spectest/shared/phase0/sanity/BUILD.bazel | 4 +- .../shared/phase0/sanity/block_processing.go | 8 +- .../shared/phase0/sanity/slot_processing.go | 4 +- .../shared/phase0/ssz_static/BUILD.bazel | 2 +- .../shared/phase0/ssz_static/ssz_static.go | 2 +- testing/util/BUILD.bazel | 10 +- testing/util/altair.go | 248 ++---- testing/util/attestation.go | 13 +- testing/util/bellatrix.go | 2 +- testing/util/block.go | 2 +- testing/util/deposits.go | 2 +- testing/util/helpers.go | 5 +- testing/util/merge_state.go | 6 +- testing/util/state.go | 117 +-- testing/util/sync_aggregate.go | 5 +- tools/benchmark-files-gen/BUILD.bazel | 4 +- tools/benchmark-files-gen/main.go | 4 +- tools/exploredb/BUILD.bazel | 2 +- tools/exploredb/main.go | 37 +- tools/pcli/BUILD.bazel | 2 +- tools/pcli/main.go | 6 +- 692 files changed, 19948 insertions(+), 2103 deletions(-) create mode 100644 beacon-chain/sharedstate/BUILD.bazel create mode 100644 beacon-chain/sharedstate/prometheus.go rename beacon-chain/{state => state-native}/BUILD.bazel (98%) rename beacon-chain/{state => state-native}/altair.go (100%) rename beacon-chain/{state => state-native}/custom-types/BUILD.bazel (95%) rename beacon-chain/{state => state-native}/custom-types/state_arrays.go (100%) rename beacon-chain/{state => state-native}/custom-types/state_arrays_test.go (100%) rename beacon-chain/{state => state-native}/fieldtrie/BUILD.bazel (74%) rename beacon-chain/{state => state-native}/fieldtrie/field_trie.go (97%) rename beacon-chain/{state => state-native}/fieldtrie/field_trie_helpers.go (88%) rename beacon-chain/{state => state-native}/fieldtrie/field_trie_test.go (67%) create mode 100644 beacon-chain/state-native/fieldtrie/helpers_test.go create mode 100644 beacon-chain/state-native/genesis/BUILD.bazel create mode 100644 beacon-chain/state-native/genesis/genesis.go create mode 100644 beacon-chain/state-native/genesis/genesis_test.go rename beacon-chain/{state => state-native}/genesis/mainnet.ssz.snappy (100%) rename beacon-chain/{state => state-native}/phase0.go (90%) create mode 100644 beacon-chain/state-native/stategen/BUILD.bazel rename beacon-chain/{state => state-native}/stategen/epoch_boundary_state_cache.go (98%) rename beacon-chain/{state => state-native}/stategen/epoch_boundary_state_cache_test.go (91%) rename beacon-chain/{state => state-native}/stategen/errors.go (100%) rename beacon-chain/{state => state-native}/stategen/getter.go (99%) rename beacon-chain/{state => state-native}/stategen/getter_test.go (96%) rename beacon-chain/{state => state-native}/stategen/hot_state_cache.go (97%) create mode 100644 beacon-chain/state-native/stategen/hot_state_cache_test.go rename beacon-chain/{state => state-native}/stategen/init_test.go (100%) rename beacon-chain/{state => state-native}/stategen/log.go (100%) rename beacon-chain/{state => state-native}/stategen/metrics.go (100%) rename beacon-chain/{state => state-native}/stategen/migrate.go (98%) rename beacon-chain/{state => state-native}/stategen/migrate_test.go (98%) rename beacon-chain/{state => state-native}/stategen/mock.go (98%) rename beacon-chain/{state => state-native}/stategen/replay.go (99%) rename beacon-chain/{state => state-native}/stategen/replay_test.go (99%) rename beacon-chain/{state => state-native}/stategen/service.go (98%) rename beacon-chain/{state => state-native}/stategen/service_test.go (94%) rename beacon-chain/{state => state-native}/stategen/setter.go (98%) rename beacon-chain/{state => state-native}/stategen/setter_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/BUILD.bazel (95%) rename beacon-chain/{state => state-native}/stateutil/benchmark_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/block_header_root.go (100%) rename beacon-chain/{state => state-native}/stateutil/eth1_root.go (100%) rename beacon-chain/{state => state-native}/stateutil/field_root_attestation.go (100%) rename beacon-chain/{state => state-native}/stateutil/field_root_eth1.go (100%) rename beacon-chain/{state => state-native}/stateutil/field_root_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/field_root_validator.go (100%) rename beacon-chain/{state => state-native}/stateutil/field_root_vector.go (100%) rename beacon-chain/{state => state-native}/stateutil/participation_bit_root.go (100%) rename beacon-chain/{state => state-native}/stateutil/pending_attestation_root.go (100%) rename beacon-chain/{state => state-native}/stateutil/reference.go (100%) rename beacon-chain/{state => state-native}/stateutil/reference_bench_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/state_hasher.go (100%) rename beacon-chain/{state => state-native}/stateutil/state_root_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/stateutil_test.go (100%) rename beacon-chain/{state => state-native}/stateutil/sync_committee.root.go (100%) rename beacon-chain/{state => state-native}/stateutil/trie_helpers.go (100%) rename beacon-chain/{state => state-native}/stateutil/trie_helpers_test.go (86%) rename beacon-chain/{state => state-native}/stateutil/validator_map_handler.go (100%) rename beacon-chain/{state => state-native}/stateutil/validator_root.go (100%) create mode 100644 beacon-chain/state-native/stateutil/validator_root_test.go create mode 100644 beacon-chain/state-native/types/BUILD.bazel rename beacon-chain/{state => state-native}/types/types.go (100%) rename beacon-chain/{state => state-native}/types/types_test.go (100%) rename beacon-chain/{state => state-native}/v1/BUILD.bazel (87%) rename beacon-chain/{state => state-native}/v1/beacon_state_mainnet.go (90%) rename beacon-chain/{state => state-native}/v1/beacon_state_minimal.go (89%) rename beacon-chain/{state => state-native}/v1/doc.go (100%) rename beacon-chain/{state => state-native}/v1/field_roots.go (91%) rename beacon-chain/{state => state-native}/v1/generated.ssz.go (100%) rename beacon-chain/{state => state-native}/v1/getters_attestation.go (100%) rename beacon-chain/{state => state-native}/v1/getters_attestation_test.go (100%) rename beacon-chain/{state => state-native}/v1/getters_block.go (81%) rename beacon-chain/{state => state-native}/v1/getters_block_test.go (96%) rename beacon-chain/{state => state-native}/v1/getters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v1/getters_eth1.go (100%) rename beacon-chain/{state => state-native}/v1/getters_misc.go (87%) rename beacon-chain/{state => state-native}/v1/getters_randao.go (75%) rename beacon-chain/{state => state-native}/v1/getters_state.go (87%) rename beacon-chain/{state => state-native}/v1/getters_test.go (100%) rename beacon-chain/{state => state-native}/v1/getters_validator.go (99%) create mode 100644 beacon-chain/state-native/v1/getters_validator_test.go rename beacon-chain/{state => state-native}/v1/proofs.go (95%) create mode 100644 beacon-chain/state-native/v1/proofs_test.go rename beacon-chain/{state => state-native}/v1/readonly_validator.go (97%) create mode 100644 beacon-chain/state-native/v1/readonly_validator_test.go rename beacon-chain/{state => state-native}/v1/references_test.go (80%) rename beacon-chain/{state => state-native}/v1/setters_attestation.go (97%) rename beacon-chain/{state => state-native}/v1/setters_attestation_test.go (97%) rename beacon-chain/{state => state-native}/v1/setters_block.go (77%) rename beacon-chain/{state => state-native}/v1/setters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v1/setters_eth1.go (95%) rename beacon-chain/{state => state-native}/v1/setters_misc.go (90%) rename beacon-chain/{state => state-native}/v1/setters_randao.go (71%) rename beacon-chain/{state => state-native}/v1/setters_state.go (75%) rename beacon-chain/{state => state-native}/v1/setters_validator.go (98%) rename beacon-chain/{state => state-native}/v1/state_test.go (98%) rename beacon-chain/{state => state-native}/v1/state_trie.go (96%) rename beacon-chain/{state => state-native}/v1/state_trie_test.go (94%) rename beacon-chain/{state => state-native}/v1/types.go (94%) rename beacon-chain/{state => state-native}/v1/types_test.go (98%) rename beacon-chain/{state => state-native}/v1/unsupported_getters.go (100%) rename beacon-chain/{state => state-native}/v1/unsupported_setters.go (100%) rename beacon-chain/{state => state-native}/v2/BUILD.bazel (84%) rename beacon-chain/{state => state-native}/v2/beacon_state_mainnet.go (90%) rename beacon-chain/{state => state-native}/v2/beacon_state_minimal.go (90%) rename beacon-chain/{state => state-native}/v2/deprecated_getters.go (100%) rename beacon-chain/{state => state-native}/v2/deprecated_getters_test.go (100%) rename beacon-chain/{state => state-native}/v2/deprecated_setters.go (100%) rename beacon-chain/{state => state-native}/v2/deprecated_setters_test.go (100%) rename beacon-chain/{state => state-native}/v2/field_roots.go (91%) rename beacon-chain/{state => state-native}/v2/generated.ssz.go (100%) rename beacon-chain/{state => state-native}/v2/getters_block.go (81%) rename beacon-chain/{state => state-native}/v2/getters_block_test.go (96%) rename beacon-chain/{state => state-native}/v2/getters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v2/getters_eth1.go (100%) rename beacon-chain/{state => state-native}/v2/getters_misc.go (90%) rename beacon-chain/{state => state-native}/v2/getters_participation.go (100%) rename beacon-chain/{state => state-native}/v2/getters_randao.go (75%) rename beacon-chain/{state => state-native}/v2/getters_state.go (88%) rename beacon-chain/{state => state-native}/v2/getters_sync_committee.go (100%) rename beacon-chain/{state => state-native}/v2/getters_test.go (100%) rename beacon-chain/{state => state-native}/v2/getters_validator.go (98%) create mode 100644 beacon-chain/state-native/v2/getters_validator_test.go rename beacon-chain/{state => state-native}/v2/proofs.go (96%) create mode 100644 beacon-chain/state-native/v2/proofs_test.go rename beacon-chain/{state => state-native}/v2/setters_block.go (77%) rename beacon-chain/{state => state-native}/v2/setters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v2/setters_eth1.go (95%) rename beacon-chain/{state => state-native}/v2/setters_misc.go (90%) rename beacon-chain/{state => state-native}/v2/setters_participation.go (97%) rename beacon-chain/{state => state-native}/v2/setters_randao.go (71%) rename beacon-chain/{state => state-native}/v2/setters_state.go (75%) rename beacon-chain/{state => state-native}/v2/setters_sync_committee.go (100%) rename beacon-chain/{state => state-native}/v2/setters_test.go (97%) rename beacon-chain/{state => state-native}/v2/setters_validator.go (98%) rename beacon-chain/{state => state-native}/v2/state_trie.go (96%) create mode 100644 beacon-chain/state-native/v2/state_trie_test.go rename beacon-chain/{state => state-native}/v2/types.go (97%) rename beacon-chain/{state => state-native}/v3/BUILD.bazel (84%) rename beacon-chain/{state => state-native}/v3/beacon_state_mainnet.go (91%) rename beacon-chain/{state => state-native}/v3/beacon_state_minimal.go (91%) rename beacon-chain/{state => state-native}/v3/deprecated_getters.go (100%) rename beacon-chain/{state => state-native}/v3/deprecated_getters_test.go (100%) rename beacon-chain/{state => state-native}/v3/deprecated_setters.go (100%) rename beacon-chain/{state => state-native}/v3/deprecated_setters_test.go (100%) rename beacon-chain/{state => state-native}/v3/field_roots.go (91%) rename beacon-chain/{state => state-native}/v3/generated.ssz.go (100%) rename beacon-chain/{state => state-native}/v3/getters_block.go (81%) rename beacon-chain/{state => state-native}/v3/getters_block_test.go (96%) rename beacon-chain/{state => state-native}/v3/getters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v3/getters_eth1.go (100%) rename beacon-chain/{state => state-native}/v3/getters_misc.go (90%) rename beacon-chain/{state => state-native}/v3/getters_participation.go (100%) rename beacon-chain/{state => state-native}/v3/getters_payload_header.go (100%) rename beacon-chain/{state => state-native}/v3/getters_randao.go (75%) rename beacon-chain/{state => state-native}/v3/getters_state.go (88%) rename beacon-chain/{state => state-native}/v3/getters_sync_committee.go (100%) rename beacon-chain/{state => state-native}/v3/getters_test.go (100%) rename beacon-chain/{state => state-native}/v3/getters_validator.go (98%) create mode 100644 beacon-chain/state-native/v3/getters_validator_test.go rename beacon-chain/{state => state-native}/v3/proofs.go (96%) create mode 100644 beacon-chain/state-native/v3/proofs_test.go rename beacon-chain/{state => state-native}/v3/setters_block.go (77%) rename beacon-chain/{state => state-native}/v3/setters_checkpoint.go (100%) rename beacon-chain/{state => state-native}/v3/setters_eth1.go (95%) rename beacon-chain/{state => state-native}/v3/setters_misc.go (90%) rename beacon-chain/{state => state-native}/v3/setters_participation.go (97%) rename beacon-chain/{state => state-native}/v3/setters_payload_header.go (100%) rename beacon-chain/{state => state-native}/v3/setters_randao.go (71%) rename beacon-chain/{state => state-native}/v3/setters_state.go (75%) rename beacon-chain/{state => state-native}/v3/setters_sync_committee.go (100%) rename beacon-chain/{state => state-native}/v3/setters_test.go (97%) rename beacon-chain/{state => state-native}/v3/setters_validator.go (98%) rename beacon-chain/{state => state-native}/v3/state_trie.go (96%) create mode 100644 beacon-chain/state-native/v3/state_trie_test.go rename beacon-chain/{state => state-native}/v3/types.go (97%) create mode 100644 beacon-chain/state-proto/fieldtrie/BUILD.bazel create mode 100644 beacon-chain/state-proto/fieldtrie/field_trie.go create mode 100644 beacon-chain/state-proto/fieldtrie/field_trie_helpers.go create mode 100644 beacon-chain/state-proto/fieldtrie/field_trie_test.go rename beacon-chain/{state => state-proto}/fieldtrie/helpers_test.go (95%) rename beacon-chain/{state => state-proto}/genesis/BUILD.bazel (88%) rename beacon-chain/{state => state-proto}/genesis/genesis.go (92%) rename beacon-chain/{state => state-proto}/genesis/genesis_test.go (89%) create mode 100644 beacon-chain/state-proto/genesis/mainnet.ssz.snappy rename beacon-chain/{state => state-proto}/stategen/BUILD.bazel (93%) create mode 100644 beacon-chain/state-proto/stategen/epoch_boundary_state_cache.go create mode 100644 beacon-chain/state-proto/stategen/epoch_boundary_state_cache_test.go create mode 100644 beacon-chain/state-proto/stategen/errors.go create mode 100644 beacon-chain/state-proto/stategen/getter.go create mode 100644 beacon-chain/state-proto/stategen/getter_test.go create mode 100644 beacon-chain/state-proto/stategen/hot_state_cache.go rename beacon-chain/{state => state-proto}/stategen/hot_state_cache_test.go (76%) create mode 100644 beacon-chain/state-proto/stategen/init_test.go create mode 100644 beacon-chain/state-proto/stategen/log.go create mode 100644 beacon-chain/state-proto/stategen/metrics.go create mode 100644 beacon-chain/state-proto/stategen/migrate.go create mode 100644 beacon-chain/state-proto/stategen/migrate_test.go create mode 100644 beacon-chain/state-proto/stategen/mock.go create mode 100644 beacon-chain/state-proto/stategen/replay.go create mode 100644 beacon-chain/state-proto/stategen/replay_test.go create mode 100644 beacon-chain/state-proto/stategen/service.go create mode 100644 beacon-chain/state-proto/stategen/service_test.go create mode 100644 beacon-chain/state-proto/stategen/setter.go create mode 100644 beacon-chain/state-proto/stategen/setter_test.go create mode 100644 beacon-chain/state-proto/stateutil/BUILD.bazel create mode 100644 beacon-chain/state-proto/stateutil/benchmark_test.go create mode 100644 beacon-chain/state-proto/stateutil/block_header_root.go create mode 100644 beacon-chain/state-proto/stateutil/eth1_root.go create mode 100644 beacon-chain/state-proto/stateutil/field_root_attestation.go create mode 100644 beacon-chain/state-proto/stateutil/field_root_eth1.go create mode 100644 beacon-chain/state-proto/stateutil/field_root_test.go create mode 100644 beacon-chain/state-proto/stateutil/field_root_validator.go create mode 100644 beacon-chain/state-proto/stateutil/field_root_vector.go create mode 100644 beacon-chain/state-proto/stateutil/participation_bit_root.go create mode 100644 beacon-chain/state-proto/stateutil/pending_attestation_root.go create mode 100644 beacon-chain/state-proto/stateutil/reference.go create mode 100644 beacon-chain/state-proto/stateutil/reference_bench_test.go create mode 100644 beacon-chain/state-proto/stateutil/state_hasher.go create mode 100644 beacon-chain/state-proto/stateutil/state_root_test.go create mode 100644 beacon-chain/state-proto/stateutil/stateutil_test.go create mode 100644 beacon-chain/state-proto/stateutil/sync_committee.root.go create mode 100644 beacon-chain/state-proto/stateutil/trie_helpers.go create mode 100644 beacon-chain/state-proto/stateutil/trie_helpers_test.go create mode 100644 beacon-chain/state-proto/stateutil/validator_map_handler.go create mode 100644 beacon-chain/state-proto/stateutil/validator_root.go rename beacon-chain/{state => state-proto}/stateutil/validator_root_test.go (85%) rename beacon-chain/{state => state-proto}/types/BUILD.bazel (96%) create mode 100644 beacon-chain/state-proto/types/types.go create mode 100644 beacon-chain/state-proto/types/types_test.go create mode 100644 beacon-chain/state-proto/v1/BUILD.bazel create mode 100644 beacon-chain/state-proto/v1/doc.go create mode 100644 beacon-chain/state-proto/v1/field_roots.go create mode 100644 beacon-chain/state-proto/v1/getters_attestation.go create mode 100644 beacon-chain/state-proto/v1/getters_attestation_test.go create mode 100644 beacon-chain/state-proto/v1/getters_block.go create mode 100644 beacon-chain/state-proto/v1/getters_block_test.go create mode 100644 beacon-chain/state-proto/v1/getters_checkpoint.go create mode 100644 beacon-chain/state-proto/v1/getters_eth1.go create mode 100644 beacon-chain/state-proto/v1/getters_misc.go create mode 100644 beacon-chain/state-proto/v1/getters_randao.go create mode 100644 beacon-chain/state-proto/v1/getters_state.go create mode 100644 beacon-chain/state-proto/v1/getters_test.go create mode 100644 beacon-chain/state-proto/v1/getters_validator.go rename beacon-chain/{state => state-proto}/v1/getters_validator_test.go (88%) create mode 100644 beacon-chain/state-proto/v1/proofs.go rename beacon-chain/{state => state-proto}/v1/proofs_test.go (93%) create mode 100644 beacon-chain/state-proto/v1/readonly_validator.go rename beacon-chain/{state => state-proto}/v1/readonly_validator_test.go (97%) create mode 100644 beacon-chain/state-proto/v1/references_test.go create mode 100644 beacon-chain/state-proto/v1/setters_attestation.go create mode 100644 beacon-chain/state-proto/v1/setters_attestation_test.go create mode 100644 beacon-chain/state-proto/v1/setters_block.go create mode 100644 beacon-chain/state-proto/v1/setters_checkpoint.go create mode 100644 beacon-chain/state-proto/v1/setters_eth1.go create mode 100644 beacon-chain/state-proto/v1/setters_misc.go create mode 100644 beacon-chain/state-proto/v1/setters_randao.go create mode 100644 beacon-chain/state-proto/v1/setters_state.go create mode 100644 beacon-chain/state-proto/v1/setters_validator.go create mode 100644 beacon-chain/state-proto/v1/state_test.go create mode 100644 beacon-chain/state-proto/v1/state_trie.go create mode 100644 beacon-chain/state-proto/v1/state_trie_test.go create mode 100644 beacon-chain/state-proto/v1/types.go create mode 100644 beacon-chain/state-proto/v1/types_test.go create mode 100644 beacon-chain/state-proto/v1/unsupported_getters.go create mode 100644 beacon-chain/state-proto/v1/unsupported_setters.go create mode 100644 beacon-chain/state-proto/v2/BUILD.bazel create mode 100644 beacon-chain/state-proto/v2/deprecated_getters.go create mode 100644 beacon-chain/state-proto/v2/deprecated_getters_test.go create mode 100644 beacon-chain/state-proto/v2/deprecated_setters.go create mode 100644 beacon-chain/state-proto/v2/deprecated_setters_test.go create mode 100644 beacon-chain/state-proto/v2/field_roots.go create mode 100644 beacon-chain/state-proto/v2/getters_block.go create mode 100644 beacon-chain/state-proto/v2/getters_block_test.go create mode 100644 beacon-chain/state-proto/v2/getters_checkpoint.go create mode 100644 beacon-chain/state-proto/v2/getters_eth1.go create mode 100644 beacon-chain/state-proto/v2/getters_misc.go create mode 100644 beacon-chain/state-proto/v2/getters_participation.go create mode 100644 beacon-chain/state-proto/v2/getters_randao.go create mode 100644 beacon-chain/state-proto/v2/getters_state.go create mode 100644 beacon-chain/state-proto/v2/getters_sync_committee.go create mode 100644 beacon-chain/state-proto/v2/getters_test.go create mode 100644 beacon-chain/state-proto/v2/getters_validator.go rename beacon-chain/{state => state-proto}/v2/getters_validator_test.go (88%) create mode 100644 beacon-chain/state-proto/v2/proofs.go rename beacon-chain/{state => state-proto}/v2/proofs_test.go (97%) create mode 100644 beacon-chain/state-proto/v2/setters_block.go create mode 100644 beacon-chain/state-proto/v2/setters_checkpoint.go create mode 100644 beacon-chain/state-proto/v2/setters_eth1.go create mode 100644 beacon-chain/state-proto/v2/setters_misc.go create mode 100644 beacon-chain/state-proto/v2/setters_participation.go create mode 100644 beacon-chain/state-proto/v2/setters_randao.go create mode 100644 beacon-chain/state-proto/v2/setters_state.go create mode 100644 beacon-chain/state-proto/v2/setters_sync_committee.go create mode 100644 beacon-chain/state-proto/v2/setters_test.go create mode 100644 beacon-chain/state-proto/v2/setters_validator.go create mode 100644 beacon-chain/state-proto/v2/state_trie.go rename beacon-chain/{state => state-proto}/v2/state_trie_test.go (98%) create mode 100644 beacon-chain/state-proto/v2/types.go create mode 100644 beacon-chain/state-proto/v3/BUILD.bazel create mode 100644 beacon-chain/state-proto/v3/deprecated_getters.go create mode 100644 beacon-chain/state-proto/v3/deprecated_getters_test.go create mode 100644 beacon-chain/state-proto/v3/deprecated_setters.go create mode 100644 beacon-chain/state-proto/v3/deprecated_setters_test.go create mode 100644 beacon-chain/state-proto/v3/field_roots.go create mode 100644 beacon-chain/state-proto/v3/getters_block.go create mode 100644 beacon-chain/state-proto/v3/getters_block_test.go create mode 100644 beacon-chain/state-proto/v3/getters_checkpoint.go create mode 100644 beacon-chain/state-proto/v3/getters_eth1.go create mode 100644 beacon-chain/state-proto/v3/getters_misc.go create mode 100644 beacon-chain/state-proto/v3/getters_participation.go create mode 100644 beacon-chain/state-proto/v3/getters_payload_header.go create mode 100644 beacon-chain/state-proto/v3/getters_randao.go create mode 100644 beacon-chain/state-proto/v3/getters_state.go create mode 100644 beacon-chain/state-proto/v3/getters_sync_committee.go create mode 100644 beacon-chain/state-proto/v3/getters_test.go create mode 100644 beacon-chain/state-proto/v3/getters_validator.go rename beacon-chain/{state => state-proto}/v3/getters_validator_test.go (88%) create mode 100644 beacon-chain/state-proto/v3/proofs.go rename beacon-chain/{state => state-proto}/v3/proofs_test.go (97%) create mode 100644 beacon-chain/state-proto/v3/setters_block.go create mode 100644 beacon-chain/state-proto/v3/setters_checkpoint.go create mode 100644 beacon-chain/state-proto/v3/setters_eth1.go create mode 100644 beacon-chain/state-proto/v3/setters_misc.go create mode 100644 beacon-chain/state-proto/v3/setters_participation.go create mode 100644 beacon-chain/state-proto/v3/setters_payload_header.go create mode 100644 beacon-chain/state-proto/v3/setters_randao.go create mode 100644 beacon-chain/state-proto/v3/setters_state.go create mode 100644 beacon-chain/state-proto/v3/setters_sync_committee.go create mode 100644 beacon-chain/state-proto/v3/setters_test.go create mode 100644 beacon-chain/state-proto/v3/setters_validator.go create mode 100644 beacon-chain/state-proto/v3/state_trie.go rename beacon-chain/{state => state-proto}/v3/state_trie_test.go (98%) create mode 100644 beacon-chain/state-proto/v3/types.go diff --git a/beacon-chain/blockchain/BUILD.bazel b/beacon-chain/blockchain/BUILD.bazel index 9e942c5590..8c3414adaa 100644 --- a/beacon-chain/blockchain/BUILD.bazel +++ b/beacon-chain/blockchain/BUILD.bazel @@ -50,8 +50,8 @@ go_library( "//beacon-chain/operations/voluntaryexits:go_default_library", "//beacon-chain/p2p:go_default_library", "//beacon-chain/powchain:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//cmd/beacon-chain/flags:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", @@ -118,8 +118,8 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/p2p:go_default_library", "//beacon-chain/powchain:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", diff --git a/beacon-chain/blockchain/chain_info.go b/beacon-chain/blockchain/chain_info.go index 3c2178f9f7..5afc763898 100644 --- a/beacon-chain/blockchain/chain_info.go +++ b/beacon-chain/blockchain/chain_info.go @@ -7,9 +7,10 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "go.opencensus.io/trace" @@ -239,7 +240,7 @@ func (s *Service) GenesisValidatorRoot() [32]byte { if !s.hasHeadState() { return [32]byte{} } - return s.head.state.GenesisValidatorRoot() + return bytesutil.ToBytes32(s.head.state.GenesisValidatorRoot()) } // CurrentFork retrieves the latest fork information of the beacon chain. diff --git a/beacon-chain/blockchain/chain_info_norace_test.go b/beacon-chain/blockchain/chain_info_norace_test.go index 2448100675..6cac02c8aa 100644 --- a/beacon-chain/blockchain/chain_info_norace_test.go +++ b/beacon-chain/blockchain/chain_info_norace_test.go @@ -5,7 +5,7 @@ import ( "testing" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/blockchain/chain_info_test.go b/beacon-chain/blockchain/chain_info_test.go index 1baaf164ba..43cf1c1326 100644 --- a/beacon-chain/blockchain/chain_info_test.go +++ b/beacon-chain/blockchain/chain_info_test.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -154,7 +154,7 @@ func TestHeadState_CanRetrieve(t *testing.T) { c.head = &head{state: s} headState, err := c.HeadState(context.Background()) require.NoError(t, err) - assert.DeepEqual(t, headState.ToProtoUnsafe(), s.ToProtoUnsafe(), "Incorrect head state received") + assert.DeepEqual(t, headState.InnerStateUnsafe(), s.InnerStateUnsafe(), "Incorrect head state received") } func TestGenesisTime_CanRetrieve(t *testing.T) { @@ -275,7 +275,7 @@ func TestService_HeadGenesisValidatorRoot(t *testing.T) { c.head = &head{state: s} root = c.HeadGenesisValidatorRoot() - require.DeepEqual(t, root, s.GenesisValidatorRoot()) + require.DeepEqual(t, root[:], s.GenesisValidatorRoot()) } func TestService_ProtoArrayStore(t *testing.T) { diff --git a/beacon-chain/blockchain/head.go b/beacon-chain/blockchain/head.go index 6f81cd872d..dca0a05cea 100644 --- a/beacon-chain/blockchain/head.go +++ b/beacon-chain/blockchain/head.go @@ -11,7 +11,7 @@ import ( statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -253,7 +253,7 @@ func (s *Service) headState(ctx context.Context) state.BeaconState { // This returns the genesis validator root of the head state. // This is a lock free version. func (s *Service) headGenesisValidatorRoot() [32]byte { - return s.head.state.GenesisValidatorRoot() + return bytesutil.ToBytes32(s.head.state.GenesisValidatorRoot()) } // This returns the validator referenced by the provided index in diff --git a/beacon-chain/blockchain/head_sync_committee_info.go b/beacon-chain/blockchain/head_sync_committee_info.go index 5fbf214482..1dd84bec45 100644 --- a/beacon-chain/blockchain/head_sync_committee_info.go +++ b/beacon-chain/blockchain/head_sync_committee_info.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/time/slots" @@ -130,8 +130,7 @@ func (s *Service) domainWithHeadState(ctx context.Context, slot types.Slot, doma if err != nil { return nil, err } - gvRoot := headState.GenesisValidatorRoot() - return signing.Domain(headState.Fork(), slots.ToEpoch(headState.Slot()), domain, gvRoot[:]) + return signing.Domain(headState.Fork(), slots.ToEpoch(headState.Slot()), domain, headState.GenesisValidatorRoot()) } // returns the head state that is advanced up to `slot`. It utilizes the cache `syncCommitteeHeadState` by retrieving using `slot` as key. diff --git a/beacon-chain/blockchain/head_sync_committee_info_test.go b/beacon-chain/blockchain/head_sync_committee_info_test.go index 6e7a59fd76..fb1a6d2c89 100644 --- a/beacon-chain/blockchain/head_sync_committee_info_test.go +++ b/beacon-chain/blockchain/head_sync_committee_info_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" @@ -122,8 +122,7 @@ func TestService_HeadSyncCommitteeDomain(t *testing.T) { c := &Service{} c.head = &head{state: s} - gvr := s.GenesisValidatorRoot() - wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainSyncCommittee, s.GenesisValidatorRoot()) require.NoError(t, err) d, err := c.HeadSyncCommitteeDomain(context.Background(), 0) @@ -137,8 +136,7 @@ func TestService_HeadSyncContributionProofDomain(t *testing.T) { c := &Service{} c.head = &head{state: s} - gvr := s.GenesisValidatorRoot() - wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainContributionAndProof, s.GenesisValidatorRoot()) require.NoError(t, err) d, err := c.HeadSyncContributionProofDomain(context.Background(), 0) @@ -152,8 +150,7 @@ func TestService_HeadSyncSelectionProofDomain(t *testing.T) { c := &Service{} c.head = &head{state: s} - gvr := s.GenesisValidatorRoot() - wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + wanted, err := signing.Domain(s.Fork(), slots.ToEpoch(s.Slot()), params.BeaconConfig().DomainSyncCommitteeSelectionProof, s.GenesisValidatorRoot()) require.NoError(t, err) d, err := c.HeadSyncSelectionProofDomain(context.Background(), 0) diff --git a/beacon-chain/blockchain/head_test.go b/beacon-chain/blockchain/head_test.go index 5a21371102..dd5baa4e7f 100644 --- a/beacon-chain/blockchain/head_test.go +++ b/beacon-chain/blockchain/head_test.go @@ -71,7 +71,7 @@ func TestSaveHead_Different(t *testing.T) { require.NoError(t, err) assert.DeepEqual(t, cachedRoot, newRoot[:], "Head did not change") assert.DeepEqual(t, newHeadSignedBlock, service.headBlock().Proto(), "Head did not change") - assert.DeepSSZEqual(t, headState.ToProto(), service.headState(ctx).ToProto(), "Head did not change") + assert.DeepSSZEqual(t, headState.CloneInnerState(), service.headState(ctx).CloneInnerState(), "Head did not change") } func TestSaveHead_Different_Reorg(t *testing.T) { @@ -116,7 +116,7 @@ func TestSaveHead_Different_Reorg(t *testing.T) { t.Error("Head did not change") } assert.DeepEqual(t, newHeadSignedBlock, service.headBlock().Proto(), "Head did not change") - assert.DeepSSZEqual(t, headState.ToProto(), service.headState(ctx).ToProto(), "Head did not change") + assert.DeepSSZEqual(t, headState.CloneInnerState(), service.headState(ctx).CloneInnerState(), "Head did not change") require.LogsContain(t, hook, "Chain reorg occurred") } diff --git a/beacon-chain/blockchain/info_test.go b/beacon-chain/blockchain/info_test.go index 607dde95b9..cb52e50eb7 100644 --- a/beacon-chain/blockchain/info_test.go +++ b/beacon-chain/blockchain/info_test.go @@ -8,7 +8,7 @@ import ( testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/blockchain/metrics.go b/beacon-chain/blockchain/metrics.go index 3508487d31..addd1fce75 100644 --- a/beacon-chain/blockchain/metrics.go +++ b/beacon-chain/blockchain/metrics.go @@ -9,7 +9,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -263,7 +263,7 @@ func reportEpochMetrics(ctx context.Context, postState, headState state.BeaconSt return err } default: - return errors.Errorf("invalid state type provided: %T", headState.ToProtoUnsafe()) + return errors.Errorf("invalid state type provided: %T", headState.InnerStateUnsafe()) } prevEpochActiveBalances.Set(float64(b.ActivePrevEpoch)) prevEpochSourceBalances.Set(float64(b.PrevEpochAttested)) diff --git a/beacon-chain/blockchain/mock_test.go b/beacon-chain/blockchain/mock_test.go index 8a6cf27f76..5adce88187 100644 --- a/beacon-chain/blockchain/mock_test.go +++ b/beacon-chain/blockchain/mock_test.go @@ -7,8 +7,8 @@ import ( testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ) func testServiceOptsWithDB(t *testing.T) []Option { diff --git a/beacon-chain/blockchain/options.go b/beacon-chain/blockchain/options.go index abc604e64d..d1ae4ab38c 100644 --- a/beacon-chain/blockchain/options.go +++ b/beacon-chain/blockchain/options.go @@ -11,8 +11,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/blockchain/process_attestation_helpers.go b/beacon-chain/blockchain/process_attestation_helpers.go index 20f81d2c31..3525e7763d 100644 --- a/beacon-chain/blockchain/process_attestation_helpers.go +++ b/beacon-chain/blockchain/process_attestation_helpers.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/async" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/blockchain/process_attestation_test.go b/beacon-chain/blockchain/process_attestation_test.go index 475d2c3f2b..05b106134e 100644 --- a/beacon-chain/blockchain/process_attestation_test.go +++ b/beacon-chain/blockchain/process_attestation_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -261,7 +261,7 @@ func TestStore_UpdateCheckpointState(t *testing.T) { cached, err = service.checkpointStateCache.StateByCheckpoint(newCheckpoint) require.NoError(t, err) - require.DeepSSZEqual(t, returned.ToProtoUnsafe(), cached.ToProtoUnsafe()) + require.DeepSSZEqual(t, returned.InnerStateUnsafe(), cached.InnerStateUnsafe()) } func TestAttEpoch_MatchPrevEpoch(t *testing.T) { diff --git a/beacon-chain/blockchain/process_block.go b/beacon-chain/blockchain/process_block.go index 3f8300253a..4af9c7bf23 100644 --- a/beacon-chain/blockchain/process_block.go +++ b/beacon-chain/blockchain/process_block.go @@ -11,7 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/blockchain/process_block_helpers.go b/beacon-chain/blockchain/process_block_helpers.go index 8b60e96834..878d3040f3 100644 --- a/beacon-chain/blockchain/process_block_helpers.go +++ b/beacon-chain/blockchain/process_block_helpers.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/monitoring/tracing" diff --git a/beacon-chain/blockchain/process_block_test.go b/beacon-chain/blockchain/process_block_test.go index 00072bb0a2..f525c7fc85 100644 --- a/beacon-chain/blockchain/process_block_test.go +++ b/beacon-chain/blockchain/process_block_test.go @@ -17,9 +17,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/db" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/features" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/blockchain/receive_attestation.go b/beacon-chain/blockchain/receive_attestation.go index e7f4dd0fd6..a4c5dc2ed0 100644 --- a/beacon-chain/blockchain/receive_attestation.go +++ b/beacon-chain/blockchain/receive_attestation.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/async/event" "github.com/prysmaticlabs/prysm/beacon-chain/core/feed" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/blockchain/receive_block_test.go b/beacon-chain/blockchain/receive_block_test.go index 9c537e97bf..dd43957037 100644 --- a/beacon-chain/blockchain/receive_block_test.go +++ b/beacon-chain/blockchain/receive_block_test.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/blockchain/service.go b/beacon-chain/blockchain/service.go index 5fb9386329..f6b9f048ba 100644 --- a/beacon-chain/blockchain/service.go +++ b/beacon-chain/blockchain/service.go @@ -26,8 +26,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -217,12 +217,11 @@ func (s *Service) startFromSavedState(saved state.BeaconState) error { return errors.Wrap(err, "could not verify initial checkpoint provided for chain sync") } - gvr := saved.GenesisValidatorRoot() s.cfg.StateNotifier.StateFeed().Send(&feed.Event{ Type: statefeed.Initialized, Data: &statefeed.InitializedData{ StartTime: s.genesisTime, - GenesisValidatorsRoot: gvr[:], + GenesisValidatorsRoot: saved.GenesisValidatorRoot(), }, }) @@ -380,12 +379,11 @@ func (s *Service) onPowchainStart(ctx context.Context, genesisTime time.Time) { // We send out a state initialized event to the rest of the services // running in the beacon node. - genesisValidatorRoot := initializedState.GenesisValidatorRoot() s.cfg.StateNotifier.StateFeed().Send(&feed.Event{ Type: statefeed.Initialized, Data: &statefeed.InitializedData{ StartTime: genesisTime, - GenesisValidatorsRoot: genesisValidatorRoot[:], + GenesisValidatorsRoot: initializedState.GenesisValidatorRoot(), }, }) } diff --git a/beacon-chain/blockchain/service_test.go b/beacon-chain/blockchain/service_test.go index c480be7974..f0c75393a7 100644 --- a/beacon-chain/blockchain/service_test.go +++ b/beacon-chain/blockchain/service_test.go @@ -22,8 +22,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -77,7 +77,7 @@ func setupBeaconChain(t *testing.T, beaconDB db.Database) *Service { var web3Service *powchain.Service var err error bState, _ := util.DeterministicGenesisState(t, 10) - pbState, err := v1.ProtobufBeaconState(bState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(bState.InnerStateUnsafe()) require.NoError(t, err) err = beaconDB.SavePowchainData(ctx, ðpb.ETH1ChainData{ BeaconState: pbState, @@ -277,7 +277,7 @@ func TestChainService_InitializeChainInfo(t *testing.T) { headState, err := util.NewBeaconState() require.NoError(t, err) require.NoError(t, headState.SetSlot(finalizedSlot)) - require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash)) + require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash[:])) headRoot, err := headBlock.Block.HashTreeRoot() require.NoError(t, err) require.NoError(t, beaconDB.SaveState(ctx, headState, headRoot)) @@ -294,7 +294,7 @@ func TestChainService_InitializeChainInfo(t *testing.T) { assert.DeepEqual(t, headBlock, headBlk.Proto(), "Head block incorrect") s, err := c.HeadState(ctx) require.NoError(t, err) - assert.DeepSSZEqual(t, headState.ToProtoUnsafe(), s.ToProtoUnsafe(), "Head state incorrect") + assert.DeepSSZEqual(t, headState.InnerStateUnsafe(), s.InnerStateUnsafe(), "Head state incorrect") assert.Equal(t, c.HeadSlot(), headBlock.Block.Slot, "Head slot incorrect") r, err := c.HeadRoot(context.Background()) require.NoError(t, err) @@ -321,7 +321,7 @@ func TestChainService_InitializeChainInfo_SetHeadAtGenesis(t *testing.T) { headState, err := util.NewBeaconState() require.NoError(t, err) require.NoError(t, headState.SetSlot(finalizedSlot)) - require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash)) + require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash[:])) headRoot, err := headBlock.Block.HashTreeRoot() require.NoError(t, err) require.NoError(t, beaconDB.SaveState(ctx, headState, headRoot)) @@ -334,7 +334,7 @@ func TestChainService_InitializeChainInfo_SetHeadAtGenesis(t *testing.T) { require.NoError(t, c.startFromSavedState(headState)) s, err := c.HeadState(ctx) require.NoError(t, err) - assert.DeepSSZEqual(t, headState.ToProtoUnsafe(), s.ToProtoUnsafe(), "Head state incorrect") + assert.DeepSSZEqual(t, headState.InnerStateUnsafe(), s.InnerStateUnsafe(), "Head state incorrect") assert.Equal(t, genesisRoot, c.originBlockRoot, "Genesis block root incorrect") assert.DeepEqual(t, genesis, c.head.block.Proto()) } @@ -377,7 +377,7 @@ func TestChainService_InitializeChainInfo_HeadSync(t *testing.T) { headState, err := util.NewBeaconState() require.NoError(t, err) require.NoError(t, headState.SetSlot(headBlock.Block.Slot)) - require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash)) + require.NoError(t, headState.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash[:])) require.NoError(t, beaconDB.SaveState(ctx, headState, genesisRoot)) require.NoError(t, beaconDB.SaveState(ctx, headState, finalizedRoot)) require.NoError(t, beaconDB.SaveState(ctx, headState, headRoot)) @@ -394,7 +394,7 @@ func TestChainService_InitializeChainInfo_HeadSync(t *testing.T) { require.NoError(t, c.startFromSavedState(headState)) s, err := c.HeadState(ctx) require.NoError(t, err) - assert.DeepSSZEqual(t, headState.ToProtoUnsafe(), s.ToProtoUnsafe(), "Head state incorrect") + assert.DeepSSZEqual(t, headState.InnerStateUnsafe(), s.InnerStateUnsafe(), "Head state incorrect") assert.Equal(t, genesisRoot, c.originBlockRoot, "Genesis block root incorrect") // Since head sync is not triggered, chain is initialized to the last finalization checkpoint. assert.DeepEqual(t, finalizedBlock, c.head.block.Proto()) @@ -415,7 +415,7 @@ func TestChainService_InitializeChainInfo_HeadSync(t *testing.T) { require.NoError(t, c.initializeHeadFromDB(ctx)) s, err = c.HeadState(ctx) require.NoError(t, err) - assert.DeepSSZEqual(t, headState.ToProtoUnsafe(), s.ToProtoUnsafe(), "Head state incorrect") + assert.DeepSSZEqual(t, headState.InnerStateUnsafe(), s.InnerStateUnsafe(), "Head state incorrect") assert.Equal(t, genesisRoot, c.originBlockRoot, "Genesis block root incorrect") // Head slot is far beyond the latest finalized checkpoint, head sync is triggered. assert.DeepEqual(t, headBlock, c.head.block.Proto()) diff --git a/beacon-chain/blockchain/state_balance_cache.go b/beacon-chain/blockchain/state_balance_cache.go index 700c0cc66c..fdd98111a9 100644 --- a/beacon-chain/blockchain/state_balance_cache.go +++ b/beacon-chain/blockchain/state_balance_cache.go @@ -7,8 +7,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ) var errNilStateFromStategen = errors.New("justified state can't be nil") diff --git a/beacon-chain/blockchain/state_balance_cache_test.go b/beacon-chain/blockchain/state_balance_cache_test.go index e41f350e52..993096ac85 100644 --- a/beacon-chain/blockchain/state_balance_cache_test.go +++ b/beacon-chain/blockchain/state_balance_cache_test.go @@ -7,8 +7,8 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/blockchain/testing/BUILD.bazel b/beacon-chain/blockchain/testing/BUILD.bazel index d16619eddd..85afc7cc1e 100644 --- a/beacon-chain/blockchain/testing/BUILD.bazel +++ b/beacon-chain/blockchain/testing/BUILD.bazel @@ -20,8 +20,8 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/forkchoice/protoarray:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", diff --git a/beacon-chain/blockchain/testing/mock.go b/beacon-chain/blockchain/testing/mock.go index 85b396717c..c3fecc9c65 100644 --- a/beacon-chain/blockchain/testing/mock.go +++ b/beacon-chain/blockchain/testing/mock.go @@ -19,8 +19,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/forkchoice/protoarray" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -215,11 +215,7 @@ func (s *ChainService) ReceiveBlockBatch(ctx context.Context, blks []block.Signe // ReceiveBlock mocks ReceiveBlock method in chain service. func (s *ChainService) ReceiveBlock(ctx context.Context, block block.SignedBeaconBlock, _ [32]byte) error { if s.State == nil { - st, err := v1.Initialize() - if err != nil { - return err - } - s.State = st + s.State = &v1.BeaconState{} } if !bytes.Equal(s.Root, block.Block().ParentRoot()) { return errors.Errorf("wanted %#x but got %#x", s.Root, block.Block().ParentRoot()) diff --git a/beacon-chain/cache/BUILD.bazel b/beacon-chain/cache/BUILD.bazel index 392dd4daa4..f946a00fe0 100644 --- a/beacon-chain/cache/BUILD.bazel +++ b/beacon-chain/cache/BUILD.bazel @@ -37,10 +37,10 @@ go_library( "//tools:__subpackages__", ], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//cache/lru:go_default_library", "//config/features:go_default_library", "//config/params:go_default_library", @@ -80,10 +80,10 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/cache/active_balance.go b/beacon-chain/cache/active_balance.go index 8d56767f27..0afbb4e048 100644 --- a/beacon-chain/cache/active_balance.go +++ b/beacon-chain/cache/active_balance.go @@ -11,7 +11,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ethTypes "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" @@ -108,7 +108,7 @@ func balanceCacheKey(st state.ReadOnlyBeaconState) (string, error) { // Mix in current epoch b := make([]byte, 8) binary.LittleEndian.PutUint64(b, uint64(currentEpoch)) - key := append(r[:], b...) + key := append(r, b...) // Mix in validator count b = make([]byte, 8) diff --git a/beacon-chain/cache/active_balance_disabled.go b/beacon-chain/cache/active_balance_disabled.go index 2796a285dc..c27eb12a45 100644 --- a/beacon-chain/cache/active_balance_disabled.go +++ b/beacon-chain/cache/active_balance_disabled.go @@ -6,7 +6,7 @@ import ( "sync" lru "github.com/hashicorp/golang-lru" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ) // FakeBalanceCache is a fake struct with 1 LRU cache for looking up balance by epoch. diff --git a/beacon-chain/cache/active_balance_test.go b/beacon-chain/cache/active_balance_test.go index 2d6faa5edb..d8fc986366 100644 --- a/beacon-chain/cache/active_balance_test.go +++ b/beacon-chain/cache/active_balance_test.go @@ -6,7 +6,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - state "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + state "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/cache/checkpoint_state.go b/beacon-chain/cache/checkpoint_state.go index 0cf8bb03b4..38f09f392a 100644 --- a/beacon-chain/cache/checkpoint_state.go +++ b/beacon-chain/cache/checkpoint_state.go @@ -6,7 +6,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "github.com/prysmaticlabs/prysm/crypto/hash" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/cache/checkpoint_state_test.go b/beacon-chain/cache/checkpoint_state_test.go index b5212e1533..1e76e19543 100644 --- a/beacon-chain/cache/checkpoint_state_test.go +++ b/beacon-chain/cache/checkpoint_state_test.go @@ -4,8 +4,8 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -33,9 +33,9 @@ func TestCheckpointStateCache_StateByCheckpoint(t *testing.T) { s, err = cache.StateByCheckpoint(cp1) require.NoError(t, err) - pbState1, err := v1.ProtobufBeaconState(s.ToProtoUnsafe()) + pbState1, err := v1.ProtobufBeaconState(s.InnerStateUnsafe()) require.NoError(t, err) - pbstate, err := v1.ProtobufBeaconState(st.ToProtoUnsafe()) + pbstate, err := v1.ProtobufBeaconState(st.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState1, pbstate) { t.Error("incorrectly cached state") @@ -50,11 +50,11 @@ func TestCheckpointStateCache_StateByCheckpoint(t *testing.T) { s, err = cache.StateByCheckpoint(cp2) require.NoError(t, err) - assert.DeepEqual(t, st2.ToProto(), s.ToProto(), "incorrectly cached state") + assert.DeepEqual(t, st2.CloneInnerState(), s.CloneInnerState(), "incorrectly cached state") s, err = cache.StateByCheckpoint(cp1) require.NoError(t, err) - assert.DeepEqual(t, st.ToProto(), s.ToProto(), "incorrectly cached state") + assert.DeepEqual(t, st.CloneInnerState(), s.CloneInnerState(), "incorrectly cached state") } func TestCheckpointStateCache_MaxSize(t *testing.T) { diff --git a/beacon-chain/cache/skip_slot_cache.go b/beacon-chain/cache/skip_slot_cache.go index 1088c42781..cbefe8cefd 100644 --- a/beacon-chain/cache/skip_slot_cache.go +++ b/beacon-chain/cache/skip_slot_cache.go @@ -9,7 +9,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "go.opencensus.io/trace" ) diff --git a/beacon-chain/cache/skip_slot_cache_test.go b/beacon-chain/cache/skip_slot_cache_test.go index efcba6dd4c..5026a22090 100644 --- a/beacon-chain/cache/skip_slot_cache_test.go +++ b/beacon-chain/cache/skip_slot_cache_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" @@ -33,5 +33,5 @@ func TestSkipSlotCache_RoundTrip(t *testing.T) { res, err := c.Get(ctx, r) require.NoError(t, err) - assert.DeepEqual(t, res.ToProto(), s.ToProto(), "Expected equal protos to return from cache") + assert.DeepEqual(t, res.CloneInnerState(), s.CloneInnerState(), "Expected equal protos to return from cache") } diff --git a/beacon-chain/cache/sync_committee.go b/beacon-chain/cache/sync_committee.go index baf15c11d2..5b4900cafe 100644 --- a/beacon-chain/cache/sync_committee.go +++ b/beacon-chain/cache/sync_committee.go @@ -8,7 +8,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "k8s.io/client-go/tools/cache" ) diff --git a/beacon-chain/cache/sync_committee_disabled.go b/beacon-chain/cache/sync_committee_disabled.go index 68da51f3c4..7363c25603 100644 --- a/beacon-chain/cache/sync_committee_disabled.go +++ b/beacon-chain/cache/sync_committee_disabled.go @@ -4,7 +4,7 @@ package cache import ( types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ) // FakeSyncCommitteeCache is a fake `SyncCommitteeCache` to satisfy fuzzing. diff --git a/beacon-chain/cache/sync_committee_head_state.go b/beacon-chain/cache/sync_committee_head_state.go index 6a2357e95c..13e3e53fe0 100644 --- a/beacon-chain/cache/sync_committee_head_state.go +++ b/beacon-chain/cache/sync_committee_head_state.go @@ -5,10 +5,10 @@ import ( lru "github.com/hashicorp/golang-lru" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" - "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" ) diff --git a/beacon-chain/cache/sync_committee_head_state_test.go b/beacon-chain/cache/sync_committee_head_state_test.go index 5dfa0b6253..0a50993926 100644 --- a/beacon-chain/cache/sync_committee_head_state_test.go +++ b/beacon-chain/cache/sync_committee_head_state_test.go @@ -4,10 +4,10 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" - v3 "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/core/altair/BUILD.bazel b/beacon-chain/core/altair/BUILD.bazel index 55be78b357..a579885958 100644 --- a/beacon-chain/core/altair/BUILD.bazel +++ b/beacon-chain/core/altair/BUILD.bazel @@ -28,8 +28,8 @@ go_library( "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", @@ -70,9 +70,9 @@ go_test( "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", diff --git a/beacon-chain/core/altair/attestation.go b/beacon-chain/core/altair/attestation.go index 3fe78afa3f..dd5a00f4ce 100644 --- a/beacon-chain/core/altair/attestation.go +++ b/beacon-chain/core/altair/attestation.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/attestation" diff --git a/beacon-chain/core/altair/attestation_test.go b/beacon-chain/core/altair/attestation_test.go index 676474975f..0eff9a79bf 100644 --- a/beacon-chain/core/altair/attestation_test.go +++ b/beacon-chain/core/altair/attestation_test.go @@ -12,8 +12,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/core/altair/block.go b/beacon-chain/core/altair/block.go index 99effce4a4..9c6c368849 100644 --- a/beacon-chain/core/altair/block.go +++ b/beacon-chain/core/altair/block.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" p2pType "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -102,8 +102,7 @@ func FilterSyncCommitteeVotes(s state.BeaconStateAltair, sync *ethpb.SyncAggrega // VerifySyncCommitteeSig verifies sync committee signature `syncSig` is valid with respect to public keys `syncKeys`. func VerifySyncCommitteeSig(s state.BeaconStateAltair, syncKeys []bls.PublicKey, syncSig []byte) error { ps := slots.PrevSlot(s.Slot()) - gvRoot := s.GenesisValidatorRoot() - d, err := signing.Domain(s.Fork(), slots.ToEpoch(ps), params.BeaconConfig().DomainSyncCommittee, gvRoot[:]) + d, err := signing.Domain(s.Fork(), slots.ToEpoch(ps), params.BeaconConfig().DomainSyncCommittee, s.GenesisValidatorRoot()) if err != nil { return err } diff --git a/beacon-chain/core/altair/deposit.go b/beacon-chain/core/altair/deposit.go index 8f55162834..291f26c080 100644 --- a/beacon-chain/core/altair/deposit.go +++ b/beacon-chain/core/altair/deposit.go @@ -5,7 +5,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/core/altair/deposit_fuzz_test.go b/beacon-chain/core/altair/deposit_fuzz_test.go index c440d8ae2f..2878b0b9ed 100644 --- a/beacon-chain/core/altair/deposit_fuzz_test.go +++ b/beacon-chain/core/altair/deposit_fuzz_test.go @@ -6,7 +6,7 @@ import ( fuzz "github.com/google/gofuzz" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" ) diff --git a/beacon-chain/core/altair/deposit_test.go b/beacon-chain/core/altair/deposit_test.go index 64e9c57bee..ac19d7aba6 100644 --- a/beacon-chain/core/altair/deposit_test.go +++ b/beacon-chain/core/altair/deposit_test.go @@ -6,7 +6,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/core/altair/epoch_precompute.go b/beacon-chain/core/altair/epoch_precompute.go index 69f551d1db..55d1df9c17 100644 --- a/beacon-chain/core/altair/epoch_precompute.go +++ b/beacon-chain/core/altair/epoch_precompute.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" "github.com/prysmaticlabs/prysm/runtime/version" diff --git a/beacon-chain/core/altair/epoch_precompute_test.go b/beacon-chain/core/altair/epoch_precompute_test.go index b13c495123..6003fc8f1c 100644 --- a/beacon-chain/core/altair/epoch_precompute_test.go +++ b/beacon-chain/core/altair/epoch_precompute_test.go @@ -7,9 +7,9 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" - v3 "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/altair/epoch_spec.go b/beacon-chain/core/altair/epoch_spec.go index 2720ea0eb9..fbdf76d594 100644 --- a/beacon-chain/core/altair/epoch_spec.go +++ b/beacon-chain/core/altair/epoch_spec.go @@ -5,7 +5,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" log "github.com/sirupsen/logrus" ) diff --git a/beacon-chain/core/altair/epoch_spec_test.go b/beacon-chain/core/altair/epoch_spec_test.go index 00036a8fd9..52548b3746 100644 --- a/beacon-chain/core/altair/epoch_spec_test.go +++ b/beacon-chain/core/altair/epoch_spec_test.go @@ -11,7 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/altair/reward.go b/beacon-chain/core/altair/reward.go index c7e6660e19..2e8d00fa16 100644 --- a/beacon-chain/core/altair/reward.go +++ b/beacon-chain/core/altair/reward.go @@ -4,7 +4,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" ) diff --git a/beacon-chain/core/altair/reward_test.go b/beacon-chain/core/altair/reward_test.go index a7a9372126..2409344261 100644 --- a/beacon-chain/core/altair/reward_test.go +++ b/beacon-chain/core/altair/reward_test.go @@ -6,7 +6,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" diff --git a/beacon-chain/core/altair/sync_committee.go b/beacon-chain/core/altair/sync_committee.go index b334c6e08a..5a123abbe9 100644 --- a/beacon-chain/core/altair/sync_committee.go +++ b/beacon-chain/core/altair/sync_committee.go @@ -9,7 +9,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/core/altair/sync_committee_test.go b/beacon-chain/core/altair/sync_committee_test.go index 79e1096873..b0febbdbda 100644 --- a/beacon-chain/core/altair/sync_committee_test.go +++ b/beacon-chain/core/altair/sync_committee_test.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/altair/transition.go b/beacon-chain/core/altair/transition.go index 810c6e28f3..aca5a9fb5c 100644 --- a/beacon-chain/core/altair/transition.go +++ b/beacon-chain/core/altair/transition.go @@ -6,7 +6,7 @@ import ( "github.com/pkg/errors" e "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/runtime/version" "go.opencensus.io/trace" diff --git a/beacon-chain/core/altair/upgrade.go b/beacon-chain/core/altair/upgrade.go index 077c2672f9..7f794d8e75 100644 --- a/beacon-chain/core/altair/upgrade.go +++ b/beacon-chain/core/altair/upgrade.go @@ -3,11 +3,10 @@ package altair import ( "context" - "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - statealtair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + statealtair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/attestation" @@ -68,82 +67,39 @@ func UpgradeToAltair(ctx context.Context, state state.BeaconState) (state.Beacon numValidators := state.NumValidators() - newState, err := statealtair.Initialize() + s := ðpb.BeaconStateAltair{ + GenesisTime: state.GenesisTime(), + GenesisValidatorsRoot: state.GenesisValidatorRoot(), + Slot: state.Slot(), + Fork: ðpb.Fork{ + PreviousVersion: state.Fork().CurrentVersion, + CurrentVersion: params.BeaconConfig().AltairForkVersion, + Epoch: epoch, + }, + LatestBlockHeader: state.LatestBlockHeader(), + BlockRoots: state.BlockRoots(), + StateRoots: state.StateRoots(), + HistoricalRoots: state.HistoricalRoots(), + Eth1Data: state.Eth1Data(), + Eth1DataVotes: state.Eth1DataVotes(), + Eth1DepositIndex: state.Eth1DepositIndex(), + Validators: state.Validators(), + Balances: state.Balances(), + RandaoMixes: state.RandaoMixes(), + Slashings: state.Slashings(), + PreviousEpochParticipation: make([]byte, numValidators), + CurrentEpochParticipation: make([]byte, numValidators), + JustificationBits: state.JustificationBits(), + PreviousJustifiedCheckpoint: state.PreviousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: state.CurrentJustifiedCheckpoint(), + FinalizedCheckpoint: state.FinalizedCheckpoint(), + InactivityScores: make([]uint64, numValidators), + } + + newState, err := statealtair.InitializeFromProto(s) if err != nil { return nil, err } - - if err = newState.SetGenesisTime(state.GenesisTime()); err != nil { - return nil, errors.Wrap(err, "could not set genesis time") - } - if err = newState.SetGenesisValidatorRoot(state.GenesisValidatorRoot()); err != nil { - return nil, errors.Wrap(err, "could not set genesis validators root") - } - if err = newState.SetSlot(state.Slot()); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = newState.SetFork(ðpb.Fork{ - PreviousVersion: state.Fork().CurrentVersion, - CurrentVersion: params.BeaconConfig().AltairForkVersion, - Epoch: epoch, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = newState.SetLatestBlockHeader(state.LatestBlockHeader()); err != nil { - return nil, errors.Wrap(err, "could not set latest block header") - } - if err = newState.SetBlockRoots(state.BlockRoots()); err != nil { - return nil, errors.Wrap(err, "could not set block roots") - } - if err = newState.SetStateRoots(state.StateRoots()); err != nil { - return nil, errors.Wrap(err, "could not set state roots") - } - if err = newState.SetHistoricalRoots(state.HistoricalRoots()); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = newState.SetEth1Data(state.Eth1Data()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = newState.SetEth1DataVotes(state.Eth1DataVotes()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = newState.SetEth1DepositIndex(state.Eth1DepositIndex()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 deposit index") - } - if err = newState.SetValidators(state.Validators()); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = newState.SetBalances(state.Balances()); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = newState.SetRandaoMixes(state.RandaoMixes()); err != nil { - return nil, errors.Wrap(err, "could not set randao mixes") - } - if err = newState.SetSlashings(state.Slashings()); err != nil { - return nil, errors.Wrap(err, "could not set slashings") - } - if err = newState.SetJustificationBits(state.JustificationBits()); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } - if err = newState.SetPreviousParticipationBits(make([]byte, numValidators)); err != nil { - return nil, errors.Wrap(err, "could not set previous participation bits") - } - if err = newState.SetCurrentParticipationBits(make([]byte, numValidators)); err != nil { - return nil, errors.Wrap(err, "could not set current participation bits") - } - if err = newState.SetInactivityScores(make([]uint64, numValidators)); err != nil { - return nil, errors.Wrap(err, "could not set inactivity scores") - } - if err = newState.SetPreviousJustifiedCheckpoint(state.PreviousJustifiedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set previous justified checkpoint") - } - if err = newState.SetCurrentJustifiedCheckpoint(state.CurrentJustifiedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set current justified checkpoint") - } - if err = newState.SetFinalizedCheckpoint(state.FinalizedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set finalized checkpoint") - } - prevEpochAtts, err := state.PreviousEpochAttestations() if err != nil { return nil, err diff --git a/beacon-chain/core/altair/upgrade_test.go b/beacon-chain/core/altair/upgrade_test.go index 44e0203220..9ac1c71a42 100644 --- a/beacon-chain/core/altair/upgrade_test.go +++ b/beacon-chain/core/altair/upgrade_test.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/attestation" diff --git a/beacon-chain/core/blocks/BUILD.bazel b/beacon-chain/core/blocks/BUILD.bazel index ee1eea3923..8a0da67f84 100644 --- a/beacon-chain/core/blocks/BUILD.bazel +++ b/beacon-chain/core/blocks/BUILD.bazel @@ -29,7 +29,7 @@ go_library( "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/validators:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//container/slice:go_default_library", @@ -84,8 +84,8 @@ go_test( "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/validators:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", diff --git a/beacon-chain/core/blocks/attestation.go b/beacon-chain/core/blocks/attestation.go index 0491e5aa1f..c12896fb19 100644 --- a/beacon-chain/core/blocks/attestation.go +++ b/beacon-chain/core/blocks/attestation.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -204,12 +204,11 @@ func VerifyIndexedAttestation(ctx context.Context, beaconState state.ReadOnlyBea if err := attestation.IsValidAttestationIndices(ctx, indexedAtt); err != nil { return err } - gvRoot := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), indexedAtt.Data.Target.Epoch, params.BeaconConfig().DomainBeaconAttester, - gvRoot[:], + beaconState.GenesisValidatorRoot(), ) if err != nil { return err diff --git a/beacon-chain/core/blocks/attestation_regression_test.go b/beacon-chain/core/blocks/attestation_regression_test.go index 21779a3054..b3b208dd79 100644 --- a/beacon-chain/core/blocks/attestation_regression_test.go +++ b/beacon-chain/core/blocks/attestation_regression_test.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/blocks/attestation_test.go b/beacon-chain/core/blocks/attestation_test.go index d0bd792a61..63f827b607 100644 --- a/beacon-chain/core/blocks/attestation_test.go +++ b/beacon-chain/core/blocks/attestation_test.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -416,7 +416,7 @@ func TestVerifyAttestations_HandlesPlannedFork(t *testing.T) { }, }) gvr := st.GenesisValidatorRoot() - prevDomain, err := signing.Domain(st.Fork(), st.Fork().Epoch-1, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + prevDomain, err := signing.Domain(st.Fork(), st.Fork().Epoch-1, params.BeaconConfig().DomainBeaconAttester, gvr) require.NoError(t, err) root, err := signing.ComputeSigningRoot(att1.Data, prevDomain) require.NoError(t, err) @@ -436,7 +436,7 @@ func TestVerifyAttestations_HandlesPlannedFork(t *testing.T) { CommitteeIndex: 1, }, }) - currDomain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + currDomain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, gvr) require.NoError(t, err) root, err = signing.ComputeSigningRoot(att2.Data, currDomain) require.NoError(t, err) @@ -475,8 +475,7 @@ func TestRetrieveAttestationSignatureSet_VerifiesMultipleAttestations(t *testing Slot: 1, }, }) - gvr := st.GenesisValidatorRoot() - domain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, st.GenesisValidatorRoot()) require.NoError(t, err) root, err := signing.ComputeSigningRoot(att1.Data, domain) require.NoError(t, err) @@ -540,8 +539,7 @@ func TestRetrieveAttestationSignatureSet_AcrossFork(t *testing.T) { Slot: 1, }, }) - gvr := st.GenesisValidatorRoot() - domain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(st.Fork(), st.Fork().Epoch, params.BeaconConfig().DomainBeaconAttester, st.GenesisValidatorRoot()) require.NoError(t, err) root, err := signing.ComputeSigningRoot(att1.Data, domain) require.NoError(t, err) diff --git a/beacon-chain/core/blocks/attester_slashing.go b/beacon-chain/core/blocks/attester_slashing.go index c558561ff3..0ea381fd68 100644 --- a/beacon-chain/core/blocks/attester_slashing.go +++ b/beacon-chain/core/blocks/attester_slashing.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/slice" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/blocks/attester_slashing_test.go b/beacon-chain/core/blocks/attester_slashing_test.go index 4d46242d2d..e7e260a93f 100644 --- a/beacon-chain/core/blocks/attester_slashing_test.go +++ b/beacon-chain/core/blocks/attester_slashing_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -108,8 +108,7 @@ func TestProcessAttesterSlashings_AppliesCorrectStatus(t *testing.T) { }, AttestingIndices: []uint64{0, 1}, }) - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) signingRoot, err := signing.ComputeSigningRoot(att1.Data, domain) assert.NoError(t, err, "Could not get signing root of beacon block header") @@ -178,8 +177,7 @@ func TestProcessAttesterSlashings_AppliesCorrectStatusAltair(t *testing.T) { }, AttestingIndices: []uint64{0, 1}, }) - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) signingRoot, err := signing.ComputeSigningRoot(att1.Data, domain) assert.NoError(t, err, "Could not get signing root of beacon block header") @@ -248,8 +246,7 @@ func TestProcessAttesterSlashings_AppliesCorrectStatusMerge(t *testing.T) { }, AttestingIndices: []uint64{0, 1}, }) - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) signingRoot, err := signing.ComputeSigningRoot(att1.Data, domain) assert.NoError(t, err, "Could not get signing root of beacon block header") diff --git a/beacon-chain/core/blocks/block_operations_fuzz_test.go b/beacon-chain/core/blocks/block_operations_fuzz_test.go index 687fdbea98..33da95bacd 100644 --- a/beacon-chain/core/blocks/block_operations_fuzz_test.go +++ b/beacon-chain/core/blocks/block_operations_fuzz_test.go @@ -7,7 +7,7 @@ import ( fuzz "github.com/google/gofuzz" types "github.com/prysmaticlabs/eth2-types" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -74,8 +74,7 @@ func TestFuzzverifyDepositDataSigningRoot_10000(_ *testing.T) { func TestFuzzProcessEth1DataInBlock_10000(t *testing.T) { fuzzer := fuzz.NewWithSeed(0) e := ðpb.Eth1Data{} - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} for i := 0; i < 10000; i++ { fuzzer.Fuzz(state) fuzzer.Fuzz(e) diff --git a/beacon-chain/core/blocks/block_regression_test.go b/beacon-chain/core/blocks/block_regression_test.go index 18b2e3f33f..b5187ce915 100644 --- a/beacon-chain/core/blocks/block_regression_test.go +++ b/beacon-chain/core/blocks/block_regression_test.go @@ -44,8 +44,7 @@ func TestProcessAttesterSlashings_RegressionSlashableIndices(t *testing.T) { AttestingIndices: setA, Signature: make([]byte, 96), } - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) signingRoot, err := signing.ComputeSigningRoot(att1.Data, domain) require.NoError(t, err, "Could not get signing root of beacon block header") diff --git a/beacon-chain/core/blocks/deposit.go b/beacon-chain/core/blocks/deposit.go index 9864d7598e..310ce5e664 100644 --- a/beacon-chain/core/blocks/deposit.go +++ b/beacon-chain/core/blocks/deposit.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/contracts/deposit" diff --git a/beacon-chain/core/blocks/deposit_test.go b/beacon-chain/core/blocks/deposit_test.go index 98f7092cee..3eea944f48 100644 --- a/beacon-chain/core/blocks/deposit_test.go +++ b/beacon-chain/core/blocks/deposit_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" diff --git a/beacon-chain/core/blocks/eth1_data.go b/beacon-chain/core/blocks/eth1_data.go index 93d6871cf0..5f9fbefe9a 100644 --- a/beacon-chain/core/blocks/eth1_data.go +++ b/beacon-chain/core/blocks/eth1_data.go @@ -5,7 +5,7 @@ import ( "context" "errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/core/blocks/eth1_data_test.go b/beacon-chain/core/blocks/eth1_data_test.go index 1682abcfd0..7708aecad6 100644 --- a/beacon-chain/core/blocks/eth1_data_test.go +++ b/beacon-chain/core/blocks/eth1_data_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/blocks/exit.go b/beacon-chain/core/blocks/exit.go index 6dd8aa3b83..db4fc5a245 100644 --- a/beacon-chain/core/blocks/exit.go +++ b/beacon-chain/core/blocks/exit.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/time/slots" @@ -57,8 +57,7 @@ func ProcessVoluntaryExits( if err != nil { return nil, err } - gvRoot := beaconState.GenesisValidatorRoot() - if err := VerifyExitAndSignature(val, beaconState.Slot(), beaconState.Fork(), exit, gvRoot[:]); err != nil { + if err := VerifyExitAndSignature(val, beaconState.Slot(), beaconState.Fork(), exit, beaconState.GenesisValidatorRoot()); err != nil { return nil, errors.Wrapf(err, "could not verify exit %d", idx) } beaconState, err = v.InitiateValidatorExit(ctx, beaconState, exit.Exit.ValidatorIndex) diff --git a/beacon-chain/core/blocks/exit_test.go b/beacon-chain/core/blocks/exit_test.go index 3beca254b3..8fef26032d 100644 --- a/beacon-chain/core/blocks/exit_test.go +++ b/beacon-chain/core/blocks/exit_test.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/blocks/header.go b/beacon-chain/core/blocks/header.go index e7a039e686..28ac55c6a8 100644 --- a/beacon-chain/core/blocks/header.go +++ b/beacon-chain/core/blocks/header.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" diff --git a/beacon-chain/core/blocks/payload.go b/beacon-chain/core/blocks/payload.go index 34eedfa5ad..69ba7cce31 100644 --- a/beacon-chain/core/blocks/payload.go +++ b/beacon-chain/core/blocks/payload.go @@ -6,7 +6,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/encoding/ssz" diff --git a/beacon-chain/core/blocks/proposer_slashing.go b/beacon-chain/core/blocks/proposer_slashing.go index 4bb1120c23..3eb82348ec 100644 --- a/beacon-chain/core/blocks/proposer_slashing.go +++ b/beacon-chain/core/blocks/proposer_slashing.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime/version" diff --git a/beacon-chain/core/blocks/proposer_slashing_regression_test.go b/beacon-chain/core/blocks/proposer_slashing_regression_test.go index 02e181c1a6..22f973c512 100644 --- a/beacon-chain/core/blocks/proposer_slashing_regression_test.go +++ b/beacon-chain/core/blocks/proposer_slashing_regression_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" ) diff --git a/beacon-chain/core/blocks/proposer_slashing_test.go b/beacon-chain/core/blocks/proposer_slashing_test.go index 0f3f177ae0..951e935d98 100644 --- a/beacon-chain/core/blocks/proposer_slashing_test.go +++ b/beacon-chain/core/blocks/proposer_slashing_test.go @@ -9,8 +9,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -378,8 +378,7 @@ func TestVerifyProposerSlashing(t *testing.T) { t.Run(tt.name, func(t *testing.T) { sk := sks[tt.args.slashing.Header_1.Header.ProposerIndex] - gvr := tt.args.beaconState.GenesisValidatorRoot() - d, err := signing.Domain(tt.args.beaconState.Fork(), slots.ToEpoch(tt.args.slashing.Header_1.Header.Slot), params.BeaconConfig().DomainBeaconProposer, gvr[:]) + d, err := signing.Domain(tt.args.beaconState.Fork(), slots.ToEpoch(tt.args.slashing.Header_1.Header.Slot), params.BeaconConfig().DomainBeaconProposer, tt.args.beaconState.GenesisValidatorRoot()) require.NoError(t, err) if tt.args.slashing.Header_1.Signature == nil { sr, err := signing.ComputeSigningRoot(tt.args.slashing.Header_1.Header, d) diff --git a/beacon-chain/core/blocks/randao.go b/beacon-chain/core/blocks/randao.go index 0123fa52bb..9e6741f51a 100644 --- a/beacon-chain/core/blocks/randao.go +++ b/beacon-chain/core/blocks/randao.go @@ -5,7 +5,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" diff --git a/beacon-chain/core/blocks/randao_test.go b/beacon-chain/core/blocks/randao_test.go index 98ffaa4da2..758490458a 100644 --- a/beacon-chain/core/blocks/randao_test.go +++ b/beacon-chain/core/blocks/randao_test.go @@ -26,8 +26,7 @@ func TestProcessRandao_IncorrectProposerFailsVerification(t *testing.T) { epoch := types.Epoch(0) buf := make([]byte, 32) binary.LittleEndian.PutUint64(buf, uint64(epoch)) - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), epoch, params.BeaconConfig().DomainRandao, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), epoch, params.BeaconConfig().DomainRandao, beaconState.GenesisValidatorRoot()) require.NoError(t, err) root, err := (ðpb.SigningData{ObjectRoot: buf, Domain: domain}).HashTreeRoot() require.NoError(t, err) diff --git a/beacon-chain/core/blocks/signature.go b/beacon-chain/core/blocks/signature.go index b4f4b0e5ea..5ca0cbbf2a 100644 --- a/beacon-chain/core/blocks/signature.go +++ b/beacon-chain/core/blocks/signature.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/network/forks" @@ -68,8 +68,7 @@ func VerifyBlockSignature(beaconState state.ReadOnlyBeaconState, sig []byte, rootFunc func() ([32]byte, error)) error { currentEpoch := slots.ToEpoch(beaconState.Slot()) - gvRoot := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot()) if err != nil { return err } @@ -84,8 +83,7 @@ func VerifyBlockSignature(beaconState state.ReadOnlyBeaconState, // VerifyBlockHeaderSignature verifies the proposer signature of a beacon block header. func VerifyBlockHeaderSignature(beaconState state.BeaconState, header *ethpb.SignedBeaconBlockHeader) error { currentEpoch := slots.ToEpoch(beaconState.Slot()) - gvRoot := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot()) if err != nil { return err } @@ -106,8 +104,7 @@ func VerifyBlockSignatureUsingCurrentFork(beaconState state.ReadOnlyBeaconState, if err != nil { return err } - gvRoot := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(fork, currentEpoch, params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(fork, currentEpoch, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot()) if err != nil { return err } @@ -125,8 +122,7 @@ func BlockSignatureBatch(beaconState state.ReadOnlyBeaconState, sig []byte, rootFunc func() ([32]byte, error)) (*bls.SignatureBatch, error) { currentEpoch := slots.ToEpoch(beaconState.Slot()) - gvRoot := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot()) if err != nil { return nil, err } @@ -168,8 +164,7 @@ func randaoSigningData(ctx context.Context, beaconState state.ReadOnlyBeaconStat buf := make([]byte, 32) binary.LittleEndian.PutUint64(buf, uint64(currentEpoch)) - gvRoot := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainRandao, gvRoot[:]) + domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainRandao, beaconState.GenesisValidatorRoot()) if err != nil { return nil, nil, nil, err } @@ -253,7 +248,7 @@ func AttestationSignatureBatch(ctx context.Context, beaconState state.ReadOnlyBe // Check attestations from before the fork. if fork.Epoch > 0 && len(preForkAtts) > 0 { // Check to prevent underflow and there is valid attestations to create sig batch. - prevDomain, err := signing.Domain(fork, fork.Epoch-1, dt, gvr[:]) + prevDomain, err := signing.Domain(fork, fork.Epoch-1, dt, gvr) if err != nil { return nil, err } @@ -272,7 +267,7 @@ func AttestationSignatureBatch(ctx context.Context, beaconState state.ReadOnlyBe if len(postForkAtts) > 0 { // Then check attestations from after the fork. - currDomain, err := signing.Domain(fork, fork.Epoch, dt, gvr[:]) + currDomain, err := signing.Domain(fork, fork.Epoch, dt, gvr) if err != nil { return nil, err } diff --git a/beacon-chain/core/blocks/signature_test.go b/beacon-chain/core/blocks/signature_test.go index b1c3933d63..62acc4f1fb 100644 --- a/beacon-chain/core/blocks/signature_test.go +++ b/beacon-chain/core/blocks/signature_test.go @@ -37,12 +37,11 @@ func TestVerifyBlockHeaderSignature(t *testing.T) { ProposerIndex: 0, }, }) - gvr := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconProposer, - gvr[:], + beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) htr, err := blockHeader.Header.HashTreeRoot() @@ -78,8 +77,7 @@ func TestVerifyBlockSignatureUsingCurrentFork(t *testing.T) { CurrentVersion: params.BeaconConfig().AltairForkVersion, PreviousVersion: params.BeaconConfig().GenesisForkVersion, } - gvr := bState.GenesisValidatorRoot() - domain, err := signing.Domain(fData, 100, params.BeaconConfig().DomainBeaconProposer, gvr[:]) + domain, err := signing.Domain(fData, 100, params.BeaconConfig().DomainBeaconProposer, bState.GenesisValidatorRoot()) assert.NoError(t, err) rt, err := signing.ComputeSigningRoot(altairBlk.Block, domain) assert.NoError(t, err) diff --git a/beacon-chain/core/epoch/BUILD.bazel b/beacon-chain/core/epoch/BUILD.bazel index c22a561580..026b65b04d 100644 --- a/beacon-chain/core/epoch/BUILD.bazel +++ b/beacon-chain/core/epoch/BUILD.bazel @@ -12,10 +12,9 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/validators:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/features:go_default_library", "//config/params:go_default_library", - "//encoding/bytesutil:go_default_library", "//math:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/attestation:go_default_library", @@ -35,8 +34,8 @@ go_test( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/core/epoch/epoch_processing.go b/beacon-chain/core/epoch/epoch_processing.go index 896010f70f..799983c671 100644 --- a/beacon-chain/core/epoch/epoch_processing.go +++ b/beacon-chain/core/epoch/epoch_processing.go @@ -14,10 +14,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" - "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/math" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/attestation" @@ -359,7 +358,7 @@ func ProcessRandaoMixesReset(state state.BeaconState) (state.BeaconState, error) if err != nil { return nil, err } - if err := state.UpdateRandaoMixesAtIndex(uint64(nextEpoch%randaoMixLength), bytesutil.ToBytes32(mix)); err != nil { + if err := state.UpdateRandaoMixesAtIndex(uint64(nextEpoch%randaoMixLength), mix); err != nil { return nil, err } @@ -386,13 +385,13 @@ func ProcessHistoricalRootsUpdate(state state.BeaconState) (state.BeaconState, e bRoots := make([][]byte, len(blockRoots)) for i := range bRoots { tmp := blockRoots[i] - bRoots[i] = tmp[:] + bRoots[i] = tmp } stateRoots := state.StateRoots() sRoots := make([][]byte, len(stateRoots)) for i := range sRoots { tmp := stateRoots[i] - sRoots[i] = tmp[:] + sRoots[i] = tmp } historicalBatch := ðpb.HistoricalBatch{ BlockRoots: bRoots, diff --git a/beacon-chain/core/epoch/epoch_processing_fuzz_test.go b/beacon-chain/core/epoch/epoch_processing_fuzz_test.go index aa081c20dc..17c4ac31a7 100644 --- a/beacon-chain/core/epoch/epoch_processing_fuzz_test.go +++ b/beacon-chain/core/epoch/epoch_processing_fuzz_test.go @@ -4,7 +4,7 @@ import ( "testing" fuzz "github.com/google/gofuzz" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" ) diff --git a/beacon-chain/core/epoch/epoch_processing_test.go b/beacon-chain/core/epoch/epoch_processing_test.go index 7f15c9c952..135485173f 100644 --- a/beacon-chain/core/epoch/epoch_processing_test.go +++ b/beacon-chain/core/epoch/epoch_processing_test.go @@ -11,8 +11,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -256,7 +256,7 @@ func TestProcessFinalUpdates_CanProcess(t *testing.T) { slashings[ce] = 0 require.NoError(t, s.SetSlashings(slashings)) mixes := s.RandaoMixes() - mixes[ce] = [32]byte{'A'} + mixes[ce] = []byte{'A'} require.NoError(t, s.SetRandaoMixes(mixes)) newS, err := epoch.ProcessFinalUpdates(s) require.NoError(t, err) diff --git a/beacon-chain/core/epoch/precompute/BUILD.bazel b/beacon-chain/core/epoch/precompute/BUILD.bazel index a857eb7686..989775848b 100644 --- a/beacon-chain/core/epoch/precompute/BUILD.bazel +++ b/beacon-chain/core/epoch/precompute/BUILD.bazel @@ -18,7 +18,7 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//math:go_default_library", "//monitoring/tracing:go_default_library", @@ -46,8 +46,8 @@ go_test( "//beacon-chain/core/epoch:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//math:go_default_library", diff --git a/beacon-chain/core/epoch/precompute/attestation.go b/beacon-chain/core/epoch/precompute/attestation.go index b549634534..699680bf89 100644 --- a/beacon-chain/core/epoch/precompute/attestation.go +++ b/beacon-chain/core/epoch/precompute/attestation.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/monitoring/tracing" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/epoch/precompute/attestation_test.go b/beacon-chain/core/epoch/precompute/attestation_test.go index af55015d50..0b16eb6385 100644 --- a/beacon-chain/core/epoch/precompute/attestation_test.go +++ b/beacon-chain/core/epoch/precompute/attestation_test.go @@ -101,7 +101,7 @@ func TestSameHead(t *testing.T) { Target: ðpb.Checkpoint{Epoch: 0}}} r := [32]byte{'A'} br := beaconState.BlockRoots() - br[0] = r + br[0] = r[:] require.NoError(t, beaconState.SetBlockRoots(br)) att.Data.BeaconBlockRoot = r[:] same, err := precompute.SameHead(beaconState, ðpb.PendingAttestation{Data: att.Data}) @@ -121,7 +121,7 @@ func TestSameTarget(t *testing.T) { Target: ðpb.Checkpoint{Epoch: 0}}} r := [32]byte{'A'} br := beaconState.BlockRoots() - br[0] = r + br[0] = r[:] require.NoError(t, beaconState.SetBlockRoots(br)) att.Data.Target.Root = r[:] same, err := precompute.SameTarget(beaconState, ðpb.PendingAttestation{Data: att.Data}, 0) @@ -141,7 +141,7 @@ func TestAttestedPrevEpoch(t *testing.T) { Target: ðpb.Checkpoint{Epoch: 0}}} r := [32]byte{'A'} br := beaconState.BlockRoots() - br[0] = r + br[0] = r[:] require.NoError(t, beaconState.SetBlockRoots(br)) att.Data.Target.Root = r[:] att.Data.BeaconBlockRoot = r[:] @@ -160,7 +160,7 @@ func TestAttestedCurrentEpoch(t *testing.T) { r := [32]byte{'A'} br := beaconState.BlockRoots() - br[params.BeaconConfig().SlotsPerEpoch] = r + br[params.BeaconConfig().SlotsPerEpoch] = r[:] require.NoError(t, beaconState.SetBlockRoots(br)) att.Data.Target.Root = r[:] att.Data.BeaconBlockRoot = r[:] @@ -190,7 +190,7 @@ func TestProcessAttestations(t *testing.T) { att1.Data.BeaconBlockRoot = rt[:] br := beaconState.BlockRoots() newRt := [32]byte{'B'} - br[0] = newRt + br[0] = newRt[:] require.NoError(t, beaconState.SetBlockRoots(br)) att2.Data.Target.Root = newRt[:] att2.Data.BeaconBlockRoot = newRt[:] diff --git a/beacon-chain/core/epoch/precompute/justification_finalization.go b/beacon-chain/core/epoch/precompute/justification_finalization.go index 1c71d23363..5b8f6eaf9c 100644 --- a/beacon-chain/core/epoch/precompute/justification_finalization.go +++ b/beacon-chain/core/epoch/precompute/justification_finalization.go @@ -4,7 +4,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/time/slots" ) diff --git a/beacon-chain/core/epoch/precompute/justification_finalization_test.go b/beacon-chain/core/epoch/precompute/justification_finalization_test.go index c877d92d70..3fd7fca676 100644 --- a/beacon-chain/core/epoch/precompute/justification_finalization_test.go +++ b/beacon-chain/core/epoch/precompute/justification_finalization_test.go @@ -6,7 +6,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/epoch/precompute/new.go b/beacon-chain/core/epoch/precompute/new.go index a41d35c3b3..bd41d05642 100644 --- a/beacon-chain/core/epoch/precompute/new.go +++ b/beacon-chain/core/epoch/precompute/new.go @@ -9,7 +9,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "go.opencensus.io/trace" ) diff --git a/beacon-chain/core/epoch/precompute/new_test.go b/beacon-chain/core/epoch/precompute/new_test.go index fa8c8bc650..6ad45ab3b3 100644 --- a/beacon-chain/core/epoch/precompute/new_test.go +++ b/beacon-chain/core/epoch/precompute/new_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/epoch/precompute/reward_penalty.go b/beacon-chain/core/epoch/precompute/reward_penalty.go index aaf004748d..9dfdc232d5 100644 --- a/beacon-chain/core/epoch/precompute/reward_penalty.go +++ b/beacon-chain/core/epoch/precompute/reward_penalty.go @@ -5,7 +5,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" ) diff --git a/beacon-chain/core/epoch/precompute/reward_penalty_test.go b/beacon-chain/core/epoch/precompute/reward_penalty_test.go index 73f4a60a2b..8f53d4ee5c 100644 --- a/beacon-chain/core/epoch/precompute/reward_penalty_test.go +++ b/beacon-chain/core/epoch/precompute/reward_penalty_test.go @@ -10,8 +10,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" diff --git a/beacon-chain/core/epoch/precompute/slashing.go b/beacon-chain/core/epoch/precompute/slashing.go index 698da324b2..5c8fd36938 100644 --- a/beacon-chain/core/epoch/precompute/slashing.go +++ b/beacon-chain/core/epoch/precompute/slashing.go @@ -4,7 +4,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/epoch/precompute/slashing_test.go b/beacon-chain/core/epoch/precompute/slashing_test.go index a8af9a7307..22e6b86607 100644 --- a/beacon-chain/core/epoch/precompute/slashing_test.go +++ b/beacon-chain/core/epoch/precompute/slashing_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/execution/BUILD.bazel b/beacon-chain/core/execution/BUILD.bazel index 367e9d1fa8..8721fc2f3d 100644 --- a/beacon-chain/core/execution/BUILD.bazel +++ b/beacon-chain/core/execution/BUILD.bazel @@ -7,11 +7,10 @@ go_library( visibility = ["//beacon-chain:__subpackages__"], deps = [ "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", - "@com_github_pkg_errors//:go_default_library", ], ) diff --git a/beacon-chain/core/execution/upgrade.go b/beacon-chain/core/execution/upgrade.go index 204d7336bb..2f60458352 100644 --- a/beacon-chain/core/execution/upgrade.go +++ b/beacon-chain/core/execution/upgrade.go @@ -3,10 +3,9 @@ package execution import ( "context" - "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - statemerge "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -37,104 +36,51 @@ func UpgradeToMerge(ctx context.Context, state state.BeaconState) (state.BeaconS return nil, err } - newState, err := statemerge.Initialize() - if err != nil { - return nil, err + s := ðpb.BeaconStateMerge{ + GenesisTime: state.GenesisTime(), + GenesisValidatorsRoot: state.GenesisValidatorRoot(), + Slot: state.Slot(), + Fork: ðpb.Fork{ + PreviousVersion: state.Fork().CurrentVersion, + CurrentVersion: params.BeaconConfig().BellatrixForkVersion, + Epoch: epoch, + }, + LatestBlockHeader: state.LatestBlockHeader(), + BlockRoots: state.BlockRoots(), + StateRoots: state.StateRoots(), + HistoricalRoots: state.HistoricalRoots(), + Eth1Data: state.Eth1Data(), + Eth1DataVotes: state.Eth1DataVotes(), + Eth1DepositIndex: state.Eth1DepositIndex(), + Validators: state.Validators(), + Balances: state.Balances(), + RandaoMixes: state.RandaoMixes(), + Slashings: state.Slashings(), + PreviousEpochParticipation: prevEpochParticipation, + CurrentEpochParticipation: currentEpochParticipation, + JustificationBits: state.JustificationBits(), + PreviousJustifiedCheckpoint: state.PreviousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: state.CurrentJustifiedCheckpoint(), + FinalizedCheckpoint: state.FinalizedCheckpoint(), + InactivityScores: inactivityScores, + CurrentSyncCommittee: currentSyncCommittee, + NextSyncCommittee: nextSyncCommittee, + LatestExecutionPayloadHeader: ðpb.ExecutionPayloadHeader{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, 32), + ReceiptRoot: make([]byte, 32), + LogsBloom: make([]byte, 256), + Random: make([]byte, 32), + BlockNumber: 0, + GasLimit: 0, + GasUsed: 0, + Timestamp: 0, + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + TransactionsRoot: make([]byte, 32), + }, } - if err = newState.SetGenesisTime(state.GenesisTime()); err != nil { - return nil, errors.Wrap(err, "could not set genesis time") - } - if err = newState.SetGenesisValidatorRoot(state.GenesisValidatorRoot()); err != nil { - return nil, errors.Wrap(err, "could not set genesis validators root") - } - if err = newState.SetSlot(state.Slot()); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = newState.SetFork(ðpb.Fork{ - PreviousVersion: state.Fork().CurrentVersion, - CurrentVersion: params.BeaconConfig().BellatrixForkVersion, - Epoch: epoch, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = newState.SetLatestBlockHeader(state.LatestBlockHeader()); err != nil { - return nil, errors.Wrap(err, "could not set latest block header") - } - if err = newState.SetBlockRoots(state.BlockRoots()); err != nil { - return nil, errors.Wrap(err, "could not set block roots") - } - if err = newState.SetStateRoots(state.StateRoots()); err != nil { - return nil, errors.Wrap(err, "could not set state roots") - } - if err = newState.SetHistoricalRoots(state.HistoricalRoots()); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = newState.SetEth1Data(state.Eth1Data()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = newState.SetEth1DataVotes(state.Eth1DataVotes()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = newState.SetEth1DepositIndex(state.Eth1DepositIndex()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 deposit index") - } - if err = newState.SetValidators(state.Validators()); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = newState.SetBalances(state.Balances()); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = newState.SetRandaoMixes(state.RandaoMixes()); err != nil { - return nil, errors.Wrap(err, "could not set randao mixes") - } - if err = newState.SetSlashings(state.Slashings()); err != nil { - return nil, errors.Wrap(err, "could not set slashings") - } - if err = newState.SetJustificationBits(state.JustificationBits()); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } - if err = newState.SetPreviousParticipationBits(prevEpochParticipation); err != nil { - return nil, errors.Wrap(err, "could not set previous participation bits") - } - if err = newState.SetCurrentParticipationBits(currentEpochParticipation); err != nil { - return nil, errors.Wrap(err, "could not set current participation bits") - } - if err = newState.SetInactivityScores(inactivityScores); err != nil { - return nil, errors.Wrap(err, "could not set inactivity scores") - } - if err = newState.SetPreviousJustifiedCheckpoint(state.PreviousJustifiedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set previous justified checkpoint") - } - if err = newState.SetCurrentJustifiedCheckpoint(state.CurrentJustifiedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set current justified checkpoint") - } - if err = newState.SetFinalizedCheckpoint(state.FinalizedCheckpoint()); err != nil { - return nil, errors.Wrap(err, "could not set finalized checkpoint") - } - if err := newState.SetCurrentSyncCommittee(currentSyncCommittee); err != nil { - return nil, errors.Wrap(err, "could not set current sync committee") - } - if err := newState.SetNextSyncCommittee(nextSyncCommittee); err != nil { - return nil, errors.Wrap(err, "could not set next sync committee") - } - if err := newState.SetLatestExecutionPayloadHeader(ðpb.ExecutionPayloadHeader{ - ParentHash: make([]byte, 32), - FeeRecipient: make([]byte, 20), - StateRoot: make([]byte, 32), - ReceiptRoot: make([]byte, 32), - LogsBloom: make([]byte, 256), - Random: make([]byte, 32), - BlockNumber: 0, - GasLimit: 0, - GasUsed: 0, - Timestamp: 0, - BaseFeePerGas: make([]byte, 32), - BlockHash: make([]byte, 32), - TransactionsRoot: make([]byte, 32), - }); err != nil { - return nil, errors.Wrap(err, "could not set latest execution payload header") - } - - return newState, nil + return v3.InitializeFromProto(s) } diff --git a/beacon-chain/core/helpers/BUILD.bazel b/beacon-chain/core/helpers/BUILD.bazel index 017422430f..3d3b906788 100644 --- a/beacon-chain/core/helpers/BUILD.bazel +++ b/beacon-chain/core/helpers/BUILD.bazel @@ -39,7 +39,7 @@ go_library( deps = [ "//beacon-chain/cache:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//container/slice:go_default_library", "//container/trie:go_default_library", @@ -79,9 +79,9 @@ go_test( deps = [ "//beacon-chain/cache:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/core/helpers/attestation_test.go b/beacon-chain/core/helpers/attestation_test.go index b0296a44e5..f14e17e13c 100644 --- a/beacon-chain/core/helpers/attestation_test.go +++ b/beacon-chain/core/helpers/attestation_test.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/core/helpers/beacon_committee.go b/beacon-chain/core/helpers/beacon_committee.go index d77d0f5725..30d490ebc7 100644 --- a/beacon-chain/core/helpers/beacon_committee.go +++ b/beacon-chain/core/helpers/beacon_committee.go @@ -13,7 +13,7 @@ import ( "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/slice" "github.com/prysmaticlabs/prysm/crypto/hash" diff --git a/beacon-chain/core/helpers/beacon_committee_test.go b/beacon-chain/core/helpers/beacon_committee_test.go index a7bb6d286f..d55f13206f 100644 --- a/beacon-chain/core/helpers/beacon_committee_test.go +++ b/beacon-chain/core/helpers/beacon_committee_test.go @@ -9,7 +9,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/slice" "github.com/prysmaticlabs/prysm/crypto/hash" diff --git a/beacon-chain/core/helpers/block.go b/beacon-chain/core/helpers/block.go index b48f0ba667..b814bb10a7 100644 --- a/beacon-chain/core/helpers/block.go +++ b/beacon-chain/core/helpers/block.go @@ -5,7 +5,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/time/slots" @@ -48,7 +48,7 @@ func BlockRootAtSlot(state state.ReadOnlyBeaconState, slot types.Slot) ([]byte, if err != nil { return nil, err } - return root[:], err + return root, err } // StateRootAtSlot returns the cached state root at that particular slot. If no state @@ -61,7 +61,7 @@ func StateRootAtSlot(state state.ReadOnlyBeaconState, slot types.Slot) ([]byte, if err != nil { return nil, err } - return root[:], err + return root, err } // BlockRoot returns the block root stored in the BeaconState for epoch start slot. diff --git a/beacon-chain/core/helpers/block_test.go b/beacon-chain/core/helpers/block_test.go index fb5c5eb01a..11618e623a 100644 --- a/beacon-chain/core/helpers/block_test.go +++ b/beacon-chain/core/helpers/block_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/helpers/genesis.go b/beacon-chain/core/helpers/genesis.go index bc4cc8d36f..651441f4fd 100644 --- a/beacon-chain/core/helpers/genesis.go +++ b/beacon-chain/core/helpers/genesis.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/helpers/randao.go b/beacon-chain/core/helpers/randao.go index 0a30716990..535006b18b 100644 --- a/beacon-chain/core/helpers/randao.go +++ b/beacon-chain/core/helpers/randao.go @@ -2,7 +2,7 @@ package helpers import ( types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/crypto/hash" @@ -50,5 +50,5 @@ func RandaoMix(state state.ReadOnlyBeaconState, epoch types.Epoch) ([]byte, erro if err != nil { return nil, err } - return root[:], err + return root, err } diff --git a/beacon-chain/core/helpers/randao_test.go b/beacon-chain/core/helpers/randao_test.go index 761df72967..cc9373a5d9 100644 --- a/beacon-chain/core/helpers/randao_test.go +++ b/beacon-chain/core/helpers/randao_test.go @@ -5,7 +5,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/helpers/rewards_penalties.go b/beacon-chain/core/helpers/rewards_penalties.go index 2c169dddd4..5108732768 100644 --- a/beacon-chain/core/helpers/rewards_penalties.go +++ b/beacon-chain/core/helpers/rewards_penalties.go @@ -5,7 +5,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" mathutil "github.com/prysmaticlabs/prysm/math" "github.com/prysmaticlabs/prysm/time/slots" diff --git a/beacon-chain/core/helpers/rewards_penalties_test.go b/beacon-chain/core/helpers/rewards_penalties_test.go index 9ebb60de5d..62abfc697c 100644 --- a/beacon-chain/core/helpers/rewards_penalties_test.go +++ b/beacon-chain/core/helpers/rewards_penalties_test.go @@ -6,7 +6,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/helpers/sync_committee.go b/beacon-chain/core/helpers/sync_committee.go index 4c0dd24c0a..ffbcf91999 100644 --- a/beacon-chain/core/helpers/sync_committee.go +++ b/beacon-chain/core/helpers/sync_committee.go @@ -9,7 +9,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/time/slots" diff --git a/beacon-chain/core/helpers/sync_committee_test.go b/beacon-chain/core/helpers/sync_committee_test.go index 2578d62f61..55e46d450a 100644 --- a/beacon-chain/core/helpers/sync_committee_test.go +++ b/beacon-chain/core/helpers/sync_committee_test.go @@ -7,8 +7,8 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/cache" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/helpers/validators.go b/beacon-chain/core/helpers/validators.go index f593fbb149..ea7a19181b 100644 --- a/beacon-chain/core/helpers/validators.go +++ b/beacon-chain/core/helpers/validators.go @@ -10,7 +10,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/core/helpers/validators_test.go b/beacon-chain/core/helpers/validators_test.go index ee628d1d7d..5bbe50dbf8 100644 --- a/beacon-chain/core/helpers/validators_test.go +++ b/beacon-chain/core/helpers/validators_test.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" diff --git a/beacon-chain/core/helpers/weak_subjectivity.go b/beacon-chain/core/helpers/weak_subjectivity.go index 0d66b4d212..2136a001e5 100644 --- a/beacon-chain/core/helpers/weak_subjectivity.go +++ b/beacon-chain/core/helpers/weak_subjectivity.go @@ -11,7 +11,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/helpers/weak_subjectivity_test.go b/beacon-chain/core/helpers/weak_subjectivity_test.go index e491eda137..310db0130b 100644 --- a/beacon-chain/core/helpers/weak_subjectivity_test.go +++ b/beacon-chain/core/helpers/weak_subjectivity_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/signing/BUILD.bazel b/beacon-chain/core/signing/BUILD.bazel index 5e83609c9e..ba6dcf87a1 100644 --- a/beacon-chain/core/signing/BUILD.bazel +++ b/beacon-chain/core/signing/BUILD.bazel @@ -9,7 +9,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/beacon-chain/core/signing", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", "//encoding/bytesutil:go_default_library", @@ -30,7 +30,7 @@ go_test( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", diff --git a/beacon-chain/core/signing/signing_root.go b/beacon-chain/core/signing/signing_root.go index 6c81187627..1ccb431bda 100644 --- a/beacon-chain/core/signing/signing_root.go +++ b/beacon-chain/core/signing/signing_root.go @@ -4,7 +4,7 @@ import ( fssz "github.com/ferranbt/fastssz" "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -23,8 +23,7 @@ var ErrSigFailedToVerify = errors.New("signature did not verify") // ComputeDomainAndSign computes the domain and signing root and sign it using the passed in private key. func ComputeDomainAndSign(st state.ReadOnlyBeaconState, epoch types.Epoch, obj fssz.HashRoot, domain [4]byte, key bls.SecretKey) ([]byte, error) { - gvRoot := st.GenesisValidatorRoot() - d, err := Domain(st.Fork(), epoch, domain, gvRoot[:]) + d, err := Domain(st.Fork(), epoch, domain, st.GenesisValidatorRoot()) if err != nil { return nil, err } @@ -70,8 +69,7 @@ func ComputeDomainVerifySigningRoot(st state.ReadOnlyBeaconState, index types.Va if err != nil { return err } - gvRoot := st.GenesisValidatorRoot() - d, err := Domain(st.Fork(), epoch, domain, gvRoot[:]) + d, err := Domain(st.Fork(), epoch, domain, st.GenesisValidatorRoot()) if err != nil { return err } diff --git a/beacon-chain/core/signing/signing_root_test.go b/beacon-chain/core/signing/signing_root_test.go index 6374dc89ef..c189eafdc6 100644 --- a/beacon-chain/core/signing/signing_root_test.go +++ b/beacon-chain/core/signing/signing_root_test.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/core/time/BUILD.bazel b/beacon-chain/core/time/BUILD.bazel index 4826b559ff..63c0a71f32 100644 --- a/beacon-chain/core/time/BUILD.bazel +++ b/beacon-chain/core/time/BUILD.bazel @@ -6,7 +6,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/beacon-chain/core/time", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//runtime/version:go_default_library", "//time/slots:go_default_library", @@ -19,7 +19,7 @@ go_test( srcs = ["slot_epoch_test.go"], embed = [":go_default_library"], deps = [ - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/assert:go_default_library", diff --git a/beacon-chain/core/time/slot_epoch.go b/beacon-chain/core/time/slot_epoch.go index 63e67508d8..8e0506d036 100644 --- a/beacon-chain/core/time/slot_epoch.go +++ b/beacon-chain/core/time/slot_epoch.go @@ -2,7 +2,7 @@ package time import ( types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/runtime/version" "github.com/prysmaticlabs/prysm/time/slots" diff --git a/beacon-chain/core/time/slot_epoch_test.go b/beacon-chain/core/time/slot_epoch_test.go index a50d1861d0..843bad5e30 100644 --- a/beacon-chain/core/time/slot_epoch_test.go +++ b/beacon-chain/core/time/slot_epoch_test.go @@ -4,7 +4,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/core/transition/BUILD.bazel b/beacon-chain/core/transition/BUILD.bazel index 149f2173cf..40c2637dd5 100644 --- a/beacon-chain/core/transition/BUILD.bazel +++ b/beacon-chain/core/transition/BUILD.bazel @@ -34,11 +34,10 @@ go_library( "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/transition/interop:go_default_library", "//beacon-chain/core/validators:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/features:go_default_library", - "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", "//crypto/hash:go_default_library", @@ -84,8 +83,8 @@ go_test( "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", @@ -125,7 +124,7 @@ go_test( "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/benchmark:go_default_library", diff --git a/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go b/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go index ea70e19590..8422e9df38 100644 --- a/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go +++ b/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" p2pType "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go b/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go index 010d2f321a..ceae411594 100644 --- a/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go +++ b/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" p2pType "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/beacon-chain/core/transition/benchmarks_test.go b/beacon-chain/core/transition/benchmarks_test.go index ea85f39598..653ec199e1 100644 --- a/beacon-chain/core/transition/benchmarks_test.go +++ b/beacon-chain/core/transition/benchmarks_test.go @@ -7,8 +7,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" coreState "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" @@ -112,7 +112,7 @@ func BenchmarkHashTreeRootState_FullState(b *testing.B) { func BenchmarkMarshalState_FullState(b *testing.B) { beaconState, err := benchmark.PreGenstateFullEpochs() require.NoError(b, err) - natState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + natState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(b, err) b.Run("Proto_Marshal", func(b *testing.B) { b.ResetTimer() @@ -136,7 +136,7 @@ func BenchmarkMarshalState_FullState(b *testing.B) { func BenchmarkUnmarshalState_FullState(b *testing.B) { beaconState, err := benchmark.PreGenstateFullEpochs() require.NoError(b, err) - natState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + natState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(b, err) protoObject, err := proto.Marshal(natState) require.NoError(b, err) diff --git a/beacon-chain/core/transition/interop/BUILD.bazel b/beacon-chain/core/transition/interop/BUILD.bazel index 5bc780d20e..15484c337e 100644 --- a/beacon-chain/core/transition/interop/BUILD.bazel +++ b/beacon-chain/core/transition/interop/BUILD.bazel @@ -13,7 +13,7 @@ go_library( "//tools:__subpackages__", ], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/features:go_default_library", "//io/file:go_default_library", "//proto/prysm/v1alpha1/block:go_default_library", diff --git a/beacon-chain/core/transition/interop/write_state_to_disk.go b/beacon-chain/core/transition/interop/write_state_to_disk.go index 5f342ea9de..b042a7d4b3 100644 --- a/beacon-chain/core/transition/interop/write_state_to_disk.go +++ b/beacon-chain/core/transition/interop/write_state_to_disk.go @@ -5,7 +5,7 @@ import ( "os" "path" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/io/file" ) diff --git a/beacon-chain/core/transition/skip_slot_cache.go b/beacon-chain/core/transition/skip_slot_cache.go index 53b3f1ecbb..0c280afb96 100644 --- a/beacon-chain/core/transition/skip_slot_cache.go +++ b/beacon-chain/core/transition/skip_slot_cache.go @@ -5,7 +5,7 @@ import ( "errors" "github.com/prysmaticlabs/prysm/beacon-chain/cache" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/crypto/hash" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) diff --git a/beacon-chain/core/transition/skip_slot_cache_test.go b/beacon-chain/core/transition/skip_slot_cache_test.go index be839a957b..838d1770c3 100644 --- a/beacon-chain/core/transition/skip_slot_cache_test.go +++ b/beacon-chain/core/transition/skip_slot_cache_test.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/assert" @@ -19,7 +19,7 @@ func TestSkipSlotCache_OK(t *testing.T) { transition.SkipSlotCache.Enable() defer transition.SkipSlotCache.Disable() bState, privs := util.DeterministicGenesisState(t, params.MinimalSpecConfig().MinGenesisActiveValidatorCount) - pbState, err := v1.ProtobufBeaconState(bState.ToProto()) + pbState, err := v1.ProtobufBeaconState(bState.CloneInnerState()) require.NoError(t, err) originalState, err := v1.InitializeFromProto(pbState) require.NoError(t, err) @@ -38,12 +38,12 @@ func TestSkipSlotCache_OK(t *testing.T) { bState, err = transition.ExecuteStateTransition(context.Background(), bState, wrapper.WrappedPhase0SignedBeaconBlock(blk)) require.NoError(t, err, "Could not process state transition") - assert.DeepEqual(t, originalState.ToProto(), bState.ToProto(), "Skipped slots cache leads to different states") + assert.DeepEqual(t, originalState.CloneInnerState(), bState.CloneInnerState(), "Skipped slots cache leads to different states") } func TestSkipSlotCache_ConcurrentMixup(t *testing.T) { bState, privs := util.DeterministicGenesisState(t, params.MinimalSpecConfig().MinGenesisActiveValidatorCount) - pbState, err := v1.ProtobufBeaconState(bState.ToProto()) + pbState, err := v1.ProtobufBeaconState(bState.CloneInnerState()) require.NoError(t, err) originalState, err := v1.InitializeFromProto(pbState) require.NoError(t, err) @@ -120,7 +120,7 @@ func TestSkipSlotCache_ConcurrentMixup(t *testing.T) { tmp1, err := transition.ProcessSlots(context.Background(), expected1.Copy(), problemSlot+1) require.NoError(t, err) gotRoot := tmp1.StateRoots()[problemSlot] - require.DeepEqual(t, expectedRoot1, gotRoot, "State roots for chain 1 are bad, expected root doesn't match") + require.DeepEqual(t, expectedRoot1[:], gotRoot, "State roots for chain 1 are bad, expected root doesn't match") expected2, err := transition.ProcessSlots(context.Background(), s0.Copy(), problemSlot) require.NoError(t, err) @@ -131,7 +131,7 @@ func TestSkipSlotCache_ConcurrentMixup(t *testing.T) { tmp2, err := transition.ProcessSlots(context.Background(), expected2.Copy(), problemSlot+1) require.NoError(t, err) gotRoot = tmp2.StateRoots()[problemSlot] - require.DeepEqual(t, expectedRoot2, gotRoot, "State roots for chain 2 are bad, expected root doesn't match") + require.DeepEqual(t, expectedRoot2[:], gotRoot, "State roots for chain 2 are bad, expected root doesn't match") var wg sync.WaitGroup wg.Add(len(setups)) @@ -143,9 +143,9 @@ func TestSkipSlotCache_ConcurrentMixup(t *testing.T) { roots := outState.StateRoots() gotRoot := roots[problemSlot] if i%2 == 0 { - assert.DeepEqual(t, expectedRoot1, gotRoot, "Unexpected root on chain 1") + assert.DeepEqual(t, expectedRoot1[:], gotRoot, "Unexpected root on chain 1") } else { - assert.DeepEqual(t, expectedRoot2, gotRoot, "Unexpected root on chain 2") + assert.DeepEqual(t, expectedRoot2[:], gotRoot, "Unexpected root on chain 2") } wg.Done() } diff --git a/beacon-chain/core/transition/state.go b/beacon-chain/core/transition/state.go index 5bee5ded2c..1759acc8bd 100644 --- a/beacon-chain/core/transition/state.go +++ b/beacon-chain/core/transition/state.go @@ -6,10 +6,9 @@ import ( "github.com/pkg/errors" b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -81,29 +80,28 @@ func OptimizedGenesisBeaconState(genesisTime uint64, preState state.BeaconState, return nil, errors.New("no eth1data provided for genesis state") } - var randaoMixes [fieldparams.RandaoMixesLength][32]byte + randaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) for i := 0; i < len(randaoMixes); i++ { - var h [32]byte - copy(h[:], eth1Data.BlockHash) + h := make([]byte, 32) + copy(h, eth1Data.BlockHash) randaoMixes[i] = h } - zeroHash32 := params.BeaconConfig().ZeroHash - zeroHash := zeroHash32[:] + zeroHash := params.BeaconConfig().ZeroHash[:] activeIndexRoots := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) for i := 0; i < len(activeIndexRoots); i++ { activeIndexRoots[i] = zeroHash } - var blockRoots [fieldparams.BlockRootsLength][32]byte + blockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) for i := 0; i < len(blockRoots); i++ { - blockRoots[i] = zeroHash32 + blockRoots[i] = zeroHash } - var stateRoots [fieldparams.StateRootsLength][32]byte + stateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) for i := 0; i < len(stateRoots); i++ { - stateRoots[i] = zeroHash32 + stateRoots[i] = zeroHash } slashings := make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector) @@ -113,6 +111,53 @@ func OptimizedGenesisBeaconState(genesisTime uint64, preState state.BeaconState, return nil, errors.Wrapf(err, "could not hash tree root genesis validators %v", err) } + state := ðpb.BeaconState{ + // Misc fields. + Slot: 0, + GenesisTime: genesisTime, + GenesisValidatorsRoot: genesisValidatorsRoot[:], + + Fork: ðpb.Fork{ + PreviousVersion: params.BeaconConfig().GenesisForkVersion, + CurrentVersion: params.BeaconConfig().GenesisForkVersion, + Epoch: 0, + }, + + // Validator registry fields. + Validators: preState.Validators(), + Balances: preState.Balances(), + + // Randomness and committees. + RandaoMixes: randaoMixes, + + // Finality. + PreviousJustifiedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + CurrentJustifiedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + JustificationBits: []byte{0}, + FinalizedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + + HistoricalRoots: [][]byte{}, + BlockRoots: blockRoots, + StateRoots: stateRoots, + Slashings: slashings, + CurrentEpochAttestations: []*ethpb.PendingAttestation{}, + PreviousEpochAttestations: []*ethpb.PendingAttestation{}, + + // Eth1 data. + Eth1Data: eth1Data, + Eth1DataVotes: []*ethpb.Eth1Data{}, + Eth1DepositIndex: preState.Eth1DepositIndex(), + } + bodyRoot, err := (ðpb.BeaconBlockBody{ RandaoReveal: make([]byte, 96), Eth1Data: ðpb.Eth1Data{ @@ -125,126 +170,40 @@ func OptimizedGenesisBeaconState(genesisTime uint64, preState state.BeaconState, return nil, errors.Wrap(err, "could not hash tree root empty block body") } - s, err := v1.Initialize() - if err != nil { - return nil, errors.Wrap(err, "could not initialize state from proto state") - } - - if err = s.SetGenesisTime(genesisTime); err != nil { - return nil, errors.Wrap(err, "could not set genesis time") - } - if err = s.SetGenesisValidatorRoot(genesisValidatorsRoot); err != nil { - return nil, errors.Wrap(err, "could not set genesis validators root") - } - if err = s.SetSlot(0); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = s.SetFork(ðpb.Fork{ - PreviousVersion: params.BeaconConfig().GenesisForkVersion, - CurrentVersion: params.BeaconConfig().GenesisForkVersion, - Epoch: 0, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = s.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ + state.LatestBlockHeader = ðpb.BeaconBlockHeader{ ParentRoot: zeroHash, StateRoot: zeroHash, BodyRoot: bodyRoot[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set latest block header") - } - if err = s.SetBlockRoots(&blockRoots); err != nil { - return nil, errors.Wrap(err, "could not set block roots") - } - if err = s.SetStateRoots(&stateRoots); err != nil { - return nil, errors.Wrap(err, "could not set state roots") - } - if err = s.SetHistoricalRoots([][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = s.SetEth1Data(eth1Data); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = s.SetEth1DataVotes([]*ethpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = s.SetEth1DepositIndex(preState.Eth1DepositIndex()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 deposit index") - } - if err = s.SetValidators(preState.Validators()); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = s.SetBalances(preState.Balances()); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = s.SetRandaoMixes(&randaoMixes); err != nil { - return nil, errors.Wrap(err, "could not set randao mixes") - } - if err = s.SetSlashings(slashings); err != nil { - return nil, errors.Wrap(err, "could not set slashings") - } - if err = s.SetJustificationBits([]byte{0}); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } - if err = s.SetPreviousJustifiedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set previous justified checkpoint") - } - if err = s.SetCurrentJustifiedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set current justified checkpoint") - } - if err = s.SetFinalizedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set finalized checkpoint") } - return s, nil + return v1.InitializeFromProto(state) } // EmptyGenesisState returns an empty beacon state object. func EmptyGenesisState() (state.BeaconState, error) { - s, err := v1.Initialize() - if err != nil { - return nil, errors.Wrap(err, "could not initialize state from proto state") - } + state := ðpb.BeaconState{ + // Misc fields. + Slot: 0, + Fork: ðpb.Fork{ + PreviousVersion: params.BeaconConfig().GenesisForkVersion, + CurrentVersion: params.BeaconConfig().GenesisForkVersion, + Epoch: 0, + }, + // Validator registry fields. + Validators: []*ethpb.Validator{}, + Balances: []uint64{}, - if err = s.SetSlot(0); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = s.SetFork(ðpb.Fork{ - PreviousVersion: params.BeaconConfig().GenesisForkVersion, - CurrentVersion: params.BeaconConfig().GenesisForkVersion, - Epoch: 0, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = s.SetHistoricalRoots([][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = s.SetEth1Data(ðpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = s.SetEth1DataVotes([]*ethpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = s.SetValidators([]*ethpb.Validator{}); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = s.SetBalances([]uint64{}); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = s.SetJustificationBits([]byte{0}); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } + JustificationBits: []byte{0}, + HistoricalRoots: [][]byte{}, + CurrentEpochAttestations: []*ethpb.PendingAttestation{}, + PreviousEpochAttestations: []*ethpb.PendingAttestation{}, - return s, nil + // Eth1 data. + Eth1Data: ðpb.Eth1Data{}, + Eth1DataVotes: []*ethpb.Eth1Data{}, + Eth1DepositIndex: 0, + } + return v1.InitializeFromProto(state) } // IsValidGenesisState gets called whenever there's a deposit event, diff --git a/beacon-chain/core/transition/state_fuzz_test.go b/beacon-chain/core/transition/state_fuzz_test.go index c446033c29..2d95b1c780 100644 --- a/beacon-chain/core/transition/state_fuzz_test.go +++ b/beacon-chain/core/transition/state_fuzz_test.go @@ -5,7 +5,7 @@ import ( "testing" fuzz "github.com/google/gofuzz" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/core/transition/state_test.go b/beacon-chain/core/transition/state_test.go index 2d0adb40e9..c461478fd6 100644 --- a/beacon-chain/core/transition/state_test.go +++ b/beacon-chain/core/transition/state_test.go @@ -6,10 +6,9 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" - "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" @@ -64,7 +63,7 @@ func TestGenesisBeaconState_OK(t *testing.T) { assert.Equal(t, latestRandaoMixesLength, types.Epoch(len(newState.RandaoMixes())), "Length of RandaoMixes was not correctly initialized") mix, err := newState.RandaoMixAtIndex(0) require.NoError(t, err) - assert.DeepEqual(t, bytesutil.ToBytes32(eth1Data.BlockHash), mix, "RandaoMixes was not correctly initialized") + assert.DeepEqual(t, eth1Data.BlockHash, mix, "RandaoMixes was not correctly initialized") // Finality fields checks. assert.Equal(t, genesisEpoch, newState.PreviousJustifiedCheckpoint().Epoch, "PreviousJustifiedCheckpoint.Epoch was not correctly initialized") @@ -83,8 +82,8 @@ func TestGenesisBeaconState_OK(t *testing.T) { zeroHash := params.BeaconConfig().ZeroHash // History root checks. - assert.DeepEqual(t, zeroHash, newState.StateRoots()[0], "StateRoots was not correctly initialized") - assert.DeepEqual(t, zeroHash, newState.BlockRoots()[0], "BlockRoots was not correctly initialized") + assert.DeepEqual(t, zeroHash[:], newState.StateRoots()[0], "StateRoots was not correctly initialized") + assert.DeepEqual(t, zeroHash[:], newState.BlockRoots()[0], "BlockRoots was not correctly initialized") // Deposit root checks. assert.DeepEqual(t, eth1Data.DepositRoot, newState.Eth1Data().DepositRoot, "Eth1Data DepositRoot was not correctly initialized") @@ -99,9 +98,9 @@ func TestGenesisState_HashEquality(t *testing.T) { state, err := transition.GenesisBeaconState(context.Background(), deposits, 0, ðpb.Eth1Data{BlockHash: make([]byte, 32)}) require.NoError(t, err) - pbState1, err := v1.ProtobufBeaconState(state1.ToProto()) + pbState1, err := v1.ProtobufBeaconState(state1.CloneInnerState()) require.NoError(t, err) - pbstate, err := v1.ProtobufBeaconState(state.ToProto()) + pbstate, err := v1.ProtobufBeaconState(state.CloneInnerState()) require.NoError(t, err) root1, err1 := hash.HashProto(pbState1) @@ -123,7 +122,7 @@ func TestGenesisState_InitializesLatestBlockHashes(t *testing.T) { assert.Equal(t, want, got, "The slice underlying array capacity is wrong") for _, h := range s.BlockRoots() { - assert.DeepEqual(t, params.BeaconConfig().ZeroHash, h, "Unexpected non-zero hash data") + assert.DeepEqual(t, params.BeaconConfig().ZeroHash[:], h, "Unexpected non-zero hash data") } } diff --git a/beacon-chain/core/transition/stateutils/BUILD.bazel b/beacon-chain/core/transition/stateutils/BUILD.bazel index d913edfc81..3c8669806e 100644 --- a/beacon-chain/core/transition/stateutils/BUILD.bazel +++ b/beacon-chain/core/transition/stateutils/BUILD.bazel @@ -22,7 +22,7 @@ go_test( srcs = ["validator_index_map_test.go"], deps = [ ":go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/fieldparams:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/core/transition/stateutils/validator_index_map_test.go b/beacon-chain/core/transition/stateutils/validator_index_map_test.go index 2597bd9339..61131d0f38 100644 --- a/beacon-chain/core/transition/stateutils/validator_index_map_test.go +++ b/beacon-chain/core/transition/stateutils/validator_index_map_test.go @@ -5,7 +5,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition/stateutils" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/core/transition/trailing_slot_state_cache.go b/beacon-chain/core/transition/trailing_slot_state_cache.go index 174a9a002d..510fbfb06e 100644 --- a/beacon-chain/core/transition/trailing_slot_state_cache.go +++ b/beacon-chain/core/transition/trailing_slot_state_cache.go @@ -7,7 +7,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ) type nextSlotCache struct { diff --git a/beacon-chain/core/transition/transition.go b/beacon-chain/core/transition/transition.go index 499dc10b05..18709fb5fe 100644 --- a/beacon-chain/core/transition/transition.go +++ b/beacon-chain/core/transition/transition.go @@ -16,7 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/math" "github.com/prysmaticlabs/prysm/monitoring/tracing" diff --git a/beacon-chain/core/transition/transition_fuzz_test.go b/beacon-chain/core/transition/transition_fuzz_test.go index b37f08d18b..6eb9a0c374 100644 --- a/beacon-chain/core/transition/transition_fuzz_test.go +++ b/beacon-chain/core/transition/transition_fuzz_test.go @@ -7,18 +7,16 @@ import ( fuzz "github.com/google/gofuzz" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" - "github.com/prysmaticlabs/prysm/testing/require" ) func TestFuzzExecuteStateTransition_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} sb := ðpb.SignedBeaconBlock{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) @@ -36,8 +34,7 @@ func TestFuzzCalculateStateRoot_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} sb := ðpb.SignedBeaconBlock{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) @@ -55,8 +52,7 @@ func TestFuzzProcessSlot_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) for i := 0; i < 1000; i++ { @@ -72,8 +68,7 @@ func TestFuzzProcessSlots_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} slot := types.Slot(0) fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) @@ -91,8 +86,7 @@ func TestFuzzprocessOperationsNoVerify_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} bb := ðpb.SignedBeaconBlock{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) @@ -109,8 +103,7 @@ func TestFuzzprocessOperationsNoVerify_1000(t *testing.T) { func TestFuzzverifyOperationLengths_10000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} bb := ðpb.SignedBeaconBlock{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) @@ -125,8 +118,7 @@ func TestFuzzverifyOperationLengths_10000(t *testing.T) { func TestFuzzCanProcessEpoch_10000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) for i := 0; i < 10000; i++ { @@ -139,8 +131,7 @@ func TestFuzzProcessEpochPrecompute_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) for i := 0; i < 1000; i++ { @@ -156,8 +147,7 @@ func TestFuzzProcessBlockForStateRoot_1000(t *testing.T) { SkipSlotCache.Disable() defer SkipSlotCache.Enable() ctx := context.Background() - state, err := v1.Initialize() - require.NoError(t, err) + state := &v1.BeaconState{} sb := ðpb.SignedBeaconBlock{} fuzzer := fuzz.NewWithSeed(0) fuzzer.NilChance(0.1) diff --git a/beacon-chain/core/transition/transition_no_verify_sig.go b/beacon-chain/core/transition/transition_no_verify_sig.go index 2f85eb4ae8..b33751e98d 100644 --- a/beacon-chain/core/transition/transition_no_verify_sig.go +++ b/beacon-chain/core/transition/transition_no_verify_sig.go @@ -11,7 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition/interop" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/monitoring/tracing" diff --git a/beacon-chain/core/transition/transition_test.go b/beacon-chain/core/transition/transition_test.go index 2ddf52b663..75cdd0879c 100644 --- a/beacon-chain/core/transition/transition_test.go +++ b/beacon-chain/core/transition/transition_test.go @@ -12,8 +12,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -141,11 +141,11 @@ func TestProcessBlock_IncorrectProcessExits(t *testing.T) { }, }, } - var blockRoots [fieldparams.BlockRootsLength][32]byte + var blockRoots [][]byte for i := uint64(0); i < uint64(params.BeaconConfig().SlotsPerHistoricalRoot); i++ { - blockRoots[i] = [32]byte{byte(i)} + blockRoots = append(blockRoots, []byte{byte(i)}) } - require.NoError(t, beaconState.SetBlockRoots(&blockRoots)) + require.NoError(t, beaconState.SetBlockRoots(blockRoots)) blockAtt := util.HydrateAttestation(ðpb.Attestation{ Data: ðpb.AttestationData{ Target: ðpb.Checkpoint{Root: bytesutil.PadTo([]byte("hello-world"), 32)}, @@ -253,8 +253,7 @@ func createFullBlockWithOperations(t *testing.T) (state.BeaconState, }, AttestingIndices: []uint64{0, 1}, }) - gvr := beaconState.GenesisValidatorRoot() - domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att1.Data, domain) require.NoError(t, err) @@ -286,11 +285,11 @@ func createFullBlockWithOperations(t *testing.T) (state.BeaconState, }, } - var blockRoots [fieldparams.BlockRootsLength][32]byte + var blockRoots [][]byte for i := uint64(0); i < uint64(params.BeaconConfig().SlotsPerHistoricalRoot); i++ { - blockRoots[i] = [32]byte{byte(i)} + blockRoots = append(blockRoots, []byte{byte(i)}) } - require.NoError(t, beaconState.SetBlockRoots(&blockRoots)) + require.NoError(t, beaconState.SetBlockRoots(blockRoots)) aggBits := bitfield.NewBitlist(1) aggBits.SetBitAt(0, true) diff --git a/beacon-chain/core/validators/BUILD.bazel b/beacon-chain/core/validators/BUILD.bazel index 12667570b2..ba3ca8f87c 100644 --- a/beacon-chain/core/validators/BUILD.bazel +++ b/beacon-chain/core/validators/BUILD.bazel @@ -11,7 +11,7 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//time/slots:go_default_library", @@ -28,7 +28,7 @@ go_test( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/assert:go_default_library", diff --git a/beacon-chain/core/validators/validator.go b/beacon-chain/core/validators/validator.go index ec76c47472..ed75ab797c 100644 --- a/beacon-chain/core/validators/validator.go +++ b/beacon-chain/core/validators/validator.go @@ -11,7 +11,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/time/slots" diff --git a/beacon-chain/core/validators/validator_test.go b/beacon-chain/core/validators/validator_test.go index 903b5493bd..179ddf9763 100644 --- a/beacon-chain/core/validators/validator_test.go +++ b/beacon-chain/core/validators/validator_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/db/iface/BUILD.bazel b/beacon-chain/db/iface/BUILD.bazel index d089b14a36..a8f9c9fd54 100644 --- a/beacon-chain/db/iface/BUILD.bazel +++ b/beacon-chain/db/iface/BUILD.bazel @@ -12,7 +12,7 @@ go_library( deps = [ "//beacon-chain/db/filters:go_default_library", "//beacon-chain/slasher/types:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//monitoring/backup:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/block:go_default_library", diff --git a/beacon-chain/db/iface/interface.go b/beacon-chain/db/iface/interface.go index ad900097f7..0e1b0f88b8 100644 --- a/beacon-chain/db/iface/interface.go +++ b/beacon-chain/db/iface/interface.go @@ -11,7 +11,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/db/filters" slashertypes "github.com/prysmaticlabs/prysm/beacon-chain/slasher/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/monitoring/backup" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" diff --git a/beacon-chain/db/kv/BUILD.bazel b/beacon-chain/db/kv/BUILD.bazel index 13853a7a0a..ac59f928ab 100644 --- a/beacon-chain/db/kv/BUILD.bazel +++ b/beacon-chain/db/kv/BUILD.bazel @@ -38,11 +38,11 @@ go_library( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/db/filters:go_default_library", "//beacon-chain/db/iface:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/genesis:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/genesis:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//config/features:go_default_library", "//config/params:go_default_library", "//container/slice:go_default_library", @@ -101,9 +101,9 @@ go_test( deps = [ "//beacon-chain/db/filters:go_default_library", "//beacon-chain/db/iface:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/db/kv/genesis.go b/beacon-chain/db/kv/genesis.go index 58d53e975f..d0c29ffae5 100644 --- a/beacon-chain/db/kv/genesis.go +++ b/beacon-chain/db/kv/genesis.go @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" dbIface "github.com/prysmaticlabs/prysm/beacon-chain/db/iface" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" diff --git a/beacon-chain/db/kv/migration_state_validators_test.go b/beacon-chain/db/kv/migration_state_validators_test.go index 1c3cdefc47..f53d6635e1 100644 --- a/beacon-chain/db/kv/migration_state_validators_test.go +++ b/beacon-chain/db/kv/migration_state_validators_test.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/golang/snappy" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/features" v1alpha1 "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" @@ -91,7 +91,7 @@ func Test_migrateStateValidators(t *testing.T) { assert.NoError(t, hashErr) individualHashes = append(individualHashes, hash[:]) } - pbState, err := v1.ProtobufBeaconState(st.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(st.InnerStateUnsafe()) assert.NoError(t, err) validatorsFoundCount := 0 for _, val := range pbState.Validators { @@ -137,7 +137,7 @@ func Test_migrateStateValidators(t *testing.T) { blockRoot := [32]byte{'A'} rcvdState, err := dbStore.State(context.Background(), blockRoot) assert.NoError(t, err) - require.DeepSSZEqual(t, rcvdState.ToProtoUnsafe(), state.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, rcvdState.InnerStateUnsafe(), state.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // find hashes of the validators that are set as part of the state var hashes []byte @@ -150,7 +150,7 @@ func Test_migrateStateValidators(t *testing.T) { } // check if all the validators that were in the state, are stored properly in the validator bucket - pbState, err := v1.ProtobufBeaconState(rcvdState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(rcvdState.InnerStateUnsafe()) assert.NoError(t, err) validatorsFoundCount := 0 for _, val := range pbState.Validators { @@ -240,7 +240,7 @@ func Test_migrateAltairStateValidators(t *testing.T) { blockRoot := [32]byte{'A'} rcvdState, err := dbStore.State(context.Background(), blockRoot) assert.NoError(t, err) - require.DeepSSZEqual(t, rcvdState.ToProtoUnsafe(), state.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, rcvdState.InnerStateUnsafe(), state.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // find hashes of the validators that are set as part of the state var hashes []byte @@ -253,7 +253,7 @@ func Test_migrateAltairStateValidators(t *testing.T) { } // check if all the validators that were in the state, are stored properly in the validator bucket - pbState, err := v2.ProtobufBeaconState(rcvdState.ToProtoUnsafe()) + pbState, err := v2.ProtobufBeaconState(rcvdState.InnerStateUnsafe()) assert.NoError(t, err) validatorsFoundCount := 0 for _, val := range pbState.Validators { diff --git a/beacon-chain/db/kv/state.go b/beacon-chain/db/kv/state.go index 43da7a37b0..9e91016143 100644 --- a/beacon-chain/db/kv/state.go +++ b/beacon-chain/db/kv/state.go @@ -8,11 +8,11 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/genesis" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" - v3 "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/genesis" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -148,21 +148,21 @@ func (s *Store) SaveStatesEfficient(ctx context.Context, states []state.ReadOnly validatorKeys := make([][]byte, len(states)) // For every state, this stores a compressed list of validator keys. for i, st := range states { var validators []*ethpb.Validator - switch st.ToProtoUnsafe().(type) { + switch st.InnerStateUnsafe().(type) { case *ethpb.BeaconState: - pbState, err := v1.ProtobufBeaconState(st.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(st.InnerStateUnsafe()) if err != nil { return err } validators = pbState.Validators case *ethpb.BeaconStateAltair: - pbState, err := v2.ProtobufBeaconState(st.ToProtoUnsafe()) + pbState, err := v2.ProtobufBeaconState(st.InnerStateUnsafe()) if err != nil { return err } validators = pbState.Validators case *ethpb.BeaconStateMerge: - pbState, err := v3.ProtobufBeaconState(st.ToProtoUnsafe()) + pbState, err := v3.ProtobufBeaconState(st.InnerStateUnsafe()) if err != nil { return err } @@ -201,7 +201,7 @@ func (s *Store) SaveStatesEfficient(ctx context.Context, states []state.ReadOnly // validator entries.To bring the gap closer, we empty the validators // just before Put() and repopulate that state with original validators. // look at issue https://github.com/prysmaticlabs/prysm/issues/9262. - switch rawType := states[i].ToProtoUnsafe().(type) { + switch rawType := states[i].InnerStateUnsafe().(type) { case *ethpb.BeaconState: pbState, err := v1.ProtobufBeaconState(rawType) if err != nil { @@ -461,15 +461,15 @@ func (s *Store) unmarshalState(_ context.Context, enc []byte, validatorEntries [ // marshal versioned state from struct type down to bytes. func marshalState(ctx context.Context, st state.ReadOnlyBeaconState) ([]byte, error) { - switch st.ToProtoUnsafe().(type) { + switch st.InnerStateUnsafe().(type) { case *ethpb.BeaconState: - rState, ok := st.ToProtoUnsafe().(*ethpb.BeaconState) + rState, ok := st.InnerStateUnsafe().(*ethpb.BeaconState) if !ok { return nil, errors.New("non valid inner state") } return encode(ctx, rState) case *ethpb.BeaconStateAltair: - rState, ok := st.ToProtoUnsafe().(*ethpb.BeaconStateAltair) + rState, ok := st.InnerStateUnsafe().(*ethpb.BeaconStateAltair) if !ok { return nil, errors.New("non valid inner state") } @@ -482,7 +482,7 @@ func marshalState(ctx context.Context, st state.ReadOnlyBeaconState) ([]byte, er } return snappy.Encode(nil, append(altairKey, rawObj...)), nil case *ethpb.BeaconStateMerge: - rState, ok := st.ToProtoUnsafe().(*ethpb.BeaconStateMerge) + rState, ok := st.InnerStateUnsafe().(*ethpb.BeaconStateMerge) if !ok { return nil, errors.New("non valid inner state") } diff --git a/beacon-chain/db/kv/state_test.go b/beacon-chain/db/kv/state_test.go index 602d3ddd1b..60bbacdd23 100644 --- a/beacon-chain/db/kv/state_test.go +++ b/beacon-chain/db/kv/state_test.go @@ -8,7 +8,7 @@ import ( "time" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -38,7 +38,7 @@ func TestState_CanSaveRetrieve(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe(), "saved state and retrieved state are not matching") + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe(), "saved state and retrieved state are not matching") savedS, err = db.State(context.Background(), [32]byte{'B'}) require.NoError(t, err) @@ -71,7 +71,7 @@ func TestState_CanSaveRetrieveValidatorEntries(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // check if the index of the second state is still present. err = db.db.Update(func(tx *bolt.Tx) error { @@ -123,7 +123,7 @@ func TestStateAltair_CanSaveRetrieveValidatorEntries(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // check if the index of the second state is still present. err = db.db.Update(func(tx *bolt.Tx) error { @@ -233,7 +233,7 @@ func TestState_CanSaveRetrieveValidatorEntriesWithoutCache(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // check if the index of the second state is still present. err = db.db.Update(func(tx *bolt.Tx) error { @@ -354,7 +354,7 @@ func TestGenesisState_CanSaveRetrieve(t *testing.T) { savedGenesisS, err := db.GenesisState(context.Background()) require.NoError(t, err) - assert.DeepSSZEqual(t, st.ToProtoUnsafe(), savedGenesisS.ToProtoUnsafe(), "Did not retrieve saved state") + assert.DeepSSZEqual(t, st.InnerStateUnsafe(), savedGenesisS.InnerStateUnsafe(), "Did not retrieve saved state") require.NoError(t, db.SaveGenesisBlockRoot(context.Background(), [32]byte{'C'})) } @@ -468,7 +468,7 @@ func TestStore_SaveDeleteState_CanGetHighestBelow(t *testing.T) { st, err := util.NewBeaconState() require.NoError(t, err) require.NoError(t, st.SetSlot(1)) - s0 := st.ToProtoUnsafe() + s0 := st.InnerStateUnsafe() require.NoError(t, db.SaveState(context.Background(), st, r)) b.Block.Slot = 100 @@ -478,7 +478,7 @@ func TestStore_SaveDeleteState_CanGetHighestBelow(t *testing.T) { st, err = util.NewBeaconState() require.NoError(t, err) require.NoError(t, st.SetSlot(100)) - s1 := st.ToProtoUnsafe() + s1 := st.InnerStateUnsafe() require.NoError(t, db.SaveState(context.Background(), st, r1)) b.Block.Slot = 1000 @@ -488,21 +488,21 @@ func TestStore_SaveDeleteState_CanGetHighestBelow(t *testing.T) { st, err = util.NewBeaconState() require.NoError(t, err) require.NoError(t, st.SetSlot(1000)) - s2 := st.ToProtoUnsafe() + s2 := st.InnerStateUnsafe() require.NoError(t, db.SaveState(context.Background(), st, r2)) highest, err := db.HighestSlotStatesBelow(context.Background(), 2) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), s0) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), s0) highest, err = db.HighestSlotStatesBelow(context.Background(), 101) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), s1) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), s1) highest, err = db.HighestSlotStatesBelow(context.Background(), 1001) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), s2) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), s2) } func TestStore_GenesisState_CanGetHighestBelow(t *testing.T) { @@ -527,14 +527,14 @@ func TestStore_GenesisState_CanGetHighestBelow(t *testing.T) { highest, err := db.HighestSlotStatesBelow(context.Background(), 2) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), st.ToProtoUnsafe()) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), st.InnerStateUnsafe()) highest, err = db.HighestSlotStatesBelow(context.Background(), 1) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), genesisState.ToProtoUnsafe()) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), genesisState.InnerStateUnsafe()) highest, err = db.HighestSlotStatesBelow(context.Background(), 0) require.NoError(t, err) - assert.DeepSSZEqual(t, highest[0].ToProtoUnsafe(), genesisState.ToProtoUnsafe()) + assert.DeepSSZEqual(t, highest[0].InnerStateUnsafe(), genesisState.InnerStateUnsafe()) } func TestStore_CleanUpDirtyStates_AboveThreshold(t *testing.T) { @@ -655,7 +655,7 @@ func TestAltairState_CanSaveRetrieve(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe()) + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe()) savedS, err = db.State(context.Background(), [32]byte{'B'}) require.NoError(t, err) @@ -806,7 +806,7 @@ func TestStateMerge_CanSaveRetrieveValidatorEntries(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe(), "saved state with validators and retrieved state are not matching") + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe(), "saved state with validators and retrieved state are not matching") // check if the index of the second state is still present. err = db.db.Update(func(tx *bolt.Tx) error { @@ -849,7 +849,7 @@ func TestMergeState_CanSaveRetrieve(t *testing.T) { savedS, err := db.State(context.Background(), r) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedS.ToProtoUnsafe()) + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedS.InnerStateUnsafe()) savedS, err = db.State(context.Background(), [32]byte{'B'}) require.NoError(t, err) diff --git a/beacon-chain/db/kv/wss.go b/beacon-chain/db/kv/wss.go index 82194dc3cb..6fac694b7d 100644 --- a/beacon-chain/db/kv/wss.go +++ b/beacon-chain/db/kv/wss.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" diff --git a/beacon-chain/deterministic-genesis/BUILD.bazel b/beacon-chain/deterministic-genesis/BUILD.bazel index 47a10653b9..7cae423457 100644 --- a/beacon-chain/deterministic-genesis/BUILD.bazel +++ b/beacon-chain/deterministic-genesis/BUILD.bazel @@ -12,8 +12,8 @@ go_library( "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/powchain:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//runtime:go_default_library", "//runtime/interop:go_default_library", diff --git a/beacon-chain/deterministic-genesis/service.go b/beacon-chain/deterministic-genesis/service.go index b860f3687c..2c1d9e74b6 100644 --- a/beacon-chain/deterministic-genesis/service.go +++ b/beacon-chain/deterministic-genesis/service.go @@ -13,8 +13,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime" "github.com/prysmaticlabs/prysm/runtime/interop" diff --git a/beacon-chain/monitor/BUILD.bazel b/beacon-chain/monitor/BUILD.bazel index ebd0cac455..4fa4412079 100644 --- a/beacon-chain/monitor/BUILD.bazel +++ b/beacon-chain/monitor/BUILD.bazel @@ -22,8 +22,8 @@ go_library( "//beacon-chain/core/feed/operation:go_default_library", "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/core/helpers:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", @@ -54,7 +54,7 @@ go_test( "//beacon-chain/core/feed:go_default_library", "//beacon-chain/core/feed/state:go_default_library", "//beacon-chain/db/testing:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/monitor/process_attestation.go b/beacon-chain/monitor/process_attestation.go index 021a9d36c4..317939b9b1 100644 --- a/beacon-chain/monitor/process_attestation.go +++ b/beacon-chain/monitor/process_attestation.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/monitor/process_block.go b/beacon-chain/monitor/process_block.go index d2310cb467..732d6e84af 100644 --- a/beacon-chain/monitor/process_block.go +++ b/beacon-chain/monitor/process_block.go @@ -6,7 +6,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" diff --git a/beacon-chain/monitor/process_sync_committee.go b/beacon-chain/monitor/process_sync_committee.go index 921cba7197..d338f5fe9e 100644 --- a/beacon-chain/monitor/process_sync_committee.go +++ b/beacon-chain/monitor/process_sync_committee.go @@ -3,7 +3,7 @@ package monitor import ( "fmt" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/sirupsen/logrus" diff --git a/beacon-chain/monitor/service.go b/beacon-chain/monitor/service.go index 79f60f0182..04de9a1cbb 100644 --- a/beacon-chain/monitor/service.go +++ b/beacon-chain/monitor/service.go @@ -13,8 +13,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/operation" statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/time/slots" "github.com/sirupsen/logrus" ) diff --git a/beacon-chain/monitor/service_test.go b/beacon-chain/monitor/service_test.go index c5c9b853b4..87b5566503 100644 --- a/beacon-chain/monitor/service_test.go +++ b/beacon-chain/monitor/service_test.go @@ -13,7 +13,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/feed" statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 03e29098b4..141b893aa2 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -37,8 +37,8 @@ go_library( "//beacon-chain/rpc:go_default_library", "//beacon-chain/rpc/apimiddleware:go_default_library", "//beacon-chain/slasher:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//beacon-chain/sync/initial-sync:go_default_library", "//cmd:go_default_library", diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 5a5eb61ba4..81bd5b9e76 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -40,8 +40,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/rpc" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/apimiddleware" "github.com/prysmaticlabs/prysm/beacon-chain/slasher" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" regularsync "github.com/prysmaticlabs/prysm/beacon-chain/sync" initialsync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync" "github.com/prysmaticlabs/prysm/cmd" diff --git a/beacon-chain/operations/slashings/BUILD.bazel b/beacon-chain/operations/slashings/BUILD.bazel index 0ebc25b11b..61eccb1b51 100644 --- a/beacon-chain/operations/slashings/BUILD.bazel +++ b/beacon-chain/operations/slashings/BUILD.bazel @@ -21,7 +21,7 @@ go_library( "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/time:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//container/slice:go_default_library", "//proto/prysm/v1alpha1:go_default_library", @@ -45,7 +45,7 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", diff --git a/beacon-chain/operations/slashings/mock.go b/beacon-chain/operations/slashings/mock.go index b5042e2c11..4ce97fda5c 100644 --- a/beacon-chain/operations/slashings/mock.go +++ b/beacon-chain/operations/slashings/mock.go @@ -3,7 +3,7 @@ package slashings import ( "context" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/operations/slashings/service.go b/beacon-chain/operations/slashings/service.go index c6e328c247..b865c302b7 100644 --- a/beacon-chain/operations/slashings/service.go +++ b/beacon-chain/operations/slashings/service.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/slice" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/operations/slashings/service_attester_test.go b/beacon-chain/operations/slashings/service_attester_test.go index 410f88328b..66073ebaae 100644 --- a/beacon-chain/operations/slashings/service_attester_test.go +++ b/beacon-chain/operations/slashings/service_attester_test.go @@ -5,7 +5,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/operations/slashings/types.go b/beacon-chain/operations/slashings/types.go index 23a0549526..8d6bba22d5 100644 --- a/beacon-chain/operations/slashings/types.go +++ b/beacon-chain/operations/slashings/types.go @@ -5,7 +5,7 @@ import ( "sync" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/operations/voluntaryexits/BUILD.bazel b/beacon-chain/operations/voluntaryexits/BUILD.bazel index ad3dde9f54..8e5a6277c4 100644 --- a/beacon-chain/operations/voluntaryexits/BUILD.bazel +++ b/beacon-chain/operations/voluntaryexits/BUILD.bazel @@ -13,7 +13,7 @@ go_library( "//testing/fuzz:__pkg__", ], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//time/slots:go_default_library", @@ -28,7 +28,7 @@ go_test( srcs = ["service_test.go"], embed = [":go_default_library"], deps = [ - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", diff --git a/beacon-chain/operations/voluntaryexits/mock.go b/beacon-chain/operations/voluntaryexits/mock.go index 7a321fa23f..919dd2c36d 100644 --- a/beacon-chain/operations/voluntaryexits/mock.go +++ b/beacon-chain/operations/voluntaryexits/mock.go @@ -4,7 +4,7 @@ import ( "context" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/operations/voluntaryexits/service.go b/beacon-chain/operations/voluntaryexits/service.go index 5767ed16ae..0a5b97ad3d 100644 --- a/beacon-chain/operations/voluntaryexits/service.go +++ b/beacon-chain/operations/voluntaryexits/service.go @@ -6,7 +6,7 @@ import ( "sync" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/time/slots" diff --git a/beacon-chain/operations/voluntaryexits/service_test.go b/beacon-chain/operations/voluntaryexits/service_test.go index 8c64f2ee6f..1a13b6d9f6 100644 --- a/beacon-chain/operations/voluntaryexits/service_test.go +++ b/beacon-chain/operations/voluntaryexits/service_test.go @@ -6,7 +6,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/p2p/BUILD.bazel b/beacon-chain/p2p/BUILD.bazel index 2ba5738975..b4d86513f9 100644 --- a/beacon-chain/p2p/BUILD.bazel +++ b/beacon-chain/p2p/BUILD.bazel @@ -142,7 +142,6 @@ go_test( "//beacon-chain/p2p/peers/scorers:go_default_library", "//beacon-chain/p2p/testing:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", "//cmd/beacon-chain/flags:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/p2p/encoder/ssz_test.go b/beacon-chain/p2p/encoder/ssz_test.go index 3157a67466..2b7f38bdc0 100644 --- a/beacon-chain/p2p/encoder/ssz_test.go +++ b/beacon-chain/p2p/encoder/ssz_test.go @@ -115,7 +115,7 @@ func TestSszNetworkEncoder_DecodeWithMultipleFrames(t *testing.T) { maxChunkSize := uint64(1 << 22) c.MaxChunkSize = maxChunkSize params.OverrideBeaconNetworkConfig(c) - _, err := e.EncodeWithMaxLength(buf, st.ToProtoUnsafe().(*ethpb.BeaconState)) + _, err := e.EncodeWithMaxLength(buf, st.InnerStateUnsafe().(*ethpb.BeaconState)) require.NoError(t, err) // Max snappy block size if buf.Len() <= 76490 { diff --git a/beacon-chain/p2p/gossip_scoring_params_test.go b/beacon-chain/p2p/gossip_scoring_params_test.go index 3f767946fe..c66824198f 100644 --- a/beacon-chain/p2p/gossip_scoring_params_test.go +++ b/beacon-chain/p2p/gossip_scoring_params_test.go @@ -6,7 +6,6 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" @@ -26,7 +25,7 @@ func TestCorrect_ActiveValidatorsCount(t *testing.T) { ctx: context.Background(), cfg: &Config{DB: db}, } - bState, err := util.NewBeaconState(func(state state.BeaconState) error { + bState, err := util.NewBeaconState(func(state *ethpb.BeaconState) error { validators := make([]*ethpb.Validator, params.BeaconConfig().MinGenesisActiveValidatorCount) for i := 0; i < len(validators); i++ { validators[i] = ðpb.Validator{ @@ -36,7 +35,7 @@ func TestCorrect_ActiveValidatorsCount(t *testing.T) { Slashed: false, } } - require.NoError(t, state.SetValidators(validators)) + state.Validators = validators return nil }) require.NoError(t, err) diff --git a/beacon-chain/powchain/BUILD.bazel b/beacon-chain/powchain/BUILD.bazel index 61f650dca2..42808700c4 100644 --- a/beacon-chain/powchain/BUILD.bazel +++ b/beacon-chain/powchain/BUILD.bazel @@ -28,9 +28,9 @@ go_library( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/powchain/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", "//contracts/deposit:go_default_library", @@ -86,7 +86,7 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/powchain/testing:go_default_library", "//beacon-chain/powchain/types:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", diff --git a/beacon-chain/powchain/log_processing.go b/beacon-chain/powchain/log_processing.go index d1be94c1ab..85c594c5dd 100644 --- a/beacon-chain/powchain/log_processing.go +++ b/beacon-chain/powchain/log_processing.go @@ -16,7 +16,7 @@ import ( statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" coreState "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" contracts "github.com/prysmaticlabs/prysm/contracts/deposit" "github.com/prysmaticlabs/prysm/crypto/hash" @@ -503,7 +503,7 @@ func (s *Service) checkForChainstart(ctx context.Context, blockHash [32]byte, bl // save all powchain related metadata to disk. func (s *Service) savePowchainData(ctx context.Context) error { - pbState, err := v1.ProtobufBeaconState(s.preGenesisState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(s.preGenesisState.InnerStateUnsafe()) if err != nil { return err } diff --git a/beacon-chain/powchain/options.go b/beacon-chain/powchain/options.go index bf0b1ccf5a..0126056a8b 100644 --- a/beacon-chain/powchain/options.go +++ b/beacon-chain/powchain/options.go @@ -5,8 +5,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/db" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/network" ) diff --git a/beacon-chain/powchain/service.go b/beacon-chain/powchain/service.go index 3f2c377e9f..218c8a4688 100644 --- a/beacon-chain/powchain/service.go +++ b/beacon-chain/powchain/service.go @@ -28,9 +28,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/powchain/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" contracts "github.com/prysmaticlabs/prysm/contracts/deposit" @@ -1011,7 +1011,7 @@ func (s *Service) ensureValidPowchainData(ctx context.Context) error { return errors.Wrap(err, "unable to retrieve eth1 data") } if eth1Data == nil || !eth1Data.ChainstartData.Chainstarted || !validateDepositContainers(eth1Data.DepositContainers) { - pbState, err := v1.ProtobufBeaconState(s.preGenesisState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(s.preGenesisState.InnerStateUnsafe()) if err != nil { return err } diff --git a/beacon-chain/powchain/service_test.go b/beacon-chain/powchain/service_test.go index 51314ebe1b..8342eccfae 100644 --- a/beacon-chain/powchain/service_test.go +++ b/beacon-chain/powchain/service_test.go @@ -19,7 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" contracts "github.com/prysmaticlabs/prysm/contracts/deposit" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/powchain/testing/BUILD.bazel b/beacon-chain/powchain/testing/BUILD.bazel index 9c79e0a95b..fece9d8e6c 100644 --- a/beacon-chain/powchain/testing/BUILD.bazel +++ b/beacon-chain/powchain/testing/BUILD.bazel @@ -15,8 +15,8 @@ go_library( deps = [ "//async/event:go_default_library", "//beacon-chain/powchain/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//container/trie:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/powchain/testing/mock_faulty_powchain.go b/beacon-chain/powchain/testing/mock_faulty_powchain.go index 51ca92571b..a1d6ddfa37 100644 --- a/beacon-chain/powchain/testing/mock_faulty_powchain.go +++ b/beacon-chain/powchain/testing/mock_faulty_powchain.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/prysm/async/event" "github.com/prysmaticlabs/prysm/beacon-chain/powchain/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/container/trie" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/powchain/testing/mock_powchain.go b/beacon-chain/powchain/testing/mock_powchain.go index 171d410a59..640857dbf9 100644 --- a/beacon-chain/powchain/testing/mock_powchain.go +++ b/beacon-chain/powchain/testing/mock_powchain.go @@ -15,7 +15,7 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/prysmaticlabs/prysm/async/event" "github.com/prysmaticlabs/prysm/beacon-chain/powchain/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/BUILD.bazel b/beacon-chain/rpc/BUILD.bazel index fcff389c8c..bdf2bb6a19 100644 --- a/beacon-chain/rpc/BUILD.bazel +++ b/beacon-chain/rpc/BUILD.bazel @@ -33,7 +33,7 @@ go_library( "//beacon-chain/rpc/prysm/v1alpha1/validator:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", "//beacon-chain/slasher:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//config/features:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/rpc/eth/beacon/BUILD.bazel b/beacon-chain/rpc/eth/beacon/BUILD.bazel index d59977385c..6cc9c1204c 100644 --- a/beacon-chain/rpc/eth/beacon/BUILD.bazel +++ b/beacon-chain/rpc/eth/beacon/BUILD.bazel @@ -32,9 +32,9 @@ go_library( "//beacon-chain/rpc/eth/helpers:go_default_library", "//beacon-chain/rpc/prysm/v1alpha1/validator:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/features:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", @@ -88,8 +88,8 @@ go_test( "//beacon-chain/rpc/prysm/v1alpha1/validator:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", "//beacon-chain/rpc/testutil:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", "//encoding/bytesutil:go_default_library", diff --git a/beacon-chain/rpc/eth/beacon/pool.go b/beacon-chain/rpc/eth/beacon/pool.go index 2a7a9fe93d..89438233a3 100644 --- a/beacon-chain/rpc/eth/beacon/pool.go +++ b/beacon-chain/rpc/eth/beacon/pool.go @@ -275,8 +275,7 @@ func (bs *Server) SubmitVoluntaryExit(ctx context.Context, req *ethpbv1.SignedVo return nil, status.Errorf(codes.Internal, "Could not get exiting validator: %v", err) } alphaExit := migration.V1ExitToV1Alpha1(req) - gvRoot := headState.GenesisValidatorRoot() - err = blocks.VerifyExitAndSignature(validator, headState.Slot(), headState.Fork(), alphaExit, gvRoot[:]) + err = blocks.VerifyExitAndSignature(validator, headState.Slot(), headState.Fork(), alphaExit, headState.GenesisValidatorRoot()) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid voluntary exit: %v", err) } diff --git a/beacon-chain/rpc/eth/beacon/pool_test.go b/beacon-chain/rpc/eth/beacon/pool_test.go index 0d13772ab8..bb5d6514fd 100644 --- a/beacon-chain/rpc/eth/beacon/pool_test.go +++ b/beacon-chain/rpc/eth/beacon/pool_test.go @@ -16,7 +16,6 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" p2pMock "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -379,8 +378,8 @@ func TestSubmitAttesterSlashing_Ok(t *testing.T) { validator := ðpbv1alpha1.Validator{ PublicKey: keys[0].PublicKey().Marshal(), } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators([]*ethpbv1alpha1.Validator{validator})) + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = []*ethpbv1alpha1.Validator{validator} return nil }) require.NoError(t, err) @@ -494,8 +493,8 @@ func TestSubmitProposerSlashing_Ok(t *testing.T) { PublicKey: keys[0].PublicKey().Marshal(), WithdrawableEpoch: eth2types.Epoch(1), } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators([]*ethpbv1alpha1.Validator{validator})) + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = []*ethpbv1alpha1.Validator{validator} return nil }) require.NoError(t, err) @@ -594,10 +593,10 @@ func TestSubmitVoluntaryExit_Ok(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, PublicKey: keys[0].PublicKey().Marshal(), } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators([]*ethpbv1alpha1.Validator{validator})) + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = []*ethpbv1alpha1.Validator{validator} // Satisfy activity time required before exiting. - require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch.Mul(uint64(params.BeaconConfig().ShardCommitteePeriod)))) + state.Slot = params.BeaconConfig().SlotsPerEpoch.Mul(uint64(params.BeaconConfig().ShardCommitteePeriod)) return nil }) require.NoError(t, err) @@ -640,8 +639,8 @@ func TestSubmitVoluntaryExit_InvalidValidatorIndex(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, PublicKey: keys[0].PublicKey().Marshal(), } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators([]*ethpbv1alpha1.Validator{validator})) + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = []*ethpbv1alpha1.Validator{validator} return nil }) require.NoError(t, err) @@ -675,8 +674,8 @@ func TestSubmitVoluntaryExit_InvalidExit(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, PublicKey: keys[0].PublicKey().Marshal(), } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators([]*ethpbv1alpha1.Validator{validator})) + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = []*ethpbv1alpha1.Validator{validator} return nil }) require.NoError(t, err) @@ -717,13 +716,13 @@ func TestServer_SubmitAttestations_Ok(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, }, } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators(validators)) - require.NoError(t, beaconState.SetSlot(1)) - require.NoError(t, beaconState.SetPreviousJustifiedCheckpoint(ðpbv1alpha1.Checkpoint{ + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = validators + state.Slot = 1 + state.PreviousJustifiedCheckpoint = ðpbv1alpha1.Checkpoint{ Epoch: 0, Root: bytesutil.PadTo([]byte("sourceroot1"), 32), - })) + } return nil }) require.NoError(t, err) @@ -823,13 +822,13 @@ func TestServer_SubmitAttestations_ValidAttestationSubmitted(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, }, } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators(validators)) - require.NoError(t, beaconState.SetSlot(1)) - require.NoError(t, beaconState.SetPreviousJustifiedCheckpoint(ðpbv1alpha1.Checkpoint{ + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = validators + state.Slot = 1 + state.PreviousJustifiedCheckpoint = ðpbv1alpha1.Checkpoint{ Epoch: 0, Root: bytesutil.PadTo([]byte("sourceroot1"), 32), - })) + } return nil }) @@ -923,13 +922,13 @@ func TestServer_SubmitAttestations_InvalidAttestationGRPCHeader(t *testing.T) { ExitEpoch: params.BeaconConfig().FarFutureEpoch, }, } - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetValidators(validators)) - require.NoError(t, beaconState.SetSlot(1)) - require.NoError(t, beaconState.SetPreviousJustifiedCheckpoint(ðpbv1alpha1.Checkpoint{ + bs, err := util.NewBeaconState(func(state *ethpbv1alpha1.BeaconState) error { + state.Validators = validators + state.Slot = 1 + state.PreviousJustifiedCheckpoint = ðpbv1alpha1.Checkpoint{ Epoch: 0, Root: bytesutil.PadTo([]byte("sourceroot1"), 32), - })) + } return nil }) diff --git a/beacon-chain/rpc/eth/beacon/server.go b/beacon-chain/rpc/eth/beacon/server.go index 3fc59f1e1e..27d605814d 100644 --- a/beacon-chain/rpc/eth/beacon/server.go +++ b/beacon-chain/rpc/eth/beacon/server.go @@ -14,7 +14,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p" v1alpha1validator "github.com/prysmaticlabs/prysm/beacon-chain/rpc/prysm/v1alpha1/validator" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/statefetcher" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ) // Server defines a server implementation of the gRPC Beacon Chain service, diff --git a/beacon-chain/rpc/eth/beacon/state.go b/beacon-chain/rpc/eth/beacon/state.go index f3edb3a223..9a2ed95cf1 100644 --- a/beacon-chain/rpc/eth/beacon/state.go +++ b/beacon-chain/rpc/eth/beacon/state.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/statefetcher" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/eth/beacon/state_test.go b/beacon-chain/rpc/eth/beacon/state_test.go index 87c7e16c58..081748273c 100644 --- a/beacon-chain/rpc/eth/beacon/state_test.go +++ b/beacon-chain/rpc/eth/beacon/state_test.go @@ -7,7 +7,6 @@ import ( chainMock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/testutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" eth "github.com/prysmaticlabs/prysm/proto/eth/v1" @@ -92,12 +91,12 @@ func TestGetStateRoot(t *testing.T) { } func TestGetStateFork(t *testing.T) { - fillFork := func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetFork(ðpb.Fork{ + fillFork := func(state *ethpb.BeaconState) error { + state.Fork = ðpb.Fork{ PreviousVersion: []byte("prev"), CurrentVersion: []byte("curr"), Epoch: 123, - })) + } return nil } fakeState, err := util.NewBeaconState(fillFork) @@ -120,19 +119,19 @@ func TestGetStateFork(t *testing.T) { } func TestGetFinalityCheckpoints(t *testing.T) { - fillCheckpoints := func(state state.BeaconState) error { - require.NoError(t, state.SetPreviousJustifiedCheckpoint(ðpb.Checkpoint{ + fillCheckpoints := func(state *ethpb.BeaconState) error { + state.PreviousJustifiedCheckpoint = ðpb.Checkpoint{ Root: bytesutil.PadTo([]byte("previous"), 32), Epoch: 113, - })) - require.NoError(t, state.SetCurrentJustifiedCheckpoint(ðpb.Checkpoint{ + } + state.CurrentJustifiedCheckpoint = ðpb.Checkpoint{ Root: bytesutil.PadTo([]byte("current"), 32), Epoch: 123, - })) - require.NoError(t, state.SetFinalizedCheckpoint(ðpb.Checkpoint{ + } + state.FinalizedCheckpoint = ðpb.Checkpoint{ Root: bytesutil.PadTo([]byte("finalized"), 32), Epoch: 103, - })) + } return nil } fakeState, err := util.NewBeaconState(fillCheckpoints) diff --git a/beacon-chain/rpc/eth/beacon/sync_committee.go b/beacon-chain/rpc/eth/beacon/sync_committee.go index 1ad1260ada..15d77e2158 100644 --- a/beacon-chain/rpc/eth/beacon/sync_committee.go +++ b/beacon-chain/rpc/eth/beacon/sync_committee.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/api/grpc" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpbv2 "github.com/prysmaticlabs/prysm/proto/eth/v2" diff --git a/beacon-chain/rpc/eth/beacon/sync_committee_test.go b/beacon-chain/rpc/eth/beacon/sync_committee_test.go index 30a618dfc3..e61138542f 100644 --- a/beacon-chain/rpc/eth/beacon/sync_committee_test.go +++ b/beacon-chain/rpc/eth/beacon/sync_committee_test.go @@ -16,7 +16,7 @@ import ( mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/prysm/v1alpha1/validator" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/testutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpbv2 "github.com/prysmaticlabs/prysm/proto/eth/v2" diff --git a/beacon-chain/rpc/eth/beacon/validator.go b/beacon-chain/rpc/eth/beacon/validator.go index 438d2fac51..8d00aa8fb0 100644 --- a/beacon-chain/rpc/eth/beacon/validator.go +++ b/beacon-chain/rpc/eth/beacon/validator.go @@ -8,8 +8,8 @@ import ( types "github.com/prysmaticlabs/eth2-types" corehelpers "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1" diff --git a/beacon-chain/rpc/eth/beacon/validator_test.go b/beacon-chain/rpc/eth/beacon/validator_test.go index c582572f26..4a0cf33e4b 100644 --- a/beacon-chain/rpc/eth/beacon/validator_test.go +++ b/beacon-chain/rpc/eth/beacon/validator_test.go @@ -11,8 +11,8 @@ import ( rpchelpers "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/statefetcher" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/testutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1" "github.com/prysmaticlabs/prysm/proto/migration" diff --git a/beacon-chain/rpc/eth/debug/BUILD.bazel b/beacon-chain/rpc/eth/debug/BUILD.bazel index 189db1927c..4e9bc943fd 100644 --- a/beacon-chain/rpc/eth/debug/BUILD.bazel +++ b/beacon-chain/rpc/eth/debug/BUILD.bazel @@ -13,8 +13,8 @@ go_library( "//beacon-chain/db:go_default_library", "//beacon-chain/rpc/eth/helpers:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/eth/v1:go_default_library", "//proto/eth/v2:go_default_library", "//proto/migration:go_default_library", diff --git a/beacon-chain/rpc/eth/debug/debug.go b/beacon-chain/rpc/eth/debug/debug.go index bf2d31a62d..06fcf80181 100644 --- a/beacon-chain/rpc/eth/debug/debug.go +++ b/beacon-chain/rpc/eth/debug/debug.go @@ -4,8 +4,8 @@ import ( "context" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" - statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpbv1 "github.com/prysmaticlabs/prysm/proto/eth/v1" ethpbv2 "github.com/prysmaticlabs/prysm/proto/eth/v2" "github.com/prysmaticlabs/prysm/proto/migration" diff --git a/beacon-chain/rpc/eth/helpers/BUILD.bazel b/beacon-chain/rpc/eth/helpers/BUILD.bazel index d8bff8841c..83b0cc5c3a 100644 --- a/beacon-chain/rpc/eth/helpers/BUILD.bazel +++ b/beacon-chain/rpc/eth/helpers/BUILD.bazel @@ -13,7 +13,7 @@ go_library( "//api/grpc:go_default_library", "//beacon-chain/blockchain:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//beacon-chain/sync:go_default_library", "//config/params:go_default_library", "//proto/eth/v1:go_default_library", @@ -34,7 +34,7 @@ go_test( deps = [ "//api/grpc:go_default_library", "//beacon-chain/blockchain/testing:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//config/params:go_default_library", "//proto/eth/v1:go_default_library", diff --git a/beacon-chain/rpc/eth/helpers/validator_status.go b/beacon-chain/rpc/eth/helpers/validator_status.go index 2f6e318579..cca3eb76fa 100644 --- a/beacon-chain/rpc/eth/helpers/validator_status.go +++ b/beacon-chain/rpc/eth/helpers/validator_status.go @@ -3,7 +3,7 @@ package helpers import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1" ) diff --git a/beacon-chain/rpc/eth/helpers/validator_status_test.go b/beacon-chain/rpc/eth/helpers/validator_status_test.go index 3a3364177f..6dbed862f6 100644 --- a/beacon-chain/rpc/eth/helpers/validator_status_test.go +++ b/beacon-chain/rpc/eth/helpers/validator_status_test.go @@ -5,7 +5,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1" "github.com/prysmaticlabs/prysm/proto/migration" diff --git a/beacon-chain/rpc/eth/validator/BUILD.bazel b/beacon-chain/rpc/eth/validator/BUILD.bazel index 2fe8815278..61ed7e4cc4 100644 --- a/beacon-chain/rpc/eth/validator/BUILD.bazel +++ b/beacon-chain/rpc/eth/validator/BUILD.bazel @@ -19,8 +19,8 @@ go_library( "//beacon-chain/rpc/eth/helpers:go_default_library", "//beacon-chain/rpc/prysm/v1alpha1/validator:go_default_library", "//beacon-chain/rpc/statefetcher:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -63,8 +63,8 @@ go_test( "//beacon-chain/powchain/testing:go_default_library", "//beacon-chain/rpc/prysm/v1alpha1/validator:go_default_library", "//beacon-chain/rpc/testutil:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/rpc/eth/validator/validator.go b/beacon-chain/rpc/eth/validator/validator.go index 1376da6619..5501b5a2fd 100644 --- a/beacon-chain/rpc/eth/validator/validator.go +++ b/beacon-chain/rpc/eth/validator/validator.go @@ -14,8 +14,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" rpchelpers "github.com/prysmaticlabs/prysm/beacon-chain/rpc/eth/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/rpc/eth/validator/validator_test.go b/beacon-chain/rpc/eth/validator/validator_test.go index f37997a574..69509f8b65 100644 --- a/beacon-chain/rpc/eth/validator/validator_test.go +++ b/beacon-chain/rpc/eth/validator/validator_test.go @@ -26,8 +26,8 @@ import ( mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" v1alpha1validator "github.com/prysmaticlabs/prysm/beacon-chain/rpc/prysm/v1alpha1/validator" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/testutil" - beaconState "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + beaconState "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" @@ -59,9 +59,9 @@ func TestGetAttesterDuties(t *testing.T) { require.NoError(t, bs.SetSlot(5)) genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) // Deactivate last validator. vals := bs.Validators() @@ -141,9 +141,9 @@ func TestGetAttesterDuties(t *testing.T) { require.NoError(t, bs.SetSlot(5)) genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) pubKeys := make([][]byte, len(deposits)) indices := make([]uint64, len(deposits)) @@ -167,7 +167,7 @@ func TestGetAttesterDuties(t *testing.T) { } resp, err := vs.GetAttesterDuties(ctx, req) require.NoError(t, err) - assert.DeepEqual(t, bs.BlockRoots()[31], bytesutil.ToBytes32(resp.DependentRoot)) + assert.DeepEqual(t, bs.BlockRoots()[31], resp.DependentRoot) require.Equal(t, 1, len(resp.Data)) duty := resp.Data[0] assert.Equal(t, types.CommitteeIndex(1), duty.CommitteeIndex) @@ -236,9 +236,9 @@ func TestGetProposerDuties(t *testing.T) { require.NoError(t, bs.SetSlot(5)) genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) pubKeys := make([][]byte, len(deposits)) for i := 0; i < len(deposits); i++ { @@ -285,9 +285,9 @@ func TestGetProposerDuties(t *testing.T) { require.NoError(t, bs.SetSlot(5)) genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) pubKeys := make([][]byte, len(deposits)) indices := make([]uint64, len(deposits)) @@ -310,7 +310,7 @@ func TestGetProposerDuties(t *testing.T) { } resp, err := vs.GetProposerDuties(ctx, req) require.NoError(t, err) - assert.DeepEqual(t, bs.BlockRoots()[31], bytesutil.ToBytes32(resp.DependentRoot)) + assert.DeepEqual(t, bs.BlockRoots()[31], resp.DependentRoot) assert.Equal(t, 32, len(resp.Data)) // We expect a proposer duty for slot 74. var expectedDuty *ethpbv1.ProposerDuty @@ -899,9 +899,9 @@ func TestProduceAttestationData(t *testing.T) { require.NoError(t, err) blockRoots := beaconState.BlockRoots() - blockRoots[1] = blockRoot - blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot - blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot + blockRoots[1] = blockRoot[:] + blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot[:] + blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot[:] require.NoError(t, beaconState.SetBlockRoots(blockRoots)) chainService := &mockChain.ChainService{ Genesis: time.Now(), @@ -1117,9 +1117,9 @@ func TestSubmitBeaconCommitteeSubscription(t *testing.T) { require.NoError(t, bs.SetSlot(5)) genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) pubKeys := make([][]byte, len(deposits)) for i := 0; i < len(deposits); i++ { @@ -1258,9 +1258,9 @@ func TestSubmitSyncCommitteeSubscription(t *testing.T) { require.NoError(t, err, "Could not set up genesis state") genesisRoot, err := genesis.Block.HashTreeRoot() require.NoError(t, err, "Could not get signing root") - var roots [fieldparams.BlockRootsLength][32]byte - roots[0] = genesisRoot - require.NoError(t, bs.SetBlockRoots(&roots)) + roots := make([][]byte, fieldparams.BlockRootsLength) + roots[0] = genesisRoot[:] + require.NoError(t, bs.SetBlockRoots(roots)) pubkeys := make([][]byte, len(deposits)) for i := 0; i < len(deposits); i++ { diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel index 7af5e047a2..9ed8f7446b 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/BUILD.bazel @@ -38,8 +38,8 @@ go_library( "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/p2p:go_default_library", "//beacon-chain/powchain:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//cmd:go_default_library", "//config/features:go_default_library", @@ -95,9 +95,9 @@ go_test( "//beacon-chain/operations/attestations:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/p2p/testing:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//cmd:go_default_library", "//cmd/beacon-chain/flags:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go index c0bd7fccbe..4f88fcd28b 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/assignments_test.go @@ -11,7 +11,7 @@ import ( mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/cmd" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go index d93efce2cf..dfb4c7f167 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/attestations_test.go @@ -18,8 +18,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/cmd" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" @@ -642,8 +642,11 @@ func TestServer_ListIndexedAttestations_OldEpoch(t *testing.T) { numValidators := uint64(128) state, _ := util.DeterministicGenesisState(t, numValidators) - var mixes [fieldparams.RandaoMixesLength][fieldparams.RootLength]byte - require.NoError(t, state.SetRandaoMixes(&mixes)) + randaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(randaoMixes); i++ { + randaoMixes[i] = make([]byte, fieldparams.RootLength) + } + require.NoError(t, state.SetRandaoMixes(randaoMixes)) require.NoError(t, state.SetSlot(startSlot)) // Next up we convert the test attestations to indexed form: @@ -907,8 +910,7 @@ func TestServer_StreamIndexedAttestations_OK(t *testing.T) { }, }, } - gvr := headState.GenesisValidatorRoot() - domain, err := signing.Domain(headState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(headState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, headState.GenesisValidatorRoot()) require.NoError(t, err) encoded, err := signing.ComputeSigningRoot(attExample.Data, domain) require.NoError(t, err) diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/blocks_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/blocks_test.go index 4322929a3a..d6c09e9ef0 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/blocks_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/blocks_test.go @@ -14,8 +14,8 @@ import ( statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/cmd" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go index a35264705f..2eeadb744e 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/committees_test.go @@ -9,8 +9,8 @@ import ( mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -80,8 +80,11 @@ func TestServer_ListBeaconCommittees_PreviousEpoch(t *testing.T) { numValidators := 128 headState := setupActiveValidators(t, numValidators) - var mixes [fieldparams.RandaoMixesLength][fieldparams.RootLength]byte - require.NoError(t, headState.SetRandaoMixes(&mixes)) + randaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(randaoMixes); i++ { + randaoMixes[i] = make([]byte, fieldparams.RootLength) + } + require.NoError(t, headState.SetRandaoMixes(randaoMixes)) require.NoError(t, headState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) b := util.NewBeaconBlock() diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/server.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/server.go index c7aaa4b722..647662d1a2 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/server.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/server.go @@ -17,7 +17,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/beacon-chain/sync" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators.go index 9eb6de56c8..2547ecb25c 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators.go @@ -13,7 +13,7 @@ import ( coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/cmd" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_stream.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_stream.go index 6d82cdd07c..01a0a228eb 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_stream.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_stream.go @@ -23,7 +23,7 @@ import ( coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go index 0e1b85e39a..1c762caf38 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/beacon/validators_test.go @@ -17,9 +17,9 @@ import ( coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/db" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/cmd" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" @@ -2166,7 +2166,7 @@ func TestServer_GetIndividualVotes_Working(t *testing.T) { att1.Data.BeaconBlockRoot = rt[:] br := beaconState.BlockRoots() newRt := [32]byte{'B'} - br[0] = newRt + br[0] = newRt[:] require.NoError(t, beaconState.SetBlockRoots(br)) att2.Data.Target.Root = rt[:] att2.Data.BeaconBlockRoot = newRt[:] diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel index 1e767aaa83..7fe789e02d 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/BUILD.bazel @@ -17,8 +17,8 @@ go_library( "//beacon-chain/db:go_default_library", "//beacon-chain/db/filters:go_default_library", "//beacon-chain/p2p:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", @@ -50,7 +50,7 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/forkchoice/protoarray:go_default_library", "//beacon-chain/p2p/testing:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/block.go b/beacon-chain/rpc/prysm/v1alpha1/debug/block.go index 504e6dc1c1..e0bf8b2592 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/block.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/block.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/db/filters" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" pbrpc "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go b/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go index 8fecfba23e..5681328c97 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/block_test.go @@ -9,7 +9,7 @@ import ( mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/server.go b/beacon-chain/rpc/prysm/v1alpha1/debug/server.go index b1d06685f6..f19b92be5c 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/server.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/server.go @@ -13,7 +13,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" pbrpc "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" diff --git a/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go b/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go index 08a28b0976..3572e35dc9 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/debug/state_test.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" dbTest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" pbrpc "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel index 5345aff754..a1c74ddff7 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel @@ -45,8 +45,8 @@ go_library( "//beacon-chain/operations/voluntaryexits:go_default_library", "//beacon-chain/p2p:go_default_library", "//beacon-chain/powchain:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", @@ -123,9 +123,9 @@ go_test( "//beacon-chain/operations/voluntaryexits:go_default_library", "//beacon-chain/p2p/testing:go_default_library", "//beacon-chain/powchain/testing:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/aggregator_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/aggregator_test.go index 18be04189f..2397ac001d 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/aggregator_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/aggregator_test.go @@ -12,8 +12,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/assignments.go b/beacon-chain/rpc/prysm/v1alpha1/validator/assignments.go index df091e52f9..c1710c6ea5 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/assignments.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/assignments.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - beaconState "github.com/prysmaticlabs/prysm/beacon-chain/state" + beaconState "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/rand" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go index 8a6207955c..9407ebc9a1 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/attester_test.go @@ -13,8 +13,8 @@ import ( dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -112,9 +112,9 @@ func TestGetAttestationData_OK(t *testing.T) { require.NoError(t, err) blockRoots := beaconState.BlockRoots() - blockRoots[1] = blockRoot - blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot - blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot + blockRoots[1] = blockRoot[:] + blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot[:] + blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot[:] require.NoError(t, beaconState.SetBlockRoots(blockRoots)) chainService := &mock.ChainService{ Genesis: time.Now(), @@ -212,9 +212,9 @@ func TestAttestationDataAtSlot_HandlesFarAwayJustifiedEpoch(t *testing.T) { }) require.NoError(t, err) blockRoots := beaconState.BlockRoots() - blockRoots[1] = blockRoot - blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = epochBoundaryRoot - blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedBlockRoot + blockRoots[1] = blockRoot[:] + blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = epochBoundaryRoot[:] + blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedBlockRoot[:] require.NoError(t, beaconState.SetBlockRoots(blockRoots)) chainService := &mock.ChainService{ Genesis: time.Now(), @@ -369,10 +369,10 @@ func TestServer_GetAttestationData_HeadStateSlotGreaterThanRequestSlot(t *testin }) require.NoError(t, err) blockRoots := beaconState.BlockRoots() - blockRoots[1] = blockRoot - blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot - blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot - blockRoots[3*params.BeaconConfig().SlotsPerEpoch] = blockRoot2 + blockRoots[1] = blockRoot[:] + blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot[:] + blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot[:] + blockRoots[3*params.BeaconConfig().SlotsPerEpoch] = blockRoot2[:] require.NoError(t, beaconState.SetBlockRoots(blockRoots)) beaconstate := beaconState.Copy() @@ -445,9 +445,9 @@ func TestGetAttestationData_SucceedsInFirstEpoch(t *testing.T) { }) require.NoError(t, err) blockRoots := beaconState.BlockRoots() - blockRoots[1] = blockRoot - blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot - blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot + blockRoots[1] = blockRoot[:] + blockRoots[1*params.BeaconConfig().SlotsPerEpoch] = targetRoot[:] + blockRoots[2*params.BeaconConfig().SlotsPerEpoch] = justifiedRoot[:] require.NoError(t, beaconState.SetBlockRoots(blockRoots)) chainService := &mock.ChainService{ Genesis: time.Now(), diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/exit.go b/beacon-chain/rpc/prysm/v1alpha1/validator/exit.go index eefe62ec07..978390097f 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/exit.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/exit.go @@ -34,8 +34,7 @@ func (vs *Server) ProposeExit(ctx context.Context, req *ethpb.SignedVoluntaryExi return nil, status.Error(codes.InvalidArgument, "validator index exceeds validator set length") } - gvRoot := s.GenesisValidatorRoot() - if err := blocks.VerifyExitAndSignature(val, s.Slot(), s.Fork(), req, gvRoot[:]); err != nil { + if err := blocks.VerifyExitAndSignature(val, s.Slot(), s.Fork(), req, s.GenesisValidatorRoot()); err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_attestations.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_attestations.go index fcb4b023ca..1042c441ef 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_attestations.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_attestations.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_deposits.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_deposits.go index 34938ac630..5247fbea9f 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_deposits.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_deposits.go @@ -6,7 +6,7 @@ import ( "math/big" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_eth1data.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_eth1data.go index 9adab9391d..fbea1deb28 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_eth1data.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_eth1data.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_phase0.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_phase0.go index 166ceb5d3d..f9ad98d022 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_phase0.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_phase0.go @@ -152,8 +152,7 @@ func (vs *Server) buildPhase0BlockData(ctx context.Context, req *ethpb.BlockRequ log.WithError(err).Warn("Proposer: invalid exit") continue } - gvRoot := head.GenesisValidatorRoot() - if err := blocks.VerifyExitAndSignature(val, head.Slot(), head.Fork(), exit, gvRoot[:]); err != nil { + if err := blocks.VerifyExitAndSignature(val, head.Slot(), head.Fork(), exit, head.GenesisValidatorRoot()); err != nil { log.WithError(err).Warn("Proposer: invalid exit") continue } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index a42f575c05..32e79eb0af 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -20,9 +20,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" @@ -1790,7 +1790,7 @@ func TestProposer_FilterAttestation(t *testing.T) { numValidators := uint64(64) state, privKeys := util.DeterministicGenesisState(t, numValidators) - require.NoError(t, state.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash)) + require.NoError(t, state.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash[:])) assert.NoError(t, state.SetSlot(1)) genesisRoot, err := genesis.Block.HashTreeRoot() diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/server.go b/beacon-chain/rpc/prysm/v1alpha1/validator/server.go index a103a9ba0c..465d42150e 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/server.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/server.go @@ -22,7 +22,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/beacon-chain/sync" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -162,11 +162,10 @@ func (vs *Server) WaitForChainStart(_ *emptypb.Empty, stream ethpb.BeaconNodeVal return status.Errorf(codes.Internal, "Could not retrieve head state: %v", err) } if head != nil && !head.IsNil() { - genesisValidatorRoot := head.GenesisValidatorRoot() res := ðpb.ChainStartResponse{ Started: true, GenesisTime: head.GenesisTime(), - GenesisValidatorsRoot: genesisValidatorRoot[:], + GenesisValidatorsRoot: head.GenesisValidatorRoot(), } return stream.Send(res) } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go index c027c69a37..d32e8d02be 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/server_test.go @@ -14,7 +14,7 @@ import ( statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -300,7 +300,7 @@ func TestWaitForChainStart_AlreadyStarted(t *testing.T) { require.NoError(t, err) require.NoError(t, st.SetSlot(3)) genesisValidatorsRoot := bytesutil.ToBytes32([]byte("validators")) - require.NoError(t, st.SetGenesisValidatorRoot(genesisValidatorsRoot)) + require.NoError(t, st.SetGenesisValidatorRoot(genesisValidatorsRoot[:])) chainService := &mockChain.ChainService{State: st, ValidatorsRoot: genesisValidatorsRoot} Server := &Server{ diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/status.go b/beacon-chain/rpc/prysm/v1alpha1/validator/status.go index 4414bd2a65..05101316b4 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/status.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/status.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/contracts/deposit" diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go index 945934aa6e..2df65a1f65 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/status_test.go @@ -13,9 +13,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/rpc/service.go b/beacon-chain/rpc/service.go index a36b4e4307..57eabc1b3c 100644 --- a/beacon-chain/rpc/service.go +++ b/beacon-chain/rpc/service.go @@ -37,7 +37,7 @@ import ( validatorv1alpha1 "github.com/prysmaticlabs/prysm/beacon-chain/rpc/prysm/v1alpha1/validator" "github.com/prysmaticlabs/prysm/beacon-chain/rpc/statefetcher" slasherservice "github.com/prysmaticlabs/prysm/beacon-chain/slasher" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" chainSync "github.com/prysmaticlabs/prysm/beacon-chain/sync" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/rpc/statefetcher/BUILD.bazel b/beacon-chain/rpc/statefetcher/BUILD.bazel index 2d941f187a..7ac89acb95 100644 --- a/beacon-chain/rpc/statefetcher/BUILD.bazel +++ b/beacon-chain/rpc/statefetcher/BUILD.bazel @@ -9,8 +9,8 @@ go_library( "//beacon-chain/blockchain:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/db:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//encoding/bytesutil:go_default_library", "@com_github_pkg_errors//:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", @@ -24,8 +24,7 @@ go_test( deps = [ "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/db/testing:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/rpc/statefetcher/fetcher.go b/beacon-chain/rpc/statefetcher/fetcher.go index 8db34c37e8..b5baf2d602 100644 --- a/beacon-chain/rpc/statefetcher/fetcher.go +++ b/beacon-chain/rpc/statefetcher/fetcher.go @@ -12,8 +12,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/db" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) @@ -177,9 +177,9 @@ func (p *StateProvider) stateByHex(ctx context.Context, stateId []byte) (state.B return nil, errors.Wrap(err, "could not get head state") } for i, root := range headState.StateRoots() { - if bytes.Equal(root[:], stateId) { + if bytes.Equal(root, stateId) { blockRoot := headState.BlockRoots()[i] - return p.StateGenService.StateByRoot(ctx, blockRoot) + return p.StateGenService.StateByRoot(ctx, bytesutil.ToBytes32(blockRoot)) } } @@ -259,7 +259,7 @@ func (p *StateProvider) stateRootByHex(ctx context.Context, stateId []byte) ([]b return nil, errors.Wrap(err, "could not get head state") } for _, root := range headState.StateRoots() { - if root == stateRoot { + if bytes.Equal(root, stateRoot[:]) { return stateRoot[:], nil } } diff --git a/beacon-chain/rpc/statefetcher/fetcher_test.go b/beacon-chain/rpc/statefetcher/fetcher_test.go index 50ca1f2d20..9512dd1350 100644 --- a/beacon-chain/rpc/statefetcher/fetcher_test.go +++ b/beacon-chain/rpc/statefetcher/fetcher_test.go @@ -11,8 +11,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" chainMock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -26,8 +25,8 @@ func TestGetState(t *testing.T) { ctx := context.Background() headSlot := types.Slot(123) - fillSlot := func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetSlot(headSlot)) + fillSlot := func(state *ethpb.BeaconState) error { + state.Slot = headSlot return nil } newBeaconState, err := util.NewBeaconState(util.FillRootsNaturalOpt, fillSlot) @@ -60,10 +59,8 @@ func TestGetState(t *testing.T) { r, err := b.Block.HashTreeRoot() require.NoError(t, err) - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - bRoots := beaconState.BlockRoots() - bRoots[0] = r - require.NoError(t, beaconState.SetBlockRoots(bRoots)) + bs, err := util.NewBeaconState(func(state *ethpb.BeaconState) error { + state.BlockRoots[0] = r[:] return nil }) require.NoError(t, err) @@ -190,8 +187,8 @@ func TestGetStateRoot(t *testing.T) { ctx := context.Background() headSlot := types.Slot(123) - fillSlot := func(beaconState state.BeaconState) error { - require.NoError(t, beaconState.SetSlot(headSlot)) + fillSlot := func(state *ethpb.BeaconState) error { + state.Slot = headSlot return nil } newBeaconState, err := util.NewBeaconState(util.FillRootsNaturalOpt, fillSlot) @@ -221,10 +218,8 @@ func TestGetStateRoot(t *testing.T) { r, err := b.Block.HashTreeRoot() require.NoError(t, err) - bs, err := util.NewBeaconState(func(beaconState state.BeaconState) error { - bRoots := beaconState.BlockRoots() - bRoots[0] = r - require.NoError(t, beaconState.SetBlockRoots(bRoots)) + bs, err := util.NewBeaconState(func(state *ethpb.BeaconState) error { + state.BlockRoots[0] = r[:] return nil }) require.NoError(t, err) diff --git a/beacon-chain/rpc/testutil/BUILD.bazel b/beacon-chain/rpc/testutil/BUILD.bazel index 4714040101..8b0d6b3bef 100644 --- a/beacon-chain/rpc/testutil/BUILD.bazel +++ b/beacon-chain/rpc/testutil/BUILD.bazel @@ -10,7 +10,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/beacon-chain/rpc/testutil", visibility = ["//beacon-chain:__subpackages__"], deps = [ - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", ], diff --git a/beacon-chain/rpc/testutil/mock_state_fetcher.go b/beacon-chain/rpc/testutil/mock_state_fetcher.go index 302f9b0730..6b62182ee4 100644 --- a/beacon-chain/rpc/testutil/mock_state_fetcher.go +++ b/beacon-chain/rpc/testutil/mock_state_fetcher.go @@ -3,7 +3,7 @@ package testutil import ( "context" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ) // MockFetcher is a fake implementation of statefetcher.Fetcher. diff --git a/beacon-chain/sharedstate/BUILD.bazel b/beacon-chain/sharedstate/BUILD.bazel new file mode 100644 index 0000000000..64ecfb6758 --- /dev/null +++ b/beacon-chain/sharedstate/BUILD.bazel @@ -0,0 +1,12 @@ +load("@prysm//tools/go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["prometheus.go"], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate", + visibility = ["//visibility:public"], + deps = [ + "@com_github_prometheus_client_golang//prometheus:go_default_library", + "@com_github_prometheus_client_golang//prometheus/promauto:go_default_library", + ], +) diff --git a/beacon-chain/sharedstate/prometheus.go b/beacon-chain/sharedstate/prometheus.go new file mode 100644 index 0000000000..c10633db1b --- /dev/null +++ b/beacon-chain/sharedstate/prometheus.go @@ -0,0 +1,13 @@ +package sharedstate + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + StateCount = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "beacon_state_count", + Help: "Count the number of active beacon state objects.", + }) +) diff --git a/beacon-chain/slasher/BUILD.bazel b/beacon-chain/slasher/BUILD.bazel index 9a76fddf02..c00f841c84 100644 --- a/beacon-chain/slasher/BUILD.bazel +++ b/beacon-chain/slasher/BUILD.bazel @@ -32,8 +32,8 @@ go_library( "//beacon-chain/db:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/slasher/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -77,7 +77,7 @@ go_test( "//beacon-chain/db/testing:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/slasher/types:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", diff --git a/beacon-chain/slasher/detect_attestations_test.go b/beacon-chain/slasher/detect_attestations_test.go index a6d0cc23a0..3f76fa930b 100644 --- a/beacon-chain/slasher/detect_attestations_test.go +++ b/beacon-chain/slasher/detect_attestations_test.go @@ -211,12 +211,11 @@ func Test_processQueuedAttestations(t *testing.T) { } err = beaconState.SetValidators(validators) require.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, - gvr[:], + beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) diff --git a/beacon-chain/slasher/detect_blocks_test.go b/beacon-chain/slasher/detect_blocks_test.go index e9b14625a4..71a3576e5d 100644 --- a/beacon-chain/slasher/detect_blocks_test.go +++ b/beacon-chain/slasher/detect_blocks_test.go @@ -10,7 +10,7 @@ import ( dbtest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" slashertypes "github.com/prysmaticlabs/prysm/beacon-chain/slasher/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -44,12 +44,11 @@ func Test_processQueuedBlocks_DetectsDoubleProposals(t *testing.T) { } err = beaconState.SetValidators(validators) require.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconProposer, - gvr[:], + beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) diff --git a/beacon-chain/slasher/process_slashings.go b/beacon-chain/slasher/process_slashings.go index 8e8c6d1f2e..7eb344eaa9 100644 --- a/beacon-chain/slasher/process_slashings.go +++ b/beacon-chain/slasher/process_slashings.go @@ -4,7 +4,7 @@ import ( "context" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/slasher/process_slashings_test.go b/beacon-chain/slasher/process_slashings_test.go index e9bf64c2e8..906f11c4a9 100644 --- a/beacon-chain/slasher/process_slashings_test.go +++ b/beacon-chain/slasher/process_slashings_test.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" dbtest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -57,12 +57,11 @@ func TestService_processAttesterSlashings(t *testing.T) { AttestingIndices: []uint64{0}, }) - gvr := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, - gvr[:], + beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) signingRoot, err := signing.ComputeSigningRoot(firstAtt.Data, domain) @@ -177,12 +176,11 @@ func TestService_processProposerSlashings(t *testing.T) { }, }) - gvr := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconProposer, - gvr[:], + beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) htr, err := firstBlockHeader.Header.HashTreeRoot() diff --git a/beacon-chain/slasher/service.go b/beacon-chain/slasher/service.go index 4c01ea5c18..fa24f3fcf4 100644 --- a/beacon-chain/slasher/service.go +++ b/beacon-chain/slasher/service.go @@ -15,7 +15,7 @@ import ( statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/beacon-chain/sync" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state/BUILD.bazel b/beacon-chain/state-native/BUILD.bazel similarity index 98% rename from beacon-chain/state/BUILD.bazel rename to beacon-chain/state-native/BUILD.bazel index 9edc6abda7..d0a2e1b972 100644 --- a/beacon-chain/state/BUILD.bazel +++ b/beacon-chain/state-native/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "altair.go", "phase0.go", ], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native", visibility = [ "//beacon-chain:__subpackages__", "//contracts/deposit:__subpackages__", diff --git a/beacon-chain/state/altair.go b/beacon-chain/state-native/altair.go similarity index 100% rename from beacon-chain/state/altair.go rename to beacon-chain/state-native/altair.go diff --git a/beacon-chain/state/custom-types/BUILD.bazel b/beacon-chain/state-native/custom-types/BUILD.bazel similarity index 95% rename from beacon-chain/state/custom-types/BUILD.bazel rename to beacon-chain/state-native/custom-types/BUILD.bazel index 9722dcccca..5350681bdb 100644 --- a/beacon-chain/state/custom-types/BUILD.bazel +++ b/beacon-chain/state-native/custom-types/BUILD.bazel @@ -3,7 +3,7 @@ load("@prysm//tools/go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["state_arrays.go"], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types", visibility = ["//visibility:public"], deps = [ "//config/fieldparams:go_default_library", diff --git a/beacon-chain/state/custom-types/state_arrays.go b/beacon-chain/state-native/custom-types/state_arrays.go similarity index 100% rename from beacon-chain/state/custom-types/state_arrays.go rename to beacon-chain/state-native/custom-types/state_arrays.go diff --git a/beacon-chain/state/custom-types/state_arrays_test.go b/beacon-chain/state-native/custom-types/state_arrays_test.go similarity index 100% rename from beacon-chain/state/custom-types/state_arrays_test.go rename to beacon-chain/state-native/custom-types/state_arrays_test.go diff --git a/beacon-chain/state/fieldtrie/BUILD.bazel b/beacon-chain/state-native/fieldtrie/BUILD.bazel similarity index 74% rename from beacon-chain/state/fieldtrie/BUILD.bazel rename to beacon-chain/state-native/fieldtrie/BUILD.bazel index ce4538745d..e2e8b1533d 100644 --- a/beacon-chain/state/fieldtrie/BUILD.bazel +++ b/beacon-chain/state-native/fieldtrie/BUILD.bazel @@ -6,12 +6,11 @@ go_library( "field_trie.go", "field_trie_helpers.go", ], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie", visibility = ["//beacon-chain:__subpackages__"], deps = [ - "//beacon-chain/state/custom-types:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", "//crypto/hash:go_default_library", "//encoding/bytesutil:go_default_library", "//encoding/ssz:go_default_library", @@ -29,9 +28,8 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state/custom-types:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/assert:go_default_library", diff --git a/beacon-chain/state/fieldtrie/field_trie.go b/beacon-chain/state-native/fieldtrie/field_trie.go similarity index 97% rename from beacon-chain/state/fieldtrie/field_trie.go rename to beacon-chain/state-native/fieldtrie/field_trie.go index 7e60feb04b..55083bd680 100644 --- a/beacon-chain/state/fieldtrie/field_trie.go +++ b/beacon-chain/state-native/fieldtrie/field_trie.go @@ -5,8 +5,8 @@ import ( "sync" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ) // FieldTrie is the representation of the representative diff --git a/beacon-chain/state/fieldtrie/field_trie_helpers.go b/beacon-chain/state-native/fieldtrie/field_trie_helpers.go similarity index 88% rename from beacon-chain/state/fieldtrie/field_trie_helpers.go rename to beacon-chain/state-native/fieldtrie/field_trie_helpers.go index e8cc378358..5f3a3fce68 100644 --- a/beacon-chain/state/fieldtrie/field_trie_helpers.go +++ b/beacon-chain/state-native/fieldtrie/field_trie_helpers.go @@ -6,9 +6,8 @@ import ( "reflect" "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/crypto/hash" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/encoding/ssz" @@ -66,42 +65,13 @@ func validateElements(field types.FieldIndex, dataType types.DataType, elements // fieldConverters converts the corresponding field and the provided elements to the appropriate roots. func fieldConverters(field types.FieldIndex, indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) { switch field { - case types.BlockRoots: - val, ok := elements.(*customtypes.BlockRoots) + case types.BlockRoots, types.StateRoots, types.RandaoMixes: + val, ok := elements.([][]byte) if !ok { return nil, errors.Errorf("Wanted type of %v but got %v", reflect.TypeOf([][]byte{}).Name(), reflect.TypeOf(elements).Name()) } - roots := make([][]byte, len(val)) - for i, r := range val { - tmp := r - roots[i] = tmp[:] - } - return handleByteArrays(roots, indices, convertAll) - case types.StateRoots: - val, ok := elements.(*customtypes.StateRoots) - if !ok { - return nil, errors.Errorf("Wanted type of %v but got %v", - reflect.TypeOf([][]byte{}).Name(), reflect.TypeOf(elements).Name()) - } - roots := make([][]byte, len(val)) - for i, r := range val { - tmp := r - roots[i] = tmp[:] - } - return handleByteArrays(roots, indices, convertAll) - case types.RandaoMixes: - val, ok := elements.(*customtypes.RandaoMixes) - if !ok { - return nil, errors.Errorf("Wanted type of %v but got %v", - reflect.TypeOf([][]byte{}).Name(), reflect.TypeOf(elements).Name()) - } - mixes := make([][]byte, len(val)) - for i, m := range val { - tmp := m - mixes[i] = tmp[:] - } - return handleByteArrays(mixes, indices, convertAll) + return handleByteArrays(val, indices, convertAll) case types.Eth1DataVotes: val, ok := elements.([]*ethpb.Eth1Data) if !ok { diff --git a/beacon-chain/state/fieldtrie/field_trie_test.go b/beacon-chain/state-native/fieldtrie/field_trie_test.go similarity index 67% rename from beacon-chain/state/fieldtrie/field_trie_test.go rename to beacon-chain/state-native/fieldtrie/field_trie_test.go index d13041054b..8440deb1f4 100644 --- a/beacon-chain/state/fieldtrie/field_trie_test.go +++ b/beacon-chain/state-native/fieldtrie/field_trie_test.go @@ -4,10 +4,9 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" @@ -19,20 +18,9 @@ func TestFieldTrie_NewTrie(t *testing.T) { newState, _ := util.DeterministicGenesisState(t, 40) // 5 represents the enum value of state roots - sRoots := customtypes.BlockRoots(*newState.StateRoots()) - trie, err := fieldtrie.NewFieldTrie(5, stateTypes.BasicArray, &sRoots, uint64(params.BeaconConfig().SlotsPerHistoricalRoot)) + trie, err := fieldtrie.NewFieldTrie(5, stateTypes.BasicArray, newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot)) require.NoError(t, err) - sRootsSlice := make([][]byte, len(newState.StateRoots())) - for i, r := range newState.StateRoots() { - tmp := r - sRootsSlice[i] = tmp[:] - } - sR := make([][]byte, len(newState.StateRoots())) - for i, r := range newState.StateRoots() { - tmp := r - sR[i] = tmp[:] - } - root, err := stateutil.RootsArrayHashTreeRoot(sR, uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "StateRoots") + root, err := stateutil.RootsArrayHashTreeRoot(newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "StateRoots") require.NoError(t, err) newRoot, err := trie.TrieRoot() require.NoError(t, err) @@ -70,8 +58,7 @@ func TestFieldTrie_RecomputeTrie(t *testing.T) { func TestFieldTrie_CopyTrieImmutable(t *testing.T) { newState, _ := util.DeterministicGenesisState(t, 32) // 12 represents the enum value of randao mixes. - mixes := customtypes.RandaoMixes(*newState.RandaoMixes()) - trie, err := fieldtrie.NewFieldTrie(13, stateTypes.BasicArray, &mixes, uint64(params.BeaconConfig().EpochsPerHistoricalVector)) + trie, err := fieldtrie.NewFieldTrie(13, stateTypes.BasicArray, newState.RandaoMixes(), uint64(params.BeaconConfig().EpochsPerHistoricalVector)) require.NoError(t, err) newTrie := trie.CopyTrie() @@ -79,11 +66,10 @@ func TestFieldTrie_CopyTrieImmutable(t *testing.T) { changedIdx := []uint64{2, 29} changedVals := [][32]byte{{'A', 'B'}, {'C', 'D'}} - require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[0], changedVals[0])) - require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[1], changedVals[1])) + require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[0], changedVals[0][:])) + require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[1], changedVals[1][:])) - mixes = customtypes.RandaoMixes(*newState.RandaoMixes()) - root, err := trie.RecomputeTrie(changedIdx, &mixes) + root, err := trie.RecomputeTrie(changedIdx, newState.RandaoMixes()) require.NoError(t, err) newRoot, err := newTrie.TrieRoot() require.NoError(t, err) diff --git a/beacon-chain/state-native/fieldtrie/helpers_test.go b/beacon-chain/state-native/fieldtrie/helpers_test.go new file mode 100644 index 0000000000..3024acdfd0 --- /dev/null +++ b/beacon-chain/state-native/fieldtrie/helpers_test.go @@ -0,0 +1,85 @@ +package fieldtrie + +import ( + "encoding/binary" + "sync" + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" +) + +func Test_handlePendingAttestation_OutOfRange(t *testing.T) { + items := make([]*ethpb.PendingAttestation, 1) + indices := []uint64{3} + _, err := handlePendingAttestation(items, indices, false) + assert.ErrorContains(t, "index 3 greater than number of pending attestations 1", err) +} + +func Test_handleEth1DataSlice_OutOfRange(t *testing.T) { + items := make([]*ethpb.Eth1Data, 1) + indices := []uint64{3} + _, err := handleEth1DataSlice(items, indices, false) + assert.ErrorContains(t, "index 3 greater than number of items in eth1 data slice 1", err) + +} + +func Test_handleValidatorSlice_OutOfRange(t *testing.T) { + vals := make([]*ethpb.Validator, 1) + indices := []uint64{3} + _, err := handleValidatorSlice(vals, indices, false) + assert.ErrorContains(t, "index 3 greater than number of validators 1", err) +} + +func TestBalancesSlice_CorrectRoots_All(t *testing.T) { + balances := []uint64{5, 2929, 34, 1291, 354305} + roots, err := handleBalanceSlice(balances, []uint64{}, true) + assert.NoError(t, err) + + root1 := [32]byte{} + binary.LittleEndian.PutUint64(root1[:8], balances[0]) + binary.LittleEndian.PutUint64(root1[8:16], balances[1]) + binary.LittleEndian.PutUint64(root1[16:24], balances[2]) + binary.LittleEndian.PutUint64(root1[24:32], balances[3]) + + root2 := [32]byte{} + binary.LittleEndian.PutUint64(root2[:8], balances[4]) + + assert.DeepEqual(t, roots, [][32]byte{root1, root2}) +} + +func TestBalancesSlice_CorrectRoots_Some(t *testing.T) { + balances := []uint64{5, 2929, 34, 1291, 354305} + roots, err := handleBalanceSlice(balances, []uint64{2, 3}, false) + assert.NoError(t, err) + + root1 := [32]byte{} + binary.LittleEndian.PutUint64(root1[:8], balances[0]) + binary.LittleEndian.PutUint64(root1[8:16], balances[1]) + binary.LittleEndian.PutUint64(root1[16:24], balances[2]) + binary.LittleEndian.PutUint64(root1[24:32], balances[3]) + + // Returns root for each indice(even if duplicated) + assert.DeepEqual(t, roots, [][32]byte{root1, root1}) +} + +func TestValidateIndices_CompressedField(t *testing.T) { + fakeTrie := &FieldTrie{ + RWMutex: new(sync.RWMutex), + reference: stateutil.NewRef(0), + fieldLayers: nil, + field: types.Balances, + dataType: types.CompressedArray, + length: params.BeaconConfig().ValidatorRegistryLimit / 4, + numOfElems: 0, + } + goodIdx := params.BeaconConfig().ValidatorRegistryLimit - 1 + assert.NoError(t, fakeTrie.validateIndices([]uint64{goodIdx})) + + badIdx := goodIdx + 1 + assert.ErrorContains(t, "invalid index for field balances", fakeTrie.validateIndices([]uint64{badIdx})) + +} diff --git a/beacon-chain/state-native/genesis/BUILD.bazel b/beacon-chain/state-native/genesis/BUILD.bazel new file mode 100644 index 0000000000..8e9c939c2e --- /dev/null +++ b/beacon-chain/state-native/genesis/BUILD.bazel @@ -0,0 +1,24 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["genesis.go"], + embedsrcs = ["mainnet.ssz.snappy"], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/genesis", + visibility = ["//beacon-chain/db:__subpackages__"], + deps = [ + "//beacon-chain/state-native/v1:go_default_library", + "//config/params:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "@com_github_golang_snappy//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["genesis_test.go"], + deps = [ + ":go_default_library", + "//config/params:go_default_library", + ], +) diff --git a/beacon-chain/state-native/genesis/genesis.go b/beacon-chain/state-native/genesis/genesis.go new file mode 100644 index 0000000000..d6f480e73a --- /dev/null +++ b/beacon-chain/state-native/genesis/genesis.go @@ -0,0 +1,39 @@ +package genesis + +import ( + _ "embed" + + "github.com/golang/snappy" + state "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +var ( + //go:embed mainnet.ssz.snappy + mainnetRawSSZCompressed []byte // 1.8Mb +) + +// State returns a copy of the genesis state from a hardcoded value. +func State(name string) (*state.BeaconState, error) { + switch name { + case params.ConfigNames[params.Mainnet]: + return load(mainnetRawSSZCompressed) + default: + // No state found. + return nil, nil + } +} + +// load a compressed ssz state file into a beacon state struct. +func load(b []byte) (*state.BeaconState, error) { + st := ðpb.BeaconState{} + b, err := snappy.Decode(nil /*dst*/, b) + if err != nil { + return nil, err + } + if err := st.UnmarshalSSZ(b); err != nil { + return nil, err + } + return state.InitializeFromProtoUnsafe(st) +} diff --git a/beacon-chain/state-native/genesis/genesis_test.go b/beacon-chain/state-native/genesis/genesis_test.go new file mode 100644 index 0000000000..5302758dad --- /dev/null +++ b/beacon-chain/state-native/genesis/genesis_test.go @@ -0,0 +1,32 @@ +package genesis_test + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/genesis" + "github.com/prysmaticlabs/prysm/config/params" +) + +func TestGenesisState(t *testing.T) { + tests := []struct { + name params.ConfigName + }{ + { + name: params.Mainnet, + }, + } + for _, tt := range tests { + t.Run(params.ConfigNames[tt.name], func(t *testing.T) { + st, err := genesis.State(params.ConfigNames[tt.name]) + if err != nil { + t.Fatal(err) + } + if st == nil { + t.Fatal("nil state") + } + if st.NumValidators() <= 0 { + t.Error("No validators present in state") + } + }) + } +} diff --git a/beacon-chain/state/genesis/mainnet.ssz.snappy b/beacon-chain/state-native/genesis/mainnet.ssz.snappy similarity index 100% rename from beacon-chain/state/genesis/mainnet.ssz.snappy rename to beacon-chain/state-native/genesis/mainnet.ssz.snappy diff --git a/beacon-chain/state/phase0.go b/beacon-chain/state-native/phase0.go similarity index 90% rename from beacon-chain/state/phase0.go rename to beacon-chain/state-native/phase0.go index ff789cd3c2..e14fd1691c 100644 --- a/beacon-chain/state/phase0.go +++ b/beacon-chain/state-native/phase0.go @@ -39,14 +39,14 @@ type ReadOnlyBeaconState interface { ReadOnlyBalances ReadOnlyCheckpoint ReadOnlyAttestations - ToProtoUnsafe() interface{} - ToProto() interface{} + InnerStateUnsafe() interface{} + CloneInnerState() interface{} GenesisTime() uint64 - GenesisValidatorRoot() [32]byte + GenesisValidatorRoot() []byte Slot() types.Slot Fork() *ethpb.Fork LatestBlockHeader() *ethpb.BeaconBlockHeader - HistoricalRoots() [][32]byte + HistoricalRoots() [][]byte Slashings() []uint64 FieldReferencesCount() map[string]uint64 MarshalSSZ() ([]byte, error) @@ -66,11 +66,11 @@ type WriteOnlyBeaconState interface { WriteOnlyCheckpoint WriteOnlyAttestations SetGenesisTime(val uint64) error - SetGenesisValidatorRoot(val [32]byte) error + SetGenesisValidatorRoot(val []byte) error SetSlot(val types.Slot) error SetFork(val *ethpb.Fork) error SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error - SetHistoricalRoots(val [][32]byte) error + SetHistoricalRoots(val [][]byte) error SetSlashings(val []uint64) error UpdateSlashingsAtIndex(idx, val uint64) error AppendHistoricalRoots(root [32]byte) error @@ -121,20 +121,20 @@ type ReadOnlyCheckpoint interface { // ReadOnlyBlockRoots defines a struct which only has read access to block roots methods. type ReadOnlyBlockRoots interface { - BlockRoots() *[fieldparams.BlockRootsLength][32]byte - BlockRootAtIndex(idx uint64) ([32]byte, error) + BlockRoots() [][]byte + BlockRootAtIndex(idx uint64) ([]byte, error) } // ReadOnlyStateRoots defines a struct which only has read access to state roots methods. type ReadOnlyStateRoots interface { - StateRoots() *[fieldparams.StateRootsLength][32]byte - StateRootAtIndex(idx uint64) ([32]byte, error) + StateRoots() [][]byte + StateRootAtIndex(idx uint64) ([]byte, error) } // ReadOnlyRandaoMixes defines a struct which only has read access to randao mixes methods. type ReadOnlyRandaoMixes interface { - RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte - RandaoMixAtIndex(idx uint64) ([32]byte, error) + RandaoMixes() [][]byte + RandaoMixAtIndex(idx uint64) ([]byte, error) RandaoMixesLength() int } @@ -153,13 +153,13 @@ type ReadOnlyAttestations interface { // WriteOnlyBlockRoots defines a struct which only has write access to block roots methods. type WriteOnlyBlockRoots interface { - SetBlockRoots(val *[fieldparams.BlockRootsLength][32]byte) error + SetBlockRoots(val [][]byte) error UpdateBlockRootAtIndex(idx uint64, blockRoot [32]byte) error } // WriteOnlyStateRoots defines a struct which only has write access to state roots methods. type WriteOnlyStateRoots interface { - SetStateRoots(val *[fieldparams.StateRootsLength][32]byte) error + SetStateRoots(val [][]byte) error UpdateStateRootAtIndex(idx uint64, stateRoot [32]byte) error } @@ -188,8 +188,8 @@ type WriteOnlyBalances interface { // WriteOnlyRandaoMixes defines a struct which only has write access to randao mixes methods. type WriteOnlyRandaoMixes interface { - SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byte) error - UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error + SetRandaoMixes(val [][]byte) error + UpdateRandaoMixesAtIndex(idx uint64, val []byte) error } // WriteOnlyCheckpoint defines a struct which only has write access to check point methods. diff --git a/beacon-chain/state-native/stategen/BUILD.bazel b/beacon-chain/state-native/stategen/BUILD.bazel new file mode 100644 index 0000000000..2e60754aaa --- /dev/null +++ b/beacon-chain/state-native/stategen/BUILD.bazel @@ -0,0 +1,83 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "epoch_boundary_state_cache.go", + "errors.go", + "getter.go", + "hot_state_cache.go", + "log.go", + "metrics.go", + "migrate.go", + "mock.go", + "replay.go", + "service.go", + "setter.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stategen", + visibility = [ + "//beacon-chain:__subpackages__", + "//testing/endtoend:__subpackages__", + "//testing/fuzz:__pkg__", + "//testing/slasher/simulator:__pkg__", + ], + deps = [ + "//beacon-chain/core/altair:go_default_library", + "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/core/time:go_default_library", + "//beacon-chain/core/transition:go_default_library", + "//beacon-chain/db:go_default_library", + "//beacon-chain/db/filters:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//cache/lru:go_default_library", + "//config/params:go_default_library", + "//encoding/bytesutil:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//proto/prysm/v1alpha1/block:go_default_library", + "//runtime/version:go_default_library", + "//time/slots:go_default_library", + "@com_github_hashicorp_golang_lru//:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_prometheus_client_golang//prometheus:go_default_library", + "@com_github_prometheus_client_golang//prometheus/promauto:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + "@io_k8s_client_go//tools/cache:go_default_library", + "@io_opencensus_go//trace:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "epoch_boundary_state_cache_test.go", + "getter_test.go", + "hot_state_cache_test.go", + "init_test.go", + "migrate_test.go", + "replay_test.go", + "service_test.go", + "setter_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//beacon-chain/core/blocks:go_default_library", + "//beacon-chain/db:go_default_library", + "//beacon-chain/db/testing:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-native/v1:go_default_library", + "//config/params:go_default_library", + "//encoding/bytesutil:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//proto/prysm/v1alpha1/block:go_default_library", + "//proto/prysm/v1alpha1/wrapper:go_default_library", + "//runtime/version:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_sirupsen_logrus//hooks/test:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) diff --git a/beacon-chain/state/stategen/epoch_boundary_state_cache.go b/beacon-chain/state-native/stategen/epoch_boundary_state_cache.go similarity index 98% rename from beacon-chain/state/stategen/epoch_boundary_state_cache.go rename to beacon-chain/state-native/stategen/epoch_boundary_state_cache.go index c938859fd9..8d198090d5 100644 --- a/beacon-chain/state/stategen/epoch_boundary_state_cache.go +++ b/beacon-chain/state-native/stategen/epoch_boundary_state_cache.go @@ -6,7 +6,7 @@ import ( "sync" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "k8s.io/client-go/tools/cache" ) diff --git a/beacon-chain/state/stategen/epoch_boundary_state_cache_test.go b/beacon-chain/state-native/stategen/epoch_boundary_state_cache_test.go similarity index 91% rename from beacon-chain/state/stategen/epoch_boundary_state_cache_test.go rename to beacon-chain/state-native/stategen/epoch_boundary_state_cache_test.go index 987d40508e..eefb84e715 100644 --- a/beacon-chain/state/stategen/epoch_boundary_state_cache_test.go +++ b/beacon-chain/state-native/stategen/epoch_boundary_state_cache_test.go @@ -35,7 +35,7 @@ func TestEpochBoundaryStateCache_CanSave(t *testing.T) { got, exists, err = e.getByRoot([32]byte{'a'}) require.NoError(t, err) assert.Equal(t, true, exists, "Should exist") - assert.DeepSSZEqual(t, s.ToProtoUnsafe(), got.state.ToProtoUnsafe(), "Should have the same state") + assert.DeepSSZEqual(t, s.InnerStateUnsafe(), got.state.InnerStateUnsafe(), "Should have the same state") got, exists, err = e.getBySlot(2) require.NoError(t, err) @@ -45,7 +45,7 @@ func TestEpochBoundaryStateCache_CanSave(t *testing.T) { got, exists, err = e.getBySlot(1) require.NoError(t, err) assert.Equal(t, true, exists, "Should exist") - assert.DeepSSZEqual(t, s.ToProtoUnsafe(), got.state.ToProtoUnsafe(), "Should have the same state") + assert.DeepSSZEqual(t, s.InnerStateUnsafe(), got.state.InnerStateUnsafe(), "Should have the same state") } func TestEpochBoundaryStateCache_CanTrim(t *testing.T) { diff --git a/beacon-chain/state/stategen/errors.go b/beacon-chain/state-native/stategen/errors.go similarity index 100% rename from beacon-chain/state/stategen/errors.go rename to beacon-chain/state-native/stategen/errors.go diff --git a/beacon-chain/state/stategen/getter.go b/beacon-chain/state-native/stategen/getter.go similarity index 99% rename from beacon-chain/state/stategen/getter.go rename to beacon-chain/state-native/stategen/getter.go index 6751f2eb4e..057bc244ff 100644 --- a/beacon-chain/state/stategen/getter.go +++ b/beacon-chain/state-native/stategen/getter.go @@ -6,7 +6,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state/stategen/getter_test.go b/beacon-chain/state-native/stategen/getter_test.go similarity index 96% rename from beacon-chain/state/stategen/getter_test.go rename to beacon-chain/state-native/stategen/getter_test.go index 63c12fd525..6e49dcf391 100644 --- a/beacon-chain/state/stategen/getter_test.go +++ b/beacon-chain/state-native/stategen/getter_test.go @@ -30,7 +30,7 @@ func TestStateByRoot_GenesisState(t *testing.T) { require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) loadedState, err := service.StateByRoot(ctx, params.BeaconConfig().ZeroHash) // Zero hash is genesis state root. require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestStateByRoot_ColdState(t *testing.T) { @@ -53,7 +53,7 @@ func TestStateByRoot_ColdState(t *testing.T) { require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) loadedState, err := service.StateByRoot(ctx, bRoot) require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestStateByRootIfCachedNoCopy_HotState(t *testing.T) { @@ -68,7 +68,7 @@ func TestStateByRootIfCachedNoCopy_HotState(t *testing.T) { service.hotStateCache.put(r, beaconState) loadedState := service.StateByRootIfCachedNoCopy(r) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestStateByRootIfCachedNoCopy_ColdState(t *testing.T) { @@ -150,7 +150,7 @@ func TestStateByRoot_HotStateCached(t *testing.T) { loadedState, err := service.StateByRoot(ctx, r) require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestStateByRoot_StateByRootInitialSync(t *testing.T) { @@ -167,7 +167,7 @@ func TestStateByRoot_StateByRootInitialSync(t *testing.T) { require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) loadedState, err := service.StateByRootInitialSync(ctx, params.BeaconConfig().ZeroHash) // Zero hash is genesis state root. require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestStateByRootInitialSync_UseEpochStateCache(t *testing.T) { @@ -201,7 +201,7 @@ func TestStateByRootInitialSync_UseCache(t *testing.T) { loadedState, err := service.StateByRootInitialSync(ctx, r) require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) if service.hotStateCache.has(r) { t.Error("Hot state cache was not invalidated") } @@ -300,7 +300,7 @@ func TestLoadeStateByRoot_Cached(t *testing.T) { // This tests where hot state was already cached. loadedState, err := service.loadStateByRoot(ctx, r) require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestLoadeStateByRoot_FinalizedState(t *testing.T) { @@ -324,7 +324,7 @@ func TestLoadeStateByRoot_FinalizedState(t *testing.T) { // This tests where hot state was already cached. loadedState, err := service.loadStateByRoot(ctx, gRoot) require.NoError(t, err) - require.DeepSSZEqual(t, loadedState.ToProtoUnsafe(), beaconState.ToProtoUnsafe()) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) } func TestLoadeStateByRoot_EpochBoundaryStateCanProcess(t *testing.T) { diff --git a/beacon-chain/state/stategen/hot_state_cache.go b/beacon-chain/state-native/stategen/hot_state_cache.go similarity index 97% rename from beacon-chain/state/stategen/hot_state_cache.go rename to beacon-chain/state-native/stategen/hot_state_cache.go index f0fe69b82a..97fdbed10e 100644 --- a/beacon-chain/state/stategen/hot_state_cache.go +++ b/beacon-chain/state-native/stategen/hot_state_cache.go @@ -6,7 +6,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" ) diff --git a/beacon-chain/state-native/stategen/hot_state_cache_test.go b/beacon-chain/state-native/stategen/hot_state_cache_test.go new file mode 100644 index 0000000000..c60b63db17 --- /dev/null +++ b/beacon-chain/state-native/stategen/hot_state_cache_test.go @@ -0,0 +1,34 @@ +package stategen + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestHotStateCache_RoundTrip(t *testing.T) { + c := newHotStateCache() + root := [32]byte{'A'} + s := c.get(root) + assert.Equal(t, state.BeaconState(nil), s) + assert.Equal(t, false, c.has(root), "Empty cache has an object") + + s, err := v1.InitializeFromProto(ðpb.BeaconState{ + Slot: 10, + }) + require.NoError(t, err) + + c.put(root, s) + assert.Equal(t, true, c.has(root), "Empty cache does not have an object") + + res := c.get(root) + assert.NotNil(t, s) + assert.DeepEqual(t, res.CloneInnerState(), s.CloneInnerState(), "Expected equal protos to return from cache") + + c.delete(root) + assert.Equal(t, false, c.has(root), "Cache not supposed to have the object") +} diff --git a/beacon-chain/state/stategen/init_test.go b/beacon-chain/state-native/stategen/init_test.go similarity index 100% rename from beacon-chain/state/stategen/init_test.go rename to beacon-chain/state-native/stategen/init_test.go diff --git a/beacon-chain/state/stategen/log.go b/beacon-chain/state-native/stategen/log.go similarity index 100% rename from beacon-chain/state/stategen/log.go rename to beacon-chain/state-native/stategen/log.go diff --git a/beacon-chain/state/stategen/metrics.go b/beacon-chain/state-native/stategen/metrics.go similarity index 100% rename from beacon-chain/state/stategen/metrics.go rename to beacon-chain/state-native/stategen/metrics.go diff --git a/beacon-chain/state/stategen/migrate.go b/beacon-chain/state-native/stategen/migrate.go similarity index 98% rename from beacon-chain/state/stategen/migrate.go rename to beacon-chain/state-native/stategen/migrate.go index 60b5510922..388c0e18d9 100644 --- a/beacon-chain/state/stategen/migrate.go +++ b/beacon-chain/state-native/stategen/migrate.go @@ -5,7 +5,7 @@ import ( "encoding/hex" "fmt" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/sirupsen/logrus" "go.opencensus.io/trace" diff --git a/beacon-chain/state/stategen/migrate_test.go b/beacon-chain/state-native/stategen/migrate_test.go similarity index 98% rename from beacon-chain/state/stategen/migrate_test.go rename to beacon-chain/state-native/stategen/migrate_test.go index 9123d319ab..ec2c5d8cc6 100644 --- a/beacon-chain/state/stategen/migrate_test.go +++ b/beacon-chain/state-native/stategen/migrate_test.go @@ -52,7 +52,7 @@ func TestMigrateToCold_HappyPath(t *testing.T) { gotState, err := service.beaconDB.State(ctx, fRoot) require.NoError(t, err) - assert.DeepSSZEqual(t, beaconState.ToProtoUnsafe(), gotState.ToProtoUnsafe(), "Did not save state") + assert.DeepSSZEqual(t, beaconState.InnerStateUnsafe(), gotState.InnerStateUnsafe(), "Did not save state") gotRoot := service.beaconDB.ArchivedPointRoot(ctx, stateSlot/service.slotsPerArchivedPoint) assert.Equal(t, fRoot, gotRoot, "Did not save archived root") lastIndex, err := service.beaconDB.LastArchivedSlot(ctx) diff --git a/beacon-chain/state/stategen/mock.go b/beacon-chain/state-native/stategen/mock.go similarity index 98% rename from beacon-chain/state/stategen/mock.go rename to beacon-chain/state-native/stategen/mock.go index 4bef97f00b..8dbde0369a 100644 --- a/beacon-chain/state/stategen/mock.go +++ b/beacon-chain/state-native/stategen/mock.go @@ -4,7 +4,7 @@ import ( "context" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" ) diff --git a/beacon-chain/state/stategen/replay.go b/beacon-chain/state-native/stategen/replay.go similarity index 99% rename from beacon-chain/state/stategen/replay.go rename to beacon-chain/state-native/stategen/replay.go index 7b3f08c826..6d4e336bfb 100644 --- a/beacon-chain/state/stategen/replay.go +++ b/beacon-chain/state-native/stategen/replay.go @@ -12,7 +12,7 @@ import ( prysmTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/beacon-chain/db/filters" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/runtime/version" diff --git a/beacon-chain/state/stategen/replay_test.go b/beacon-chain/state-native/stategen/replay_test.go similarity index 99% rename from beacon-chain/state/stategen/replay_test.go rename to beacon-chain/state-native/stategen/replay_test.go index 33d996a156..72846a162c 100644 --- a/beacon-chain/state/stategen/replay_test.go +++ b/beacon-chain/state-native/stategen/replay_test.go @@ -394,7 +394,7 @@ func TestLastSavedState_Genesis(t *testing.T) { savedState, err := s.lastSavedState(ctx, 0) require.NoError(t, err) - require.DeepSSZEqual(t, gState.ToProtoUnsafe(), savedState.ToProtoUnsafe()) + require.DeepSSZEqual(t, gState.InnerStateUnsafe(), savedState.InnerStateUnsafe()) } func TestLastSavedState_CanGet(t *testing.T) { @@ -424,7 +424,7 @@ func TestLastSavedState_CanGet(t *testing.T) { savedState, err := s.lastSavedState(ctx, s.finalizedInfo.slot+100) require.NoError(t, err) - require.DeepSSZEqual(t, st.ToProtoUnsafe(), savedState.ToProtoUnsafe()) + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedState.InnerStateUnsafe()) } func TestLastSavedState_NoSavedBlockState(t *testing.T) { diff --git a/beacon-chain/state/stategen/service.go b/beacon-chain/state-native/stategen/service.go similarity index 98% rename from beacon-chain/state/stategen/service.go rename to beacon-chain/state-native/stategen/service.go index 69dce996ee..95cf97ac1d 100644 --- a/beacon-chain/state/stategen/service.go +++ b/beacon-chain/state-native/stategen/service.go @@ -10,7 +10,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/db" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state/stategen/service_test.go b/beacon-chain/state-native/stategen/service_test.go similarity index 94% rename from beacon-chain/state/stategen/service_test.go rename to beacon-chain/state-native/stategen/service_test.go index 4a2ac735ff..e839cca80b 100644 --- a/beacon-chain/state/stategen/service_test.go +++ b/beacon-chain/state-native/stategen/service_test.go @@ -30,7 +30,7 @@ func TestResume(t *testing.T) { resumeState, err := service.Resume(ctx, beaconState) require.NoError(t, err) - require.DeepSSZEqual(t, beaconState.ToProtoUnsafe(), resumeState.ToProtoUnsafe()) + require.DeepSSZEqual(t, beaconState.InnerStateUnsafe(), resumeState.InnerStateUnsafe()) assert.Equal(t, params.BeaconConfig().SlotsPerEpoch, service.finalizedInfo.slot, "Did not get watned slot") assert.Equal(t, service.finalizedInfo.root, root, "Did not get wanted root") assert.NotNil(t, service.finalizedState(), "Wanted a non nil finalized state") diff --git a/beacon-chain/state/stategen/setter.go b/beacon-chain/state-native/stategen/setter.go similarity index 98% rename from beacon-chain/state/stategen/setter.go rename to beacon-chain/state-native/stategen/setter.go index 6cb81ee1b0..06e349eb2f 100644 --- a/beacon-chain/state/stategen/setter.go +++ b/beacon-chain/state-native/stategen/setter.go @@ -4,7 +4,7 @@ import ( "context" "math" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state/stategen/setter_test.go b/beacon-chain/state-native/stategen/setter_test.go similarity index 100% rename from beacon-chain/state/stategen/setter_test.go rename to beacon-chain/state-native/stategen/setter_test.go diff --git a/beacon-chain/state/stateutil/BUILD.bazel b/beacon-chain/state-native/stateutil/BUILD.bazel similarity index 95% rename from beacon-chain/state/stateutil/BUILD.bazel rename to beacon-chain/state-native/stateutil/BUILD.bazel index ea960dbb58..c32bc2e7f1 100644 --- a/beacon-chain/state/stateutil/BUILD.bazel +++ b/beacon-chain/state-native/stateutil/BUILD.bazel @@ -18,7 +18,7 @@ go_library( "validator_map_handler.go", "validator_root.go", ], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil", visibility = [ "//beacon-chain:__subpackages__", "//proto/migration:__subpackages__", @@ -66,6 +66,7 @@ go_test( "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", "//encoding/ssz:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//runtime/interop:go_default_library", @@ -91,7 +92,7 @@ go_test( "no-cache", ], deps = [ - "//beacon-chain/state/stateutil:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", "//crypto/hash:go_default_library", "//encoding/ssz:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/state/stateutil/benchmark_test.go b/beacon-chain/state-native/stateutil/benchmark_test.go similarity index 100% rename from beacon-chain/state/stateutil/benchmark_test.go rename to beacon-chain/state-native/stateutil/benchmark_test.go diff --git a/beacon-chain/state/stateutil/block_header_root.go b/beacon-chain/state-native/stateutil/block_header_root.go similarity index 100% rename from beacon-chain/state/stateutil/block_header_root.go rename to beacon-chain/state-native/stateutil/block_header_root.go diff --git a/beacon-chain/state/stateutil/eth1_root.go b/beacon-chain/state-native/stateutil/eth1_root.go similarity index 100% rename from beacon-chain/state/stateutil/eth1_root.go rename to beacon-chain/state-native/stateutil/eth1_root.go diff --git a/beacon-chain/state/stateutil/field_root_attestation.go b/beacon-chain/state-native/stateutil/field_root_attestation.go similarity index 100% rename from beacon-chain/state/stateutil/field_root_attestation.go rename to beacon-chain/state-native/stateutil/field_root_attestation.go diff --git a/beacon-chain/state/stateutil/field_root_eth1.go b/beacon-chain/state-native/stateutil/field_root_eth1.go similarity index 100% rename from beacon-chain/state/stateutil/field_root_eth1.go rename to beacon-chain/state-native/stateutil/field_root_eth1.go diff --git a/beacon-chain/state/stateutil/field_root_test.go b/beacon-chain/state-native/stateutil/field_root_test.go similarity index 100% rename from beacon-chain/state/stateutil/field_root_test.go rename to beacon-chain/state-native/stateutil/field_root_test.go diff --git a/beacon-chain/state/stateutil/field_root_validator.go b/beacon-chain/state-native/stateutil/field_root_validator.go similarity index 100% rename from beacon-chain/state/stateutil/field_root_validator.go rename to beacon-chain/state-native/stateutil/field_root_validator.go diff --git a/beacon-chain/state/stateutil/field_root_vector.go b/beacon-chain/state-native/stateutil/field_root_vector.go similarity index 100% rename from beacon-chain/state/stateutil/field_root_vector.go rename to beacon-chain/state-native/stateutil/field_root_vector.go diff --git a/beacon-chain/state/stateutil/participation_bit_root.go b/beacon-chain/state-native/stateutil/participation_bit_root.go similarity index 100% rename from beacon-chain/state/stateutil/participation_bit_root.go rename to beacon-chain/state-native/stateutil/participation_bit_root.go diff --git a/beacon-chain/state/stateutil/pending_attestation_root.go b/beacon-chain/state-native/stateutil/pending_attestation_root.go similarity index 100% rename from beacon-chain/state/stateutil/pending_attestation_root.go rename to beacon-chain/state-native/stateutil/pending_attestation_root.go diff --git a/beacon-chain/state/stateutil/reference.go b/beacon-chain/state-native/stateutil/reference.go similarity index 100% rename from beacon-chain/state/stateutil/reference.go rename to beacon-chain/state-native/stateutil/reference.go diff --git a/beacon-chain/state/stateutil/reference_bench_test.go b/beacon-chain/state-native/stateutil/reference_bench_test.go similarity index 100% rename from beacon-chain/state/stateutil/reference_bench_test.go rename to beacon-chain/state-native/stateutil/reference_bench_test.go diff --git a/beacon-chain/state/stateutil/state_hasher.go b/beacon-chain/state-native/stateutil/state_hasher.go similarity index 100% rename from beacon-chain/state/stateutil/state_hasher.go rename to beacon-chain/state-native/stateutil/state_hasher.go diff --git a/beacon-chain/state/stateutil/state_root_test.go b/beacon-chain/state-native/stateutil/state_root_test.go similarity index 100% rename from beacon-chain/state/stateutil/state_root_test.go rename to beacon-chain/state-native/stateutil/state_root_test.go diff --git a/beacon-chain/state/stateutil/stateutil_test.go b/beacon-chain/state-native/stateutil/stateutil_test.go similarity index 100% rename from beacon-chain/state/stateutil/stateutil_test.go rename to beacon-chain/state-native/stateutil/stateutil_test.go diff --git a/beacon-chain/state/stateutil/sync_committee.root.go b/beacon-chain/state-native/stateutil/sync_committee.root.go similarity index 100% rename from beacon-chain/state/stateutil/sync_committee.root.go rename to beacon-chain/state-native/stateutil/sync_committee.root.go diff --git a/beacon-chain/state/stateutil/trie_helpers.go b/beacon-chain/state-native/stateutil/trie_helpers.go similarity index 100% rename from beacon-chain/state/stateutil/trie_helpers.go rename to beacon-chain/state-native/stateutil/trie_helpers.go diff --git a/beacon-chain/state/stateutil/trie_helpers_test.go b/beacon-chain/state-native/stateutil/trie_helpers_test.go similarity index 86% rename from beacon-chain/state/stateutil/trie_helpers_test.go rename to beacon-chain/state-native/stateutil/trie_helpers_test.go index 77ef9923f6..1f92152fee 100644 --- a/beacon-chain/state/stateutil/trie_helpers_test.go +++ b/beacon-chain/state-native/stateutil/trie_helpers_test.go @@ -4,9 +4,10 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" @@ -15,17 +16,12 @@ import ( func TestReturnTrieLayer_OK(t *testing.T) { newState, _ := util.DeterministicGenesisState(t, 32) - bRootsSlice := make([][]byte, len(newState.BlockRoots())) - for i, r := range newState.BlockRoots() { - tmp := r - bRootsSlice[i] = tmp[:] - } - root, err := stateutil.RootsArrayHashTreeRoot(bRootsSlice, uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") + root, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") require.NoError(t, err) blockRts := newState.BlockRoots() roots := make([][32]byte, 0, len(blockRts)) for _, rt := range blockRts { - roots = append(roots, rt) + roots = append(roots, bytesutil.ToBytes32(rt)) } layers, err := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) assert.NoError(t, err) @@ -57,7 +53,7 @@ func TestRecomputeFromLayer_FixedSizedArray(t *testing.T) { blockRts := newState.BlockRoots() roots := make([][32]byte, 0, len(blockRts)) for _, rt := range blockRts { - roots = append(roots, rt) + roots = append(roots, bytesutil.ToBytes32(rt)) } layers, err := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) require.NoError(t, err) @@ -67,12 +63,7 @@ func TestRecomputeFromLayer_FixedSizedArray(t *testing.T) { require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[0], changedRoots[0])) require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[1], changedRoots[1])) - bRootsSlice := make([][]byte, len(newState.BlockRoots())) - for i, r := range newState.BlockRoots() { - tmp := r - bRootsSlice[i] = tmp[:] - } - expectedRoot, err := stateutil.RootsArrayHashTreeRoot(bRootsSlice, uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") + expectedRoot, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") require.NoError(t, err) root, _, err := stateutil.RecomputeFromLayer(changedRoots, changedIdx, layers) require.NoError(t, err) diff --git a/beacon-chain/state/stateutil/validator_map_handler.go b/beacon-chain/state-native/stateutil/validator_map_handler.go similarity index 100% rename from beacon-chain/state/stateutil/validator_map_handler.go rename to beacon-chain/state-native/stateutil/validator_map_handler.go diff --git a/beacon-chain/state/stateutil/validator_root.go b/beacon-chain/state-native/stateutil/validator_root.go similarity index 100% rename from beacon-chain/state/stateutil/validator_root.go rename to beacon-chain/state-native/stateutil/validator_root.go diff --git a/beacon-chain/state-native/stateutil/validator_root_test.go b/beacon-chain/state-native/stateutil/validator_root_test.go new file mode 100644 index 0000000000..60a01a5914 --- /dev/null +++ b/beacon-chain/state-native/stateutil/validator_root_test.go @@ -0,0 +1,22 @@ +package stateutil_test + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" +) + +func BenchmarkUint64ListRootWithRegistryLimit(b *testing.B) { + balances := make([]uint64, 100000) + for i := 0; i < len(balances); i++ { + balances[i] = uint64(i) + } + b.Run("100k balances", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := stateutil.Uint64ListRootWithRegistryLimit(balances) + if err != nil { + b.Fatal(err) + } + } + }) +} diff --git a/beacon-chain/state-native/types/BUILD.bazel b/beacon-chain/state-native/types/BUILD.bazel new file mode 100644 index 0000000000..c3724b06f4 --- /dev/null +++ b/beacon-chain/state-native/types/BUILD.bazel @@ -0,0 +1,19 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["types.go"], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types", + visibility = ["//beacon-chain:__subpackages__"], + deps = [ + "//runtime/version:go_default_library", + "@com_github_pkg_errors//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["types_test.go"], + embed = [":go_default_library"], + deps = ["//testing/assert:go_default_library"], +) diff --git a/beacon-chain/state/types/types.go b/beacon-chain/state-native/types/types.go similarity index 100% rename from beacon-chain/state/types/types.go rename to beacon-chain/state-native/types/types.go diff --git a/beacon-chain/state/types/types_test.go b/beacon-chain/state-native/types/types_test.go similarity index 100% rename from beacon-chain/state/types/types_test.go rename to beacon-chain/state-native/types/types_test.go diff --git a/beacon-chain/state/v1/BUILD.bazel b/beacon-chain/state-native/v1/BUILD.bazel similarity index 87% rename from beacon-chain/state/v1/BUILD.bazel rename to beacon-chain/state-native/v1/BUILD.bazel index d0aae818a6..993ff9ef9a 100644 --- a/beacon-chain/state/v1/BUILD.bazel +++ b/beacon-chain/state-native/v1/BUILD.bazel @@ -35,7 +35,7 @@ go_library( "//config:mainnet": ["beacon_state_mainnet.go"], "//config:minimal": ["beacon_state_minimal.go"], }), - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/v1", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1", visibility = [ "//beacon-chain:__subpackages__", "//contracts/deposit:__subpackages__", @@ -52,11 +52,12 @@ go_library( "//tools/pcli:__pkg__", ], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", - "//beacon-chain/state/fieldtrie:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", + "//beacon-chain/state-native/fieldtrie:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -95,9 +96,9 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -122,7 +123,7 @@ ssz_gen_marshal( "//config:minimal": ["beacon_state_minimal.go"], }), includes = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//config/fieldparams:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", diff --git a/beacon-chain/state/v1/beacon_state_mainnet.go b/beacon-chain/state-native/v1/beacon_state_mainnet.go similarity index 90% rename from beacon-chain/state/v1/beacon_state_mainnet.go rename to beacon-chain/state-native/v1/beacon_state_mainnet.go index 1ba6dfc56f..8fddb01482 100644 --- a/beacon-chain/state/v1/beacon_state_mainnet.go +++ b/beacon-chain/state-native/v1/beacon_state_mainnet.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/beacon_state_minimal.go b/beacon-chain/state-native/v1/beacon_state_minimal.go similarity index 89% rename from beacon-chain/state/v1/beacon_state_minimal.go rename to beacon-chain/state-native/v1/beacon_state_minimal.go index 69ae68729a..9b9b8a7a03 100644 --- a/beacon-chain/state/v1/beacon_state_minimal.go +++ b/beacon-chain/state-native/v1/beacon_state_minimal.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/doc.go b/beacon-chain/state-native/v1/doc.go similarity index 100% rename from beacon-chain/state/v1/doc.go rename to beacon-chain/state-native/v1/doc.go diff --git a/beacon-chain/state/v1/field_roots.go b/beacon-chain/state-native/v1/field_roots.go similarity index 91% rename from beacon-chain/state/v1/field_roots.go rename to beacon-chain/state-native/v1/field_roots.go index 6f93d2a321..30c5c1b226 100644 --- a/beacon-chain/state/v1/field_roots.go +++ b/beacon-chain/state-native/v1/field_roots.go @@ -4,7 +4,7 @@ import ( "context" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/config/features" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/generated.ssz.go b/beacon-chain/state-native/v1/generated.ssz.go similarity index 100% rename from beacon-chain/state/v1/generated.ssz.go rename to beacon-chain/state-native/v1/generated.ssz.go diff --git a/beacon-chain/state/v1/getters_attestation.go b/beacon-chain/state-native/v1/getters_attestation.go similarity index 100% rename from beacon-chain/state/v1/getters_attestation.go rename to beacon-chain/state-native/v1/getters_attestation.go diff --git a/beacon-chain/state/v1/getters_attestation_test.go b/beacon-chain/state-native/v1/getters_attestation_test.go similarity index 100% rename from beacon-chain/state/v1/getters_attestation_test.go rename to beacon-chain/state-native/v1/getters_attestation_test.go diff --git a/beacon-chain/state/v1/getters_block.go b/beacon-chain/state-native/v1/getters_block.go similarity index 81% rename from beacon-chain/state/v1/getters_block.go rename to beacon-chain/state-native/v1/getters_block.go index 880c090794..5d54f268cf 100644 --- a/beacon-chain/state/v1/getters_block.go +++ b/beacon-chain/state-native/v1/getters_block.go @@ -3,8 +3,7 @@ package v1 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -46,7 +45,7 @@ func (b *BeaconState) latestBlockHeaderInternal() *ethpb.BeaconBlockHeader { } // BlockRoots kept track of in the beacon state. -func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { +func (b *BeaconState) BlockRoots() [][]byte { if b.blockRoots == nil { return nil } @@ -54,8 +53,12 @@ func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.BlockRootsLength][32]byte(*b.blockRootsInternal()) - return &roots + rootsArr := b.blockRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + return roots } // blockRootsInternal kept track of in the beacon state. @@ -66,15 +69,19 @@ func (b *BeaconState) blockRootsInternal() *customtypes.BlockRoots { // BlockRootAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) BlockRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { if b.blockRoots == nil { - return [32]byte{}, nil + return []byte{}, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.blockRootAtIndex(idx) + r, err := b.blockRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // blockRootAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v1/getters_block_test.go b/beacon-chain/state-native/v1/getters_block_test.go similarity index 96% rename from beacon-chain/state/v1/getters_block_test.go rename to beacon-chain/state-native/v1/getters_block_test.go index acf47e1cb5..6cb1380b27 100644 --- a/beacon-chain/state/v1/getters_block_test.go +++ b/beacon-chain/state-native/v1/getters_block_test.go @@ -29,7 +29,7 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err := InitializeFromProto(ðpb.BeaconState{}) require.NoError(t, err) got := s.BlockRoots() - require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, *got) + require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, got) want := [fieldparams.BlockRootsLength][32]byte{{'a'}} bRoots := make([][]byte, len(want)) @@ -40,11 +40,11 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err = InitializeFromProto(ðpb.BeaconState{BlockRoots: bRoots}) require.NoError(t, err) got = s.BlockRoots() - require.DeepEqual(t, want, *got) + require.DeepEqual(t, want, got) // Test copy does not mutate. got[0][0] = 'b' - require.DeepNotEqual(t, want, *got) + require.DeepNotEqual(t, want, got) } func TestBeaconState_BlockRootAtIndex(t *testing.T) { diff --git a/beacon-chain/state/v1/getters_checkpoint.go b/beacon-chain/state-native/v1/getters_checkpoint.go similarity index 100% rename from beacon-chain/state/v1/getters_checkpoint.go rename to beacon-chain/state-native/v1/getters_checkpoint.go diff --git a/beacon-chain/state/v1/getters_eth1.go b/beacon-chain/state-native/v1/getters_eth1.go similarity index 100% rename from beacon-chain/state/v1/getters_eth1.go rename to beacon-chain/state-native/v1/getters_eth1.go diff --git a/beacon-chain/state/v1/getters_misc.go b/beacon-chain/state-native/v1/getters_misc.go similarity index 87% rename from beacon-chain/state/v1/getters_misc.go rename to beacon-chain/state-native/v1/getters_misc.go index f9b1f4bfb8..e499ff3364 100644 --- a/beacon-chain/state/v1/getters_misc.go +++ b/beacon-chain/state-native/v1/getters_misc.go @@ -2,7 +2,7 @@ package v1 import ( types "github.com/prysmaticlabs/eth2-types" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime/version" @@ -23,11 +23,12 @@ func (b *BeaconState) genesisTimeInternal() uint64 { } // GenesisValidatorRoot of the beacon state. -func (b *BeaconState) GenesisValidatorRoot() [32]byte { +func (b *BeaconState) GenesisValidatorRoot() []byte { b.lock.RLock() defer b.lock.RUnlock() - return b.genesisValidatorRootInternal() + r := b.genesisValidatorRootInternal() + return r[:] } // genesisValidatorRootInternal of the beacon state. @@ -88,7 +89,7 @@ func (b *BeaconState) forkInternal() *ethpb.Fork { } // HistoricalRoots based on epochs stored in the beacon state. -func (b *BeaconState) HistoricalRoots() [][32]byte { +func (b *BeaconState) HistoricalRoots() [][]byte { if b.historicalRoots == nil { return nil } @@ -96,7 +97,13 @@ func (b *BeaconState) HistoricalRoots() [][32]byte { b.lock.RLock() defer b.lock.RUnlock() - return b.historicalRootsInternal() + rootsArr := b.historicalRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + + return roots } // historicalRootsInternal based on epochs stored in the beacon state. diff --git a/beacon-chain/state/v1/getters_randao.go b/beacon-chain/state-native/v1/getters_randao.go similarity index 75% rename from beacon-chain/state/v1/getters_randao.go rename to beacon-chain/state-native/v1/getters_randao.go index 4c4fea5a46..c654d51bd7 100644 --- a/beacon-chain/state/v1/getters_randao.go +++ b/beacon-chain/state-native/v1/getters_randao.go @@ -3,12 +3,11 @@ package v1 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ) // RandaoMixes of block proposers on the beacon chain. -func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { +func (b *BeaconState) RandaoMixes() [][]byte { if b.randaoMixes == nil { return nil } @@ -16,8 +15,13 @@ func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - mixes := [fieldparams.RandaoMixesLength][32]byte(*b.randaoMixesInternal()) - return &mixes + mixesArr := b.randaoMixesInternal() + mixes := make([][]byte, len(mixesArr)) + for i, m := range mixesArr { + mixes[i] = m[:] + } + + return mixes } // randaoMixesInternal of block proposers on the beacon chain. @@ -28,15 +32,19 @@ func (b *BeaconState) randaoMixesInternal() *customtypes.RandaoMixes { // RandaoMixAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { if b.randaoMixes == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.randaoMixAtIndex(idx) + m, err := b.randaoMixAtIndex(idx) + if err != nil { + return nil, err + } + return m[:], nil } // randaoMixAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v1/getters_state.go b/beacon-chain/state-native/v1/getters_state.go similarity index 87% rename from beacon-chain/state/v1/getters_state.go rename to beacon-chain/state-native/v1/getters_state.go index 61d6349f84..62487b733b 100644 --- a/beacon-chain/state/v1/getters_state.go +++ b/beacon-chain/state-native/v1/getters_state.go @@ -4,8 +4,7 @@ import ( "fmt" "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -153,7 +152,7 @@ func (b *BeaconState) toProtoNoLock() interface{} { } // StateRoots kept track of in the beacon state. -func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { +func (b *BeaconState) StateRoots() [][]byte { if b.stateRoots == nil { return nil } @@ -161,8 +160,13 @@ func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.StateRootsLength][32]byte(*b.stateRootsInternal()) - return &roots + rootsArr := b.stateRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + + return roots } // stateRootsInternal kept track of in the beacon state. @@ -173,15 +177,19 @@ func (b *BeaconState) stateRootsInternal() *customtypes.StateRoots { // StateRootAtIndex retrieves a specific state root based on an // input index value. -func (b *BeaconState) StateRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { if b.stateRoots == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.stateRootAtIndex(idx) + r, err := b.stateRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // stateRootAtIndex retrieves a specific state root based on an @@ -203,3 +211,14 @@ func ProtobufBeaconState(s interface{}) (*ethpb.BeaconState, error) { } return pbState, nil } + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + return b.ToProtoUnsafe() +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + return b.ToProto() +} diff --git a/beacon-chain/state/v1/getters_test.go b/beacon-chain/state-native/v1/getters_test.go similarity index 100% rename from beacon-chain/state/v1/getters_test.go rename to beacon-chain/state-native/v1/getters_test.go diff --git a/beacon-chain/state/v1/getters_validator.go b/beacon-chain/state-native/v1/getters_validator.go similarity index 99% rename from beacon-chain/state/v1/getters_validator.go rename to beacon-chain/state-native/v1/getters_validator.go index 040137f2d7..0ce302a204 100644 --- a/beacon-chain/state/v1/getters_validator.go +++ b/beacon-chain/state-native/v1/getters_validator.go @@ -5,7 +5,7 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state-native/v1/getters_validator_test.go b/beacon-chain/state-native/v1/getters_validator_test.go new file mode 100644 index 0000000000..510ca8cb18 --- /dev/null +++ b/beacon-chain/state-native/v1/getters_validator_test.go @@ -0,0 +1,20 @@ +package v1_test + +import ( + "testing" + + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_ValidatorAtIndexReadOnly_HandlesNilSlice(t *testing.T) { + st, err := v1.InitializeFromProtoUnsafe(ðpb.BeaconState{ + Validators: nil, + }) + require.NoError(t, err) + + _, err = st.ValidatorAtIndexReadOnly(0) + assert.Equal(t, v1.ErrNilValidatorsInState, err) +} diff --git a/beacon-chain/state/v1/proofs.go b/beacon-chain/state-native/v1/proofs.go similarity index 95% rename from beacon-chain/state/v1/proofs.go rename to beacon-chain/state-native/v1/proofs.go index 1d3fc5dd34..8d31957558 100644 --- a/beacon-chain/state/v1/proofs.go +++ b/beacon-chain/state-native/v1/proofs.go @@ -4,7 +4,7 @@ import ( "encoding/binary" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) diff --git a/beacon-chain/state-native/v1/proofs_test.go b/beacon-chain/state-native/v1/proofs_test.go new file mode 100644 index 0000000000..6bcca5eefc --- /dev/null +++ b/beacon-chain/state-native/v1/proofs_test.go @@ -0,0 +1,34 @@ +package v1_test + +import ( + "context" + "testing" + + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + "github.com/prysmaticlabs/prysm/container/trie" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestBeaconStateMerkleProofs(t *testing.T) { + ctx := context.Background() + st, _ := util.DeterministicGenesisState(t, 256) + htr, err := st.HashTreeRoot(ctx) + require.NoError(t, err) + t.Run("current sync committee", func(t *testing.T) { + _, err := st.CurrentSyncCommitteeProof() + require.ErrorContains(t, "unsupported", err) + }) + t.Run("next sync committee", func(t *testing.T) { + _, err := st.NextSyncCommitteeProof() + require.ErrorContains(t, "unsupported", err) + }) + t.Run("finalized root", func(t *testing.T) { + finalizedRoot := st.FinalizedCheckpoint().Root + proof, err := st.FinalizedRootProof() + require.NoError(t, err) + gIndex := v1.FinalizedRootGeneralizedIndex() + valid := trie.VerifyMerkleProof(htr[:], finalizedRoot, gIndex, proof) + require.Equal(t, true, valid) + }) +} diff --git a/beacon-chain/state/v1/readonly_validator.go b/beacon-chain/state-native/v1/readonly_validator.go similarity index 97% rename from beacon-chain/state/v1/readonly_validator.go rename to beacon-chain/state-native/v1/readonly_validator.go index ce82153968..d04ee5b109 100644 --- a/beacon-chain/state/v1/readonly_validator.go +++ b/beacon-chain/state-native/v1/readonly_validator.go @@ -3,7 +3,7 @@ package v1 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state-native/v1/readonly_validator_test.go b/beacon-chain/state-native/v1/readonly_validator_test.go new file mode 100644 index 0000000000..081d8808ed --- /dev/null +++ b/beacon-chain/state-native/v1/readonly_validator_test.go @@ -0,0 +1,73 @@ +package v1_test + +import ( + "testing" + + types "github.com/prysmaticlabs/eth2-types" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestReadOnlyValidator_ReturnsErrorOnNil(t *testing.T) { + if _, err := v1.NewValidator(nil); err != v1.ErrNilWrappedValidator { + t.Errorf("Wrong error returned. Got %v, wanted %v", err, v1.ErrNilWrappedValidator) + } +} + +func TestReadOnlyValidator_EffectiveBalance(t *testing.T) { + bal := uint64(234) + v, err := v1.NewValidator(ðpb.Validator{EffectiveBalance: bal}) + require.NoError(t, err) + assert.Equal(t, bal, v.EffectiveBalance()) +} + +func TestReadOnlyValidator_ActivationEligibilityEpoch(t *testing.T) { + epoch := types.Epoch(234) + v, err := v1.NewValidator(ðpb.Validator{ActivationEligibilityEpoch: epoch}) + require.NoError(t, err) + assert.Equal(t, epoch, v.ActivationEligibilityEpoch()) +} + +func TestReadOnlyValidator_ActivationEpoch(t *testing.T) { + epoch := types.Epoch(234) + v, err := v1.NewValidator(ðpb.Validator{ActivationEpoch: epoch}) + require.NoError(t, err) + assert.Equal(t, epoch, v.ActivationEpoch()) +} + +func TestReadOnlyValidator_WithdrawableEpoch(t *testing.T) { + epoch := types.Epoch(234) + v, err := v1.NewValidator(ðpb.Validator{WithdrawableEpoch: epoch}) + require.NoError(t, err) + assert.Equal(t, epoch, v.WithdrawableEpoch()) +} + +func TestReadOnlyValidator_ExitEpoch(t *testing.T) { + epoch := types.Epoch(234) + v, err := v1.NewValidator(ðpb.Validator{ExitEpoch: epoch}) + require.NoError(t, err) + assert.Equal(t, epoch, v.ExitEpoch()) +} + +func TestReadOnlyValidator_PublicKey(t *testing.T) { + key := [48]byte{0xFA, 0xCC} + v, err := v1.NewValidator(ðpb.Validator{PublicKey: key[:]}) + require.NoError(t, err) + assert.Equal(t, key, v.PublicKey()) +} + +func TestReadOnlyValidator_WithdrawalCredentials(t *testing.T) { + creds := []byte{0xFA, 0xCC} + v, err := v1.NewValidator(ðpb.Validator{WithdrawalCredentials: creds}) + require.NoError(t, err) + assert.DeepEqual(t, creds, v.WithdrawalCredentials()) +} + +func TestReadOnlyValidator_Slashed(t *testing.T) { + slashed := true + v, err := v1.NewValidator(ðpb.Validator{Slashed: slashed}) + require.NoError(t, err) + assert.Equal(t, slashed, v.Slashed()) +} diff --git a/beacon-chain/state/v1/references_test.go b/beacon-chain/state-native/v1/references_test.go similarity index 80% rename from beacon-chain/state/v1/references_test.go rename to beacon-chain/state-native/v1/references_test.go index 542ebc201f..c8a7c01a3e 100644 --- a/beacon-chain/state/v1/references_test.go +++ b/beacon-chain/state-native/v1/references_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" @@ -36,7 +36,7 @@ func TestStateReferenceSharing_Finalizer(t *testing.T) { b, ok := copied.(*BeaconState) require.Equal(t, true, ok) assert.Equal(t, uint(2), b.sharedFieldReferences[randaoMixes].Refs(), "Expected 2 shared references to RANDAO mixes") - require.NoError(t, b.UpdateRandaoMixesAtIndex(0, bytesutil.ToBytes32([]byte("bar")))) + require.NoError(t, b.UpdateRandaoMixesAtIndex(0, []byte("bar"))) if b.sharedFieldReferences[randaoMixes].Refs() != 1 || a.sharedFieldReferences[randaoMixes].Refs() != 1 { t.Error("Expected 1 shared reference to RANDAO mix for both a and b") } @@ -64,70 +64,46 @@ func TestStateReferenceCopy_NoUnexpectedRootsMutation(t *testing.T) { assertRefCount(t, a, stateRoots, 2) assertRefCount(t, b, blockRoots, 2) assertRefCount(t, b, stateRoots, 2) + assert.Equal(t, 1, len(b.BlockRoots()), "No block roots found") + assert.Equal(t, 1, len(b.StateRoots()), "No state roots found") // Assert shared state. - bRootsA := make([][]byte, len(a.BlockRoots())) - for i, r := range a.BlockRoots() { - tmp := r - bRootsA[i] = tmp[:] + blockRootsA := a.BlockRoots() + stateRootsA := a.StateRoots() + blockRootsB := b.BlockRoots() + stateRootsB := b.StateRoots() + if len(blockRootsA) != len(blockRootsB) || len(blockRootsA) < 1 { + t.Errorf("Unexpected number of block roots, want: %v", 1) } - sRootsA := make([][]byte, len(a.StateRoots())) - for i, r := range a.StateRoots() { - tmp := r - sRootsA[i] = tmp[:] + if len(stateRootsA) != len(stateRootsB) || len(stateRootsA) < 1 { + t.Errorf("Unexpected number of state roots, want: %v", 1) } - bRootsB := make([][]byte, len(b.BlockRoots())) - for i, r := range b.BlockRoots() { - tmp := r - bRootsB[i] = tmp[:] - } - sRootsB := make([][]byte, len(b.StateRoots())) - for i, r := range b.StateRoots() { - tmp := r - sRootsB[i] = tmp[:] - } - assertValFound(t, bRootsA, root1[:]) - assertValFound(t, bRootsB, root1[:]) - assertValFound(t, sRootsA, root1[:]) - assertValFound(t, sRootsB, root1[:]) + assertValFound(t, blockRootsA, root1[:]) + assertValFound(t, blockRootsB, root1[:]) + assertValFound(t, stateRootsA, root1[:]) + assertValFound(t, stateRootsB, root1[:]) // Mutator should only affect calling state: a. require.NoError(t, a.UpdateBlockRootAtIndex(0, root2)) require.NoError(t, a.UpdateStateRootAtIndex(0, root2)) // Assert no shared state mutation occurred only on state a (copy on write). - bRootsA = make([][]byte, len(a.BlockRoots())) - for i, r := range a.BlockRoots() { - tmp := r - bRootsA[i] = tmp[:] + assertValNotFound(t, a.BlockRoots(), root1[:]) + assertValNotFound(t, a.StateRoots(), root1[:]) + assertValFound(t, a.BlockRoots(), root2[:]) + assertValFound(t, a.StateRoots(), root2[:]) + assertValFound(t, b.BlockRoots(), root1[:]) + assertValFound(t, b.StateRoots(), root1[:]) + if len(blockRootsA) != len(blockRootsB) || len(blockRootsA) < 1 { + t.Errorf("Unexpected number of block roots, want: %v", 1) } - sRootsA = make([][]byte, len(a.StateRoots())) - for i, r := range a.StateRoots() { - tmp := r - sRootsA[i] = tmp[:] + if len(stateRootsA) != len(stateRootsB) || len(stateRootsA) < 1 { + t.Errorf("Unexpected number of state roots, want: %v", 1) } - blockRootsB := b.BlockRoots() - bRootsB = make([][]byte, len(b.BlockRoots())) - for i, r := range b.BlockRoots() { - tmp := r - bRootsB[i] = tmp[:] - } - stateRootsB := b.StateRoots() - sRootsB = make([][]byte, len(b.StateRoots())) - for i, r := range b.StateRoots() { - tmp := r - sRootsB[i] = tmp[:] - } - assertValNotFound(t, bRootsA, root1[:]) - assertValNotFound(t, sRootsA, root1[:]) - assertValFound(t, bRootsA, root2[:]) - assertValFound(t, sRootsA, root2[:]) - assertValFound(t, bRootsB, root1[:]) - assertValFound(t, sRootsB, root1[:]) - assert.DeepEqual(t, root2, a.BlockRoots()[0], "Expected mutation not found") - assert.DeepEqual(t, root2, a.StateRoots()[0], "Expected mutation not found") - assert.DeepEqual(t, root1, blockRootsB[0], "Unexpected mutation found") - assert.DeepEqual(t, root1, stateRootsB[0], "Unexpected mutation found") + assert.DeepEqual(t, root2[:], a.BlockRoots()[0], "Expected mutation not found") + assert.DeepEqual(t, root2[:], a.StateRoots()[0], "Expected mutation not found") + assert.DeepEqual(t, root1[:], blockRootsB[0], "Unexpected mutation found") + assert.DeepEqual(t, root1[:], stateRootsB[0], "Unexpected mutation found") // Copy on write happened, reference counters are reset. assertRefCount(t, a, blockRoots, 1) @@ -138,10 +114,10 @@ func TestStateReferenceCopy_NoUnexpectedRootsMutation(t *testing.T) { func TestStateReferenceCopy_NoUnexpectedRandaoMutation(t *testing.T) { - val1, val2 := bytesutil.ToBytes32([]byte("foo")), bytesutil.ToBytes32([]byte("bar")) + val1, val2 := []byte("foo"), []byte("bar") a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{ RandaoMixes: [][]byte{ - val1[:], + val1, }, }) require.NoError(t, err) @@ -155,41 +131,29 @@ func TestStateReferenceCopy_NoUnexpectedRandaoMutation(t *testing.T) { assertRefCount(t, b, randaoMixes, 2) // Assert shared state. - mixesA := make([][]byte, len(a.RandaoMixes())) - for i, r := range a.RandaoMixes() { - tmp := r - mixesA[i] = tmp[:] + mixesA := a.RandaoMixes() + mixesB := b.RandaoMixes() + if len(mixesA) != len(mixesB) || len(mixesA) < 1 { + t.Errorf("Unexpected number of mix values, want: %v", 1) } - mixesB := make([][]byte, len(b.RandaoMixes())) - for i, r := range b.RandaoMixes() { - tmp := r - mixesB[i] = tmp[:] - } - assertValFound(t, mixesA, val1[:]) - assertValFound(t, mixesB, val1[:]) + assertValFound(t, mixesA, val1) + assertValFound(t, mixesB, val1) // Mutator should only affect calling state: a. require.NoError(t, a.UpdateRandaoMixesAtIndex(0, val2)) // Assert no shared state mutation occurred only on state a (copy on write). - mixesA = make([][]byte, len(a.RandaoMixes())) - for i, r := range a.RandaoMixes() { - tmp := r - mixesA[i] = tmp[:] + if len(mixesA) != len(mixesB) || len(mixesA) < 1 { + t.Errorf("Unexpected number of mix values, want: %v", 1) } - mixesB = make([][]byte, len(b.RandaoMixes())) - for i, r := range b.RandaoMixes() { - tmp := r - mixesB[i] = tmp[:] - } - assertValFound(t, mixesA, val2[:]) - assertValNotFound(t, mixesA, val1[:]) - assertValFound(t, mixesB, val1[:]) - assertValNotFound(t, mixesB, val2[:]) - assertValFound(t, mixesB, val1[:]) - assertValNotFound(t, mixesB, val2[:]) - assert.DeepEqual(t, bytesutil.ToBytes32(val2[:]), a.RandaoMixes()[0], "Expected mutation not found") - assert.DeepEqual(t, val1[:], mixesB[0], "Unexpected mutation found") + assertValFound(t, a.RandaoMixes(), val2) + assertValNotFound(t, a.RandaoMixes(), val1) + assertValFound(t, b.RandaoMixes(), val1) + assertValNotFound(t, b.RandaoMixes(), val2) + assertValFound(t, mixesB, val1) + assertValNotFound(t, mixesB, val2) + assert.DeepEqual(t, val2, a.RandaoMixes()[0], "Expected mutation not found") + assert.DeepEqual(t, val1, mixesB[0], "Unexpected mutation found") // Copy on write happened, reference counters are reset. assertRefCount(t, a, randaoMixes, 1) diff --git a/beacon-chain/state/v1/setters_attestation.go b/beacon-chain/state-native/v1/setters_attestation.go similarity index 97% rename from beacon-chain/state/v1/setters_attestation.go rename to beacon-chain/state-native/v1/setters_attestation.go index 6e716d7fbe..49fe20730f 100644 --- a/beacon-chain/state/v1/setters_attestation.go +++ b/beacon-chain/state-native/v1/setters_attestation.go @@ -3,7 +3,7 @@ package v1 import ( "fmt" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/setters_attestation_test.go b/beacon-chain/state-native/v1/setters_attestation_test.go similarity index 97% rename from beacon-chain/state/v1/setters_attestation_test.go rename to beacon-chain/state-native/v1/setters_attestation_test.go index 0003358ef1..174e44bf1b 100644 --- a/beacon-chain/state/v1/setters_attestation_test.go +++ b/beacon-chain/state-native/v1/setters_attestation_test.go @@ -5,7 +5,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/state/v1/setters_block.go b/beacon-chain/state-native/v1/setters_block.go similarity index 77% rename from beacon-chain/state/v1/setters_block.go rename to beacon-chain/state-native/v1/setters_block.go index 9eb06bf95a..21638e4985 100644 --- a/beacon-chain/state/v1/setters_block.go +++ b/beacon-chain/state-native/v1/setters_block.go @@ -3,9 +3,10 @@ package v1 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -21,14 +22,18 @@ func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { // SetBlockRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetBlockRoots(val *[fieldparams.BlockRootsLength][32]byte) error { +func (b *BeaconState) SetBlockRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[blockRoots].MinusRef() b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) - roots := customtypes.BlockRoots(*val) + var rootsArr [fieldparams.BlockRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.BlockRoots(rootsArr) b.blockRoots = &roots b.markFieldAsDirty(blockRoots) b.rebuildTrie[blockRoots] = true diff --git a/beacon-chain/state/v1/setters_checkpoint.go b/beacon-chain/state-native/v1/setters_checkpoint.go similarity index 100% rename from beacon-chain/state/v1/setters_checkpoint.go rename to beacon-chain/state-native/v1/setters_checkpoint.go diff --git a/beacon-chain/state/v1/setters_eth1.go b/beacon-chain/state-native/v1/setters_eth1.go similarity index 95% rename from beacon-chain/state/v1/setters_eth1.go rename to beacon-chain/state-native/v1/setters_eth1.go index ce3d6af567..c615945846 100644 --- a/beacon-chain/state/v1/setters_eth1.go +++ b/beacon-chain/state-native/v1/setters_eth1.go @@ -1,7 +1,7 @@ package v1 import ( - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/setters_misc.go b/beacon-chain/state-native/v1/setters_misc.go similarity index 90% rename from beacon-chain/state/v1/setters_misc.go rename to beacon-chain/state-native/v1/setters_misc.go index 83d2f9d1ec..87f965233b 100644 --- a/beacon-chain/state/v1/setters_misc.go +++ b/beacon-chain/state-native/v1/setters_misc.go @@ -3,10 +3,11 @@ package v1 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "google.golang.org/protobuf/proto" ) @@ -50,11 +51,11 @@ func (b *BeaconState) SetGenesisTime(val uint64) error { } // SetGenesisValidatorRoot for the beacon state. -func (b *BeaconState) SetGenesisValidatorRoot(val [32]byte) error { +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { b.lock.Lock() defer b.lock.Unlock() - b.genesisValidatorsRoot = val + b.genesisValidatorsRoot = bytesutil.ToBytes32(val) b.markFieldAsDirty(genesisValidatorRoot) return nil } @@ -85,14 +86,18 @@ func (b *BeaconState) SetFork(val *ethpb.Fork) error { // SetHistoricalRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetHistoricalRoots(val [][32]byte) error { +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[historicalRoots].MinusRef() b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - b.historicalRoots = val + roots := make([][32]byte, len(val)) + for i, r := range val { + roots[i] = bytesutil.ToBytes32(r) + } + b.historicalRoots = roots b.markFieldAsDirty(historicalRoots) return nil } diff --git a/beacon-chain/state/v1/setters_randao.go b/beacon-chain/state-native/v1/setters_randao.go similarity index 71% rename from beacon-chain/state/v1/setters_randao.go rename to beacon-chain/state-native/v1/setters_randao.go index b5f0c2c9fe..8f8b106678 100644 --- a/beacon-chain/state/v1/setters_randao.go +++ b/beacon-chain/state-native/v1/setters_randao.go @@ -2,21 +2,26 @@ package v1 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetRandaoMixes for the beacon state. Updates the entire // randao mixes to a new value by overwriting the previous one. -func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byte) error { +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[randaoMixes].MinusRef() b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) - mixes := customtypes.RandaoMixes(*val) + var mixesArr [fieldparams.RandaoMixesLength][32]byte + for i := 0; i < len(mixesArr); i++ { + mixesArr[i] = bytesutil.ToBytes32(val[i]) + } + mixes := customtypes.RandaoMixes(mixesArr) b.randaoMixes = &mixes b.markFieldAsDirty(randaoMixes) b.rebuildTrie[randaoMixes] = true @@ -25,7 +30,7 @@ func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byt // UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes // at a specific index to a new value. -func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { if uint64(len(b.randaoMixes)) <= idx { return errors.Errorf("invalid index provided %d", idx) } @@ -42,7 +47,7 @@ func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) } - mixes[idx] = val + mixes[idx] = bytesutil.ToBytes32(val) b.randaoMixes = mixes b.markFieldAsDirty(randaoMixes) b.addDirtyIndices(randaoMixes, []uint64{idx}) diff --git a/beacon-chain/state/v1/setters_state.go b/beacon-chain/state-native/v1/setters_state.go similarity index 75% rename from beacon-chain/state/v1/setters_state.go rename to beacon-chain/state-native/v1/setters_state.go index a8f6421217..c3c48c73ad 100644 --- a/beacon-chain/state/v1/setters_state.go +++ b/beacon-chain/state-native/v1/setters_state.go @@ -2,21 +2,26 @@ package v1 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetStateRoots for the beacon state. Updates the state roots // to a new value by overwriting the previous value. -func (b *BeaconState) SetStateRoots(val *[fieldparams.StateRootsLength][32]byte) error { +func (b *BeaconState) SetStateRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[stateRoots].MinusRef() b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) - roots := customtypes.StateRoots(*val) + var rootsArr [fieldparams.StateRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.StateRoots(rootsArr) b.stateRoots = &roots b.markFieldAsDirty(stateRoots) b.rebuildTrie[stateRoots] = true diff --git a/beacon-chain/state/v1/setters_validator.go b/beacon-chain/state-native/v1/setters_validator.go similarity index 98% rename from beacon-chain/state/v1/setters_validator.go rename to beacon-chain/state-native/v1/setters_validator.go index 99f7d3e4d9..9280973c0f 100644 --- a/beacon-chain/state/v1/setters_validator.go +++ b/beacon-chain/state-native/v1/setters_validator.go @@ -3,7 +3,7 @@ package v1 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v1/state_test.go b/beacon-chain/state-native/v1/state_test.go similarity index 98% rename from beacon-chain/state/v1/state_test.go rename to beacon-chain/state-native/v1/state_test.go index 8d9006e683..2b779b4327 100644 --- a/beacon-chain/state/v1/state_test.go +++ b/beacon-chain/state-native/v1/state_test.go @@ -8,7 +8,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/state/v1/state_trie.go b/beacon-chain/state-native/v1/state_trie.go similarity index 96% rename from beacon-chain/state/v1/state_trie.go rename to beacon-chain/state-native/v1/state_trie.go index 59462d7089..595accc151 100644 --- a/beacon-chain/state/v1/state_trie.go +++ b/beacon-chain/state-native/v1/state_trie.go @@ -6,13 +6,12 @@ import ( "sort" "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/features" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" @@ -25,13 +24,6 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - stateCount = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "beacon_state_count", - Help: "Count the number of active beacon state objects.", - }) -) - // InitializeFromProto the beacon state from a protobuf representation. func InitializeFromProto(st *ethpb.BeaconState) (*BeaconState, error) { return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconState)) @@ -116,7 +108,7 @@ func InitializeFromProtoUnsafe(st *ethpb.BeaconState) (*BeaconState, error) { b.sharedFieldReferences[balances] = stateutil.NewRef(1) b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -160,7 +152,7 @@ func Initialize() (*BeaconState, error) { b.sharedFieldReferences[balances] = stateutil.NewRef(1) b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -255,7 +247,7 @@ func (b *BeaconState) Copy() state.BeaconState { } } - stateCount.Inc() + sharedstate.StateCount.Inc() // Finalizer runs when dst is being destroyed in garbage collection. runtime.SetFinalizer(dst, func(b *BeaconState) { for field, v := range b.sharedFieldReferences { @@ -273,7 +265,7 @@ func (b *BeaconState) Copy() state.BeaconState { delete(b.sharedFieldReferences, field) delete(b.stateFieldLeaves, field) } - stateCount.Sub(1) + sharedstate.StateCount.Sub(1) }) return dst } diff --git a/beacon-chain/state/v1/state_trie_test.go b/beacon-chain/state-native/v1/state_trie_test.go similarity index 94% rename from beacon-chain/state/v1/state_trie_test.go rename to beacon-chain/state-native/v1/state_trie_test.go index 639a7a1f1e..95458d0e1b 100644 --- a/beacon-chain/state/v1/state_trie_test.go +++ b/beacon-chain/state-native/v1/state_trie_test.go @@ -5,8 +5,8 @@ import ( "context" "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -24,7 +24,7 @@ func TestMain(m *testing.M) { func TestInitializeFromProto(t *testing.T) { testState, _ := util.DeterministicGenesisState(t, 64) - pbState, err := v1.ProtobufBeaconState(testState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) require.NoError(t, err) type test struct { name string @@ -67,7 +67,7 @@ func TestInitializeFromProto(t *testing.T) { func TestInitializeFromProtoUnsafe(t *testing.T) { testState, _ := util.DeterministicGenesisState(t, 64) - pbState, err := v1.ProtobufBeaconState(testState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) require.NoError(t, err) type test struct { name string @@ -161,7 +161,7 @@ func TestBeaconState_HashTreeRoot(t *testing.T) { if err == nil && tt.error != "" { t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) } - pbState, err := v1.ProtobufBeaconState(testState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) require.NoError(t, err) genericHTR, err := pbState.HashTreeRoot() if err == nil && tt.error != "" { @@ -230,7 +230,7 @@ func TestBeaconState_HashTreeRoot_FieldTrie(t *testing.T) { if err == nil && tt.error != "" { t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) } - pbState, err := v1.ProtobufBeaconState(testState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) require.NoError(t, err) genericHTR, err := pbState.HashTreeRoot() if err == nil && tt.error != "" { diff --git a/beacon-chain/state/v1/types.go b/beacon-chain/state-native/v1/types.go similarity index 94% rename from beacon-chain/state/v1/types.go rename to beacon-chain/state-native/v1/types.go index e395259950..566f131dba 100644 --- a/beacon-chain/state/v1/types.go +++ b/beacon-chain/state-native/v1/types.go @@ -2,8 +2,8 @@ package v1 import ( "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/params" ) diff --git a/beacon-chain/state/v1/types_test.go b/beacon-chain/state-native/v1/types_test.go similarity index 98% rename from beacon-chain/state/v1/types_test.go rename to beacon-chain/state-native/v1/types_test.go index 9af391c03e..d8ecd95eb4 100644 --- a/beacon-chain/state/v1/types_test.go +++ b/beacon-chain/state-native/v1/types_test.go @@ -6,7 +6,7 @@ import ( "strconv" "testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -190,7 +190,7 @@ func TestBeaconState_ImmutabilityWithSharedResources(t *testing.T) { // Randao mixes require.DeepEqual(t, a.RandaoMixes(), b.RandaoMixes(), "Test precondition failed, fields are not equal") - require.NoError(t, a.UpdateRandaoMixesAtIndex(1, bytesutil.ToBytes32([]byte("foo")))) + require.NoError(t, a.UpdateRandaoMixesAtIndex(1, []byte("foo"))) if reflect.DeepEqual(a.RandaoMixes(), b.RandaoMixes()) { t.Error("Expect a.RandaoMixes() to be different from b.RandaoMixes()") } diff --git a/beacon-chain/state/v1/unsupported_getters.go b/beacon-chain/state-native/v1/unsupported_getters.go similarity index 100% rename from beacon-chain/state/v1/unsupported_getters.go rename to beacon-chain/state-native/v1/unsupported_getters.go diff --git a/beacon-chain/state/v1/unsupported_setters.go b/beacon-chain/state-native/v1/unsupported_setters.go similarity index 100% rename from beacon-chain/state/v1/unsupported_setters.go rename to beacon-chain/state-native/v1/unsupported_setters.go diff --git a/beacon-chain/state/v2/BUILD.bazel b/beacon-chain/state-native/v2/BUILD.bazel similarity index 84% rename from beacon-chain/state/v2/BUILD.bazel rename to beacon-chain/state-native/v2/BUILD.bazel index 789371fc21..5ea90f8bf3 100644 --- a/beacon-chain/state/v2/BUILD.bazel +++ b/beacon-chain/state-native/v2/BUILD.bazel @@ -35,7 +35,7 @@ go_library( "//config:mainnet": ["beacon_state_mainnet.go"], "//config:minimal": ["beacon_state_minimal.go"], }), - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/v2", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v2", visibility = [ "//beacon-chain:__subpackages__", "//proto/migration:__subpackages__", @@ -43,12 +43,13 @@ go_library( "//testing/util:__pkg__", ], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", - "//beacon-chain/state/fieldtrie:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", + "//beacon-chain/state-native/fieldtrie:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", + "//beacon-chain/state-native/v1:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -83,9 +84,9 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", + "//beacon-chain/state-native/v1:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -108,7 +109,7 @@ ssz_gen_marshal( "//config:minimal": ["beacon_state_minimal.go"], }), includes = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//config/fieldparams:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", diff --git a/beacon-chain/state/v2/beacon_state_mainnet.go b/beacon-chain/state-native/v2/beacon_state_mainnet.go similarity index 90% rename from beacon-chain/state/v2/beacon_state_mainnet.go rename to beacon-chain/state-native/v2/beacon_state_mainnet.go index ae5106164f..6c8f43c247 100644 --- a/beacon-chain/state/v2/beacon_state_mainnet.go +++ b/beacon-chain/state-native/v2/beacon_state_mainnet.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v2/beacon_state_minimal.go b/beacon-chain/state-native/v2/beacon_state_minimal.go similarity index 90% rename from beacon-chain/state/v2/beacon_state_minimal.go rename to beacon-chain/state-native/v2/beacon_state_minimal.go index f94f2e3e40..fca96794e8 100644 --- a/beacon-chain/state/v2/beacon_state_minimal.go +++ b/beacon-chain/state-native/v2/beacon_state_minimal.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v2/deprecated_getters.go b/beacon-chain/state-native/v2/deprecated_getters.go similarity index 100% rename from beacon-chain/state/v2/deprecated_getters.go rename to beacon-chain/state-native/v2/deprecated_getters.go diff --git a/beacon-chain/state/v2/deprecated_getters_test.go b/beacon-chain/state-native/v2/deprecated_getters_test.go similarity index 100% rename from beacon-chain/state/v2/deprecated_getters_test.go rename to beacon-chain/state-native/v2/deprecated_getters_test.go diff --git a/beacon-chain/state/v2/deprecated_setters.go b/beacon-chain/state-native/v2/deprecated_setters.go similarity index 100% rename from beacon-chain/state/v2/deprecated_setters.go rename to beacon-chain/state-native/v2/deprecated_setters.go diff --git a/beacon-chain/state/v2/deprecated_setters_test.go b/beacon-chain/state-native/v2/deprecated_setters_test.go similarity index 100% rename from beacon-chain/state/v2/deprecated_setters_test.go rename to beacon-chain/state-native/v2/deprecated_setters_test.go diff --git a/beacon-chain/state/v2/field_roots.go b/beacon-chain/state-native/v2/field_roots.go similarity index 91% rename from beacon-chain/state/v2/field_roots.go rename to beacon-chain/state-native/v2/field_roots.go index 2314c59e8f..ea3db898de 100644 --- a/beacon-chain/state/v2/field_roots.go +++ b/beacon-chain/state-native/v2/field_roots.go @@ -4,7 +4,7 @@ import ( "context" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/config/features" eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v2/generated.ssz.go b/beacon-chain/state-native/v2/generated.ssz.go similarity index 100% rename from beacon-chain/state/v2/generated.ssz.go rename to beacon-chain/state-native/v2/generated.ssz.go diff --git a/beacon-chain/state/v2/getters_block.go b/beacon-chain/state-native/v2/getters_block.go similarity index 81% rename from beacon-chain/state/v2/getters_block.go rename to beacon-chain/state-native/v2/getters_block.go index 277e620a44..5c32f66697 100644 --- a/beacon-chain/state/v2/getters_block.go +++ b/beacon-chain/state-native/v2/getters_block.go @@ -3,8 +3,7 @@ package v2 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -46,7 +45,7 @@ func (b *BeaconState) latestBlockHeaderInternal() *ethpb.BeaconBlockHeader { } // BlockRoots kept track of in the beacon state. -func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { +func (b *BeaconState) BlockRoots() [][]byte { if b.blockRoots == nil { return nil } @@ -54,8 +53,12 @@ func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.BlockRootsLength][32]byte(*b.blockRootsInternal()) - return &roots + rootsArr := b.blockRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + return roots } // blockRootsInternal kept track of in the beacon state. @@ -66,15 +69,19 @@ func (b *BeaconState) blockRootsInternal() *customtypes.BlockRoots { // BlockRootAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) BlockRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { if b.blockRoots == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.blockRootAtIndex(idx) + r, err := b.blockRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // blockRootAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v2/getters_block_test.go b/beacon-chain/state-native/v2/getters_block_test.go similarity index 96% rename from beacon-chain/state/v2/getters_block_test.go rename to beacon-chain/state-native/v2/getters_block_test.go index fb7e5dd6b8..c7054f2e3f 100644 --- a/beacon-chain/state/v2/getters_block_test.go +++ b/beacon-chain/state-native/v2/getters_block_test.go @@ -29,7 +29,7 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err := InitializeFromProto(ðpb.BeaconStateAltair{}) require.NoError(t, err) got := s.BlockRoots() - require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, *got) + require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, got) want := [fieldparams.BlockRootsLength][32]byte{{'a'}} bRoots := make([][]byte, len(want)) @@ -40,11 +40,11 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err = InitializeFromProto(ðpb.BeaconStateAltair{BlockRoots: bRoots}) require.NoError(t, err) got = s.BlockRoots() - require.DeepEqual(t, want, *got) + require.DeepEqual(t, want, got) // Test copy does not mutate. got[0][0] = 'b' - require.DeepNotEqual(t, want, *got) + require.DeepNotEqual(t, want, got) } func TestBeaconState_BlockRootAtIndex(t *testing.T) { diff --git a/beacon-chain/state/v2/getters_checkpoint.go b/beacon-chain/state-native/v2/getters_checkpoint.go similarity index 100% rename from beacon-chain/state/v2/getters_checkpoint.go rename to beacon-chain/state-native/v2/getters_checkpoint.go diff --git a/beacon-chain/state/v2/getters_eth1.go b/beacon-chain/state-native/v2/getters_eth1.go similarity index 100% rename from beacon-chain/state/v2/getters_eth1.go rename to beacon-chain/state-native/v2/getters_eth1.go diff --git a/beacon-chain/state/v2/getters_misc.go b/beacon-chain/state-native/v2/getters_misc.go similarity index 90% rename from beacon-chain/state/v2/getters_misc.go rename to beacon-chain/state-native/v2/getters_misc.go index 032d8b7469..8b26d9a6fd 100644 --- a/beacon-chain/state/v2/getters_misc.go +++ b/beacon-chain/state-native/v2/getters_misc.go @@ -4,7 +4,7 @@ import ( "time" types "github.com/prysmaticlabs/eth2-types" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime/version" @@ -25,11 +25,12 @@ func (b *BeaconState) genesisTimeInternal() uint64 { } // GenesisValidatorRoot of the beacon state. -func (b *BeaconState) GenesisValidatorRoot() [32]byte { +func (b *BeaconState) GenesisValidatorRoot() []byte { b.lock.RLock() defer b.lock.RUnlock() - return b.genesisValidatorRootInternal() + r := b.genesisValidatorRootInternal() + return r[:] } // genesisValidatorRootInternal of the beacon state. @@ -124,7 +125,7 @@ func (b *BeaconState) forkInternal() *ethpb.Fork { } // HistoricalRoots based on epochs stored in the beacon state. -func (b *BeaconState) HistoricalRoots() [][32]byte { +func (b *BeaconState) HistoricalRoots() [][]byte { if b.historicalRoots == nil { return nil } @@ -132,7 +133,12 @@ func (b *BeaconState) HistoricalRoots() [][32]byte { b.lock.RLock() defer b.lock.RUnlock() - return b.historicalRootsInternal() + rootsArr := b.historicalRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + return roots } // historicalRootsInternal based on epochs stored in the beacon state. diff --git a/beacon-chain/state/v2/getters_participation.go b/beacon-chain/state-native/v2/getters_participation.go similarity index 100% rename from beacon-chain/state/v2/getters_participation.go rename to beacon-chain/state-native/v2/getters_participation.go diff --git a/beacon-chain/state/v2/getters_randao.go b/beacon-chain/state-native/v2/getters_randao.go similarity index 75% rename from beacon-chain/state/v2/getters_randao.go rename to beacon-chain/state-native/v2/getters_randao.go index 7bbfb06411..6124591719 100644 --- a/beacon-chain/state/v2/getters_randao.go +++ b/beacon-chain/state-native/v2/getters_randao.go @@ -3,12 +3,11 @@ package v2 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ) // RandaoMixes of block proposers on the beacon chain. -func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { +func (b *BeaconState) RandaoMixes() [][]byte { if b.randaoMixes == nil { return nil } @@ -16,8 +15,13 @@ func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - mixes := [fieldparams.RandaoMixesLength][32]byte(*b.randaoMixesInternal()) - return &mixes + mixesArr := b.randaoMixesInternal() + mixes := make([][]byte, len(mixesArr)) + for i, m := range mixesArr { + mixes[i] = m[:] + } + + return mixes } // randaoMixesInternal of block proposers on the beacon chain. @@ -28,15 +32,19 @@ func (b *BeaconState) randaoMixesInternal() *customtypes.RandaoMixes { // RandaoMixAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { if b.randaoMixes == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.randaoMixAtIndex(idx) + m, err := b.randaoMixAtIndex(idx) + if err != nil { + return nil, err + } + return m[:], nil } // randaoMixAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v2/getters_state.go b/beacon-chain/state-native/v2/getters_state.go similarity index 88% rename from beacon-chain/state/v2/getters_state.go rename to beacon-chain/state-native/v2/getters_state.go index dff47837e9..6c5066ec79 100644 --- a/beacon-chain/state/v2/getters_state.go +++ b/beacon-chain/state-native/v2/getters_state.go @@ -4,8 +4,7 @@ import ( "fmt" "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -146,7 +145,7 @@ func (b *BeaconState) toProtoNoLock() interface{} { } // StateRoots kept track of in the beacon state. -func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { +func (b *BeaconState) StateRoots() [][]byte { if b.stateRoots == nil { return nil } @@ -154,8 +153,13 @@ func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.StateRootsLength][32]byte(*b.stateRootsInternal()) - return &roots + rootsArr := b.stateRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + + return roots } // stateRootsInternal kept track of in the beacon state. @@ -166,15 +170,19 @@ func (b *BeaconState) stateRootsInternal() *customtypes.StateRoots { // StateRootAtIndex retrieves a specific state root based on an // input index value. -func (b *BeaconState) StateRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { if b.stateRoots == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.stateRootAtIndex(idx) + r, err := b.stateRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // stateRootAtIndex retrieves a specific state root based on an @@ -197,3 +205,14 @@ func ProtobufBeaconState(s interface{}) (*ethpb.BeaconStateAltair, error) { } return pbState, nil } + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + return b.ToProtoUnsafe() +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + return nil +} diff --git a/beacon-chain/state/v2/getters_sync_committee.go b/beacon-chain/state-native/v2/getters_sync_committee.go similarity index 100% rename from beacon-chain/state/v2/getters_sync_committee.go rename to beacon-chain/state-native/v2/getters_sync_committee.go diff --git a/beacon-chain/state/v2/getters_test.go b/beacon-chain/state-native/v2/getters_test.go similarity index 100% rename from beacon-chain/state/v2/getters_test.go rename to beacon-chain/state-native/v2/getters_test.go diff --git a/beacon-chain/state/v2/getters_validator.go b/beacon-chain/state-native/v2/getters_validator.go similarity index 98% rename from beacon-chain/state/v2/getters_validator.go rename to beacon-chain/state-native/v2/getters_validator.go index 6a31963a37..4338305452 100644 --- a/beacon-chain/state/v2/getters_validator.go +++ b/beacon-chain/state-native/v2/getters_validator.go @@ -5,8 +5,8 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state-native/v2/getters_validator_test.go b/beacon-chain/state-native/v2/getters_validator_test.go new file mode 100644 index 0000000000..997893cfb4 --- /dev/null +++ b/beacon-chain/state-native/v2/getters_validator_test.go @@ -0,0 +1,20 @@ +package v2_test + +import ( + "testing" + + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_ValidatorAtIndexReadOnly_HandlesNilSlice(t *testing.T) { + st, err := v1.InitializeFromProtoUnsafe(ðpb.BeaconState{ + Validators: nil, + }) + require.NoError(t, err) + + _, err = st.ValidatorAtIndexReadOnly(0) + assert.Equal(t, v1.ErrNilValidatorsInState, err) +} diff --git a/beacon-chain/state/v2/proofs.go b/beacon-chain/state-native/v2/proofs.go similarity index 96% rename from beacon-chain/state/v2/proofs.go rename to beacon-chain/state-native/v2/proofs.go index 026bb25fec..7d8a3f3dc7 100644 --- a/beacon-chain/state/v2/proofs.go +++ b/beacon-chain/state-native/v2/proofs.go @@ -3,7 +3,7 @@ package v2 import ( "encoding/binary" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) diff --git a/beacon-chain/state-native/v2/proofs_test.go b/beacon-chain/state-native/v2/proofs_test.go new file mode 100644 index 0000000000..8cd63a16ac --- /dev/null +++ b/beacon-chain/state-native/v2/proofs_test.go @@ -0,0 +1,75 @@ +package v2_test + +import ( + "context" + "testing" + + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v2" + "github.com/prysmaticlabs/prysm/container/trie" + "github.com/prysmaticlabs/prysm/crypto/bls" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestBeaconStateMerkleProofs(t *testing.T) { + ctx := context.Background() + st, _ := util.DeterministicGenesisStateAltair(t, 256) + htr, err := st.HashTreeRoot(ctx) + require.NoError(t, err) + t.Run("current sync committee", func(t *testing.T) { + sc, err := st.CurrentSyncCommittee() + require.NoError(t, err) + + // Verify the Merkle proof. + scRoot, err := sc.HashTreeRoot() + require.NoError(t, err) + proof, err := st.CurrentSyncCommitteeProof() + require.NoError(t, err) + valid := trie.VerifyMerkleProof(htr[:], scRoot[:], v2.CurrentSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + }) + t.Run("next sync committee", func(t *testing.T) { + nextSC, err := st.NextSyncCommittee() + require.NoError(t, err) + proof, err := st.NextSyncCommitteeProof() + require.NoError(t, err) + + // Verify the Merkle proof. + nextSCRoot, err := nextSC.HashTreeRoot() + require.NoError(t, err) + valid := trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v2.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + + // Edit the sync committee. + privKey, err := bls.RandKey() + require.NoError(t, err) + nextSC.AggregatePubkey = privKey.PublicKey().Marshal() + require.NoError(t, st.SetNextSyncCommittee(nextSC)) + + // Verifying the old Merkle proof for the new value should fail. + nextSCRoot, err = nextSC.HashTreeRoot() + require.NoError(t, err) + valid = trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v2.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, false, valid) + + // Generating a new, valid proof should pass. + proof, err = st.NextSyncCommitteeProof() + require.NoError(t, err) + htr, err = st.HashTreeRoot(ctx) + require.NoError(t, err) + valid = trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v2.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + }) + t.Run("finalized root", func(t *testing.T) { + finalizedRoot := st.FinalizedCheckpoint().Root + + // Verify the Merkle proof. + htr, err = st.HashTreeRoot(ctx) + require.NoError(t, err) + proof, err := st.FinalizedRootProof() + require.NoError(t, err) + gIndex := v2.FinalizedRootGeneralizedIndex() + valid := trie.VerifyMerkleProof(htr[:], finalizedRoot, gIndex, proof) + require.Equal(t, true, valid) + }) +} diff --git a/beacon-chain/state/v2/setters_block.go b/beacon-chain/state-native/v2/setters_block.go similarity index 77% rename from beacon-chain/state/v2/setters_block.go rename to beacon-chain/state-native/v2/setters_block.go index 7a1833b4d6..4140921ce5 100644 --- a/beacon-chain/state/v2/setters_block.go +++ b/beacon-chain/state-native/v2/setters_block.go @@ -3,9 +3,10 @@ package v2 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -21,14 +22,18 @@ func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { // SetBlockRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetBlockRoots(val *[fieldparams.BlockRootsLength][32]byte) error { +func (b *BeaconState) SetBlockRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[blockRoots].MinusRef() b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) - roots := customtypes.BlockRoots(*val) + var rootsArr [fieldparams.BlockRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.BlockRoots(rootsArr) b.blockRoots = &roots b.markFieldAsDirty(blockRoots) b.rebuildTrie[blockRoots] = true diff --git a/beacon-chain/state/v2/setters_checkpoint.go b/beacon-chain/state-native/v2/setters_checkpoint.go similarity index 100% rename from beacon-chain/state/v2/setters_checkpoint.go rename to beacon-chain/state-native/v2/setters_checkpoint.go diff --git a/beacon-chain/state/v2/setters_eth1.go b/beacon-chain/state-native/v2/setters_eth1.go similarity index 95% rename from beacon-chain/state/v2/setters_eth1.go rename to beacon-chain/state-native/v2/setters_eth1.go index 7446ea6838..b32ec489c3 100644 --- a/beacon-chain/state/v2/setters_eth1.go +++ b/beacon-chain/state-native/v2/setters_eth1.go @@ -1,7 +1,7 @@ package v2 import ( - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v2/setters_misc.go b/beacon-chain/state-native/v2/setters_misc.go similarity index 90% rename from beacon-chain/state/v2/setters_misc.go rename to beacon-chain/state-native/v2/setters_misc.go index c08aed5837..3310b8ac02 100644 --- a/beacon-chain/state/v2/setters_misc.go +++ b/beacon-chain/state-native/v2/setters_misc.go @@ -3,10 +3,11 @@ package v2 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "google.golang.org/protobuf/proto" ) @@ -49,11 +50,11 @@ func (b *BeaconState) SetGenesisTime(val uint64) error { } // SetGenesisValidatorRoot for the beacon state. -func (b *BeaconState) SetGenesisValidatorRoot(val [32]byte) error { +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { b.lock.Lock() defer b.lock.Unlock() - b.genesisValidatorsRoot = val + b.genesisValidatorsRoot = bytesutil.ToBytes32(val) b.markFieldAsDirty(genesisValidatorRoot) return nil } @@ -84,14 +85,18 @@ func (b *BeaconState) SetFork(val *ethpb.Fork) error { // SetHistoricalRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetHistoricalRoots(val [][32]byte) error { +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[historicalRoots].MinusRef() b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - b.historicalRoots = val + roots := make([][32]byte, len(val)) + for i, r := range val { + roots[i] = bytesutil.ToBytes32(r) + } + b.historicalRoots = roots b.markFieldAsDirty(historicalRoots) return nil } diff --git a/beacon-chain/state/v2/setters_participation.go b/beacon-chain/state-native/v2/setters_participation.go similarity index 97% rename from beacon-chain/state/v2/setters_participation.go rename to beacon-chain/state-native/v2/setters_participation.go index 5e92d63042..5f5adb7f6d 100644 --- a/beacon-chain/state/v2/setters_participation.go +++ b/beacon-chain/state-native/v2/setters_participation.go @@ -1,7 +1,7 @@ package v2 import ( - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" ) // SetPreviousParticipationBits for the beacon state. Updates the entire diff --git a/beacon-chain/state/v2/setters_randao.go b/beacon-chain/state-native/v2/setters_randao.go similarity index 71% rename from beacon-chain/state/v2/setters_randao.go rename to beacon-chain/state-native/v2/setters_randao.go index 0db89b9d86..2f208a5e91 100644 --- a/beacon-chain/state/v2/setters_randao.go +++ b/beacon-chain/state-native/v2/setters_randao.go @@ -2,21 +2,26 @@ package v2 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetRandaoMixes for the beacon state. Updates the entire // randao mixes to a new value by overwriting the previous one. -func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byte) error { +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[randaoMixes].MinusRef() b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) - mixes := customtypes.RandaoMixes(*val) + var mixesArr [fieldparams.RandaoMixesLength][32]byte + for i := 0; i < len(mixesArr); i++ { + mixesArr[i] = bytesutil.ToBytes32(val[i]) + } + mixes := customtypes.RandaoMixes(mixesArr) b.randaoMixes = &mixes b.markFieldAsDirty(randaoMixes) b.rebuildTrie[randaoMixes] = true @@ -25,7 +30,7 @@ func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byt // UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes // at a specific index to a new value. -func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { if uint64(len(b.randaoMixes)) <= idx { return errors.Errorf("invalid index provided %d", idx) } @@ -42,7 +47,7 @@ func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) } - mixes[idx] = val + mixes[idx] = bytesutil.ToBytes32(val) b.randaoMixes = mixes b.markFieldAsDirty(randaoMixes) b.addDirtyIndices(randaoMixes, []uint64{idx}) diff --git a/beacon-chain/state/v2/setters_state.go b/beacon-chain/state-native/v2/setters_state.go similarity index 75% rename from beacon-chain/state/v2/setters_state.go rename to beacon-chain/state-native/v2/setters_state.go index c2b4f6a626..ee6b4525d9 100644 --- a/beacon-chain/state/v2/setters_state.go +++ b/beacon-chain/state-native/v2/setters_state.go @@ -2,21 +2,26 @@ package v2 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetStateRoots for the beacon state. Updates the state roots // to a new value by overwriting the previous value. -func (b *BeaconState) SetStateRoots(val *[fieldparams.StateRootsLength][32]byte) error { +func (b *BeaconState) SetStateRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[stateRoots].MinusRef() b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) - roots := customtypes.StateRoots(*val) + var rootsArr [fieldparams.StateRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.StateRoots(rootsArr) b.stateRoots = &roots b.markFieldAsDirty(stateRoots) b.rebuildTrie[stateRoots] = true diff --git a/beacon-chain/state/v2/setters_sync_committee.go b/beacon-chain/state-native/v2/setters_sync_committee.go similarity index 100% rename from beacon-chain/state/v2/setters_sync_committee.go rename to beacon-chain/state-native/v2/setters_sync_committee.go diff --git a/beacon-chain/state/v2/setters_test.go b/beacon-chain/state-native/v2/setters_test.go similarity index 97% rename from beacon-chain/state/v2/setters_test.go rename to beacon-chain/state-native/v2/setters_test.go index 8329667aa7..32a157ef16 100644 --- a/beacon-chain/state/v2/setters_test.go +++ b/beacon-chain/state-native/v2/setters_test.go @@ -7,8 +7,8 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/state/v2/setters_validator.go b/beacon-chain/state-native/v2/setters_validator.go similarity index 98% rename from beacon-chain/state/v2/setters_validator.go rename to beacon-chain/state-native/v2/setters_validator.go index a142d06620..c6f2907c0c 100644 --- a/beacon-chain/state/v2/setters_validator.go +++ b/beacon-chain/state-native/v2/setters_validator.go @@ -3,7 +3,7 @@ package v2 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v2/state_trie.go b/beacon-chain/state-native/v2/state_trie.go similarity index 96% rename from beacon-chain/state/v2/state_trie.go rename to beacon-chain/state-native/v2/state_trie.go index ad66b60798..1714268843 100644 --- a/beacon-chain/state/v2/state_trie.go +++ b/beacon-chain/state-native/v2/state_trie.go @@ -8,13 +8,12 @@ import ( "sort" "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/features" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" @@ -27,13 +26,6 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - stateCount = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "beacon_state_altair_count", - Help: "Count the number of active beacon state objects.", - }) -) - // InitializeFromProto the beacon state from a protobuf representation. func InitializeFromProto(st *ethpb.BeaconStateAltair) (*BeaconState, error) { return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconStateAltair)) @@ -143,7 +135,7 @@ func InitializeFromProtoUnsafe(st *ethpb.BeaconStateAltair) (*BeaconState, error b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) // New in Altair. b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -188,7 +180,7 @@ func Initialize() (*BeaconState, error) { b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) // New in Altair. b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -283,7 +275,7 @@ func (b *BeaconState) Copy() state.BeaconState { } } - stateCount.Inc() + sharedstate.StateCount.Inc() // Finalizer runs when dst is being destroyed in garbage collection. runtime.SetFinalizer(dst, func(b *BeaconState) { for field, v := range b.sharedFieldReferences { @@ -300,7 +292,7 @@ func (b *BeaconState) Copy() state.BeaconState { delete(b.sharedFieldReferences, field) delete(b.stateFieldLeaves, field) } - stateCount.Sub(1) + sharedstate.StateCount.Sub(1) }) return dst diff --git a/beacon-chain/state-native/v2/state_trie_test.go b/beacon-chain/state-native/v2/state_trie_test.go new file mode 100644 index 0000000000..21a6d83967 --- /dev/null +++ b/beacon-chain/state-native/v2/state_trie_test.go @@ -0,0 +1,168 @@ +package v2 + +import ( + "strconv" + "sync" + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestMain(m *testing.M) { + resetCfg := features.InitWithReset(&features.Flags{EnableBalanceTrieComputation: true}) + defer resetCfg() + m.Run() +} + +func TestValidatorMap_DistinctCopy(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + handler := stateutil.NewValMapHandler(vals) + newHandler := handler.Copy() + wantedPubkey := strconv.Itoa(22) + handler.Set(bytesutil.ToBytes48([]byte(wantedPubkey)), 27) + val1, _ := handler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + val2, _ := newHandler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + assert.NotEqual(t, val1, val2, "Values are supposed to be unequal due to copy") +} + +func TestInitializeFromProto(t *testing.T) { + type test struct { + name string + state *ethpb.BeaconStateAltair + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconStateAltair{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconStateAltair{}, + }, + // TODO: Add full state. Blocked by testutil migration. + } + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + _, err := InitializeFromProto(tt.state) + if tt.error != "" { + require.ErrorContains(t, tt.error, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestBeaconState_NoDeadlock(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + st, err := InitializeFromProtoUnsafe(ðpb.BeaconStateAltair{ + Validators: vals, + }) + assert.NoError(t, err) + + wg := new(sync.WaitGroup) + + wg.Add(1) + go func() { + // Continuously lock and unlock the state + // by acquiring the lock. + for i := 0; i < 1000; i++ { + for _, f := range st.stateFieldLeaves { + f.Lock() + if f.Empty() { + f.InsertFieldLayer(make([][]*[32]byte, 10)) + } + f.Unlock() + f.FieldReference().AddRef() + } + } + wg.Done() + }() + // Constantly read from the offending portion + // of the code to ensure there is no possible + // recursive read locking. + for i := 0; i < 1000; i++ { + go func() { + _ = st.FieldReferencesCount() + }() + } + // Test will not terminate in the event of a deadlock. + wg.Wait() +} + +func TestInitializeFromProtoUnsafe(t *testing.T) { + type test struct { + name string + state *ethpb.BeaconStateAltair + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconStateAltair{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconStateAltair{}, + }, + // TODO: Add full state. Blocked by testutil migration. + } + _ = initTests +} diff --git a/beacon-chain/state/v2/types.go b/beacon-chain/state-native/v2/types.go similarity index 97% rename from beacon-chain/state/v2/types.go rename to beacon-chain/state-native/v2/types.go index 0b967b5e67..69893f5793 100644 --- a/beacon-chain/state/v2/types.go +++ b/beacon-chain/state-native/v2/types.go @@ -2,7 +2,7 @@ package v2 import ( "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/params" ) diff --git a/beacon-chain/state/v3/BUILD.bazel b/beacon-chain/state-native/v3/BUILD.bazel similarity index 84% rename from beacon-chain/state/v3/BUILD.bazel rename to beacon-chain/state-native/v3/BUILD.bazel index f7371ec165..ede8553f81 100644 --- a/beacon-chain/state/v3/BUILD.bazel +++ b/beacon-chain/state-native/v3/BUILD.bazel @@ -37,18 +37,19 @@ go_library( "//config:mainnet": ["beacon_state_mainnet.go"], "//config:minimal": ["beacon_state_minimal.go"], }), - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/v3", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v3", visibility = [ "//beacon-chain:__subpackages__", "//testing/util:__pkg__", ], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", - "//beacon-chain/state/fieldtrie:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", + "//beacon-chain/state-native/fieldtrie:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", + "//beacon-chain/state-native/v1:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -83,9 +84,9 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/types:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native/stateutil:go_default_library", + "//beacon-chain/state-native/types:go_default_library", + "//beacon-chain/state-native/v1:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", @@ -108,7 +109,7 @@ ssz_gen_marshal( "//config:minimal": ["beacon_state_minimal.go"], }), includes = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//config/fieldparams:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", diff --git a/beacon-chain/state/v3/beacon_state_mainnet.go b/beacon-chain/state-native/v3/beacon_state_mainnet.go similarity index 91% rename from beacon-chain/state/v3/beacon_state_mainnet.go rename to beacon-chain/state-native/v3/beacon_state_mainnet.go index 18d56d5d7a..d89b9bb8d1 100644 --- a/beacon-chain/state/v3/beacon_state_mainnet.go +++ b/beacon-chain/state-native/v3/beacon_state_mainnet.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v3/beacon_state_minimal.go b/beacon-chain/state-native/v3/beacon_state_minimal.go similarity index 91% rename from beacon-chain/state/v3/beacon_state_minimal.go rename to beacon-chain/state-native/v3/beacon_state_minimal.go index 935fcf8b7d..b109c08811 100644 --- a/beacon-chain/state/v3/beacon_state_minimal.go +++ b/beacon-chain/state-native/v3/beacon_state_minimal.go @@ -7,10 +7,10 @@ import ( eth2types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v3/deprecated_getters.go b/beacon-chain/state-native/v3/deprecated_getters.go similarity index 100% rename from beacon-chain/state/v3/deprecated_getters.go rename to beacon-chain/state-native/v3/deprecated_getters.go diff --git a/beacon-chain/state/v3/deprecated_getters_test.go b/beacon-chain/state-native/v3/deprecated_getters_test.go similarity index 100% rename from beacon-chain/state/v3/deprecated_getters_test.go rename to beacon-chain/state-native/v3/deprecated_getters_test.go diff --git a/beacon-chain/state/v3/deprecated_setters.go b/beacon-chain/state-native/v3/deprecated_setters.go similarity index 100% rename from beacon-chain/state/v3/deprecated_setters.go rename to beacon-chain/state-native/v3/deprecated_setters.go diff --git a/beacon-chain/state/v3/deprecated_setters_test.go b/beacon-chain/state-native/v3/deprecated_setters_test.go similarity index 100% rename from beacon-chain/state/v3/deprecated_setters_test.go rename to beacon-chain/state-native/v3/deprecated_setters_test.go diff --git a/beacon-chain/state/v3/field_roots.go b/beacon-chain/state-native/v3/field_roots.go similarity index 91% rename from beacon-chain/state/v3/field_roots.go rename to beacon-chain/state-native/v3/field_roots.go index 51fa71af6e..07a93ef098 100644 --- a/beacon-chain/state/v3/field_roots.go +++ b/beacon-chain/state-native/v3/field_roots.go @@ -4,7 +4,7 @@ import ( "context" "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/config/features" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v3/generated.ssz.go b/beacon-chain/state-native/v3/generated.ssz.go similarity index 100% rename from beacon-chain/state/v3/generated.ssz.go rename to beacon-chain/state-native/v3/generated.ssz.go diff --git a/beacon-chain/state/v3/getters_block.go b/beacon-chain/state-native/v3/getters_block.go similarity index 81% rename from beacon-chain/state/v3/getters_block.go rename to beacon-chain/state-native/v3/getters_block.go index d7b515e073..66358c91e9 100644 --- a/beacon-chain/state/v3/getters_block.go +++ b/beacon-chain/state-native/v3/getters_block.go @@ -3,8 +3,7 @@ package v3 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -46,7 +45,7 @@ func (b *BeaconState) latestBlockHeaderInternal() *ethpb.BeaconBlockHeader { } // BlockRoots kept track of in the beacon state. -func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { +func (b *BeaconState) BlockRoots() [][]byte { if b.blockRoots == nil { return nil } @@ -54,8 +53,12 @@ func (b *BeaconState) BlockRoots() *[fieldparams.BlockRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.BlockRootsLength][32]byte(*b.blockRootsInternal()) - return &roots + rootsArr := b.blockRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + return roots } // blockRootsInternal kept track of in the beacon state. @@ -66,15 +69,19 @@ func (b *BeaconState) blockRootsInternal() *customtypes.BlockRoots { // BlockRootAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) BlockRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { if b.blockRoots == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.blockRootAtIndex(idx) + r, err := b.blockRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // blockRootAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v3/getters_block_test.go b/beacon-chain/state-native/v3/getters_block_test.go similarity index 96% rename from beacon-chain/state/v3/getters_block_test.go rename to beacon-chain/state-native/v3/getters_block_test.go index f929623f5d..24cc360983 100644 --- a/beacon-chain/state/v3/getters_block_test.go +++ b/beacon-chain/state-native/v3/getters_block_test.go @@ -29,7 +29,7 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err := InitializeFromProto(ðpb.BeaconStateMerge{}) require.NoError(t, err) got := s.BlockRoots() - require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, *got) + require.DeepEqual(t, [fieldparams.BlockRootsLength][32]byte{}, got) want := [fieldparams.BlockRootsLength][32]byte{{'a'}} bRoots := make([][]byte, len(want)) @@ -40,11 +40,11 @@ func TestBeaconState_BlockRoots(t *testing.T) { s, err = InitializeFromProto(ðpb.BeaconStateMerge{BlockRoots: bRoots}) require.NoError(t, err) got = s.BlockRoots() - require.DeepEqual(t, want, *got) + require.DeepEqual(t, want, got) // Test copy does not mutate. got[0][0] = 'b' - require.DeepNotEqual(t, want, *got) + require.DeepNotEqual(t, want, got) } func TestBeaconState_BlockRootAtIndex(t *testing.T) { diff --git a/beacon-chain/state/v3/getters_checkpoint.go b/beacon-chain/state-native/v3/getters_checkpoint.go similarity index 100% rename from beacon-chain/state/v3/getters_checkpoint.go rename to beacon-chain/state-native/v3/getters_checkpoint.go diff --git a/beacon-chain/state/v3/getters_eth1.go b/beacon-chain/state-native/v3/getters_eth1.go similarity index 100% rename from beacon-chain/state/v3/getters_eth1.go rename to beacon-chain/state-native/v3/getters_eth1.go diff --git a/beacon-chain/state/v3/getters_misc.go b/beacon-chain/state-native/v3/getters_misc.go similarity index 90% rename from beacon-chain/state/v3/getters_misc.go rename to beacon-chain/state-native/v3/getters_misc.go index 8aa97dc5cf..8592b55c34 100644 --- a/beacon-chain/state/v3/getters_misc.go +++ b/beacon-chain/state-native/v3/getters_misc.go @@ -4,7 +4,7 @@ import ( "time" types "github.com/prysmaticlabs/eth2-types" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime/version" @@ -25,11 +25,12 @@ func (b *BeaconState) genesisTimeInternal() uint64 { } // GenesisValidatorRoot of the beacon state. -func (b *BeaconState) GenesisValidatorRoot() [32]byte { +func (b *BeaconState) GenesisValidatorRoot() []byte { b.lock.RLock() defer b.lock.RUnlock() - return b.genesisValidatorRootInternal() + r := b.genesisValidatorRootInternal() + return r[:] } // genesisValidatorRootInternal of the beacon state. @@ -124,7 +125,7 @@ func (b *BeaconState) forkInternal() *ethpb.Fork { } // HistoricalRoots based on epochs stored in the beacon state. -func (b *BeaconState) HistoricalRoots() [][32]byte { +func (b *BeaconState) HistoricalRoots() [][]byte { if b.historicalRoots == nil { return nil } @@ -132,7 +133,13 @@ func (b *BeaconState) HistoricalRoots() [][32]byte { b.lock.RLock() defer b.lock.RUnlock() - return b.historicalRootsInternal() + rootsArr := b.historicalRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + + return roots } // historicalRootsInternal based on epochs stored in the beacon state. diff --git a/beacon-chain/state/v3/getters_participation.go b/beacon-chain/state-native/v3/getters_participation.go similarity index 100% rename from beacon-chain/state/v3/getters_participation.go rename to beacon-chain/state-native/v3/getters_participation.go diff --git a/beacon-chain/state/v3/getters_payload_header.go b/beacon-chain/state-native/v3/getters_payload_header.go similarity index 100% rename from beacon-chain/state/v3/getters_payload_header.go rename to beacon-chain/state-native/v3/getters_payload_header.go diff --git a/beacon-chain/state/v3/getters_randao.go b/beacon-chain/state-native/v3/getters_randao.go similarity index 75% rename from beacon-chain/state/v3/getters_randao.go rename to beacon-chain/state-native/v3/getters_randao.go index fdad917b22..cede515ca4 100644 --- a/beacon-chain/state/v3/getters_randao.go +++ b/beacon-chain/state-native/v3/getters_randao.go @@ -3,12 +3,11 @@ package v3 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ) // RandaoMixes of block proposers on the beacon chain. -func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { +func (b *BeaconState) RandaoMixes() [][]byte { if b.randaoMixes == nil { return nil } @@ -16,8 +15,13 @@ func (b *BeaconState) RandaoMixes() *[fieldparams.RandaoMixesLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - mixes := [fieldparams.RandaoMixesLength][32]byte(*b.randaoMixesInternal()) - return &mixes + mixesArr := b.randaoMixesInternal() + mixes := make([][]byte, len(mixesArr)) + for i, m := range mixesArr { + mixes[i] = m[:] + } + + return mixes } // randaoMixesInternal of block proposers on the beacon chain. @@ -28,15 +32,19 @@ func (b *BeaconState) randaoMixesInternal() *customtypes.RandaoMixes { // RandaoMixAtIndex retrieves a specific block root based on an // input index value. -func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { if b.randaoMixes == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.randaoMixAtIndex(idx) + m, err := b.randaoMixAtIndex(idx) + if err != nil { + return nil, err + } + return m[:], nil } // randaoMixAtIndex retrieves a specific block root based on an diff --git a/beacon-chain/state/v3/getters_state.go b/beacon-chain/state-native/v3/getters_state.go similarity index 88% rename from beacon-chain/state/v3/getters_state.go rename to beacon-chain/state-native/v3/getters_state.go index 688b6b5884..0e64571b4d 100644 --- a/beacon-chain/state/v3/getters_state.go +++ b/beacon-chain/state-native/v3/getters_state.go @@ -4,8 +4,7 @@ import ( "fmt" "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -148,7 +147,7 @@ func (b *BeaconState) toProtoNoLock() interface{} { } // StateRoots kept track of in the beacon state. -func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { +func (b *BeaconState) StateRoots() [][]byte { if b.stateRoots == nil { return nil } @@ -156,8 +155,13 @@ func (b *BeaconState) StateRoots() *[fieldparams.StateRootsLength][32]byte { b.lock.RLock() defer b.lock.RUnlock() - roots := [fieldparams.StateRootsLength][32]byte(*b.stateRootsInternal()) - return &roots + rootsArr := b.stateRootsInternal() + roots := make([][]byte, len(rootsArr)) + for i, r := range rootsArr { + roots[i] = r[:] + } + + return roots } // stateRootsInternal kept track of in the beacon state. @@ -168,15 +172,19 @@ func (b *BeaconState) stateRootsInternal() *customtypes.StateRoots { // StateRootAtIndex retrieves a specific state root based on an // input index value. -func (b *BeaconState) StateRootAtIndex(idx uint64) ([32]byte, error) { +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { if b.stateRoots == nil { - return [32]byte{}, nil + return nil, nil } b.lock.RLock() defer b.lock.RUnlock() - return b.stateRootAtIndex(idx) + r, err := b.stateRootAtIndex(idx) + if err != nil { + return nil, err + } + return r[:], nil } // stateRootAtIndex retrieves a specific state root based on an @@ -199,3 +207,14 @@ func ProtobufBeaconState(s interface{}) (*ethpb.BeaconStateMerge, error) { } return pbState, nil } + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + return b.ToProtoUnsafe() +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + return nil +} diff --git a/beacon-chain/state/v3/getters_sync_committee.go b/beacon-chain/state-native/v3/getters_sync_committee.go similarity index 100% rename from beacon-chain/state/v3/getters_sync_committee.go rename to beacon-chain/state-native/v3/getters_sync_committee.go diff --git a/beacon-chain/state/v3/getters_test.go b/beacon-chain/state-native/v3/getters_test.go similarity index 100% rename from beacon-chain/state/v3/getters_test.go rename to beacon-chain/state-native/v3/getters_test.go diff --git a/beacon-chain/state/v3/getters_validator.go b/beacon-chain/state-native/v3/getters_validator.go similarity index 98% rename from beacon-chain/state/v3/getters_validator.go rename to beacon-chain/state-native/v3/getters_validator.go index 2e9541f977..d1b8a4c1ef 100644 --- a/beacon-chain/state/v3/getters_validator.go +++ b/beacon-chain/state-native/v3/getters_validator.go @@ -5,8 +5,8 @@ import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/state-native/v3/getters_validator_test.go b/beacon-chain/state-native/v3/getters_validator_test.go new file mode 100644 index 0000000000..ce9ef604de --- /dev/null +++ b/beacon-chain/state-native/v3/getters_validator_test.go @@ -0,0 +1,20 @@ +package v3_test + +import ( + "testing" + + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_ValidatorAtIndexReadOnly_HandlesNilSlice(t *testing.T) { + st, err := v1.InitializeFromProtoUnsafe(ðpb.BeaconState{ + Validators: nil, + }) + require.NoError(t, err) + + _, err = st.ValidatorAtIndexReadOnly(0) + assert.Equal(t, v1.ErrNilValidatorsInState, err) +} diff --git a/beacon-chain/state/v3/proofs.go b/beacon-chain/state-native/v3/proofs.go similarity index 96% rename from beacon-chain/state/v3/proofs.go rename to beacon-chain/state-native/v3/proofs.go index 408bc9f096..57b300b149 100644 --- a/beacon-chain/state/v3/proofs.go +++ b/beacon-chain/state-native/v3/proofs.go @@ -3,7 +3,7 @@ package v3 import ( "encoding/binary" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) diff --git a/beacon-chain/state-native/v3/proofs_test.go b/beacon-chain/state-native/v3/proofs_test.go new file mode 100644 index 0000000000..d26665a995 --- /dev/null +++ b/beacon-chain/state-native/v3/proofs_test.go @@ -0,0 +1,75 @@ +package v3_test + +import ( + "context" + "testing" + + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-native/v3" + "github.com/prysmaticlabs/prysm/container/trie" + "github.com/prysmaticlabs/prysm/crypto/bls" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestBeaconStateMerkleProofs(t *testing.T) { + ctx := context.Background() + st, _ := util.DeterministicGenesisStateAltair(t, 256) + htr, err := st.HashTreeRoot(ctx) + require.NoError(t, err) + t.Run("current sync committee", func(t *testing.T) { + sc, err := st.CurrentSyncCommittee() + require.NoError(t, err) + + // Verify the Merkle proof. + scRoot, err := sc.HashTreeRoot() + require.NoError(t, err) + proof, err := st.CurrentSyncCommitteeProof() + require.NoError(t, err) + valid := trie.VerifyMerkleProof(htr[:], scRoot[:], v3.CurrentSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + }) + t.Run("next sync committee", func(t *testing.T) { + nextSC, err := st.NextSyncCommittee() + require.NoError(t, err) + proof, err := st.NextSyncCommitteeProof() + require.NoError(t, err) + + // Verify the Merkle proof. + nextSCRoot, err := nextSC.HashTreeRoot() + require.NoError(t, err) + valid := trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v3.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + + // Edit the sync committee. + privKey, err := bls.RandKey() + require.NoError(t, err) + nextSC.AggregatePubkey = privKey.PublicKey().Marshal() + require.NoError(t, st.SetNextSyncCommittee(nextSC)) + + // Verifying the old Merkle proof for the new value should fail. + nextSCRoot, err = nextSC.HashTreeRoot() + require.NoError(t, err) + valid = trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v3.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, false, valid) + + // Generating a new, valid proof should pass. + proof, err = st.NextSyncCommitteeProof() + require.NoError(t, err) + htr, err = st.HashTreeRoot(ctx) + require.NoError(t, err) + valid = trie.VerifyMerkleProof(htr[:], nextSCRoot[:], v3.NextSyncCommitteeGeneralizedIndex(), proof) + require.Equal(t, true, valid) + }) + t.Run("finalized root", func(t *testing.T) { + finalizedRoot := st.FinalizedCheckpoint().Root + + // Verify the Merkle proof. + htr, err = st.HashTreeRoot(ctx) + require.NoError(t, err) + proof, err := st.FinalizedRootProof() + require.NoError(t, err) + gIndex := v3.FinalizedRootGeneralizedIndex() + valid := trie.VerifyMerkleProof(htr[:], finalizedRoot, gIndex, proof) + require.Equal(t, true, valid) + }) +} diff --git a/beacon-chain/state/v3/setters_block.go b/beacon-chain/state-native/v3/setters_block.go similarity index 77% rename from beacon-chain/state/v3/setters_block.go rename to beacon-chain/state-native/v3/setters_block.go index 6badd97036..50e60e87a7 100644 --- a/beacon-chain/state/v3/setters_block.go +++ b/beacon-chain/state-native/v3/setters_block.go @@ -3,9 +3,10 @@ package v3 import ( "fmt" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) @@ -21,14 +22,18 @@ func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { // SetBlockRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetBlockRoots(val *[fieldparams.BlockRootsLength][32]byte) error { +func (b *BeaconState) SetBlockRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[blockRoots].MinusRef() b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) - roots := customtypes.BlockRoots(*val) + var rootsArr [fieldparams.BlockRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.BlockRoots(rootsArr) b.blockRoots = &roots b.markFieldAsDirty(blockRoots) b.rebuildTrie[blockRoots] = true diff --git a/beacon-chain/state/v3/setters_checkpoint.go b/beacon-chain/state-native/v3/setters_checkpoint.go similarity index 100% rename from beacon-chain/state/v3/setters_checkpoint.go rename to beacon-chain/state-native/v3/setters_checkpoint.go diff --git a/beacon-chain/state/v3/setters_eth1.go b/beacon-chain/state-native/v3/setters_eth1.go similarity index 95% rename from beacon-chain/state/v3/setters_eth1.go rename to beacon-chain/state-native/v3/setters_eth1.go index 4167599ef7..f0b9866fed 100644 --- a/beacon-chain/state/v3/setters_eth1.go +++ b/beacon-chain/state-native/v3/setters_eth1.go @@ -1,7 +1,7 @@ package v3 import ( - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v3/setters_misc.go b/beacon-chain/state-native/v3/setters_misc.go similarity index 90% rename from beacon-chain/state/v3/setters_misc.go rename to beacon-chain/state-native/v3/setters_misc.go index 26b0d4de35..5a0d14f295 100644 --- a/beacon-chain/state/v3/setters_misc.go +++ b/beacon-chain/state-native/v3/setters_misc.go @@ -3,10 +3,11 @@ package v3 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "google.golang.org/protobuf/proto" ) @@ -49,11 +50,11 @@ func (b *BeaconState) SetGenesisTime(val uint64) error { } // SetGenesisValidatorRoot for the beacon state. -func (b *BeaconState) SetGenesisValidatorRoot(val [32]byte) error { +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { b.lock.Lock() defer b.lock.Unlock() - b.genesisValidatorsRoot = val + b.genesisValidatorsRoot = bytesutil.ToBytes32(val) b.markFieldAsDirty(genesisValidatorRoot) return nil } @@ -84,14 +85,18 @@ func (b *BeaconState) SetFork(val *ethpb.Fork) error { // SetHistoricalRoots for the beacon state. Updates the entire // list to a new value by overwriting the previous one. -func (b *BeaconState) SetHistoricalRoots(val [][32]byte) error { +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[historicalRoots].MinusRef() b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) - b.historicalRoots = val + roots := make([][32]byte, len(val)) + for i, r := range val { + roots[i] = bytesutil.ToBytes32(r) + } + b.historicalRoots = roots b.markFieldAsDirty(historicalRoots) return nil } diff --git a/beacon-chain/state/v3/setters_participation.go b/beacon-chain/state-native/v3/setters_participation.go similarity index 97% rename from beacon-chain/state/v3/setters_participation.go rename to beacon-chain/state-native/v3/setters_participation.go index b3cca9cd3a..763c0f27a6 100644 --- a/beacon-chain/state/v3/setters_participation.go +++ b/beacon-chain/state-native/v3/setters_participation.go @@ -1,7 +1,7 @@ package v3 import ( - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" ) // SetPreviousParticipationBits for the beacon state. Updates the entire diff --git a/beacon-chain/state/v3/setters_payload_header.go b/beacon-chain/state-native/v3/setters_payload_header.go similarity index 100% rename from beacon-chain/state/v3/setters_payload_header.go rename to beacon-chain/state-native/v3/setters_payload_header.go diff --git a/beacon-chain/state/v3/setters_randao.go b/beacon-chain/state-native/v3/setters_randao.go similarity index 71% rename from beacon-chain/state/v3/setters_randao.go rename to beacon-chain/state-native/v3/setters_randao.go index a9737346f8..083b835f16 100644 --- a/beacon-chain/state/v3/setters_randao.go +++ b/beacon-chain/state-native/v3/setters_randao.go @@ -2,21 +2,26 @@ package v3 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetRandaoMixes for the beacon state. Updates the entire // randao mixes to a new value by overwriting the previous one. -func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byte) error { +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[randaoMixes].MinusRef() b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) - mixes := customtypes.RandaoMixes(*val) + var mixesArr [fieldparams.RandaoMixesLength][32]byte + for i := 0; i < len(mixesArr); i++ { + mixesArr[i] = bytesutil.ToBytes32(val[i]) + } + mixes := customtypes.RandaoMixes(mixesArr) b.randaoMixes = &mixes b.markFieldAsDirty(randaoMixes) b.rebuildTrie[randaoMixes] = true @@ -25,7 +30,7 @@ func (b *BeaconState) SetRandaoMixes(val *[fieldparams.RandaoMixesLength][32]byt // UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes // at a specific index to a new value. -func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { if uint64(len(b.randaoMixes)) <= idx { return errors.Errorf("invalid index provided %d", idx) } @@ -42,7 +47,7 @@ func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val [32]byte) error { b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) } - mixes[idx] = val + mixes[idx] = bytesutil.ToBytes32(val) b.randaoMixes = mixes b.markFieldAsDirty(randaoMixes) b.addDirtyIndices(randaoMixes, []uint64{idx}) diff --git a/beacon-chain/state/v3/setters_state.go b/beacon-chain/state-native/v3/setters_state.go similarity index 75% rename from beacon-chain/state/v3/setters_state.go rename to beacon-chain/state-native/v3/setters_state.go index 6593eb8853..d1fb309d36 100644 --- a/beacon-chain/state/v3/setters_state.go +++ b/beacon-chain/state-native/v3/setters_state.go @@ -2,21 +2,26 @@ package v3 import ( "github.com/pkg/errors" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" ) // SetStateRoots for the beacon state. Updates the state roots // to a new value by overwriting the previous value. -func (b *BeaconState) SetStateRoots(val *[fieldparams.StateRootsLength][32]byte) error { +func (b *BeaconState) SetStateRoots(val [][]byte) error { b.lock.Lock() defer b.lock.Unlock() b.sharedFieldReferences[stateRoots].MinusRef() b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) - roots := customtypes.StateRoots(*val) + var rootsArr [fieldparams.StateRootsLength][32]byte + for i := 0; i < len(rootsArr); i++ { + rootsArr[i] = bytesutil.ToBytes32(val[i]) + } + roots := customtypes.StateRoots(rootsArr) b.stateRoots = &roots b.markFieldAsDirty(stateRoots) b.rebuildTrie[stateRoots] = true diff --git a/beacon-chain/state/v3/setters_sync_committee.go b/beacon-chain/state-native/v3/setters_sync_committee.go similarity index 100% rename from beacon-chain/state/v3/setters_sync_committee.go rename to beacon-chain/state-native/v3/setters_sync_committee.go diff --git a/beacon-chain/state/v3/setters_test.go b/beacon-chain/state-native/v3/setters_test.go similarity index 97% rename from beacon-chain/state/v3/setters_test.go rename to beacon-chain/state-native/v3/setters_test.go index db2a6efa31..635a247061 100644 --- a/beacon-chain/state/v3/setters_test.go +++ b/beacon-chain/state-native/v3/setters_test.go @@ -7,8 +7,8 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/state/v3/setters_validator.go b/beacon-chain/state-native/v3/setters_validator.go similarity index 98% rename from beacon-chain/state/v3/setters_validator.go rename to beacon-chain/state-native/v3/setters_validator.go index c696766f1b..1ebce577dd 100644 --- a/beacon-chain/state/v3/setters_validator.go +++ b/beacon-chain/state-native/v3/setters_validator.go @@ -3,7 +3,7 @@ package v3 import ( "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/v3/state_trie.go b/beacon-chain/state-native/v3/state_trie.go similarity index 96% rename from beacon-chain/state/v3/state_trie.go rename to beacon-chain/state-native/v3/state_trie.go index d6dee64b51..d6fef13fb4 100644 --- a/beacon-chain/state/v3/state_trie.go +++ b/beacon-chain/state-native/v3/state_trie.go @@ -6,13 +6,12 @@ import ( "sort" "github.com/pkg/errors" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state/custom-types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/fieldtrie" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + customtypes "github.com/prysmaticlabs/prysm/beacon-chain/state-native/custom-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/slice" @@ -24,13 +23,6 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - stateCount = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "beacon_state_merge_count", - Help: "Count the number of active beacon state objects.", - }) -) - // InitializeFromProto the beacon state from a protobuf representation. func InitializeFromProto(st *ethpb.BeaconStateMerge) (*BeaconState, error) { return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconStateMerge)) @@ -120,7 +112,7 @@ func InitializeFromProtoUnsafe(st *ethpb.BeaconStateMerge) (*BeaconState, error) b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) // New in Altair. b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) b.sharedFieldReferences[latestExecutionPayloadHeader] = stateutil.NewRef(1) // New in Merge. - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -166,7 +158,7 @@ func Initialize() (*BeaconState, error) { b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) b.sharedFieldReferences[latestExecutionPayloadHeader] = stateutil.NewRef(1) // New in Merge. - stateCount.Inc() + sharedstate.StateCount.Inc() return b, nil } @@ -261,7 +253,7 @@ func (b *BeaconState) Copy() state.BeaconState { } } } - stateCount.Inc() + sharedstate.StateCount.Inc() // Finalizer runs when dst is being destroyed in garbage collection. runtime.SetFinalizer(dst, func(b *BeaconState) { for field, v := range b.sharedFieldReferences { @@ -278,7 +270,7 @@ func (b *BeaconState) Copy() state.BeaconState { delete(b.sharedFieldReferences, field) delete(b.stateFieldLeaves, field) } - stateCount.Sub(1) + sharedstate.StateCount.Sub(1) }) return dst diff --git a/beacon-chain/state-native/v3/state_trie_test.go b/beacon-chain/state-native/v3/state_trie_test.go new file mode 100644 index 0000000000..5ec8aad22e --- /dev/null +++ b/beacon-chain/state-native/v3/state_trie_test.go @@ -0,0 +1,167 @@ +package v3 + +import ( + "strconv" + "sync" + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/stateutil" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestMain(m *testing.M) { + resetCfg := features.InitWithReset(&features.Flags{EnableBalanceTrieComputation: true}) + defer resetCfg() + m.Run() +} + +func TestValidatorMap_DistinctCopy(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + handler := stateutil.NewValMapHandler(vals) + newHandler := handler.Copy() + wantedPubkey := strconv.Itoa(22) + handler.Set(bytesutil.ToBytes48([]byte(wantedPubkey)), 27) + val1, _ := handler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + val2, _ := newHandler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + assert.NotEqual(t, val1, val2, "Values are supposed to be unequal due to copy") +} + +func TestInitializeFromProto(t *testing.T) { + type test struct { + name string + state *ethpb.BeaconStateMerge + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconStateMerge{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconStateMerge{}, + }, + } + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + _, err := InitializeFromProto(tt.state) + if tt.error != "" { + require.ErrorContains(t, tt.error, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestBeaconState_NoDeadlock(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + st, err := InitializeFromProtoUnsafe(ðpb.BeaconStateMerge{ + Validators: vals, + }) + assert.NoError(t, err) + + wg := new(sync.WaitGroup) + + wg.Add(1) + go func() { + // Continuously lock and unlock the state + // by acquiring the lock. + for i := 0; i < 1000; i++ { + for _, f := range st.stateFieldLeaves { + f.Lock() + if f.Empty() { + f.InsertFieldLayer(make([][]*[32]byte, 10)) + } + f.Unlock() + f.FieldReference().AddRef() + } + } + wg.Done() + }() + // Constantly read from the offending portion + // of the code to ensure there is no possible + // recursive read locking. + for i := 0; i < 1000; i++ { + go func() { + _ = st.FieldReferencesCount() + }() + } + // Test will not terminate in the event of a deadlock. + wg.Wait() +} + +func TestInitializeFromProtoUnsafe(t *testing.T) { + type test struct { + name string + state *ethpb.BeaconStateMerge + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconStateMerge{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconStateMerge{}, + }, + // TODO: Add full state. Blocked by testutil migration. + } + _ = initTests +} diff --git a/beacon-chain/state/v3/types.go b/beacon-chain/state-native/v3/types.go similarity index 97% rename from beacon-chain/state/v3/types.go rename to beacon-chain/state-native/v3/types.go index 7f8bbe81d1..bb387b2b2b 100644 --- a/beacon-chain/state/v3/types.go +++ b/beacon-chain/state-native/v3/types.go @@ -2,7 +2,7 @@ package v3 import ( "github.com/pkg/errors" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native/types" "github.com/prysmaticlabs/prysm/config/params" ) diff --git a/beacon-chain/state-proto/fieldtrie/BUILD.bazel b/beacon-chain/state-proto/fieldtrie/BUILD.bazel new file mode 100644 index 0000000000..5dd3e53334 --- /dev/null +++ b/beacon-chain/state-proto/fieldtrie/BUILD.bazel @@ -0,0 +1,40 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "field_trie.go", + "field_trie_helpers.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie", + visibility = ["//beacon-chain:__subpackages__"], + deps = [ + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/version:go_default_library", + "@com_github_pkg_errors//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "field_trie_test.go", + "helpers_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//config/params:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + ], +) diff --git a/beacon-chain/state-proto/fieldtrie/field_trie.go b/beacon-chain/state-proto/fieldtrie/field_trie.go new file mode 100644 index 0000000000..030e5cd512 --- /dev/null +++ b/beacon-chain/state-proto/fieldtrie/field_trie.go @@ -0,0 +1,200 @@ +package fieldtrie + +import ( + "reflect" + "sync" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" +) + +// FieldTrie is the representation of the representative +// trie of the particular field. +type FieldTrie struct { + *sync.RWMutex + reference *stateutil.Reference + fieldLayers [][]*[32]byte + field types.FieldIndex + dataType types.DataType + length uint64 + numOfElems int +} + +// NewFieldTrie is the constructor for the field trie data structure. It creates the corresponding +// trie according to the given parameters. Depending on whether the field is a basic/composite array +// which is either fixed/variable length, it will appropriately determine the trie. +func NewFieldTrie(field types.FieldIndex, dataType types.DataType, elements interface{}, length uint64) (*FieldTrie, error) { + if elements == nil { + return &FieldTrie{ + field: field, + dataType: dataType, + reference: stateutil.NewRef(1), + RWMutex: new(sync.RWMutex), + length: length, + numOfElems: 0, + }, nil + } + fieldRoots, err := fieldConverters(field, []uint64{}, elements, true) + if err != nil { + return nil, err + } + if err := validateElements(field, dataType, elements, length); err != nil { + return nil, err + } + switch dataType { + case types.BasicArray: + fl, err := stateutil.ReturnTrieLayer(fieldRoots, length) + if err != nil { + return nil, err + } + return &FieldTrie{ + fieldLayers: fl, + field: field, + dataType: dataType, + reference: stateutil.NewRef(1), + RWMutex: new(sync.RWMutex), + length: length, + numOfElems: reflect.ValueOf(elements).Len(), + }, nil + case types.CompositeArray, types.CompressedArray: + return &FieldTrie{ + fieldLayers: stateutil.ReturnTrieLayerVariable(fieldRoots, length), + field: field, + dataType: dataType, + reference: stateutil.NewRef(1), + RWMutex: new(sync.RWMutex), + length: length, + numOfElems: reflect.ValueOf(elements).Len(), + }, nil + default: + return nil, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(dataType).Name()) + } + +} + +// RecomputeTrie rebuilds the affected branches in the trie according to the provided +// changed indices and elements. This recomputes the trie according to the particular +// field the trie is based on. +func (f *FieldTrie) RecomputeTrie(indices []uint64, elements interface{}) ([32]byte, error) { + f.Lock() + defer f.Unlock() + var fieldRoot [32]byte + if len(indices) == 0 { + return f.TrieRoot() + } + fieldRoots, err := fieldConverters(f.field, indices, elements, false) + if err != nil { + return [32]byte{}, err + } + if err := f.validateIndices(indices); err != nil { + return [32]byte{}, err + } + switch f.dataType { + case types.BasicArray: + fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayer(fieldRoots, indices, f.fieldLayers) + if err != nil { + return [32]byte{}, err + } + f.numOfElems = reflect.ValueOf(elements).Len() + return fieldRoot, nil + case types.CompositeArray: + fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayerVariable(fieldRoots, indices, f.fieldLayers) + if err != nil { + return [32]byte{}, err + } + f.numOfElems = reflect.ValueOf(elements).Len() + return stateutil.AddInMixin(fieldRoot, uint64(len(f.fieldLayers[0]))) + case types.CompressedArray: + numOfElems, err := f.field.ElemsInChunk() + if err != nil { + return [32]byte{}, err + } + // We remove the duplicates here in order to prevent + // duplicated insertions into the trie. + newIndices := []uint64{} + indexExists := make(map[uint64]bool) + newRoots := make([][32]byte, 0, len(fieldRoots)/int(numOfElems)) + for i, idx := range indices { + startIdx := idx / numOfElems + if indexExists[startIdx] { + continue + } + newIndices = append(newIndices, startIdx) + indexExists[startIdx] = true + newRoots = append(newRoots, fieldRoots[i]) + } + fieldRoot, f.fieldLayers, err = stateutil.RecomputeFromLayerVariable(newRoots, newIndices, f.fieldLayers) + if err != nil { + return [32]byte{}, err + } + f.numOfElems = reflect.ValueOf(elements).Len() + return stateutil.AddInMixin(fieldRoot, uint64(f.numOfElems)) + default: + return [32]byte{}, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(f.dataType).Name()) + } +} + +// CopyTrie copies the references to the elements the trie +// is built on. +func (f *FieldTrie) CopyTrie() *FieldTrie { + if f.fieldLayers == nil { + return &FieldTrie{ + field: f.field, + dataType: f.dataType, + reference: stateutil.NewRef(1), + RWMutex: new(sync.RWMutex), + length: f.length, + numOfElems: f.numOfElems, + } + } + dstFieldTrie := make([][]*[32]byte, len(f.fieldLayers)) + for i, layer := range f.fieldLayers { + dstFieldTrie[i] = make([]*[32]byte, len(layer)) + copy(dstFieldTrie[i], layer) + } + return &FieldTrie{ + fieldLayers: dstFieldTrie, + field: f.field, + dataType: f.dataType, + reference: stateutil.NewRef(1), + RWMutex: new(sync.RWMutex), + length: f.length, + numOfElems: f.numOfElems, + } +} + +// TrieRoot returns the corresponding root of the trie. +func (f *FieldTrie) TrieRoot() ([32]byte, error) { + switch f.dataType { + case types.BasicArray: + return *f.fieldLayers[len(f.fieldLayers)-1][0], nil + case types.CompositeArray: + trieRoot := *f.fieldLayers[len(f.fieldLayers)-1][0] + return stateutil.AddInMixin(trieRoot, uint64(len(f.fieldLayers[0]))) + case types.CompressedArray: + trieRoot := *f.fieldLayers[len(f.fieldLayers)-1][0] + return stateutil.AddInMixin(trieRoot, uint64(f.numOfElems)) + default: + return [32]byte{}, errors.Errorf("unrecognized data type in field map: %v", reflect.TypeOf(f.dataType).Name()) + } +} + +// FieldReference returns the underlying field reference +// object for the trie. +func (f *FieldTrie) FieldReference() *stateutil.Reference { + return f.reference +} + +// Empty checks whether the underlying field trie is +// empty or not. +func (f *FieldTrie) Empty() bool { + return f == nil || len(f.fieldLayers) == 0 +} + +// InsertFieldLayer manually inserts a field layer. This method +// bypasses the normal method of field computation, it is only +// meant to be used in tests. +func (f *FieldTrie) InsertFieldLayer(layer [][]*[32]byte) { + f.fieldLayers = layer +} diff --git a/beacon-chain/state-proto/fieldtrie/field_trie_helpers.go b/beacon-chain/state-proto/fieldtrie/field_trie_helpers.go new file mode 100644 index 0000000000..17c0445858 --- /dev/null +++ b/beacon-chain/state-proto/fieldtrie/field_trie_helpers.go @@ -0,0 +1,295 @@ +package fieldtrie + +import ( + "encoding/binary" + "fmt" + "reflect" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/version" +) + +// ProofFromMerkleLayers creates a proof starting at the leaf index of the state Merkle layers. +func ProofFromMerkleLayers(layers [][][]byte, startingLeafIndex types.FieldIndex) [][]byte { + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + proof := make([][]byte, 0) + currentIndex := startingLeafIndex + for i := 0; i < len(layers)-1; i++ { + neighborIdx := currentIndex ^ 1 + neighbor := layers[i][neighborIdx] + proof = append(proof, neighbor) + currentIndex = currentIndex / 2 + } + return proof +} + +func (f *FieldTrie) validateIndices(idxs []uint64) error { + length := f.length + if f.dataType == types.CompressedArray { + comLength, err := f.field.ElemsInChunk() + if err != nil { + return err + } + length *= comLength + } + for _, idx := range idxs { + if idx >= length { + return errors.Errorf("invalid index for field %s: %d >= length %d", f.field.String(version.Phase0), idx, length) + } + } + return nil +} + +func validateElements(field types.FieldIndex, dataType types.DataType, elements interface{}, length uint64) error { + if dataType == types.CompressedArray { + comLength, err := field.ElemsInChunk() + if err != nil { + return err + } + length *= comLength + } + val := reflect.ValueOf(elements) + if val.Len() > int(length) { + return errors.Errorf("elements length is larger than expected for field %s: %d > %d", field.String(version.Phase0), val.Len(), length) + } + return nil +} + +// fieldConverters converts the corresponding field and the provided elements to the appropriate roots. +func fieldConverters(field types.FieldIndex, indices []uint64, elements interface{}, convertAll bool) ([][32]byte, error) { + switch field { + case types.BlockRoots, types.StateRoots, types.RandaoMixes: + val, ok := elements.([][]byte) + if !ok { + return nil, errors.Errorf("Wanted type of %v but got %v", + reflect.TypeOf([][]byte{}).Name(), reflect.TypeOf(elements).Name()) + } + return handleByteArrays(val, indices, convertAll) + case types.Eth1DataVotes: + val, ok := elements.([]*ethpb.Eth1Data) + if !ok { + return nil, errors.Errorf("Wanted type of %v but got %v", + reflect.TypeOf([]*ethpb.Eth1Data{}).Name(), reflect.TypeOf(elements).Name()) + } + return handleEth1DataSlice(val, indices, convertAll) + case types.Validators: + val, ok := elements.([]*ethpb.Validator) + if !ok { + return nil, errors.Errorf("Wanted type of %v but got %v", + reflect.TypeOf([]*ethpb.Validator{}).Name(), reflect.TypeOf(elements).Name()) + } + return handleValidatorSlice(val, indices, convertAll) + case types.PreviousEpochAttestations, types.CurrentEpochAttestations: + val, ok := elements.([]*ethpb.PendingAttestation) + if !ok { + return nil, errors.Errorf("Wanted type of %v but got %v", + reflect.TypeOf([]*ethpb.PendingAttestation{}).Name(), reflect.TypeOf(elements).Name()) + } + return handlePendingAttestation(val, indices, convertAll) + case types.Balances: + val, ok := elements.([]uint64) + if !ok { + return nil, errors.Errorf("Wanted type of %v but got %v", + reflect.TypeOf([]uint64{}).Name(), reflect.TypeOf(elements).Name()) + } + return handleBalanceSlice(val, indices, convertAll) + default: + return [][32]byte{}, errors.Errorf("got unsupported type of %v", reflect.TypeOf(elements).Name()) + } +} + +// handleByteArrays computes and returns byte arrays in a slice of root format. +func handleByteArrays(val [][]byte, indices []uint64, convertAll bool) ([][32]byte, error) { + length := len(indices) + if convertAll { + length = len(val) + } + roots := make([][32]byte, 0, length) + rootCreator := func(input []byte) { + newRoot := bytesutil.ToBytes32(input) + roots = append(roots, newRoot) + } + if convertAll { + for i := range val { + rootCreator(val[i]) + } + return roots, nil + } + if len(val) > 0 { + for _, idx := range indices { + if idx > uint64(len(val))-1 { + return nil, fmt.Errorf("index %d greater than number of byte arrays %d", idx, len(val)) + } + rootCreator(val[idx]) + } + } + return roots, nil +} + +// handleValidatorSlice returns the validator indices in a slice of root format. +func handleValidatorSlice(val []*ethpb.Validator, indices []uint64, convertAll bool) ([][32]byte, error) { + length := len(indices) + if convertAll { + length = len(val) + } + roots := make([][32]byte, 0, length) + hasher := hash.CustomSHA256Hasher() + rootCreator := func(input *ethpb.Validator) error { + newRoot, err := stateutil.ValidatorRootWithHasher(hasher, input) + if err != nil { + return err + } + roots = append(roots, newRoot) + return nil + } + if convertAll { + for i := range val { + err := rootCreator(val[i]) + if err != nil { + return nil, err + } + } + return roots, nil + } + if len(val) > 0 { + for _, idx := range indices { + if idx > uint64(len(val))-1 { + return nil, fmt.Errorf("index %d greater than number of validators %d", idx, len(val)) + } + err := rootCreator(val[idx]) + if err != nil { + return nil, err + } + } + } + return roots, nil +} + +// handleEth1DataSlice processes a list of eth1data and indices into the appropriate roots. +func handleEth1DataSlice(val []*ethpb.Eth1Data, indices []uint64, convertAll bool) ([][32]byte, error) { + length := len(indices) + if convertAll { + length = len(val) + } + roots := make([][32]byte, 0, length) + hasher := hash.CustomSHA256Hasher() + rootCreator := func(input *ethpb.Eth1Data) error { + newRoot, err := stateutil.Eth1DataRootWithHasher(hasher, input) + if err != nil { + return err + } + roots = append(roots, newRoot) + return nil + } + if convertAll { + for i := range val { + err := rootCreator(val[i]) + if err != nil { + return nil, err + } + } + return roots, nil + } + if len(val) > 0 { + for _, idx := range indices { + if idx > uint64(len(val))-1 { + return nil, fmt.Errorf("index %d greater than number of items in eth1 data slice %d", idx, len(val)) + } + err := rootCreator(val[idx]) + if err != nil { + return nil, err + } + } + } + return roots, nil +} + +func handlePendingAttestation(val []*ethpb.PendingAttestation, indices []uint64, convertAll bool) ([][32]byte, error) { + length := len(indices) + if convertAll { + length = len(val) + } + roots := make([][32]byte, 0, length) + hasher := hash.CustomSHA256Hasher() + rootCreator := func(input *ethpb.PendingAttestation) error { + newRoot, err := stateutil.PendingAttRootWithHasher(hasher, input) + if err != nil { + return err + } + roots = append(roots, newRoot) + return nil + } + if convertAll { + for i := range val { + err := rootCreator(val[i]) + if err != nil { + return nil, err + } + } + return roots, nil + } + if len(val) > 0 { + for _, idx := range indices { + if idx > uint64(len(val))-1 { + return nil, fmt.Errorf("index %d greater than number of pending attestations %d", idx, len(val)) + } + err := rootCreator(val[idx]) + if err != nil { + return nil, err + } + } + } + return roots, nil +} + +func handleBalanceSlice(val, indices []uint64, convertAll bool) ([][32]byte, error) { + if convertAll { + balancesMarshaling := make([][]byte, 0) + for _, b := range val { + balanceBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(balanceBuf, b) + balancesMarshaling = append(balancesMarshaling, balanceBuf) + } + balancesChunks, err := ssz.PackByChunk(balancesMarshaling) + if err != nil { + return [][32]byte{}, errors.Wrap(err, "could not pack balances into chunks") + } + return balancesChunks, nil + } + if len(val) > 0 { + numOfElems, err := types.Balances.ElemsInChunk() + if err != nil { + return nil, err + } + roots := [][32]byte{} + for _, idx := range indices { + // We split the indexes into their relevant groups. Balances + // are compressed according to 4 values -> 1 chunk. + startIdx := idx / numOfElems + startGroup := startIdx * numOfElems + chunk := [32]byte{} + sizeOfElem := len(chunk) / int(numOfElems) + for i, j := 0, startGroup; j < startGroup+numOfElems; i, j = i+sizeOfElem, j+1 { + wantedVal := uint64(0) + // We are adding chunks in sets of 4, if the set is at the edge of the array + // then you will need to zero out the rest of the chunk. Ex : 41 indexes, + // so 41 % 4 = 1 . There are 3 indexes, which do not exist yet but we + // have to add in as a root. These 3 indexes are then given a 'zero' value. + if int(j) < len(val) { + wantedVal = val[j] + } + binary.LittleEndian.PutUint64(chunk[i:i+sizeOfElem], wantedVal) + } + roots = append(roots, chunk) + } + return roots, nil + } + return [][32]byte{}, nil +} diff --git a/beacon-chain/state-proto/fieldtrie/field_trie_test.go b/beacon-chain/state-proto/fieldtrie/field_trie_test.go new file mode 100644 index 0000000000..e601bffa89 --- /dev/null +++ b/beacon-chain/state-proto/fieldtrie/field_trie_test.go @@ -0,0 +1,79 @@ +package fieldtrie_test + +import ( + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestFieldTrie_NewTrie(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 40) + + // 5 represents the enum value of state roots + trie, err := fieldtrie.NewFieldTrie(5, stateTypes.BasicArray, newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot)) + require.NoError(t, err) + root, err := stateutil.RootsArrayHashTreeRoot(newState.StateRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "StateRoots") + require.NoError(t, err) + newRoot, err := trie.TrieRoot() + require.NoError(t, err) + assert.Equal(t, root, newRoot) +} + +func TestFieldTrie_RecomputeTrie(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + // 10 represents the enum value of validators + trie, err := fieldtrie.NewFieldTrie(11, stateTypes.CompositeArray, newState.Validators(), params.BeaconConfig().ValidatorRegistryLimit) + require.NoError(t, err) + + changedIdx := []uint64{2, 29} + val1, err := newState.ValidatorAtIndex(10) + require.NoError(t, err) + val2, err := newState.ValidatorAtIndex(11) + require.NoError(t, err) + val1.Slashed = true + val1.ExitEpoch = 20 + + val2.Slashed = true + val2.ExitEpoch = 40 + + changedVals := []*ethpb.Validator{val1, val2} + require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[0]), changedVals[0])) + require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[1]), changedVals[1])) + + expectedRoot, err := stateutil.ValidatorRegistryRoot(newState.Validators()) + require.NoError(t, err) + root, err := trie.RecomputeTrie(changedIdx, newState.Validators()) + require.NoError(t, err) + assert.Equal(t, expectedRoot, root) +} + +func TestFieldTrie_CopyTrieImmutable(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + // 12 represents the enum value of randao mixes. + trie, err := fieldtrie.NewFieldTrie(13, stateTypes.BasicArray, newState.RandaoMixes(), uint64(params.BeaconConfig().EpochsPerHistoricalVector)) + require.NoError(t, err) + + newTrie := trie.CopyTrie() + + changedIdx := []uint64{2, 29} + + changedVals := [][32]byte{{'A', 'B'}, {'C', 'D'}} + require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[0], changedVals[0][:])) + require.NoError(t, newState.UpdateRandaoMixesAtIndex(changedIdx[1], changedVals[1][:])) + + root, err := trie.RecomputeTrie(changedIdx, newState.RandaoMixes()) + require.NoError(t, err) + newRoot, err := newTrie.TrieRoot() + require.NoError(t, err) + if root == newRoot { + t.Errorf("Wanted roots to be different, but they are the same: %#x", root) + } +} diff --git a/beacon-chain/state/fieldtrie/helpers_test.go b/beacon-chain/state-proto/fieldtrie/helpers_test.go similarity index 95% rename from beacon-chain/state/fieldtrie/helpers_test.go rename to beacon-chain/state-proto/fieldtrie/helpers_test.go index 54666b872a..19d4c6bcc0 100644 --- a/beacon-chain/state/fieldtrie/helpers_test.go +++ b/beacon-chain/state-proto/fieldtrie/helpers_test.go @@ -5,8 +5,8 @@ import ( "sync" "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - "github.com/prysmaticlabs/prysm/beacon-chain/state/types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/state/genesis/BUILD.bazel b/beacon-chain/state-proto/genesis/BUILD.bazel similarity index 88% rename from beacon-chain/state/genesis/BUILD.bazel rename to beacon-chain/state-proto/genesis/BUILD.bazel index f6ad87381e..278436e6d5 100644 --- a/beacon-chain/state/genesis/BUILD.bazel +++ b/beacon-chain/state-proto/genesis/BUILD.bazel @@ -4,10 +4,10 @@ go_library( name = "go_default_library", srcs = ["genesis.go"], embedsrcs = ["mainnet.ssz.snappy"], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/genesis", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/genesis", visibility = ["//beacon-chain/db:__subpackages__"], deps = [ - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_golang_snappy//:go_default_library", diff --git a/beacon-chain/state/genesis/genesis.go b/beacon-chain/state-proto/genesis/genesis.go similarity index 92% rename from beacon-chain/state/genesis/genesis.go rename to beacon-chain/state-proto/genesis/genesis.go index 3992f27e42..a1b12c9923 100644 --- a/beacon-chain/state/genesis/genesis.go +++ b/beacon-chain/state-proto/genesis/genesis.go @@ -4,7 +4,7 @@ import ( _ "embed" "github.com/golang/snappy" - state "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + state "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/beacon-chain/state/genesis/genesis_test.go b/beacon-chain/state-proto/genesis/genesis_test.go similarity index 89% rename from beacon-chain/state/genesis/genesis_test.go rename to beacon-chain/state-proto/genesis/genesis_test.go index 59f47c2200..7d1b6048e6 100644 --- a/beacon-chain/state/genesis/genesis_test.go +++ b/beacon-chain/state-proto/genesis/genesis_test.go @@ -3,7 +3,7 @@ package genesis_test import ( "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/genesis" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/genesis" "github.com/prysmaticlabs/prysm/config/params" ) diff --git a/beacon-chain/state-proto/genesis/mainnet.ssz.snappy b/beacon-chain/state-proto/genesis/mainnet.ssz.snappy new file mode 100644 index 0000000000000000000000000000000000000000..55d52c320a63abca95a160a521c5f9829e1f618d GIT binary patch literal 1809174 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©i*e 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 ?$Y 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

jBVdD2DVTur^~6 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

r})%cnEkBsV>ohLn|( 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 UF-;^`bPR;thj}Pdp+Ovyk9lfv-~o3 zD<3^l(Yqs3Jt-WgPx` zG`MC}_0`^eeLg|sgs59zwA06jg>19nascfQ6Sm0rTBAHr+{BbZw}aCWKTSzr0Erq2 z1dIsJc@Wfl%;VQz5d|pOVnlI1XeOLZD;lI=Uw9oy6{8jrtvFd?m#03 zA&HVF(HI^@;{FDA0!!6ve%h)Z$Xa?DD2nQxyMgb*QI_)kki%)y|BZmsR^xGJJA0Q2 zWPYTGQq-ftDsi|{uVz9s`-r)pcKtkoKjoTCfM&9)y@B2&KfH3~ylVuTrb()>6b~Tf zf2r=G7~78)ORVV|_A}=AN8*kHMz{7w<56b7==H#qRehNX3-KP(vFP!2OXqqLkWkx2~v|s_-bd*Uv}7+ksDm zO0Kbd-iG`AbY6S&+oYLMWs+3h(|nUGCT55gqBQ8=1y8 zTaFa7(GYO>)y&`4(rWwT$FWJn&)}JYrHz!^+r5+lApJ;Uj~HZrN>6pH9gIUG81m#G z;#CLZEdN{*H*tV*Y3EAf@yBOX#zhG<*tr%s;yD*Yzq%$fAny&cRSoZ!MEm-J9cACR z)zfnUR$}jvI@RY1*G!uZ1Z`YGE(6~xcp>vRj{5OpCz|{Lt7L03(a!9(h@&Oav~{|K zGA5i?>>MZ&KluK8GZw()#DQFOu#RJh9zB&2iKqIres^|#IYO6HFRI^~5e(rf3IHqFX;eQ|z{A9`Ne!Vss@w7egwoByUj11%H?+%3mS(rGr) zi=)`cY>A8t{=LI8Pw;jh`uXFt_))CLd+*02LoUUqA;oO7J`F();RX5J%@Q8Au`rZ& z35mm5efoAE74w$*Eoaou-~Iqs5d!%7k=g))_ZU9K`KPi?7-lEAvaGgm%l=l0AurX9 zOA!cKo3q8Ik{-7lhfJrf$crhB-e^=u--_sxgD||w4?}cxEQ*@OuHE)z`mNslV6#vd z*f#DUfgoIgYbN2o|A}kz2=~#schi*M%skS_VOxCx1ocsjR)eSEQ!vrL@>Zkbn=2?I#bhr#mxs6eFp-Hu`%IG$0lS?FeJO%hq!% z{Rco89y+N9h2bwYhoi6}O!dIt*xM^u{I&m9((wFm_CKF^AV7EbiN|v<1JfZ_Zl7gC zlIJt6Uc681ebglW`hh}169}3d@0DslG{xt9Rv`KqRaebM^oq@_12frkBca|V@^4*W zS*JdYOy&=h6E?tP**^g4hb0X9C5whNc1yLDoZV^~Zu##|vSDa4Q4KbarO`pq`Y;{` zX4+ui5JHN}5woJ!1nCP-{64(tzux0{qCEV0_>|%w+wR`!R}Su=D8IB4Qm+Y=I~P@&8C#?pb^pX>a~E- z(RH{;^whLjulxH|fB2H5XEV7$ZAjbXga9*|bOt(}6?-`=e&$6tEE zb*<{x`5*r3a=`AhZXSR_`Y9?9IabG_5+3UB64M46^oWX z!DbV7UX$x4L8;RrhMh~oXxIDsEOvhCuSDj=js!ard)bWo_STGPlfadAFBs|rcEcJ= zkG@~3VV~5^&i7>3);QX#Zh)~rHn$N{X_qmA1e{43u|_It)T0y}q0cy)G7ghq7SvIG z!VN=D0t%V}E<9Lvb}L#9u|QtsNu24IU#1eZ|(*`+*{{HZ^U+ zusIptV?!_tW@R&*f|1QHO{k~O@#o!R2KX}xmzC8ZEL z(FDCxq(6$->f>~Boe2o)FGle_vVIM!QqbR&vOc&4G6XZGaaEzT4UN@vU49nfCJZhO z>1OJ@BJ$sKa5Vo(OShZt{N-NLH6Ay7kFXAJdk4}-ZuY~bY`C9 zX^UWLkQnVQoy<+VLWA#+(;F4Z0fL5qsvwuf)>a$V_0^u0v>dDRuc`cgg5#|gALLM* zI=Aczz9eRlMIkKRY7BPPBGd(BNepIv=xhOp_7PTunJJZ{K{*3Lr6j zJBO1cYUsbv;uA9UmYIAi4$P5GpH2|9Fqm|}2SKY4{JL{d`VKq)RkYrf?#o=y3uk+) ze4?wnvF>Bje4WB^h7;lbQxU`ekr%$tBl{~p!TJ5~^>nJaLDyRUIAY7!hI3`86BPuZ;<=f{LT2<@ zo#$UYo4`621SO5v!Sq4pVRvVb({z(?h_D1GG~VA`ilDFY)epkQlOJnS5h&O7S};oZppvsAlKR0Ank4}b$tO4V zOHkB(pTn;u=(K7?aDe$Qa*13FD#VsW0Kp*D_LhST8jfxKv_^4>sEu%+6R1t=m9Km1 zFn|T$1r0Z|zQx(ck`0u+z-scgZJL~;c`G;r68H=P2#y&YM@sQJ@Wu@8uFyjAxTloCO&LQ@qK81Zibi&j*P={P~R`p ze9~v-JXOKLBVP)MZ)2V9sy<`19iTH6--ISq?K+indgEiOJEkhqALL8G%Vnc7MULe+ z1wpe%DXTmKp<#3j<7#Z$jSf{&^W*&=d`L2Ip?)=a!~y)ejB~F^NbM>55Xs3R_hdl1 zm)&@IdC_%EkF1^O>CE>^HH-RzEv5MIlLJO5k~I)C%uqs*U#6@*-VE%=jGox0UAh4+ z83G5c+6uFkxh`(wpb$wigGZ39FmsfC7^Khu5GMBM(?S}crcC2?R;PA$aGhR}hKz(* z5Xotv@Ou8f=}iebD_0E({pvmZEnSJlU<-YX+$j356*q0XoV7QAWq1}}`#gOR&Vov> zN~MYA5C)9;ux+x`&>&iG*Jy2%I`9LVs>ZVCNxQf!R54bRFd(JnxOuMK>z9q3qb6Uo zh!O~LD>-wqS3VqdWX>m(jB|G;H7Nb%%t-x!{HrPkGT)yASbqNM=0p4N-AMb3_J~&T z*E)q}%**ZA6t!>MM&?8Bi5g*#&=yUx+n;kM1R3>=`wx~YT|P_bCfb#5T{Vm-Pz5g- zd=pGv*L_v)Zjbw{Zu$s>@%fk8Rgt37s}zra9x3vCZTZ5 zURg9&PEj96^7)HsEywy? z1p^?Zb-I*kgq8E2h>Nz&KgFJ8RvvecoI57RVea$>&B8^hTK4qt-cZ;wX`Zwb2abM1 z0)%jlyrfGp@;~Gp!prSiD2tZ&F;f9!S8kIXIHq4{sXlji`L!(e}U*)EEX7KgDe8HBVKN6!!(~&P=5RIcbiv zFrn3@EZNVkMZ5>V=ehr_X)N(@Rg_LDx@HQ+(93MRd5+coC^|1DRjakiPw0sQq?> zvYRTUC#>^ZG1LUb0z~3vdO?HxmcU*HC&`@a@M`x*hbK+Jx%#7iv8?HJnvW|JPaXiAP61=5vOtZ%|PAdfG;3 z>kigi&~JNL3H!~V$U#Y1XW)r9d894b@mPk|6cJ~IVV?=r!#G7X(-XP&a8UlO52Q4t z;_);{HMD%d_&!j>Y$rZReu!3Qi&5nS&ZA9$upz zLN(oz?zuuex0@Kk`DHbg$e_z!j9gF>YWWV0MIUm)8vJcYp_v+n`{*IftWdCV^(kHq z+T?=7qLGCuJzAGn5?x$JnY)9^`6=)LKqRDhCrrL5FYfTx*hxa2Q-i)a>uIx|LYm0h zz!>5ODgFH*{I9fQts>30d9ajbET6|5=|9o;zsPEgJs5Y5JihPVTiWJOzlWYcz zyKpHCS3Es|{Jej8t_#BaGmMBNRS4io`x=wr*~4B!0GuMY`Ox8MOp3>(%LS$!$tv`x z7~KW3Ra-Cc-QA)02#17U5bW~a@v_EMZs1GagM!(_p!L3-xt8 zSj!g1;4sZ{$j}-}43|3YO3sf!E8WDR)umVm65#AZ=ktn6q-JG3MCFUKnMP#nW1Sn`N#2q^r~EhgR<5d9 zf_ny_iRaYxlYnib#Z3AOcG6#Mcdfq(His?=e;wUxm=)AO10YhGP*v`gz2+H)8&PI| zHpG5UxB;G?Dw{^rI<%Flnc~blY#!_=I({p$emyYv6b5kQW||wg3sBMN2K&8GW)asb z^gVcQKI!WTsfG1~@B0BIA+5!+ho_Y51R9C=FGT0MI}(Ih@Jv;ORd^?1O;yv48Z)hF zH%jfll=&&>M7vlMKpafqnHDuBOsl;as=wI08KqonD!Agvb_;x>GOsonSoq3RlqY_d z{%(gWC1q&*v(}%w8)#M?kbmm}YHzA}^v`RYv(6h0#0oW#qC;%AZz=Y@74zUCpKsm| zeQ`g=cT@&&wC6%eze{oYq2kI@`Au^A_)t93ZCHX`A29?hThGeZgCd^6w_ zDA+i-&-}F^+Z_z9Rj$66{-e9F{h1oAe1Z#bgR!m76+U-ZQ`n&UIr3knCH;@s0ihLp zt?`f?dD6WgXdVnJ`&$PWPC6D5{-VwjCQ+;uaclbaQjg=tZhp|234#EPbQ}MCjVD}} zP5*x95`aD+w!F4vPEFMDm$8&-KsU^=;)s7xc0?rm2yWf>7YJJ0Wl|LO*$2(rq`hKR zS2kg(x9#^ba&$PSDN`yzx?yL317(MDwZ%D^y}w+n2)ZUPNMR)gekmaMd+O+u)~@>O zioFt(Ak_A{TG>!lv$+Ha>J8=N-u&X^j;x(?YJ1lX!*jgOLZ4Dj7PAFyZoF^i;&zs` zvQd-ZD&hYiIZ-GV04(8y2RGC#cHR7bMSIEg2pp26Kwv-}6@t9bd_+oqcgWW~ha6x; zZ^(UNiN?|J>hs5;F3sE+($O8YR8elpAVGZ!{RO0+_Gs}Kx7 zpuUm@Cj7ggJQFO_d%}zuLo*$TCUcA#x}j!?U^XyE|Mo&xb(8mghgi*~tp-DcUlob5 zUTTLOHan_D)i#POTU_3^n`rS=+cj7TMG`8;3X+pXGv-7k(yeeC-}UeD|IvW7gvekCiu>z70FKw)d=)e1$gr&dM#zgs&1>w|2M= zR6q^ry7iyIZtC5XKR4C^=|NKN4qN`;n}y-_*oocLkQ)&<(F*iXZkO5FMjaZi(oSnao#EhhJMVP1pP)9)iJGqFC{NpqlEJ^9V5{MnHn4Bhk_pr!31 z5dzRI)6`9ImCy$Z;;^J`Z0ED=0>J4k#T#Q)(Nhn$^1PGQnuJ30k*A@hK8sPc_IXm=or+ z1-Wg^S)p~e&n&>P1~T1UjT0l-r+CC_xOm`7Zaeea5gd_}KH;2H-^Z0ynNzFwFTHd0 zsrcnR3=Gef!%T0m{d(!#w&3RRsc?(-B3m)-w*H@>uZaem_l@S#fCk~@<;q5R==_F)y- zr~KNNS?9|;X|qJL+uxCTPdUjnPYX{%+kMNl_$oUk+9?cG_%`=qJNNTp9i6smz{*!M zjn2XO1Av&`hIduU3&lD}WRiemw1&FzQFZ|0m)-v;PtrXN))AO%9{j1~0(7FPKyK+4~nQSL|7e(n^9 zznRr&k-%aGa^EMZvoF29lNNEcsim_pT^|$IoXKvvtqGlnCYrk8-a6M%#_sgqBnj;j zi)!;bs)V4Hb>mAp>jLP(%9sCT5XWHFPBe?s2|;#O{RE}Wfg>DMH>JbJIJ^l2=zQ7&Z_HkETMy}#$&(@>*eK>zpTglH+A#&jYSes)&DElD= zp|kbpx2PdA=WTUxOXo&C^OaOmPAJ63IBmJsmvl`Ic%Je@jmkTwb@zWW*4^p>zm1X!nQaOtR#F^(TUsV zkM?e9OlYr{-hx*Dpdr>UM`} zfXzgczbDGFOJYl`*N=ST#rZ4iWMLwNt8QZp1pB)m+aABiac{fgZJH<(wV5N{K>A-l zBbHu~6FYu~uME+#62iX5ij;c<9_f_MjOe=&OHu)-bW5BO+D~R%)0txWqA23-FAiB# z8i`YnI}BwbYd%u{BAkf^?^iXzwGbLYe1k}7pz))X5H2&Ti(Yo5IL}6w?QWoiMO~M1 zK<0Jq>7o4(0K;hx3oBt7p}k310`n!A6_!~9QGzf`mw@R^p@1dJclX1OEmtJ@KqRVd z`FNZkR5>D$J*vX{a391ptcA11r|jinL*FRQwwsIjYa_bDvl;=vs9C*VZl}u>kg;d! ztt|4OlXA=hDB%D?t3M})?>~0Z5f#1jQvd3m$WEFBqP(6943fiDYk)9VVea{TB3KKA5W zKbPwXjN7(_F5XD^kPJFz+8g#rq={-TL5`1$o~Si`{?SNrkG7=UvdMxN-J`?f?v4sAwt#89_4KaDGiU6Q{oq)#1wUEhwYO z+7j$vKW^kgR&YHv$yDWZF(spt$vM$BOAnCKQ(>!>-Kqw+9#lq~BtjRk2k$02=Zre4 zAXQ-i0d8!-Gj96^f$7qoxGzN(N|^Yj(;#RggOu3J1P!NBrWWkf;i#nU~HLEO1`)cT4M&ynM=f z`ibr<&34s9R~YEAd0QC~feU_hA{cHp^N*gg+y|vrxSF>>c*PzW-$nqKm;vfl+*B-m zGL`afZ-aagcc_#Ll-H{kpnnz;y3O86gHoYq7{3>w$Jt`8ZYJ|98MmXYTaWT0yhJRN z25LD#-BJZ68cAxnU)eni!Me3^0!}KcZpiMzXsz4KPhTs>5z>;|#qjLzy$Z|FDGt4} z-bssL_gpZHcKK`p?d_g1dRQerr9SZXsbfmi2edoxLSn{W*-yd!iZ1_{G7lw5i z*L1Lw%=TMm)^ALXfcw_Vtc%Z>nxkD(jYl+00JS@|uLuV)#tu(>n+dt%l)%%@JY8US z)#p+;p*vP{@1zNH5Lk5eo5u(XHP*!HznXv9VP0~Ae}Q<$kv|Quh2?0)g7w+>(~v>R zTvBliQ=b4hxFFRZBGYDbh=~&vUxMpi*OU0SCTh;F98uz(^25H9rXrUWO`iRbp>V#s zB;6y|!=g=n$Z=}gglfN#TXHUNPlD@+Y`mZajz%|F2#@Z^0Juol8iC*rtD(6uDS-aU zbR1vZA->IEsEMbunPS2D*q;U-d5xH*rk3`x1rMw%GP3x3kq-AVLTnrxXpjt11neo2 zfLw`Lx)x5=WbAURok#rtl>KgqCH<==XdD&vR@;@4Ov|~}Qg-(9sbxk>r^b_&>5Oc} z#KuT5DBFa_3>Hg%PxYS&)Vpq4E>x}Um#6u#8x7u|37M+ml`9p+Sap5dyCs(ur?d$8 z3ke5rxZ|y~SIi9#TBhjUPgqe+A<<|fKEkfSjb8_d9Lg#AYhrDvSxPjQZ~u=B<{Vq$ zX@m?HX>wn@J^G|D(XdZg&`^Xb-OsGs*oX!ypdGn0;G>|N8nZKzG|MqxZPuL@&O{*C z!E>4GLC#o&bM7Tuhf|q8%`k!n8(VvUZlUM@U zxU38wh(=jaR0qaBY8&OjuUn89PUOW*B$N6cS^bzrDR*bvr#@;W`Kx{uzvcb?SjfV) z5`d7g8>UF~9s8ez;=2@ODLpw}?NtLpQ|>ayu=7}cFjV79)m2f8JVdo3ud8c->KA18 zE|vTg+`37mNzmj^xy%a{SnF0{DfA73ee6?EV5r0VV}oE$2ee_PfKe0AgFYS}E$*No z7?_H);$x(PjM$?8*GTxtO9kL#Dq{ih5i9q^Wao+7d8ddOGrXC)UQJ)FUp)jlZulLF zAhR45r4aXGWPyLd!VBR_=c|G%pFkAi|t-BbMbBQv{%GF|QN zvccFtW$qR1w{_;Coe=g>yT)+#tiXQ?rOibq;Irb*s^$&dO`%%?*e<=8fy z_yREo`PkEuWM-S_cHca1KKza26Be0nq@ZBm)H7x2+}yl2YC0&(fBy#3!>u34hfcK0 zXYiMe_WD4%vsfq%#8P^G=H?St&+KJTrWYghOkjj|jzNq_e}7W8!#($>s}vLgm+sUY zK<078V?_WBP&e^?qj7}$gq65{PgO%v7k=qK+ZkYp6f{}kZC|m<8?GDiO4f$R5IC6) zbAPB4ANV=6XT|-?(USQ7qmWMQ4(&@ko0of=0ur1DIDlzLNM0056-qPld5W0=q6XX8Uxma$X?iP z8mlmGbl;->(<5(yV z#L6rward8GzaMv2#L?X?-vm70C3e-$c6#&nm-vNH5d?=GVDwB4o!I^Kb&Ioe$njt- znQ$0fst+SuLxT8t_-SNQzBr`4ipxkhQoF@sslgthf$S%3O7(e6i!^Jf!y}w@7R(Yags8Mi%{3>tmt&e$Zr9Rss{ISAC_-T6x?4$>)U-aO zO?#48OhZcB%M2D+BTx=0e^SiK^cxkId-5V12>zCFn5bJTpRI?wiIf@hRq5H*K>bf( zGhfVuHV~94nOjlDpqVk|x4bi0su7HR2E&nqIKDriVkSa^9rRyiQs^MW1^uL49YMk%*^sU}# z3jFBJ)C`hO;Nr!{yiRq*^ZUKpiiY|s1vHPzrJj~X9`z7~C!H`dncpZY$v-{G_s>!U z;Wuza4G~)-B_*+!RX4+BESQ856Vu~VHx}hi$XmNSIW&h5djZQ>{Q&KNoW1)S*9dgW%gHKpFBo@-B zIW4^X8~G|qi`gmxH1d>5Fm@cyhSI*q4FKDAlr;SA{;cph=OG4Ic0&CVmTwOv)^CVg zm$XT>iO;=po!ZmWDP*tZTaDtMr6uZmB+vR6o_QGbcpB$`+YbU+-~-m$umK7?L5oLD zCKu!PCW89s*R78=&%JoU+j+Bcod=#N)0%P=FV5J;4Ec0dwS(xt6&dTQrxNF%b}$5A zSILhE4^c2)UHb{jL4UU?1!hb#T}SPt@41uT+J0>&=m)IaH5DPQ{{0-t`Cr?g8X{FA z173Zg;;UqTMEB{(J;b#XJSl+M>sMq-%BYu>5^&v%M;#C+@;AR$s3 zRQzBViq$iV>C|r{{rPJfHGb__s+EZ-5N3QET05Xn-szA7WqD5{y@H6We?XKaBoJzhd47X zzqyMO|DuPgDA&*tx06A=U0WySpG729Tq4tk4EUG)lL&twk%gQpc~iB0wt?0w!!@#r z4gGB1STjSj3#`L25dmS3d9{1{tcmlkebz~>9IRf?wV$x2s0oztLj}>@R2vq5TE~T2 zJG1+5Hn7w_Td3#3!kwK=PXg}zKtF@l?W-lQlDs`XVM!d1gre9*xl3QtCX1)w9>f=u zR+|I!qo6Un*D6UI<|*byglB>sz%9iPxY?v2O+H|)O{#Tc$3{Sbnj!+o`K-3cukUh0L~-jb*Psc)0(qqJ5K<4qIO3dnn$^e2}%(H1+o z$FmmJ$bY$%NCw;b!Vaw$!93?0LpD|w|CTPV+50vG;y%=x?Z!kj!w>w-ji5j;Dv=8qqGa$fu2lc zE!+#SSG&NPF0*ntB2c-1{oHXpUC0-*Iq3BqUaKjwM+11<0b<(eX#=_KK$a5Zx!U~$ zBhfj>X_7-w6qsfO&W}QxI)Dz9g5O;7_2|a>$~7~wZvgb-zgiS2qGEh%>!T0TA=zjb zMH#W=W0|G>8dAj*w==}+I%ozRrHV8HL`twj%nM`dy-oj>=ZHORGfd6Zt-mx#@DHLj za#@1Ef50VB4l~^CKBpBf-Y9f3Jp7J?3Nj_|+Y!>3kLfe`<>mCQ?FO?>(&>?fZD*J@ z*Wg$e_ueMZMzTt#Ys)0z@mcqsAdcy+R)3Dw&MZLQq+rRVV0%i8p0Cj0RMbjrsv>#u(q{kn}%c;}^!(lV%4q*w(T4>F*7{s}<;Zxh)XBajt5QO8EGJcV6% z6iud!w{rJWwFT4xLkIh9m*t|Dhr^lh2%u%)l1VAv6Y=!XRwIKWycJU%wmrCjmaf;6 z_G17t8SVC_2#>=o@z0Vc*#z0N2G#&JPHAG?=X{v_?$2-(sZPA5IvOu&cOhpz`w1_( zq13%p<)X;lu+mdo$Qcq)M?}fo;V=g^l)%H48f!LvPP3>V`9f8-oOS+tY~RSRh9ydZ zy6D00UUq{jxU>k|u)o)#9{mP4nYh#CAXY0{_9y*>rGR$?6?>LxTlUaf@{+TUg00{* zG%}$-A-1Qd`n6Rkf>Y-Iwz70($QK6>99-`o|AbXiiB`eLynyezBrULd0>#xBT`N&v zZ&Vl<#^=}e2S|~18>8b%V$QArL(L`#)n|ReO7CC=z#7eEdHN??{7|Xm!(_ymH?VC_ z0;<1ea=3O|Z>RPt0Z6`4HFutAloP5_e!?0q2OqyAJ&KL9cBT_^I>cNdaZ4dr6585e z@(@b+T#-=y%PM34du!TGbr^f8*lPa?OBG5qDv2q!{A)F(EnWpYX~xLskEF+ZSCXI~ zY9j2ufimg>!x#uY^V3hxlo80F{u9=yLA0-s#WPE^eRlVTZzF<^z`@fi$)-JC9~d~N zhxps3^h_Qlh=sGRLd=_kNZ0NYR@0_Do{Qsg4`lvT6QxE>-}}lVyuPxd>)ApKY5ZF~ zRihkJZxuV2rE@5Q6O$n3XStr%=(Qph3^P8Q1p1WPj7WoB=SE$<4I4Y=quc{~>IcvU zsV)!3zGA=jj^53NN6Ndm3Ig&9g4Q%7YZvNijSWO!=3Sl8MEtQ%sM{*lu67$P=@$5n zSt$&+R$p5~>f^J~`$7b-pP%Z=={m9g_U!U=kw4ju1*;Vx?-J++ zV&{=vBS_%eJxTIT6wNDxKjm}dj4>*|tMlPC|C(1e^&nyF*tAO7aZBI;iV46O!AzsJ zDEmJ0+_|Z}dk%@D54qM?zO_`!xNqwqN)?OZ@npuaspc;j3UWNziQH)qdV(J zEcfpyx(rQjh^~f||Le6P)|cj(XiA&dDSey0Z(LLIOE}oM3KPn;ABeL|kjHnp-J851M_B9#nqJkELi4Z|zUr2`i$!8Cr*bYZMIwV3F z_Ky02G`RHqxr)@OVqGUy8g~6ud8))>R-AafE+t9(lKndv{^W*xPuIBKG10J3)Z)~L zT?yxWR_tRHX~i~)Ut8Yh!|Q(h0XXIlQ^{!6(MDtDuic84#!yu&+9BI8BU0kFnUuu? z#e*dOCnEp;+gmX10c@2;Gn3CA(iHKBZjozfd+3M0iLIn4+j-34-yoGIdD*G7w$-zW zaYK=#((}(K<_XDFL<7ea;*zE09?_jH9WkjMKhiS1j1tc(x}ReCfQ@qQW7DRCIln&X zRXGZZe!}9K2t6O6g-9uti|vqz_&Ohyb#k?NoU*?9$`N}PY>2HMA&r%9j~VX(MUd9N z;4gf_LPs!tYl()e1n6wH>=up$!SXDJhO6CyL@+tN$|PLa3;C^OkdX+me=%K9ZkUJp zSDWB{|5CEQSdT+6wYFQ}%;a4i8cFdAX->UVH%9YZem$&b<0<{%X-}KJD-uuYNIsM_ zSMdRB&Eu%4l*UsGAW?_ZL)2!Y_6}Wu)`GNhRo|;1&qu<53vkP7Bgg!rElw5m=g#Nl ztrD!QvM10P%I$`6beBx|NG;76YnOo{MC(gybl$-ClPF*U5VCNxy_$y+x8H+U#A22E zsuQ2#FHT00^|c*TWP@5!7^eS=W^mfG2n|Vtjtx?8fn-S7$CeVdO`*1hXXh)N>nI2G zPr3X3n5S^%OIONo0_PJYzINluP15O#p3%MJ-p&j>XHE95qKp9SC#wT(4ErD1cU`~T zrQiC<$@|EAnjnrFeS&IgMC~mkWYf4{CVUzzesBvm`AT+#g1nNuNFmAC)Ib;$JjZ0$ zBl}m|e%e^iM`j|7hifye#7w|VWI&Sh6$jCF3_LxY8) zCi=@~^jir#=2b}>ObEZgIxr2kiJZ%q*^MWpn_YD7sx_{r{rD}Nnr{P-V$)=nB_CIw zqWS4s!d`1#n&1MH_kc2n!GtsGsGRG}cf&K~DBSq6Z8lqtQ`9*|Vl=f`H96r;`1AV@ z&HB~^f!r#(k-E;@?b%;F*!*ZP>oetU)P0Wt+ormMu5*o0`GdpE3DJP zcc1HA?XQcs+xla-t;M10mfdrWsJw#Tw5ky~4K{13t4SkSI6*D)I0Hi zMGf9NEf*ujBtpk6l@6mqg1*##uJdSgKS7zW_Z}hr|qS}YAac(af9 z%>swq0;eY(XbK$y;_m{1+7pc4cvB)7{=p%Du_);XZBr0LCFyz9GS&_tmHtQO+`(US7k;cSADnqtW&vHZnpe0X1h zSN`c(L*yB#_l(zWJ)|lJr6}xXa`&3qT64y|LTCn^Yw;Q}W+9o^<_cNb(aX(akDl2Z zB@;O%Q){?Uz_9W1lLp530xtHNG9_Uh%NfTyadyYIE#{k^ZaiWw$H?}yZLZd!w{Dvq z+&6S0@_!`?V*~A=_-{b4hr68U(`OPzbb$B!GPZKypG@$EVc5Q0QY1lR6>UXjKdV2H z4|edsaZ^xpQ?#CZi-r4+G=R+11VyI zdooCPN^n^BzbX{kzzW(uNx?rCDu6AhFT9;he!n0+vGFCt$SCD1BcQ57O-0i*sf?Mg zuq4&(ob386>IN%(7TD-1sLs!?sagI8=PUA1MH2Lv%S=i4flFDADS@G^amMDp2+&b& z_FV!u{AnFMh9g z^9<9{sGbn@F%+3kSZ?%g5~e7!J})z<#kHR$YJE?l=hC%1YxNH8&T<8ku8}JY^Omk9 z1~@gpXIJLYe@A3&P2B2T002_$=Kt6%i+Xt&9ELgTb?#8t85aHfm35=n~XWO~g|>F^@TNmPt9 zB$aeh>Hb#muhi80XE$BAZ5#duAzZ7p70kR{V`sBoHWe828P}CfnqvN17fUBE_J$>c zCVLftq!AMIyXZ3_iSYM`+h&?!!mnln$kV+7TP4v9CKy$oECu`J8y;n>9mA{C>4Ll2 zQZ%`%g+}C`OL1%1&7k3L?^}2N(E^sKs-GGfgdQ*KMU{>d4M(wI7;6@e+7_hsLuB`P z^L|Yo_Nt$&W1KZBMcl@0S$?5cmjX7WCsX~&cg;)lK$AbA?rQ9fqtf3ZayCN7Ed^-Y zv>*|_Iexg->W?sDB{eGc?b*-67RRe^6vsLVdCj&mO> zmd@qu&7itl-|mpe?~q#aXxD$7iwW4t&h%crS}$wYty2G0vX1ZHQ-HRYK`JfC(J@8f zYipXrqXL2)cdvb;qa>%JypStLE#Z;ssfgS(vc51^E|g825h5hphsj%vDCLYe38H)U zp#4d+MjI2?kS1Tu4O0mi`;GnjdLm~>$*MYvxfu253J!YLJ%Es$cN~Ws`aU#2lj}mR zgf~WE70uAS{oZeGi@^d)i+lkyI#eeU5Mlf+N*BLp9r^}-*0@83>Ap~n_S>2;07f`m zv}ufx^>jnPu_fnE#!u5P(pz9(+9GonWgEjW;I8RxA4 zYtDAt5qteFTcsyml&b=@KuxuR!wVTa8RD&M`K;=Q@PK>ZSr#}Is$ZV@BAKPUNBZkO z^=@&qGSbhBjtjYnA0DHwoVO3uW{9F4tvn$|3Qcs)6#QzC_21b5OpC>3(_av6O~>PH z^2s26a~%)@U}sJ5_kB{OdREfSm5$Fql>e4$5l_WpsyOoMJqBjK%Xk)x>muA??HFj~ zwZapB8@y*DNP!~O8uYubhOE8k7x&}}D5}@NWtib}y9&3MR&E0nim(mo{B#PdBSO4w zUU(I4L?=J>`c6~)N9t*Z%I@|(Y6X^Z`S2}E=z~k)MOZ%fNqR4eQ~@FVctWF0IV}5N zwK_$hd04_V&wK0Uv_wD&+5i&t{(MiUy9>kg)9XgQf;GtC=Sn8-y;5Q@L$dM;2rCQ{9qxAq(WeFDm= zNK9ox6|vV`Gks(-$@G27keW2rQ_5-=N%9|$vKyN%x_)WNlw387K!et3+>8Ib^ponr z7;ojunQMD7<;Fe@0HN?P`(nOzLBqE1Z2*XHPb*2-byRlHYnN*e9y>W$WF*58ZrPH@=3FQCU^H1z3bit&aykm6$gaTS4mc!Iu(K+r5yHW=keOg)@r9!B?glp2fB3=(Op6 zP2Ppt1jzR7d8uhOfXx~9>iZ$7xb_Su71ZNw(1H2eS!fCOYM3%Gdu6{5Ij_>)d|XF9 zh-VQqG-#yMxUZGe92H^N$-`N}^Mtj=@Ibcxs0}8OodL46Fo}~ey50bCS>TR8>h(G_ zplW5z;K`XBjR4HUr(n$v!yH>1&sD_I!*3jd$s8aMaT7>OLj$0Um4F5j*~;O4W_Qz zzQ;7ZU4f`+d*6L+QNF+kh<9c$yZ{z4T<#*$plo!*1j{B_eMwJyf~<*Zka) zbD>Kt-YhecDnGN3=UCKn`(~aJXz5wl5ajSLD8L*h!mC+$8Ie_bLIO~bAgPH3q`?9Z z;}>)7TyQ3$kF>F7tk^=VY+*&?Z91`$Qbov6AtD@-VVd$^BceYFe*N{)dZi!k&#$jU zoaF!NU%(pxi1K)Sbb|}>R|}(fFs4k2f<`quOp8p*a;>7!G<*Vjw={1!Y6BfR14P|Z zGpMFdTf+1l3+^k+#$&Dwi?)6zC%CM8jt z$l~lQ8IgIIexBj$f}|z{0C)C5dJ%`ns2WUlkDRefgg2MarT*agOlXkZ1K)M>owPdF z8a2apOmT9Y!MR(>v)d=K3pn7-yl6PDM&*`Y@23&^Zc)pz6S;mO_OSbz00e3*t&&;PaHMFr|Moq{Mb_+ofrk5Ag1J$H+4TB$h_wR6+0ZF z-6O;@0V)y!9-&uM(oZXi%9uQ;g?mE4fsb=^D7Yro?i07*{k+mi7^RwA(AbK>(@8N( zv%&bgr8TetQA?PR=|bj1K=%vfk6J6TLAGUIYMrav7c32 z{Q&4=FPnuYU)(wQsvV4xW=H(wC^v-Y4OP?*@B~1dKisc7kQ?ZI5xqU*_02TERips6 z1HY&?mLuWm9k=R9@tSFC^OGRNn`}}>S3n$f8~Xv^QRp5up@nN^fzoB>zs&9^I2FX8 zfB0TOHVVd)y8i3k(&B-FWurT^E#=|E^W(I%h^~Q1kRzVpA1NItI%2@e_ls{`^1bd~ zb%)V(Ah38gulC-9>HAwV_6KsYgXUP?wb_UuUhkxZ9(?o3)*~Jc zS0MF3qJOGZv6d--V|<0DvF(KnrqLjU@U6aUJtX5{K#}Us;XIlG1mThUifvM(pl1eL z5>#dNAP{U8FVx2#gEdnk=psI5R0LC-S<|@1mH5Fu%>2xy8_Es7s5G0ghaW0f38l_p4^ROjewSZIHF#Ek@oR#;|53DK39E zO+M&1#ArkUz;OvT$;HMmQ}kebO)1M3>;b^8mh>&K&ewIZZ%s#=zP;*{!cAX&_g_13 zZ5}~1KST!;;IM1~Y?t7TEI5{2R%P7w*%;i?z6$NRi^+0KT5uAUS5}yLy-NAtSp1qA|c6V zwV~+{{d%j#<(0fI#Q5)|CE?g?K%~u^)qmbZm&KD4;sX0d;tG{CRu0cNU+n~t$%2B7 zV_D0y49 z<%w;{@PEU1N0?l&c>*UD)$w1H4=zvt=^_m*dkJ?GpwR4ynPbS}X9WNof0;%xCp5c_ z)f}Zd&YyA76QEXPM~>wCgF1Hj%>Cj1@4uRbpb!P45aJ$_2BWle2f5}Dofju)wG-(@ zzn2Jq-2a)Xw!Eni4Jnq0&1iiFkUq-;*`NmA)b57-Cni3@pSccs`4E~#gJ4E? z!Q620I%RLpj6Y_nh#XSUR$v!xZwxgLkt1~um^I=FJXrlLtIlQIOA;MxEh{@|c2T+{OpV_@mg4 zf!AUxX-R-afb1eCMiaPa+7JGx5Lsq24`d8$mU;f%IEi^rms-wTz96_$e1| z4gSzS?J}puEVL_M^DR@ycdP6C&f+2B6%MbODlM$ra}wzf0f{z!Wx&Ffqqb#(J>s>N zTNyT8tT^yGDf<#*t~C74@0Nzss8(8*vxyTd2YAi3JgRvRWWA+2P*|z^6&HlKUJ0N} z_K0Zud!GbCq|Z@F_ALXnRMNkf_5KxLr*skYm#>5@pHP`Hj$S%%_TOS%w zG&rIUH>a7f{_xx6pXrae^;o6&zt5K>M&xTLP*@-K{imlN5VBvznuW~86{M!Y^$`sG)dC!yFM8|9ULPQ~W9Ws`tLbzAp8%SYcA4}n}L zs;2|1IuH&q^39A>O^u*>HVL_M>TnPIS`jD?N7Ag7O6S?M-*g-p2X+Oq>f{CiG~5(h zq%&eZ4}LLXHA7A}MOuJJLuq_KlqdqhfOBmB-xIrp1epuDFj|*wwY#vVGnrTCBL~7+ z1S|s5MLVNEI=eRO8a-W*5B~%$=Av^J_1*U=Gx@7T01P``dCs(Mc^vonAOtc!{SM#x zs6#6dI~xL+T0z%g-+$&(d2!I0Tcxl~DssLinlmhDV-S_f#8gp}T{=uzauO-$Q;{W0 zff)tGgzR>m!my+mTAvxzAGh-4XO$AZl-L9^`G_Crdrot_x=v zf|zK?o5wZc&w6-zkIP>1)i4l4NR~K+Wyeu9n+>sQ)UQck8vxIo0agI;Hn|mQEQ&Bg zwRDr#`Wje8A_kB^cWMBTxj=nb`G-bbuJ$b8MKI42W2MU>sAq(;eA+#4!-?Rj=l5+u z?dbSMZ0GHQ{BbG$57TtVA#&V&z*Aom-c$Z2t*-X3`UF;^SSVZpzwJjNpS_&wS%a|q1v{rBg9DDK2XjZLDTwHHw-Jt#yWj6v0 zcIe?kDKBpip>cpS5N37a?+wdSgMa)fCd;sr_4<>gzxI7}=_@ zB?FCU@y5d-BN}L@p+&XsBB05H9Ja)6%K}wF24G8NP;Rk-6smP}E9;n+3*LhJ4R?$fsbE;%#YRc4Jpr=mP^CO-`%e+((9hgK66R%QpN-NdTGiF`U(Fx@eDl^_m-B zRX4>zZRIPwY|;vY`E4kFoxhW&iid1n9g2-n32Zd^qC7>kDj;o(iKm8R_NegajY}o# z5O(bl^+wkN%1lJ7CqpEQlba*r(XPpvGJ?c;HbRVB;4%1q?6rM#RO=#1 z27Z!SeL|mtV;*2ClnI&r%;q4?qD5lwm9nh6bz}XHbVx6Ce))YjUxTw*C?HTE3weUl zoj;$cM5Y#G-W;cnW8i_VB^Sx+2K_)K=-pC(8Z=8rr>2TUO(^5U4ScBv2;FdTKNs9h zF%Z!-)Pue^DRv&GaDDpxIW1KClRI`mmsf-V!Km}rW$v{Rs3oJAp;#Ak|Et|P1q?Sp z0ZQ|oG;f>PjhK2LA_l31@LqAva>x-RGLFf9BSqZT$X#1V2&w3fW`+$zb?D@FafgsS z5TM3Fa9nh(b0I;tEtc8uq$$B_-H2+Ur>Bs;xPxGF1~NkE0vveAy-C#LFJ9-PzYLQg>S)I- zDXjfAVm3MDy8sb7O8JAyiwnK=n)61Y1Yv(@3&;e{JjF;qbR=tzP zq^B6-o?oqiMUrJOr#BTS?s>2f3MAA`hRe>8MU1(p3WVw$md zM>c*WCe*v75ys8k{VgeFsLC_!RxgYzC5BpJ-C^`3J*U2O`H^#^L9NjG0})*>E7cx~ zdD~o>fY&+L>&w=C(5~t9=MyjM>0A+)%p7_81>u%tuEZymchbD}=2fG!qo11V&No*; zttk7ylxuVPJ&|bbXQL@5Q!nkH<(Uu_79R<=bnQ3_`S1Xn8pQ*EEIJtax)Kr+t3!FrTdoD3d>Hy$ zR>I`&S8VDXzPfb~$yfh}GnF3?jDQeq`=_XCR-Zad6^Gd3vRUG(S>s`DMkkq{l>M1X zt?#5M8$;vRJOtT)W*xmLq#X<@aZ)RO@n&;Ut{f-Nu@Y@jQJT2jl`ePNY$TO%$SNJ78$^Y-6-C#`Tj+q4`O?;?qWzngjF4|d5= z6C)<+{FxF;6foQEY+MRjLay1>0fvLn2!dz6X95U93DFY}G)hG+;3Au>;M#U$CMeO{YY9Zp8{lP@w(%g3VDqzpA#?KG>9IobZD+xa5Dx!P}2w4+Z8V`XwoV` z3=iDUZUf-{RSATt;xaaPL2^iVqBC460CKxvsV(#j4I@wJwT=8(rJB~>N@svF#O|5Y zBwu4Z?_U4T7$h7O>&LAti0>uUmy(b{FFNQ#^fR&&Kr1T{w&s7(zqmt1#F<|3eG`fdeUSP)2eRQ+XVP}Z9m%@vQ6AiNYly>X4RM0NMEEkyEO*l!d{?KM7U!Qo)xpkAZRr@Uh-*4t2dpFK%oI@ z=HLK|elq7SH-yU-h{RiO8PeN*P7t#GrgH@E4A61g{g3q8w(N3qGJm$6(7}XqmTN&D zInOFfW|-+mba4k?3CH$&<5$by!e@J0#U&15CQ8r#01%s}a|c6NqqjfMikuF%R8;ER zPk*l!Up(@|(#H)y+>b~r`PM9aFF6KTe%aqVS&kyuKF=+Jt=XmmZ zZff>bzIagPmKea0M8wH*a!u;W@)Kp?`CLO|TP_@o{kg)iFg~(V-6;Ncrw98!nKygaE|^Dgrnbn{f#)BWclaLHH7q8E{2SDQ{D>Un5zTf7 zdb`){=Y$1;IJ=z5c4hN?aZo8lKDHMwWv7K5Z& zxDV>@JL$NeVu!o0H*9lOeEX-O5z8l3vU?bRXIL3qTv(@GO`Lod3M_lKCAIanJ<9*$ zVT}Pq>jpUS@gMtYEi9j7AW0BALM>=?A08j7W=ngslU(12ROA4(Q=2!GJ(J)m4;DWD zjJfsb3+dPsLSu$C45U8gl0w({{bhFLcG0Tkx1o?6U;ss9t&=L4{W&y0FMbd7Mu>y< zF8zLCQ6uuV?N}p-gLl%x>%=J%+g~ejH-S`oJ=YIynNo7B$czxsX_6X(uU)-6T-}1pC;);&tS?Kt0!TKv8xb>6H3iVE&V0hk9h5TEmA}MVpKT9VFK5 zl)I^H6y)WyhFO*T5vxB-cdrjI`(5YRLt_QTmWs-nj~X)OVN9%-76AAtz(qXM0AJW3 z>b{OQz{e`jKXUpvB57HZ&3kKr}LdOfkZ{NtCU`$MN$F&++!#2k@~V7 z0#z)ma2!`q?#IA$hwir5`W$Y~YGK!lEWld}UW&yj9 z3kd&qm^aBRp=Z3;1yby^G9br$!jss?$qv908`!q2V1N7x^}OG}N{ptIR4p{k0`Pa1 zu22?)nvi?TdX|{U%;KS^ack!ixHT94^=nI*>3y2Ulnru+!kGq8;k=k(jMvr0V^(Wt z9wQ>sO()HXmpo&N229ezR&x1SHBq_$h&4zA1f$y3E!5H|3k{=|{KzN`mP^9&1!nr@ zuk6Ec#IpnX9@8Y%v+JDG@6WMenoQo=k$|Uqv4Q!Vhpa!0Wdn{|5J>{~Pc$!_H2w@~ zZ+#3LE?Iz3RxC>68n_F4jU$wtg!aTGLfpc>V88jn+^?~*Jip&b^NuWa?^1T-Ly*1h z*1PfbRkv+<_f>YL25WYf;bI2vCG)4D3w~_pGS}_7qH;%PND7Zo7#z$0+!ljn5j%nd)1#)KxqOPeQ@i zrVu)!j0%ap&8QW0+faZVk}O17s@TDzMoxXS?-n&O*>Y<^swEk(Tm__U%^$y!^+>B5 z%Je8d4UlZ=I$<>V{_6Xv9uvxql+Ov(@DgoE>8|B{QL(c}W)i+4^xuJ3B|ChIta5$;Y2@^4t$^K6=@S`T>>{k+>H zc~}K0VnQpx@Z+B`o%w`05hE3^n_mIhnqP?B!7UWeRm(W|kj_`hMA=ciVM;fr=6p4c zbNAk3n)adywFb;PI#bER`2*3UyncmU1x3E*O;5{8D_a6a5ll&jT&apA9rfb_fc4ON%8k>!c#o>}Yj!~TQPD>QzGd=?@yiNt-3FqXDmztT>q{pdE-IR~fajvC>m>X+=-t%E^D z`7n$ejd10xa}Z#s`YdvGVGz6h23IQA0Q_e0xcVfhw8%)Kxly}6=q&=qx43Z*BP}KH zjgmjSnLZ!15W+0)6uZLeZUbJpqmZkL7=3PHJV%-xI##(Yx0C4NfHKoKD`lSX#ZNfP z{bcQ8#~*8HdKt0eYJ|?&Hf_Fjyn0#<)$x6!&=`3aPgu#&FxA9SNss$Cl^!AwPA>JY z{N4LG_L&gjEYr>w@ug@#W2i>Jn(%a0E;6$+%yw;L4efLgwQXhvE80Akqq_emJfY(& zwA@&Ay#?i_Z;Zt-SCvdmdRdx_D#lc^W1zFA*v3EM0f89_F;()}bc_`$TyZoR3xNA$ zm}BC@pcd=%=Uc($sDN+{2hIGJ5UD6#$>!;2=-02*0Zw=&*q#*9kSBhy zUY?w_Vxn0fBLnhOKCn%P5L`%WFDI5=u-U3?`W{(BxkY8Y@~(i4zP;QnaLp?q!T-pg zN$Z-_z;4yP1ZY}l(Dz`h2fyk135FVNico8huW6wCTZl#Q`1#QE=JhL8H@kfC(`*QG zId+lhha4VAObqM;MTUx?HwS4qWH*zi-Kz6}h*+7Qbxd@x%keM5?ReXc`C1=Z9%o zN(OJi3T}kzm+&QlkIGgYCp1YBM#&qKJLyHa!)^duThin=tUu_V3dwk*Wu9l5TA0{o zk-`8`Pp9xpskbf_S{f<#JMR9|zmS3}q5K|ex-X)Mg!^X)TxBU^PKr(vQS<0alKQ@= za}Iy`=CbYp0J^6Aqq#!yx^-70)}=p_!rWJ+2a8-xX3?m;@M#0Y*M6FZtB|g2xFkvG z0*Wob{?yyo8a|@%V|rL!QJftnU0Hm$p=AT~rS|s#FNzFM4zm_Jga&!#Ym#)O!;G`X{oX zmbtqTd>*1`*MOI51E_x&43J6sIsc@SO_p|r`d+BmKK;2d?AmNBKV_O9|BppL(JQoq z_m8Vi1q>8W-tSSY;XLb@jkLS-BUtEQXC3+{65(d%geg>w2muI|>(X9@{nkA2$u-if zl*NCYKINpJT1a%?v&JTrOP^rsMEUmDRod7qG|T4%0R?vjPfdJ!J~^@_5T{Q@HNIaM z6=k*=VzHcpcpFNBx}7V5S}a{z%b5hr1~B`@e~DFI00~jCbQV-6_~V#-^-pS@zNWN` z2>852&?~eNIlxz^slIA5>7%3JCM?mHww&rjc;A$viO;_ubcRM7D;kOizqqUmi4yZG z#5C3e1^*(Imq_Y^N2K@vvVX2r42#D=3YLJy`H@CMq?Bs#3XQ!wW0&Eyq3bdl=|rTZ zg0`1C6;4NFKoM?Z zeGj=>J7rrW)4m9{lYNCIbKy@2t2P49X=#L^UJ-&cW&!kmQ7s!%^Ekyrtl$Mb(;qPd zTbU`uuTXXBB!=ez<)dytCDu*?%Bth0Oxfo^d&aq(F$VLPB-Stn0YSG{s6Qp87LBh{ z1)3zX{WJ6B^pakiEgl|3XR%vxA~B)W>%jG$Cg;QX=xFr#YDJzQ?8|Z0RZ`7 z{a-|4rXbJcs$-uMekD3_#wEV`zc3UI8`{5&QC>Z5(iZ{Zj}d2X7CQ4#KHoY^N6|>3 z>v-6w$?HY*3kzWee#6;oun=3AC@UmTJu@!=no?3mIgSZhwR&EH@hapcN;Kg+CA&Ir zg%W$giW}x$q51sto@mF)nAKeNx54J9-#rZ4n~XS9*oUaem>hR^nw0Nz>n} z!U#pHou@+BIZ_CjD$$(fvh6UrVnZ3>t>LRZdyYY&gLgy&iqCiOWAOz^eS@meertlb z;2K9!@EL#amr=RnZuyh`3a#SCNVgU{*o%=Zz+5t0h3CG*<#)|a2X=D^R*9qfTG8{X zt=%ZfYxg(^uLsfyuL04ccG|%!+U!|$XZ73PFN#tOjL2@i1`~~hVG2t%Z*h9E<<`W8 zf4FJHgy#{ZqDF>X36kHf)oE^Ou;YLDRYkm&8N|RIAaa;4z$+|h5~bk^6izYr+?qX@ z0m+1aR>3)m12uxKi#hd1@UQJB+xU}TJ*;|bJJhXfZC9lVr#@H9cf8K9gtx6xTVq4W)#|bbIUjaeb_RBw+O(|2!H`SAvRQ~p2Z3Bw=EhPJ-l%% zI5+gF*!>IpAomI_-xMwLEJofzTFRWWI#`RVssHfj#5F*iJjZnFEDY-26;%w9_>8Vy zw{>4erCdfEm_RhD%YwLKaV55;^RcWjrkKgqu~7R_i8o_k1d+Y=3N5Ni*3@M!1@5Bt z5hwhRkT^e&6->umphJHI3{~`m`{NKOo&nd}A%g#q zTzv+yllw^cxGgS=QIM_e1HsuWbpb{!yKx6If*6$ZH!a02XyA}=Oe~SXavWIrbxqtN ze_C}KPyqgmCbdk5&kD1uBIN`rYIVKV?(L*EPQ&E4pL+O3Rq4yEc2g~hE30O*xFf=) z@*uVzYRR=CR?c+r3J*ErXE4ZIbI!|XfIs6}7e!c8f6EsaBv!diB7o39%@gsHjdTcz z${c|& zR)S2GT9v0t2s~=9wsy+_I;>5!tyQ^5`FtKP9UacZCm^Fi+#tH`(Rz5s8Df2gVV}9g zPq^A>`&12G+6*T-?G;)@%?~o8C1hB0A!8KH=eG%hm5M-;w%c(Yk1HaH{+D@}aLCsV zk_oh99N2Ig9)tAcB^x_<#$3!z`Nt(@XgZO~mbBZ8t1) zr>&W09_cn}Rq}7=QddT>jg3q+&3&5PTPxd?UNqG_9X1UG?adqb4D@FP&kwo#gJOkJ zQuw3>`(cfBIrJZe4GTRb$Zyuvyh2MA&ju>ibAEdlYL<9KkQmNIsg8}BEyOsxltfPH z^!J;wkMox8!-1%4)tcrj z)Gt)eXYs;op9(}m)^OHjk72lEyzbHRQqGv~&w@HUM_~jUL)x~{mKeR)epb^T9iZD^ zsBf(okFBZP4n<6EtpzEwaCyP=%x#<)e$MGYqHgr&V|w# zDGvM#A6l?2P8S)pKv$dk$ZI%_n#VSEf+94)&tmhqdV$J7)+!6{x2kX>Dk_S9Km?ml z;h_eXHs{*{E!zklY@f54jd}`7_$2zb&6+ul3nc(0wL9~1z8{M~ur(59o7SS<`dB^j z=6HoF49Mf!Y=`oSDq$twp)i8XBt*#&PRRWstQx_^4b3(s-NT4SD%3kqEfVJ8khzheDcp;-7d89-3VqH;(D7V|Er zL*cGjzc49oEL2H0l$!*;Li1apsQ4hL8Q7noq+hm;Fb_3J)lUVj${R>Y5JUv}L7?$O zG~~E33IF)#P?1k@;sdeG&vKRCHn~=49HokzqI^c#o3txI4B4xaBMGrAZy)JzHS!UR zNw9GGvdi6Oyz!x1NQz=rS-X)T=eB*LTWzO`SF!N$$%&(?inkQ93&aILth)1bf4^MD z{hcUVRl)7IW*qN`$_~*|?~aBl=8m^6m4I>@vLo+bc+MHJtdTkua^JCIDe?DS$*_g6 zXMD5yVvUBN{%pcShq@qny7s8@JHY;{T5M166W+Yug;=%jlrAM#Q$WdWzsA7z*=)mA z*=zB0i?yep$DOGKx==5pH`b+G>aB)4IIl$3*!bg;!copxj7d`sdxQkwlm#A3f5Z6z zsExDN{e1IDVJIu{*nx>ir7%#jbUUlf6;1=6M*J~fq1j`DQ(uCMp%hni!_+U}|G5z@SbKE%WdIhcf19FH*u4t{p{3<6dA|K%i7#^R z?c9sLtfKV(h5rf->~2y1#JX?_cYQUGnc3{r6ov6?M0{{I%2N`)`cjQ{H>W5fgj#z* zwGCtaCtjT(P`YFRHQZR1;+6$|!nu~-{oHWkq4zy|U8pQH-r?lM#pkie3<~ zO9pwtg1VtPT58*M^>m$WXPQ?}>!i^Ik4LqclF=UKJV--FXvEGbunuK5=OPdir@k=u zI_5&1gk>hcmYyYZ_rj+b0@LS_5(`nshMUr+WbgzE1s+9nNAg>XtyWoJht(}_6JP9Y zhL})SI}7_#;8y&1N+KgpuQOjigVW4UXVU>sfGKLl%l}Fp}=P} zEXf|K)%2hBBv_W-tg%19%O4fQs20~)49s6Wjq{oQMsf!QK0K_JT1EadE+o)LsM_T= zC96msAiPI5rTxOdk2o=$v;$2!Iz6d-1zd8s)L@8wCID=G<*g!bsdc!_e2YKvrGDJt zFk48Je}yLdZ$R7fcX3PUC^svu4%fTt&f7C$P^+NOMO`16U8u1At}%huJ;L?U-Y2$@ zD;EU(SXxg-)6sJK_s#~oXD5`!+;dRE4MSCEji)82QJr6*QA$mIUoIu$ld_2Grg5_W zL>WmBoNL`rxqkszc#3bU>!}n^yiKQ1A4AIv_WC4O2a;b|t1x1L=~IgUFA+mg!&AM{)!zYJ z@04E*q8)I!r-5UVA`JLHJ|b7VLMuPgs&2Jt+Ye(yj)y)vy5=9a+9iys*!`T}>^mSM zHf*H>!}`iWQ@*B${_h1AxH3TC%3%Mz48zw8ip@MZ65m={;zviUJNzYRH~iKU?(LyQ zEdSGQe%GiIx1w3lJ`0f~U`8y%;Wx@PGLH|c$HfVhlr^aVT!XV^oH6jz9t+C|NX#pw zHi=S-;HqtW)y(%mzt=i#fhX#YMeFd^r3 z#*rWf=8aiRo*p0UGI|N{@-?p2L>@09&{AMncoh!^Uw13*@8k`1#_0HC^iP zc_aJ+3ep>)6L?JAmDYtG<(m|7sX0lGGqUc?cbZZ1yio#Pq4{@FD!G)M^_)H_iF!_F z`lM@}lr07iFpF{xC#5szRmSeABtjFPIS!a;q#!LNK!B5<7U_@nB84ZNX&1<=KwI5G zy*k0@jZxizleqor+iV(@|8+{k>JI4j4?VQ!b$+FD(vP^GFm?(6yQ89aEHmKOGfV#KVf1s_j`@J}* z-g-(Qf<+SH)XNY}j;3pRPcvUI zEP+vJJCp|-swra=HMbZs8o>3*DvTa0-_)E&1e2pO_MGn~5TnaP>RVY>5Ak_)=qt3I zBjONuE55W3(ae0J?qr%KLL96&l1D-$E>!R@6fyDY-Y`g&>vbF$y?nzL@R3&FtSGL} zVQFdn=F)m+;I3(v8F9pbmJuD}uX1VRA5@iB=(iJ@FkKo%_UCcO`GMws?ZY_aX@}2U z>!1aGbQ-Q*FOnBMj%Rfu{^(*Ht+&(>R)9j<7oXoBXJCXux`io~PQo)HZ)(4|Lw(pN zYfs#TeG8o*afer}g7>wUeT$!*vR2h5kw6sgHX3C_SnI{~qmkX^f)0Cmm_S2Eu%fJ_PQePI=kENz?H|&NBBFI;O6r=O=nnb8G}uTszR9qDUFs@VogXq17dG&;yD z49gFeow|KcRLSLYtJ;@*=8Nvn%5Rx6eX)|z+hzss*vXmyVd1C9xD>lMXQj+Di@=!bZdA|gp5qff4bWcT{WzM zSQX|rw>{@wfa%J)Xa|dXL$p0WWVVa@R+S1dZsY9&W-_}?p&S&giXjU`xxc+}jd}*D> zdW1f1!WqKPAFj0rn_LRf9UU%gmJ(#LMz8TuY>22^9zT}B+}>Ff=&K^S#Z^} z{v=G{4+jkb(sFgmXA2jWkiBJ_d)~yycH`u?-2P75G=a6-3L|en%0A`%rDNkC=J;Z#iFzGf^7AaR8YL%*O*Y-4E{WETmUp z8VL->eIsp4mwb@79P~a-A71M;ln2xc!fv|Wm$-F6M7%%-b=N{Qu=Yafw-@+IE!cEh z_KUDQ;`q6n5;PAJ2XACLz&1+>0xc-8_G3^&V0FgJ-5@d~f{trjFo3?|(pYEmkx*o?mm@H7M2Fz@ zLq!{<#yQ~Dk=<;`oHC_h9Y#3tuV=K$-?x4mn&xbaHt*u@w!r5nrxYzroltgjVq;K! z2Y1PG7hhtnJl*P73@vIyjx*6@%gN8RN_w4C`fDrtzlj^irehXB;18RYTxy0dAl=_Ge$NqC$Kr_ z)|KWB1^anYbRWMXfwF>Cy?znm33J}xSAF9PRovj1H;b)A7mo@%Fy{2j`nkTD!Z`ir zl*6-aUrtl;bB!nU3x)KmB}h5MtEWX0(|bI(YCJpfWGmvkaVX5-ELZlN+Jg_9>>z>F zew5aiOS@#uRy#e-N`{-lcT+&Nm|At(_b4t~$CL%hom>$sY*E>8`-48&p8`kLLnE)y z$lPVWnzdo&lgF?5xy%$NQ&5iNYAYo`KuhS!ti(=76EGj4Z_BT~=jfVM#3D5WXgaW? z|KYT~H^_1sS99E);IA{d62kh*)@b`P?%wU~{%H-v?aPyWHWv|YJl*H0a=>{dXKf@I z9Vz$eY(i=~b*)}-aB{C^-7a`5s3cL_(gFw(#RT{5(!g%grJ%ID3ISyBYm-<6Y&`hT zl~j>a-iB$V(5lz3j^?TDt-|CO=FKoQF>OV`yD-8k#0F-QCDO*5M(v0 zph>-#>}R2+GGPsM@_L1q1a^Y`{WuAC=Y6cv`pLx6)fPsKZo3ZiUm9mi6Uz~&82z#k z(~G!3=L?fKk0h%xK=sLFVKLJutcxtd_Q7X5m`m5RgTdj^lVS^t)Ze4$z)5r znCW(IwVtlrk0H*)DXDkj_&BKbP4KG^a~WZHRKCX%G41GJFw60M)C8D@Ag$*NgBi4h zxStj1Mt}|5<(po5lr2r&RZZ@Ow{!mNf&h;hA)es-K+YFXmfo=iI2PAGqG2nB4V!1~ z@MnLX(zz9AB-ZVJdt{@1wmRkpmJDz`mPh7a&S?~|8;9iw&=mb`mgB~g?{1ei_wnA2 z<*JeE=)Nmn(;T?U2`?`6(UCX4Fo!;8Um@)jhAsg@g68by(f0ITJh1W3dW#OY_5j!} zuD~qE9gNSk+Zj}{LNU3^8IUbZiWSm7f?)cf8D5K@&mE5ycNcvnbxh8lOf>_S z@V#H>kG4*4^Un(_JTX5@r3|urt3Z^HD{^TT;Aa2uGt-MgB^4$G8W`kpJ4_eTMj^~E z=Wx9#RTA~SS7=kTuiuNMan?m^t<$36Lu*L<5bjLyVj0|h=*k)~e@knw?*y6E^lsBP zIy@a&m+yd;Qw}faXzc7?+dV2h*s(S@`g6lq-ntHmp{K(QyesXM&f2V+B7 z_6nYi+;CU#QZo#{GKeO=)lM1*7tQEIysc0$R@$1zD8>;TP-4X{{s}0{HLG+Hgk18u z!-FBtK4N?-fGqM>eu8>?om~7J8;L++Mrv)iBj3mTV(Wjsj}c6ewJ?rE0g+Z6ABsS0^W1?Yjhl-%uK&-Ft95>S9bAEs^973~g;?fjm)D z9AIgUa0OwwV_j-+Lkp_Iw+I`50Ocxr{li~vxLTC7UlLbkZ zn`*lNe_``4$h6{~cz!&7N@Mmb%*9xO6|EpPc2sdO&( zgCF$QFm`Oe@OqrJUgZQO4AfhfsjO02o8Gr$jR5lAlWS&;HXS1=gOPR2~ z{>*+(pgIg@r73wH(K>%^{Ujz2D7k+qK2&zaDKAYZa3wVnKobgNmCfjbl#4j_t5dX-=e$B2vm%}J z{2??2znRnwPM@4W!q;jt!ydN&PQ+W#BK}p6~dZX-y$)5@xRstr0>N$m0cec zTvi0K=2r}!^~NWLqoN*VIBYk!Ly$~gp$SQ7WeSN#=}p4H8kWJ!E|51C*KEl@MC$)t zdQM+S(y6y*76-?))F|_A8ff#oy#w4n&?0*xQX#l8$JRLXEy_qAFxxvPH*gY<8)eG` zznx4p&OZu9ObyYTZ=SPNUe(C8!Sd|!+U92-Pi&X0iD$dm`DGvf$}%S7XaRG}8WYL} zc$ea%C8T#`p-&>_=dMMCjjjg?UdDbDqY6cZWKbQvd3sdXK7q+R+5SgRf8AjKCQ#X0 zg_e+FP|Gu$MBe`6tAHk#o@jRdM1(-x743QK`RK5Gc3vb&spb9hU*51jq3-m>Srx(74Tc(c=P6G`MI; zTm{5QyDn<`LdMd(8juV$L*7F%AzQGdb+*OavSGe06eZ9_2 z_Gjk=TL4x1p)D@Ns;_kd7@s8cx~pfi@4{-$>gK9-kd+fLd@~v0ZtRUr+<<-i&5_kD zs)tRdhveMp7)!z349-of5a*C-Q)3QRxU$g5;owIT*LZaqml6unbi+$KWCJwZ8)shY z!sA2aHU2cN-5w-XOT?pnAy7J6o8rrIQM{;7Cwh|RE461q`1#xO&bQ+BbXpU!M2O|+MI zC$LL;Y;IzS+vzA^s!acf2^`qD`>)47@4%F7?#KM^82#wWF+#~yzaZaQKf#o;-+bQM z>DViDZb2sRDp94xM~_((W9|j3-j9*=+ya}DbESv-1z<^a|0Rr^3^Z3d28FpYVj;E9 z%dw~wVlH|3xorJGMn^TBqDUuxJLoPO4ZHMOIGV6y|8V9E*qWjjXP-W0TH!ClBRcbCJckgjr5EZ4Cg0L@av9`qWJPr036%u*d*;l{3;TDt|IuJAC zx?*VsDmE}`j4w?UcHG8Nnnks+!j?({)Lau z-pRvWT4TENaim+`GgQ zsD2cD@&u(=pY@YvbsC$OKa`m~amLC-n{O4rc$Wq2w14XP#-MJ4q3bsFc%0hHNijBn zJ0P`BV2@VKFe?RR5y5nX%NFL(Qz^#L&+_42R%>u=xgz6A_3yQJc|v7ni>}^6c(d~g zR*tV1sHj>|0*Mw?oGR-S#w=XzMx~}k$Ga@z5o=H9HdIDKb}~iXox$L)^HA7x&Zaup zy9ghWWuhe`v>GOv^I!TwO@Xym2e#q=oHWS%RAPg7Ni@}3Rd>0YwQ0jk@$FPsf99x; zB+Ucl+|ct^+qWyU0d6n5)1F9`|6-$-pPD@(-OZ4+>pyT_OGCkXC%s^OjwJ|$s7hvw z?_+EFyeW`_m|^1}qMdUywp~B?ZY==^Ovt<%VTE#xpiZ;Sc?(9xpe(ygQ|TBoU5A3r@eT~ha8bWVKS$8IcKh!EZl%juwyNQn^iP4pr5LIn zH9H-xSyA!5uKgF{>H*WmcUiuQ2R(=<(*udKyq+HqS*<60`>YdpKw6=L1+0Ae?IE24 zPRQZooGPfOFu(0VkL$av{Ng@R{L4zA8i%Oxn7!hyEY1l&B0V><36o?ujJ% zx^bPwM22Lyzm&6l@3NBUW96|j(WT2P%;HZie&#(dNr5qZ<>j49*L(1IkTPGSkxT`_!v^~{hy$NZQpqc0NQ-OedOo^n1?)tD z$a15|TdKB6$@uaAU!w}hNI~of`KC+^e;+rhUC5G$s0r1S!S=WVt5TNi+Nn+VRS<;& z^!yqjse21ksO;2DiERY*J!)B0camSB)`VPh-dF9OTPxQO&<+U}HR3pk)&?P#7iQ*G zOp5{@?tG-;;3d;k41!qiCI41}>_9Lq|L<^s6OT>2*AhW}k4FoAC}EZaTWLpEBe*y} zLoH@5EV%S%;BlA3?9;ofp35v1u&Qi7Qi2Ljb(^L;Es>BdB%ceJ6!{rSb!VO-LDObH zyr#&secvaoarO1z6{y!i?8h)HLuC^`Z?8&)TzS#yz885yhRlQ3qYE>(>@O3?fG6{v z$hq64)tTv}z3(FTzpNFFpE#^HgryqG%0D7`Y2Jr$fWa3^^U8yd`PYq;H0_yjDq^r;En&+B3-XGIF$kd*Xs^3GPAVmRYFuYFH;lYslBagS~wf?q@YH zgO04^h0Om_3lxVv%-{c*#@O0~Okm)!m27@m{b+H)NF-L(J!OyWW=+_-jRe`w=7#L> zrQ(47j`ZDH4Rwh%zBYJqe9QP5tEai5$>!H6^RQ8Q6LB?!(&nJUArSL8ZYlFA?ZtkQ z2`?{*|H{V8Wgf?gx>kCRnc&uyd`CS=4rcJl1(D2HmECRV;_Godf<#B#hoN2*Mzglv zxx;taPgZ{BUHiglnmSCDRtaV=NE{-RecO5h<>}hrfi}XQ>2K@dna=G=59_?QtF`ak z-(&+NlOi7Q5ip73f%2^}EcYN^cOxoqVKEY3_g*zq8eQ8X7+yZUih1HyzY~FCl$0HT3 z!Mt;eEb0Rbs);POZBnv-7XGysjC)6R4b-0$6M8?p{m#YOihMsw9B^b1f^2^Z@$1+) z+bwlOga|k=3Q@!*%0Ljc=d=HEjFb;z+43j>Q!#}n&VmuzeemjRgB9jw0uB;50`xgE z;oS+f)SJJ$5RqN*sMGBh)+qHm9Gm zn1*ARI@DeKgD$wx%e%F>wm*Rowa#6vZHJ}q-FqJLNBVmmY5TDf?)`~l%=?blBQA+p zZVIMJEhkw#5pw^ih~_Fr-`%C*s5BBGaZ&I4|S9m zU~a&?2xdVa^e?f|>u^c_;5dLtt& zKxoS9p}iDLkH1?B-{U!$kfXwlUO?{R-{b4<6TwVBD!orO)~n#1<=%DUHF|Cz-=Lbc?2b+BAC8=9pYoH4RC!%*c5Ncks#R z6ew2_3hDn@Lw6tWya`-xC7-gc7iEG*&h%sTp;e=BwktexS0=%bOvL_AFS zZ!$miQkU9l=n3o3-=jf>EoAp$u)t5*Rw_^#1x#vEAV?dG4*7X1{EV$8?hIdW zWb4>a#D=3dlV1pW2-v zBH$%ozRPMC53QlJ`3r(-$Ev@V+0N`tA3I^ssqTwu1co(8C&vv-H#)(7-N59phC%Rv zS^O_fcU)4GCp;m25c-x@GOWYe5LN&4Jgw>^bbDu|Xka9K_rXQ70dV~f#mbGVCHzUJ?OOW`~L-=>*wF+@v&Tn&{o;iqlAV6og$*?(Dm-e><+8k6A~$-d=$vClF(c(?l?@UgW)U{5vAv;XB8B8=bN=sJ>LcG}5Q{(wH9#$qkLjMi}XN9d1%W>}UA@ zd_+HQ{EBK$e{cP1(6DgQfUr5yaqDb(QTh zjQ4vNNxVK>pILQO`|@pWy>*wO&NsSccT@%Jz8pai{fTmDP9=^L6rx+%ffuy+Z+uQG z_PZ>)-oqXbvDr4c^68N#P8aRWpEFNgT((VF8$vMCTz)k z#I7*0cGJ?1_G08LUrUur=d8M6347n*@N)4WFI|(#HwdQ+-?~W?}tbY;J znPnDMOtv+Y3&q!_n_d*gmRKr{`{7wvFhgDVHR_LB-RV?@rYPU7|qkga}oZi`d2Q8t>`w91H8NDHDyWs$$k-nH@36LBz#8gL6r9SGS>Sp%Z@28Hgz5?2%W=ghxI2{ z*cP&V+;8ZphTB`0%0yCzgN0aRVaRVgEyB?&hs9=cXGkIth5~o?ICLJ(JS>-K^*RqLinmb z^u%Vf@bj{{Nba`}@zcMbR?Qwg^jPWf16EOmC*Nh?s3$E;_ioV$lWbjRTu<|n%HstV zwf^qfM2YICM(gEiYeIs!%Mv9&pBw+lD&6>RYn)}}#f0n{ad9jcv*d_1{j0De*g@7P^1vMruCzoYn?2OP^tG`2I`P zc)zzzWW)L%w&L2;-o(V^{71gf$ZVGX4jF=JqaZY^b@oBIG_yM(r?suck-m>eyUqho z*Aa5dD!vIQKA76tps=`kGv7qTi2vJYROd=9ETK3~--P8douN2l;GSJxb2~wru8@E6 z`;MAIfui^4#<_foWbgT8KSY&>>D|d9Cq}zGP9!LryfVfkrEr&aI_XO7(VrsS;@qpP z9*!3>F1<@ZE|HApt&aRZ-CSGVWz~YRj3#+yfnn{1>(Bn0H*=OxakzsFk-k?#uLc$AiOV<`j zv2fdeM_Y#w880(q>G;3nnj}X&a&z?TM5j+B52R`3ekA{X!vEBe{TlJt?FS_uS1VW& zkGd9xU?_cK5W#P^L$`Np;RD`kc3G}>$c2(hp?2Pc(WAOUzhWv9ddlz%Z13aO`O>*4 z=R9oT)8(Us`X(g|-enE-Hep$}ii8^Au+n2|yN3GZ+*GA@RH=e_zEsY|Vyh;jVmE?{ zcjKIynouw4P8094a>Yz@+NS~K*^fD9$m^%ZOH6r%K~q)*;sMn+MzbA9;Wph>p`&vT z1`~a>hM!Lq-(?XU6dS05i-@thS9~Zz1b;+m9C0CVRQ;WFjGubTylX>SKPB1hvG`Qp zNC#XeC@j6pLbcol1z_sTVa}=okAW>E&s4n#Rkv)CBzO0MyL^umYE^ze$q#;(WplQT%8eu;&xw-`lSWl+^rV(6d^OLn6mSd4T zufbBR!FJU990Xkvhg)RCKp-vLJlktioq8&nQ&5qw!X89IwbZ$o8N>Njxrh6s0+UL5 ze*a|;`SyvxxAb(2PkggFr!nqlcWfgDYk^@E&ofSE;PRsvE+!-U;AhL0fD+`Sd#%VH z67N2S+oV9Wj4bF6LSiYzY^;S9`+N(GgmRu@ztV`$+jd+qbb`}jRfkGLs(#pvtN!?m zi$#Hp_3xRbdh8Aln-h)&sHV(qqoYDXy1VHx{19=8`@^<-2~g!X{?5^3)ClVEkpS+(>7YI^ ze?=LM+4CbUie?xc439qf@5oky!5GD=M!rI${dR7C#+`n&%;o$V0aL$F3`>;B>oj74 z-99F7g8Rdy?xBe$AzvrwG&X}+5<>_Q2oL>%-bfR~QN8*B#Qe{Q=;aJzWNKx#xnr80 zG@jAhMdp+&d;2m8dVl=jGTE!(6_JCW8Mt87ma;Qi6KpmV!%T2%jvJ_wj}9c#-wB2F zBOQS3Y;sQG#j_-&VIRk9%D`kF?&ES9y1g87&;xC5!rWI+8^1m$Ul~lJb7^_>NJ?^x z+y{&{8^v9VvnGI^gt`W>T2$)}rrF$0A1Z?nZY|#a1Sqr}UY03)m%!V;8!ZogFrVo+ z>qD$NHp<>1Axn^$e}%?A5A{AY7SLFe<%2dO0?2gW0|781tRE;4lwE>HZXiEs%n zCAZ_(`rf+Cc3v`5zYD~vW9I-Qw&d69Jl(=zoh5`70~QouJRH)P$?A6BjYe=xDL=i{ zsY=?!JWDp+-ya8=-g9_8jzqfAaZKkhADQ$9prOZ+kEBIQY56l%nVB%2wT@Ln6hasnnjm0bd^riq4ua*5rPZO(_l4=A5l4U{))8c3wg5oaomYT&)gf-`vG zPFAzYpK&ved>f+1ps2iyk3Rf>xwroE>_#0MNN?9uGO>FWGe(5$+unp`^Cml$uMh1| zxd8ujoHNuRynviK5KjY*mO0BE2O8Jo?_!^Q1KOl5u(G33cr^`Ailodw3{2|Hp&u0y zx%Xy)e`Ah*F}KbvTK%-iFh1welWD2llrsx@DqpmlC9%fr=Zxf&nHaM-ySa$q7i3KSnEOSw-Uy%+Gjs^i<>=F6^2!TYJb-iR&ON|_0q58D zT4vbz_XyV=XpAyFnqEJhGNz(B6gP7xlTvCsa$7V%MRoRVmb`^6_#DQl724uumzn*f zVbyko@?1bgQ9#v^i1M3PBk@^b$lvf7Y_fomUzR5Q*sa97~VjdN^UHNZp9kn=1aH&0>WOpID z-1#JVbkm`P-(-yqWYK}9T%7t8WHqXXN$3VF4~vYDayNfmXl2cUHe4DbSm3$w{ZJ>? zEgfK&e{;O0WofK+92=O@9~q|p39zBL)4;mI=p}R-E6e>2+M(8G*-WNQ;`*{7lY@I56_G00Yf^b8O!ftV{cS+TLLzzX#H6~(f*#^r&7`TIlsB|uH@;Y^cilI|rPQLeJVB6sFhnNx1P&yq|9;XQ;gx%Ix3f%dBGFVulC6&;QY zGqRzV#b*>G3KXOcKN5@heu)s62g`s(mW37+(Y3qJNg)$(UST1QIbdI=#QpB1QGoNG zC64Yv;cRUG^8NlV;Y?%pF1kE~$Uu9Q;*0Tjv}xDkMYK>j9T&2s1gb5wlg)2W1xupp zHx-Y9)9F&$brH{YC=_-m9obvHDWOuw%0V@1aSD|V_@{zON&BVjJ8cKnf^;;ByOC0$ z9A2)nN{B<`J2v3 z6dgrMe_z&Fp%Jml_a5@o%PhC$5!Kgjv_lK*eg?TwKZQ!h`m5w`P%@n**bt4~L9x(r zol+zo_!|2PquBqxLBV$$`Z>Bs@;v0v;S#C@3j0Ee^AOR=tOT=g#l$f*<_=P+Kl9T# zMom->v6rO9+up4e)$LCxpWn%?^&k_3$5(mGc1l)F!_W>7dJ|JAly_YrUm+U!c^-ZM zk(!T-9e-z=vpxzF>Q zb7toH-{Ej#{08m57g&ChmHPu&lF;mTV+0|TM+Wnn*x~n5DCK%+J$D3>|8j(4JFY#2 zr2hN5rf84c0V{6?N&K&V=~_+3b(_1%g}%@#LsP-?sU1eylyozR2lg=L&fNvvL-AO0 z+Vr&-jjR`~udc!k+b9$W9KwTEf+UX<{JMV;iBr-W%0aw&6g75ohqN#?@HJl` z5ftuSWau+TS_{_espO!UQShl7*a5=B+=iy;KvOp@-<0oZ*WJl)mMGfkxJ=+`*o`T* zmr9slwQLMa(Mwqd}>3ZeX;TJCh=)VM(ygSP%Et#|@z+Wtx+KPheGg(ki*a zBVC||2j8#gKN7Mo=ox+9GS`fG``3U}2$$$Zb$B|VDLPiI>EkaW^7YPu!l{J&?4k`p zCie0l!pE=4m}JSA?Wr%4=5pHbz93_E;tyQ7E`ma-0|LL!0whOhebJP?z=ak(JN}AO zVfn=ZhaOEXetp;NG;ps1@$p98L7Xc#0Yt4KYoa`|xqdE(k5k{X8vncY>Q%TM#2a~_ z9jN(x7Xd}_^<5_cin}Sw)`4us0;_}*SSE^v5B%v)ugeM_vQeA^+{TW0_DLidgoC*9 z>jG+aeSdvrNQ-ReZRX9KE~qlgJV=of+(=*%QdC69It_$zqv{LxfhK@ zb;B)S|H~|vVa8Uzy2bH01lIdLV_wn5BLFSs1nc{(PXW6zq!}C`&Dx8q{QWppm9f$$ z2e729==5KB?nn9^jXm?-mgye;zPyJvRo~k2`?$Hx{2m96ot$+ zpbw4s_KM$;TlXiJW0JB|A+7l*^Jp-vI^OE{f2nBmv{++uXhdoS?IRzDplwY5lTXPJ%F7W9wxDVz^U^uN)PyY+Z-YSFp#ySulN z4VtgOss!!(-pa{KHRkQQw5App!v76J(&f7+AXQ}AMxbdQS6Sl1M>jxkjY_GELlJ)e z^s&7Jj8>i=jQ>w?=glv&w5T zIaxD#UxPJsxvbz$pAk#A*M4H=x|zC;h1Nks(Xn3NDR|ZQdslqUdS-i@Z1SI6Im5(! z4_}cLoq^MJDIH$m3_b@YdUyn6n5Zs;JS*XZm#xA6H{oDlnwMjBoGb*DMdrUwb0Yjd z6}3|BK4$;JVTBHOHbvTejK;lh=6s4;qk3;_$@NIM{o(me)wVq0YU`_WPsWs?+W)($ zYp#lGH8Xio(4X|e?Ng^dQq7*>tzJzT-HT>4YR>hVAzyICQmm*`4OfOWei4NG{l#PQ z!<6$Zsj1?=wyr^@VGd8+wYQJRfaS*0_?=VyqF~Vd_)#8^{WUQZM z**2E#lw&rZs3bceWdctmGoa_e!B~X^9NT}&kk+kdI|U90(R8S7>hzBV?$^p+4tH{K z$qz>p-{#6GBjBQFsN=`jKF+(8)YH4c*x=K&U0Ev*o;1L=H|i4oO;zDtt?*;B9T0Qy zSi~s0eos~lmfzKOhU=79Q+2$GUgnLcZ;C9zYnGt6t$fjb0ZFKM0+#a9{1sZnziUwt z7?5S#pX*Kv=-F`eA!lO05<9KvTw!n_AZh;cnNPJa_Y|$6&P@=PFWJ1VqmZqm^tJ4( zS-80kN&ozVMyXiC8bg11cirP;mCGCk?nk75#!85rmMd)UOv6DWDT{fWY4NpSRh{B> zp`ZT)Co;>^dP5)F%9TcjETx91Yk>3mR{LK-2OsMy{53cl#P`&pvmfK=p9-)EKc-Y{ z{ey8PX+nJk38QIe*KO8>_p7+S>q~cWaHY!5{qihDtgWWg<5 z3U)@kx7sVcuQW0G$amEWrtSD{T3a-~=pHTUbw@L2q~TbY-p3Y*yWoq)SlPJ(Ucp*3 zcC3EgRwL3j#J3G%)se0Mw88uIhYR!d^%QP&WSoFzs{L9@L+s_RBdYdV)q`Lyc1haR zt+R{N>eIo+3<7@8eb~i3r!J|5_bM99Fk>4J7+44zuZfY)qQ+M_5D&S&hLW=~4X@Z@ zbZR3uc`3HBYY@JYv7sevWUt6OI%?`94i#f1 zFj(UK1QmW;7UW*1D{QK~+u)&zD=O*4p`c|%snW{o)e4Bysy+4WJQ|b_xR(tUhh&*` zS%oJ99$K!QdHvah*&>D1P({Szbz?I-P~f@?Tc;as^fd#4?7e&^N^{3P{lud>iT^ti zeLW44Q^T9e>k#k1PCo-7_83gtTI^MJ)Y=MfQ~KszEeTeXujMKMIiZ5yxAum0Q5TfT zsxpf<5@S%){!hbySXhLjKCScwmhY_t`eAG*)_~vd;iuToMFq5>_ z{iJ|IBh)@4KR<4X*%n|fod?UylbCw^4qVOJtZ+GV;P}NyB@@t^mxqogIr;Ulznj0C zg`9jMQk4%VQZr;Lnyv)$IK@nG7Q=px#+YcRT;`s*^M@PCQ2fs#d+0 ziz`)8qdT|1NS1vF+3Db;RTy_tEUsmdRbO~pGa8PR)vF9UkqmoZTp~?v*BCWuLP600 zbbu&UxX5bpEEBYuOOu=Cs0s6=xTrw2mH#OtvK=q!ylMaO7a@(Na`T}*hCg9qseFJq zQOb*^H%FF6bR*(`w6zo{>xkCYhYbk-z4h_F{w^jsfLQp7EKI#Zny*s}bOUNcPkbl| zR#Te9au^Q1g;lh#8Wmi|+d|F5J~&xrsER0p>uB8I^$3~l2)VtZ_ezVn3!h#ixG51k z{;WP1{bxqsiWsdue~v(FXEwh2$Oa#5Ssy6$jW9}M?#@UMXN&zr#ZNI)q@gGkwr@8EZX zOaS(alxc}T%t^tp0To4c%}d?NWnds(_8g_@nfoEMAjs}l0t7OG_q3WU*l(M3*1pgb z_3SV{ife!FO%i?GSDb_$N7sA0$K^Z;M}19vB@r;c z=KNtd^?sPq9?6^t$rqnjq86CO?=Od%`K`bY-p5k?aLNtXu#^8)kR(SITP9Qnag>7H zLh?}Dj}LCc-v~(FEVl15JJu4Y+WogRnJ^0^iU&XZABT&}?ElUHDz~SAD0NJL;0A@& z)m;&){MLlWbXX!|kY#16t*&-VR^NLszLGc+NkHt1@wocStg8325xGHf5G;3)T`lwv z7qQa~C>V?yh25$w!OTdALU(K1DzjN=wM-;Aiyopy%a>W*awZo?=%oi;Th6|4Q(H2_;eSu>$r-q5 z7tPJNHtoGb?GFw3S&*whi?q|-uRFsa!{#CM_+?gNeh9E6X}@b-suLc!XAjiiozhc9 z@GxGNL|l~st@&3t{BYTu1ESs(g$?frvWfp?mQDcav<@xnW8n|c#ak(QdR&zs-uOF) z)GY>W%7Hoat^5>a|Htd!kb5+$BQYB+voEv4)l($Y!BSoo7N`jUqdDI4u_)pFl1jqP z_WQ9>P6(tHV{h`t?cHNZGrQwki71#)v-T9*w7h#FLFk?%(J0C$i+TAsKf-4zV%(u_ z*I*4i9pu`qZ#5_#*^6vq8~Q&E>0Tj;$RLUO%0QkD9%hgzDXOT<7-&rmL_@uQkPvf7 zQ*y@$tpr`e*wjn_{u;hQA(RDFYCfaHb(T7;WEm$)d%2=d=qNj?B7&R z3VrDM>#ZkxXel)4Fn68{A(%2>)qAg>Szu18Xez)ms0FGq!#6RWrKvQAB?h8&K#n zs6~7u*@IbImTKonv8(qDQKZ`|t9&+vpC?VE1HA47G4A(;Cn}4w2Go_34pVo7r4L4g zQ5w2Npes9S$8O&upb_OM47wKu7{U{mxE~6p2zgR}(NPd09_EIxKp$Y=)O&RMK=%|R zUpkXb-*K>BZUsH4MScWJIUOXd&JD#RJJ6 z-x=x4X50S)4&PX9mZJL;{|6Y;b@OwZFeMdVJgjKo=Q`IO0Ywd6u^#J2c~41#8ix$F zRRk1MLtawkF}DRS|6aZS9rk(5!)t=VrH#cqt3vy=9-XWny**6`TPlm&DO(d|i!J7; zPMmPg&h@dOJ&*pF{k95!F&$xC5lnNM`J~+e3)W)0=T()DOqH)aA|9{&*zC77J0m33 z-8W^zfB3G$CYKRcZmjVwu_j=B$YFTmv_;%+&ty+<>!$ecKb~aoKc1!CunZ9f)+>o! z)eMXHLm#`%Wx0 z!3WX+o42hWuIFM>)43y7Sv1vv0dUyK&sqcRd%*j_fJ(ECF8{UcxAK0YM|q##z+%K2 z+x_2(Do_^If0nfY?M#GyWhbc1=ttqFH#C*OB0e1z&s;a8Buqq-wMsUC znFSwiZ&_{4m{EJFHq;1nj&nqGi$~$z)*EU<@3*i7Y_9lfOG9Q$(^r}KUl5$g>)H1r z64%ZQu+Djh-bu7&8m2uCYR{d5df0(|oq0_g6+3E1Ud&!%uP`8J6PMICDE7UQ%}2D_0c!9P()z%0VSTciv4#2n>BiwsW@P+%d;~YXs>A$k z{&5!&aVl3T!9u$(xpihx__sh0z%SlRdpzVpMz;bh!^FF3MeILYR$WcgWXT)Sr+($| zK6Or-DCVy&3xgSO`XYnNQf78|{JW+S;Uy&gZDeor2WSYYO5g}40?T&Eiq)+@^MlgL zaI<&SljIr6LUN5i{p+=EgS96m&stDD$2czHqBY?BuNKWOp7NNDf74rlaO%0pws`#8 z8-9_~QGiCO*UJZJG^WUr83I?xs8RGO9Eb-898>IHjNdunzH|qx3>%r`$b%2PgxP79 zHgvpm--5;s0mTfN;k1K2QVMdoYj}=zE2SfJv&EFr*+OFaaN8q>AE5ata{@{%y1#rZ zBZnwyL-zT_>JemlAGOvpjXUEkGOHj~YuiW>W3{V_5;xV{XTJd!Kqk|vnge&N{!x{a zPr}c{YO1F)$~$*f9Nn8`iD`a-Che-EfGhuTI}U>*Zlor+W24wxq&Q(3+YLDXWl)68_r|Z;W;LuG-CG54vhAFz zO)a_Y5ICAWq=}~vUok)%M)#*gktOiH`hocY8n0ZRYIFDK69Uvt#f}vhKyuF~r}LxG zb~&mznzIG*VQbiLi)IN%}4&ln!1uhb6StY8OsT?i>{gyXbPE$ke5 zrn1oI>;tsugqw9w=@1k9O3-yP;Z*l=&+KT@l^&!m=kF9`z~n5s|6 z(znWh02D?$e96LA*+6Hrj*&g5!lwu7c)Ak@u{rqmSV^=G&}1I3Ji9uEl_H|F;>G0r z=3nVJ^htXOYCa7psy|O#R z#IO)a>BSgb!1tH~MuV1ibeRiQR9#YTZy{=C=DQ=N`8lg%l4XQHeIdZ9o-uBN%>f6! zJ-DbKL^j*q>yC}N`T73u0~(EA2E<4B85&SOGfa=Bi3}Ti@vi?K8kjCiJ~cokL`=)H zd5H&A{z?b_ZCvt$aGb~aDsRC`1i&BGTpn}>F2aDy@3$ccDDM?C9o}YQ)c_z9D%R_h0)~;hsL&W|DFc@DsufsB z1s~$!uDHVJ7eB&}L&Rwy#hioFLfwV<;X{YID340Aez-z1xtpjk_xNMU+Lb;43T%|p zETPLpA-60Y5G7%phAj4Novf1DsAHJDbHcvRqzUzf1kz}r9V3_joE23$?NtTIxBUL8zK zYBD`10Ef-R)OExZ=SNUaWwJvR(IxrO)?X6w2EjpaTp?K)TiKOb%s|rN&{H^g7E&e zQx(Wssx)D3hj+!1R)?+MZ&)25M;{CYf4==7(>pf10D>O$vht!9k)^+pyxI9n4EjZ8 z_tO|qVKX@tx{?|MgKeXW3;>wZVQgZ+`#qmByGO)h1+B2#uIpy&@(w}dv61tARE>+A zgV-mh#l4INh;|r25v!@EPyEiYg(5hDt>P@Z&QX$edh9OU#_5`G`Nn}XJYw6eTf4nnjoGlAL}F0w5j#>t0l*8sy34tkOSzu;Rg=GC(a1I#kFFLLAz9RPAip-@RN? z^@Fm2t??Fk;&&hp5u+D?xz!<%wypJ!yuc=`lLG;1B3g%t2|gwluPC9w7^CX^0ON2w zl@4j81BfQjh0g}ZRJ{z9ehH?hEf3Y}YXPT9{)CMZ;=T6`ZG*K)?y zS~T$B>H2l-dj-fw8nx6Tihzymk$RePerABb3nz-#l+ST%pL*Y{g;3mpJx&eI|Dc0 zDtiChq`tv>)J}h>ub%O`63pWRv^H$#W*}S#SLH2_t;?=M&%d1!8r9BYyO?>>g`B+|GiAb%i4qpY_|Za+Xf z(u?hoc5*RLEMm<7@6&cnhQ(V?dghvr0^wXlc13C6aZjm6UmoBw(3OF*ubSKeVa6?? zMbH5f0Yk}~}V(s4)Bf+xU^gSQ)2r_ zd3OqXEya^&KNC~^1pje0t_1EvH?yTvI{`Q!6#iu*76e$Wp%Q~DpDoHd7ia;5c_>9J z1i;E(8b3hO+Hjnz@D=$p_#~QFfeX8~!(R6c0G5h-%sE;#AdVg!`QNrQc*r1|XNzA^ zBX*Sl!Js1O#5-ImuWST8FCgSQ@s}eNNVIdT$tOjfp)3I(pix34a8gO6&a6kiH+oph zDT^sBK9jx2&wGKe7{$0UR|wka!Rp7fYs<7$b9w)~f&tFXb5QoGkwW*691q^;r^5%J z1l-~w)kDX?s%VKgpJObmIhOQY#0Wuuf?`9sKG&Op_;Dp*l+{SXLlQ!>DnnP{?+(tp zu(r>N@J;Fgnww|NSWu&HMCz7pKx*a{K+0({ct_fQDrI zpgg1A@2)VcxDilTq6LyR9r(e~eolf5ALh_qr;}%SGd2P~6{zgrECA?0$D=44eM7XH<9@4gqV!ScIS!I2xt# z8P|K}drbm@5uE;f@HbUBuq!s5w5sZXKM3Es0bme+P*;6jeFRpQd2I~$nPAe+yf#ap z&E{~u74$HEe}J~@Ok%pdmeS`~{rq&5J~OWgg5qW=tKVqPMO)StF2E@!_550 z-tW~g&(vH00f(Q}+?-R)G(woc>{FYXp{irE6si6}C-e*0U`Yawo+G&*0&ocDKF-hW zgAl(>jDw=`8t8Y}12OoA01|HVN6`FC5M8;wCFZC?UVtXe$sN<#EIw8Ny%7JJ`B-C_WYyB`U2$&X;g z;0ou1(CxD7MXdnZt%jatuY?BBk3) zOF(-=8iVhZdtrhN6CVAsjp$)7F8b3@8BgV$bq0cH_y=fQe(^k@yj=z4&tvZ;>Np2? z0C&sup*{Fil%q;g)?lw!Bj$WYSAyHnPB5OX+k2_#F&dCh=khmFNzwEQ=W}54eEH`M zPcEm*ttaa9*GQxf(7*-Tr@5<6p7Avq83%fI-dRT>fmRFkH#Uz1OV-f0?`iCZsPL~CaDNn`xLRRk4IM%-%wxnc_f7&BPSX4jhhjv%3X zb{%mDFaNFIMZQgjO9^61Z>91%fg-IcnIN2Q1ge>+^*B4RDktYA5i(oSI>(&uuVjW3 z-y(MsSXMvG6;Zh01Z#?A_Yy!qTX@e0obZD7PR8QWN~9_>8|HMoY?(@zg&rXVb?L*? zIunpgG2q#YKm7DE)sT4lfwz5XC?1$u4oxvGzLCq#dFqjdnYUsYW1$P7gLylA1!d2vLPBi^z!5EO^*REdmh8Jw0FU|zQIEetc(f?(wdk=9P~;< zJslAhW_*sc32kRp2^>%gy(a~p2NVZb>t2d!X>F*5_d#vqzreAuqy(C}+5e%?`t^Oo zAO+;V7Qi%WMH&0%vHQK!{HS|!k|*g9QTOs(l*LbjH+vUw=nqfBXRCY7CHcsdT+!GE zciKV-W^^B7A(jTe3BQP10V2n}ol^kU$>#$%fr%D1tc@$xf3 zC2s<343Cg8bgw&AG;uy978=Atw88AjZmeC*>_AiEt^CFjvgo|(bKrauL|&SvpnZ0w z`#8X?Y_lo{gyRxSgaB{YM!||9Ai;TS-z;hfGv$$nnJLR`_>e%M_$Kb_KX-g39_}Y} z`1iDbxPPqN+z{uf(7e3PSFj%N7NzW<97V=~qr6H#!jD|oG`@_2dBLAO7_Z{RD-Gx4np38L%)+g` zEaf=@CRk%`h~|{M=ecz-$AY~r_5)=8o6R-etm(vNohj8@S9X>uD=3eTaSR2mNbs#5 zbNK*mcX*r*okyrPsf-}9oWH_me=%R;DQgb&wOg-Q8?*&;U`#DfF-wS9HK^evrG^SdF*2miegafh6ZU9mb9_rLA52=FzR)D}7X<fabGlHL!i9>% zHl-*G41l~p^G^wSR3Fu4e|pSv%6|5NJ=b^O94Ce_ zPf_w{s|AfO_+5C+b#7P*crUj&0)h+;YfPb0`E~}I)@ZI5aPFZ7<4?5^v$XQ5f7gQN zWER>ow;!8EXX{u;yDXkLvcF}f2&z>5PPAW%cCs0I>y{E45Ly?o}CS8W_`K-|^vTs>T3)_o&GRnw4k>k`5e@D#7=ofq$C(mcO5b098aO{`#ea)=x~t3wwtnVp+zr0T>2}&ql?k z2)ucyAE5Et?mQRyGYlxqtI+wV^sUZADj@5ed(`Ur>tO6I+%}Ss-P`s*x|H#x#|eZg z-~<8itWE6`mHQSTsK6U9yz;iV1vOj-Yl^Hs3&+=8d!PUMLcVum(3qL2GF3L5t}?(H z9OP{1%gR0on@cL}HFGDc&kP~jPRGco+f%2hsv?4e0e+~Tarpz$buAioO71TB#88(+ z5$o}TO~}o#*g9grLny)vGYmMY)(b zJYbuWX;6?mN9zbEc5R7@*UJYlt_aJrn}Y-*hJCOBtm(X(Q`DGZW{ZA+R){82q#F8R z=kfnK{w-Ni019jjEe2mY6}fS89C2Xc4eICQy#gmSpdZ$a!3D242*|aTMz`4ElGA^0 z?9iz%FG6C`H(OVT6zs%r7{sLf-0w$E%Sm1@axIPV-U&LSqOZ#%O0cq4vG0$yWLW&i z$tMDnDsoW0(udEErX&7ei?b5on4t0p6jVOtNfTx-i5aq#dd|$rKhOS@egpl6@pA1C zPfLG`&n2M6z8e1e{SQ8^>2C|smH&>-A32fUn9i%4hs%QsBbJ5@2!Cq~bbRXJnJGZ$ zhFb?nURU^E+sl$28ES_DWY8)B@Ez=#M(hq_rmGLoBFCQ>R0LHW0+CVqOD4AMkre-Y z@tPvN_2TUw)W|bWG4@OlO}NK+*6BoqHQIH-06nTo4NDq>;QRC>>GLo*)Y$=ZRO4q= zCX`AqWI@@ZAE1#}t1a|$hY=i1YbiTs_cHopsNWy3qbRU9bKK@< z#WT6S*%Sbl*L5)?t)-mCQl8y>pKof(n|$x{OYBJg`-?)YR{8mv2HMl9K`-)0bBz2{ zkEQB|eAY#%Cs<>{!cP$nM2a>A7z^|wPVZT0@6eS$#&-Uh1{`boSUN<%#jnzPjh{t2 zhj1Xq1<@Y-cZLy)Hg8<}InF8y5b5eNrK46LwqCy1HI^9%M&w`E0sMwivBNORL*!ff zcNM3Mbzmv!n8~QOkYgOc7tx1mR9J7m7^1a0H$ael#GQ{}>IRg!okyfC{rhus7D*}z zIv=kw^dR!mWq7tgS%rgx<+5}Bx526Ax#@dzd#lqewqxpmO z^PRD8T?=Ua&(k^P#uRosR0NGMfiM%+gk2EGXk2{4epDzg zH!btTy4vb^oUErk|1o0Ys!M6Z(20d|@pnHlN$&UoU`oq`i}*CK_A*q~h}gq+VD!ME z14{e-TN+z!QxEj@2Wa?dhlAH*wvJ;hKgm_ot9f;(cA^&LcVzc^wgxRgbGsOYd>QwY zq_uHuEl~X#BPoD$#Lc)g(1Xt3Yu0G~@%TcpWH4u+xLi_EkJxjXlHwh-FPbc)e0u{q zec$atOV3}z(?&*jezP(-cx1gDZH#?%MvI)QW=u?X*cv);2u@oC7VzpsjORq$o{`=& z{%;xUTKTBZs-)=WZ5RcOUZ>KIa`i@h7IGO(3HyP(zH?xvlN?2Q)blWBUCo+T$#EM4}?XSVT!6TL=KkwsGVMc#gQ zG!zGtPW5SxH?Wvj%Qqx`wQ`9lQ4sW4fafg;!?be1-Sj1*->$2s-N1##Ma6D9B zW<}W!-UjfcRCGo)_`9{{3$wf5`z7cmrENll3JUC;&+MAO0}We?2wC)^B>Bu-zp5n^?qv);%=Md##k9p|)6Q2sWa7oOn4J3DSB9zIG`jAl%+IvG^;aK2;0_bZ2^ zV4a#Kc~vBTne4ewU}E{YP@Y!@I5KTunj~|}7ch{$7AJU_PP~*{?17j0FvxvY(4|@$ zr&-eaxLnb3IV!lGaCPBCpR7LqxAG@$8Q!)>H>?NNlAau6msu_FRxTe!_Pyxwqqf06 zOZMiKM{&lW$rM!B9xl{gNgG=oQAkh909wD`J`xCh;=F7Vpf0K?^y`xSMe@g2e#B%; z2IcbKBCIAMY;;=_H9*Z*B6uL3**DEtEiqYv_en5Y%x&pTEMts&!?%#|qq~a*bEdlT$13lq$VGKDX{bFX~DQJJi;3> z0p>C!V0Pz<;CBx)f&mV*AYes%YXXIg!-62m>-lZ-dcPnOv*cPe{x?7(unOKZkkVO! zYGJ8!qEUBm7{od&jjRA#%%36!Y2#JB2rbY5aLUZv!ucx(`In9oQH9Mi_ zi5GBjK{!`5Msk(TAqOb^%W_`>wf4C)O-NSRvqMUD7HA0hclN)@D=9I-vQtPKK^~yL z)}Y*DV$&|r2u2_)Z-T`+g0*XTfK3Ok&HZFOnw41e;fAXIOa6LV-7N?S!ZMz@#P@56 zIz#1cqJlOyld6jGI2bQ!J<1^(RyagFmD*yXU`ds*`Q1_jPCtkS1$%Vf8~b5)r@sN7#r_k2I|GjD1Ufvg9zof}pVo61h(o-`2T%a(~2eXmUdWK9Bnk)u_zcW zBQnZitCK9Ebv1<8(U7uh6QT&0A!AcHk+S=eG4scAn^YDmFVZ zn@%YvEic*nt}yeD)`#|RT2IypuSoRUQ$@c*3#=o6D^sewE~&yx4u|nmOH`)=?^QkJi>>ehRS=f z{);TBqnl)~52nHFs+!o%iSn;$LS$(|eevgH3T-A>ZLf_gx(Nu@vS&KK{%lXf2bp2D zx05IAgj|@OtMm=NZ0`Buo{ixoe<3- zT;q$!o2jRT!lIvBlZvO|L4-51U!g@#e_LyG_19q;P7%9x5d$i!5oME%7O4JC!4*)i zVUKZYKjiv@(Hj1Kb6Jm=#xLe8v{3!I8ONEK`nLcvCJ=v6I+zY^n5kE^$b{G_yi^UW z5jO+kGbk2QZ1OxC^X{`)_YBqb01l~s)Fl^eyIt2A+Y|0kbe4ARR z1re27lZ?k^t%zPflt;B#Pk+5fBD+UwkG9)#D!85aF>1lt9%a-sLf(}W?b<1AwJWMY z&$mMJJ|1}pi5)FVOeh1mcpEghT4p(bJSjX#vqQ2gK_ zk_YX`W~ckOk^wq7rjRMVq&9r&>)%p>BZocX)mKCc;&F=M9>4avOwwUVcAriBz`9j1d#Qn`Ri|i&Cv_hwO=2Ur zUxiEA1OFz+zOJPS`YRigaw8TLo$?1?HU7>2z`a7w_jyWloZOI<)r8_ius6w6D`CG7 zmD;l1f?u%K5g1uKM8L{r|PK@C3Ve_o1{?9pw0{f5h5D^HZvFZVr z%Up;_F#eE&Ojxa6bMP1aDG0oS;WW#1-AZen^3z9YQ5e*{60)bi^1j`qk}#l(oPM+B zd|08B?N+kvUDaIqY&>m`bOVpZwdG=glcUlNR?~|J+~hk3U2!WFl~5&rsH4G_qP-ad zsjJx!^8=fjvtD~;!Y5xCAI|>Zqj59bNwXXWySYDicCx;WB{ht?(2I=DU5e``NJpbq zo+1_6lca|i*83ck_r-qNOJ(zzVo7d=Dg=^*t3KOzYSrkj+J6pM@%($n9+LS1B4sF= zxc9_xC{F_Uc0gt|b&;+zx?M!N5jHH{c*_(&##d5#kp%I2@GmS&?T$Qb$9%b>1b zdL_PcBz3#eLQdbB&&h7(0Q?{4e|0_Gz6*uUv^!MgO-GvFLMIgVSJO!8j1)sOL<79M*Y!+km__Zz)t%rZjCSXJw$7&V^W~9m{MM@VaRIpDOcv=Zx zj3ggN@uXB9h2gB^opE)&B=%A0KbUP6M?n&&^8E*_Ej&Q_N6Q!c<)JG>gNZ ztwL~5ZlV-WU@Zs5OXD$$;>7}0*8Z?cE9{v$^_y(OVmI@p>F_e!EB}+FE`9m+tu+L7 zcUUBynpi^NR5P}jfydrmdc?*3TjU+Hvo1|eA7FMeX>p`IQH1DHfhg5pBm5$y9IuOK zRrhL$)NP>&&AzQykl21~?ljz=dNMrpA8w<+Gj|xhn2r#I5slTNbmd>EFSAh5oR`4t zbs~;uxN068%?k?!v;8+;<=<1o%`<+k)lB@<6?b`WIO~Bj&YRm;Vnts(wq?du+dXd# zNVSmw@C!@px@pogM5w51VofizP(E1kxAtB)r!yU z1PzE=0Y-p{k-jS*OW5=j(1rTL{K|%T7u+kIf=Dk-!Z4wYh8z=xvnkFH0h=5nt3A|w!1 zW=KO{QbK6;6}NA2`;v>+$_AzK8#t$Ow6fm?GUMiPIM$4JYxN zq=%;^u;hLQ_vPVj*DbD|C_emw>fN-AbgY;KE_)}272vZ)E2^-U*9s$_?PjrXu?&^7 zxko(6E=$%7va-RY+Fj5gP~Jj%VYSE%0Eo( zSUS5Lb_pD0s!h;+{Ch;w>`rIHxkcIP{C4(2Y@b{)x9u2(^vAZx@BW{sX6+$Cp^@gw zEhyT02o>hm4A~e_<~W8aMVd3e&5MU%L&)fe+uBMg_UN$S7YCtWI$i}pGX$D?pkHkF9}|7wqPrvV}=m_Q^Bk!ANMM92AsAg%gZ}l z+1l=r-q1@gCLH1U?sJ;2AZ8UP0KkP+b*1uFh1M2ZR~z<&oLSJh zLMqwk92~A7ZH*CTucXyI!B7@LUZyVDcTw0AAYj8S7fHwg@IDUx4GS{UqO(jwtHet9 zeCK;cT`?Mp1*OPs8uo5X9V*|j<*_aQKeP*2%_)`@m?mMl?K_@& zh?^h!Ce7|C--wgy-TC0LZJy@_3>qxgLPe;Q2l27{5_~$sGn(gBIhe9K?rOYuMH^5L zAOKS9&c1n7EmLA8N1eOC$}mfoh1`@GNyY^OtVJ4*pNi{k)+u&Z*~u7V0O=+;(()9Q z!@}(gJq3Jodd`?|ZY8m~8{@%#-@&4^DnZzp1?nBZPmg{M0qYB=C%!6Xp6N_w1104U z!Roqtq}8fq<=#(C!<40?jIPF0O`25_SJIZGa&C$ z5uxS9M}@uhU;uU^mpuYiDp7h+PMAl7Evmd#MtUt`tfZta*V(8vsE^b8BEEXo=b%wN zHjk&vs7Cj(mwP=c&hHFU%sUWGoX=P7JhjWqV8u;zr0|DP$k3!z0L8JXJDPsC)D-QE zZ%Ngdc%#YP&hM%}1jAw`9i6W|e? zH(_P{H(Pu-US#nocfbsjZ_5G7s}0S!@b5AJ-f#J9;Wu`)l0U)DS^X;3FCWM`Ps2Vy ziy!1|7HwWO?tY;(Sp5K0ORx~!!EDL3pllNoQyD|yOm`#}W*$p>%poiA>rh1v5FSf&c322wG%84-#RmNAX_t)Epy!`v7e%tr!@cUXa%b2g!B7H2a(Kt*U=Q z41e60Qr|r_n19X6Gu3==B|8U8U4gsd_nRaj21MAiw1L-kp2K@8q}W zB|Jk*9lS<*L>=2H64>(((0IevH3+U2@|xVGEmDQ64#HC>6M8l+8i4$B6#EMcnGlc& zTXPHZG`|;qb53wd0>GaF0}YRYQxJg*N2>9{%CYW-ZDbw~KH}n$7Td-^Ogk@4N)`| z2ci=ZjpOUNJf%Tiv~)bjf(*0WnEbrDik6;Fcwx$Nc1YJ_@mjlX;3YFWscq`|-O<>_ zqH_awvLW%$+6V!j-c>@~k$f5>7|VTq>-LM!Bm1zZNOAGoh!Iqh>NHTzk$IgiH12iS{e644~Ukp^Lu5~-|PkxYu zrzs*bh4n=eoyanV^@+MiHtz@#b%uz-{}J}hZ=HVM*RPsv*JRta-Gs@uZBDjr+jf&C z+it4KoXOVHr+WYPT-WyxSnKSw&$*B8z4k^fb``rc12`7YBYL%m&0LcP$TcFR1zG2CRK@jsd7#)dma53j_VVhK{KB+#XgnUHoME5yzlOBvW zNqWYcq|`WG)eK@Z?UgUUIntP_IdV9Hd^tW10YO0iGck;ZFg5n z_;zu}Tb8!Oacb+NcyxV7Nn(XT@@{E3aCZWC(8-Y$B{v~`W3pcq?Lz@HRxC9aVEcQk z_fZ-T+?ctffXiNLEIpGUN$whemZ*WW{SL~_vFNdgicPLBTgw>dZvo+P2xyY}mn?;M z(%cP84Tuy0_gG7zp6ZFcx1#Wa+S8;k_z%k_2z2B-dJQDzy@3$c1PcbfFR4hW26C{4 zcw8PQ7Q{%f1H^k|4WuInf@=y~rB(|Tvu8)C3y}`bA7jERfMobNVDIB-pT9`ewpor3 z#3dn>U(iRjf~#Q8q{(>u-bo9rb2guE#FR)}wwU`XfL2Vt&}6p%ti)Rpmx*T{ESD z7@n`un?^+PK$tq_pG!MYY$vnc{sW}OE#Y&+u=d{Hb5{~WWb#jSVesiytsdHaFRTD|`Z(_l`eVWp5MrSjC%}bYAp=#_8Iy{+q zAU7rTysdv@ev%`Eigrv`BV=svr2fzb9xQ=l4&6n+uB||B>vlvvfCt7@WTED-;rir6 zR?8VjCHjA7i8{(y$n}3wylkx;$u>f;~LQS1Th>p9JLslv&le zn}>J_aj5dth-Ur_kou^3!SKyJo*LM@7m2jJTUz=%>M?L0G-W7_!V#Bf@HYvatm z*7Xpmw;VDY%qBF{Q^&cP-l8wXkh)_-T@b*04G!kIihbG>fHaN~@hfvM;GTGmWUV<8 zw9bEQfcc%Y7@%V`^t&G0ud9Mj73S7rYj-Xh;KT)myZL09Oh>E<51B=0?-+Q_X9uJu zf0^t8IHhAF7hZX=DWjsKl-==~V=PrWj4rPQEhbnc0t}76lQv@JaQ*nR>`@3G1^Cfz zrncf%8e8M}+DOZc=Nhjb&1NrQRCu_5IFn}#xq=+it_xsw>SFrMOAo;V+k>FOVIi~M zFb~Sc@98x!ImO|Qvnc|PFBNqQvaCyw8!Ajk!f<<;(*}S_J{yZkL7W{&qfbVF zU4`D2*ZBBJmFy+~#N~eADajQeKgn}AhkxlFwer;-rcI`!aS(`N{6qbrRVk4 zA<5eD0}FC8BroV~l6MRZ?|XSRHTvsQ00FbjxOZg9N^;s8+xHUYdkx{V2Lf=9U{ zOf$Qpr-q($76uK}W(?(^<*_`~$h~(zUx5R(6)L3@#@f0&E;8I-zv~pc1vIa7`D}q` zLza*3j$t-SigDz-=(4=Cnukd=z{@_@6yC0XZ1b;udfn!~GnqVbV0TwM>m{S2B;)fQbG}3O;DEj0bbd-V}gtIS)yEPFG0{2xIg?y764dRu)ffDTORhes*o zZ*3l3Za+Lj^~|0c7H=Cl`M|;&TY)`3VgXZ*$4^&P0Tz3r>1haus4xg^;~bM6xq7;W zsOL_c4}4Kh`4I6)YiYV%9rFzbu>k;XAjx{;-bStw8b4#nYgeTEO&k^`t$*n7H%jKO zP^Rxwszu=D;ipyB>!pu-7+72|CN9~|`47L4E=q1|#sjDZMMV$nQwwur_Q@(OMW01R zL_jrlw^qLPAIKD1!fADC6R(j=WJG&e;h}$^oHfUu#_yz|O617PUe*fvh#Z}vobnVl z5B0qIV$9#RQGNZ-TB;pWlKq8!9E2%YTR5BWS?(?Ykbcifdt@G<1CtV_CO1qR$=H45VPfY_QUuSXhEDyg&}GGQcC>K}$+G^dK-%!=e^%-FS8 zco<6RzXy_e?gF4rz)}qU)wv{9bw;QaDFf}Bz+@G7Wnnx#_6ZqRew1PKGhl{=F2{kl zo^W#cIwN0oq7%S8uOJcc5bq}tJRonYqQqVRqTChfDpT7s#T6?JaP$h7`_XGNtj=}^ zK=|HJEyDaIEmn6nPj*S30tNNsNFB?FOtN@jcsNJ2*mSPl+w?Ul$1y8yML4ahPE1({ z4z@tirQm5x?+D=mvzLXu?Fir@I8xJ}uZI&0F`LHpz=ezEylVA&q3!Z1Kz+zY>(=zxcAj}sjK@_%!-2YzkO+_i0PA8pYJKS5?OEPK(p2=qR9hlYga; zgQoJ>-Nj!`FbinIP^8X9=ifz0_(lL5p(4Tu=;|h+TYVUth9J(65I2;kQ{1hK z#|!acg)kqZUj>V?(1t5Y+u(%Q5Y%a~xgb41w|b(PtDq#M_uyy+0+A47{?)I6hl`Q6 zasSB;Ad|1-V2Xzc!la=%9C9*f0ktamqDiw3R1|KO<6U_xgbE~;Ix+$9Q1-njn4>l9 zi9f)En=>|J0@{j^0Fp4pV}ue|wLE$!O?Y~4+>9*u**26U*9L+8D?%Ed4*e zkAZ60-DwCKOBzWIDAXkF?GKsMlY_^56dWKNODUw zJ1n-A)VjEWol+(e9)I8gLamc_&BQew3$%qaGhm~+O^ImDKWV<{jO_H!eVMhv z_6uKm##(WvJT9gHFDk_hsHJm=m4dZRaZ|}Kp+@O$#luVD5ulZfF-ZR#DV?$-sl$BA zb=UB9RTTtz$U`<91gN3sBV0eaFq0J*>PfWRmh1J$L@t`c;hus<>+#j(`W~_!4(E$& zItv6V&Y%iJ9Pr>8_Bj)v6cRPv1eG81Y=TWWN4wMP9^lQZXO$0K3#}g3gYfa0`Y>*K z?&u6k#WZNI8r8uxmGf%s0=j1n>5vE4Ix~2lBK{17aH9H1Xnl#A$X36P0{oGiPB%Ll zYan9BzL-~cKMfe=LolIRVR?9&^%PrLc=u@&4_hSDjT0#9Q7B%|2qSqVtFC(PaZ)wn zQ{rJ|b1XanDel`OT+p^Mp^Y6#Jft|_4l~K!H(Dieg{7@M_eyK$8rDBoZsxvJK)=3z zkL@GjMIKtfWDQUGUaezI+qWQPlCFQ8%GYZk!PHG48^9URt+S-giq2=lp6WD2V@c7hMU;RUkH+ zJ}l`b_;c_dk2Vy!E)ZP+X zZLv5EpoDX1#RFKW75fm#SFT&uXVnDK;|4u^x<+EzsOXtvk?DW^W_q`@VqS$~!F!DX zkIrnyj8bUh#H?^qHVU*34+2`_3bR(lss(K_f&_DgRDh2ws2zO=p!$k!X;iw6rQ;!)Fzud)C@&y9OSqAi(YbgZBVna`Zuam9D54__sN#gz(!5;WdP zLqaUrzm;D>2`Xlc4R`R07Et5&Oaxk&wIjkc8GpC!z4!q2E{Q{++abvT0K-04QMa5>M?mFJK>^=9nu_B5_2kv>J=~x@YWdJ-wQMQfyZU~TC#OUJ^kwD1@ttC|96Eyw3x|s` zVYr~91&iRY4ir^1ga+hyOUvv+8@f}j*S1oX`WFmd+YNmJ-I%oc1)#7S#Gp8_hcs|RulR{J67t-wh9 z_aF89Cf9R)yiLE(!8VUp4jPhh+5w0S>X|)}a+Ol|5UnEJvM#TuA>!Jzi5AWup?(do z|8JhQ)X-ba5$}4`{S&wiCX@ppbemp+;pF9+zqIV^hbeUMtCE@=Lrn|LTjLoX)D?Vv z;UXjDBI^$R7d~xekY{H|$^uL9j7WxumUHQx7}vUB&J;~AwpU`=GR{mK{Q1S`Ho_`(wp{Nz)3v@;?DuU=2ZuW(Ic3(g@}H9=<* z;wJa=CupGX_(S3nen3MWZ&)NxE|=(`Q0;Cju-V_KR%MW?A9=k)(GA+oUnIeF)C$~y zGBC#tBYTo3TrlbTW*i^|CAw}pG5BQ)#T`l8RxbVIC?o0k zpRo82Ojs+qyn;BGgt)X@*E)Q>2Szn7L!vt6ZQO~3re?i0W^^#;hLZzpnvXj#Nw;DIU4X@P0h_k;xOF^VwR3 zZ}MV-Tjq(tGxvV1&^g{6$54Lf_&3v$_F1YTF&EF&o!4dP?PnWox5Ee}n6l4&qTPOc zfBC|bLL{}d{#20LQ@^EqJ+~?^dsdp|<`Y3We6GD43~WvAbRHqD)*Q1dFt7M%?d>V? zW}_mf0-Zq8jtqiR=t^kWfm}|pH7*-FJg!AaGD^xg>W@+A^ns-26ig>=O11`ou;*@b zGPp_-YB7EFN`sq%zqd~c3*F)$L-j$Tp*&4q1?ZV<1pzDLlpOPg@>GDmDw>nTbkz+h zhZ$v6JTd>`$!yK9X`^6ETHOXyb;`)m;hNJmfa{WnQX>yq>MHL!qB%SUu8xsGMgTN( z@G_^f{NRn?`?uvIIGg76%Q>L@>GeU323PHyjYcq7CAn$m)yO%~z>ihy(&9J|Xk5IL z+dd%9>IEbK{1@Y9dhLOLz$#RPJ`^A%PJge1ZHP(CVy)RarEom2a>AQm z2li6R_zC4MA#HpWh;AInRwtLwypY+p`tVY219^!^$v*>2>j1%Pnvh1P5kx22$vCUsoF)1mZC|vx2Ccw^AQw`X8B$MiZA4i)nwA}PFj>} zCh9eHX;a8V2sP*8T@GUsh(=j^BCu_6N((glpX>#wd3C|40G?K(T#qTg4EqUuN9mXS$MvFqt7slCf+Zw z%YnVdT7`SC%GX-6-o+!T)&E2U^?sc?0n&G|{vE<;$u1`{#MLZF_6&r0=Tj>%gDm(5 z%j;!-{P@WS>&Z*dn(|90NtJqGmM2|VT1J-gvlaU?CzYvKK~#<_3q5~2LR8m__m;Rf zis%^7KFQt_ZZ7X#utS41Vc52;9uj2cTHDK-0>W&;?koFlX;=V~@l7?Nga>oC$Bmm> zrfK@pGwH8I&FO%GyF9omEXy>EJ)?0Et^SnUM6swZ%lsD3$I58-sXFeXw%Dd|##DTS1kVs0OsChVG^k`R8+DZ(~SsJq0#Kj!Rtp8LMWzWKxYDxfk-LI#e+Gx3Rf;uM5jaL+DKm)P4j_1Mb zvhB(3iF`$5WfYVg83G(}|1ChrpkYE#K3#+2dG0TTIS5@DLK@xZztFG9DX=d%?^H@C zypm{tiQeKYNBg4u$;kPH6%32A?6#Qm$K;Yv!=JD=X*Sms3&>7G36a2YQN>O3ntG+@bI&7x`)1%TIDpciw^E%Wtk!l=3*oa{jN1Lz8{*msj8G_Lh~y7--AZvt5Lebzj{-M$~~%f907VoxMBy!FIL~ zdvflLdJKH{6+T-FKgC`7XLqVndFTylMO2lm;tv0GH9kZ%JsIW@(X#99WuP>3^t*PM zrc9?N-R37O1dr*DcDh0TDRJiR0!7k6>CfNS+x8?b#$sL(_i!oSWDUM1Huye}en%wn zKH6~1q^r*8PaPl(a*Fjc{9DhRw5`VVz2v2O6zqJtvjEIw0b47;_kkf z8NCHTzK5K}nud54*&ei45*G)!p^p!7$=o2D^f!u^-5a+)ad%|i$G7UXblXNTl#$8! zaN}`(!irJNIu$QmsZB`P$;i;VwZW;5RhX;$JLE;67d!s-*t18a#&X8ze9yh&|6)Z+ zRrU!B9V~aOfhMDGf|sAC-KItgpV2~}_l7z4plV1DWEI;$@S&Oo=*p)FL9kVO7w(09 z!jdOdzRQeG@0hNNNPypsacbhXQIm*fIlXQ?YcbrUO$?p82p;XJmbhGDu8RIJd5h71 z?^|G$B)s#6VIk5MPV>wl3SOO%46(A=*MH^`Ve^FiiH-ORUr{Y(7{q)R=NI`wES*1L zH3m3*us4>I(lV3tHti<>v*f*+L2Q9-bJTwuaGT(mBNY8ovey4zg-(QPP6zzfK4A^v zJV4g=oTfauQgw}9B;5FDQJAQI{*A1GKXpZLsgO|y3!G}CJVN*eK=2R5zY>1HT4EIB zEL}pZJr|eMl7Dm>+CR2kS<%65CuYmE9P`JxH^>pYiIJVA8cC*f#T1J_zv;8SUUUai z%^kySKWw!1N??iCD1=Jw(5Bxs>UI>#J?6cn=k^MhnQ6LRX(vsAi`!TLy^wwikZ5y69#$^U}Rd}Gun z4MJ6^6kE9H^or+XAU5ZiGFkra>Ni!=E}F`pWxZ^w&(g#XuSa|hvZ+S=PyJEzo#l)# z-29@*;alHU#Z1I%Z!m3*1v-e^heByV)x=b)**-tEYfMdQQls_crTx4^{rIa1ClF(CaT zj^ZtdqL&<;yHq#hFBKNGg9JOl?*dBPR>j8?9$nl0bY$2b5tW~Zcuk)$-*3GCJaoJT zj}i3Bum*c$4$Q!ur*}pHZ`XmgDJ;AtND5y!eN* z7eAgAL?Sm-(*<75w|e>qKJ02L1V~*1SH*qPd6$Ji&{Yq9prqn03iaK{0BHyP*%O2M zd;N~0jRilsc&2zU4G^7RtCx&Wa)hfVfHNL{cdNapt76>Cxe3ghV(=Z-GB@&*%imNt zkJqC`mLKHj>Q{ZM#@{ZaeEGoPXZcqW`fyj;Za67$3+e!%h8S4TPgsn zegHFSz?oIzOiPn>MtcX$nXjTxICqiylsg~Mf#$;HDDKGJ7p+fN;tlF*XqJ8w)KjH) zmjT4SFht2uEWO(NT^{?f?EZkMAU83~@mTW#VoRblZLgY%Pgs$xoLNwE!%kRDo6 zBw$G}eG35uM7CdQ%xANuq&x-FYihd*qf@zUa5!u9rM-u=y{9|(;k=s`%j>Gf<=QO$ zy3aUN3MhFDq6-)69v@{{sU%>8t@=+jFx=#>ad>+Vg^dNJw;9`OeaY1?IGAE ziNwt2U)BXk`}J%wpi*wpRitfvhZg7>?~(6^pCH z8JAF1Ez*#9sI8DYnbBWY^xy5$M|WgcT84X<5nd9P`+Kda@asUPjhk=Hzyn^qb4C-^ z0-jUa*QMrAI;SXu{m4Kfd%zEDaT%e#2ZmGgBZ*miOas7ip=!XG^Qt5 z6}l3-se8!&^9}*&Qr3C#L?rb@?5+!>{G}t;zgB-Dfnib>@iR^Vw!2^xlb0wLi9~yM zS0@m*(^a9j;K3`H(GD_C{gCN{WR3D^sqj81f#HoCttrtQKOx(!CwkJqkG zstchr-ZJ%PI4zD%i7Ce;yy+p|SFNxuUlq|W=%^@y;aH_qLNHIroiccFy#g(|wL1 zYBI)pG?^H0vK5nGKEYbLpB`y4jkh#%kS_M5MbF!1JS+l4L1>v+yXjyv@-<0cMqdaBWJP@M2 zo^0gFJ_*lj2Fa>e(BjWehcrN>*PsDyxy8#WTjyQ*qtf>U+tbkW5I8eL>*Q$*7|ZyA z)ZiYrY!JxlVR;3;C|N?RQ{ngfI{GEGvqdS#t>l8wZ$%{>CoG>G_+M*oo|&4B zE5s|g(bouZ9{&eJbvu*A;!Om0kT__<7nJoB%jFP$@>h(6!m+Xt!}D_ECP7i#gr@#B z?K_wA3;Z|FG&RuwRh<%$^^3nd;1tj0AmRQ}c-3L%G9O$u=M5i5UVQZ2!6POC~r;>E9# z^9)fk3v?%lbCc!p-(4i0RY{3b5;DPmG+&i=I~G?p7BsoSt^rBREq49(0DM!?u)1ci z(WkzVSM8URG4a-CYxVqozkIL`CBwBYwhyrH)ez$EbMd{0>4P+h}eMr!@Y~*sybGYcmZL@{eU4vZQ|BKI+`A zN3(7CX4L-Q`%p|PsU0ew?L#nsmZk>CEj2-%8;0DFRGcMFtit#Hj(uLNXPuNQTM9X+ zDXel=?@vi*cd)m7$^sU@<>uY^dB7gyko*~nh<`A|vbwl~r4_H+g zb}xPqq<#?HO}2a?LYFB9=@a6ClF2Tv2sh3eYajq=(~bzIHGPzpt1~q(YRnSbNK~8j zQl7g1ME#+5!bU-(x6{Kt+a%b|L*mVBXX)=sek;0L`c3`+bV#Mr;Vr~D5=+r-bp+!L@2u&^2 z#TNlPyc7FBzkhx;2XFuYAov9Uc;y5FoC(!*N~+4XB+km3wrWaJ($q-gjk5}N6xM0w z6OGH|IJlM#yk(zFp-R)qO#bejeSq`-YhmUssZI9m9k9#Q)U+;s+bG_yccDMz>c3S|Et}0y&}~?dOWkWaFB7xB z4wZ@`qT9iTh!F!1G?>`z+BzghoQh7Ayxp$f_ZNRsK8HS%X{fWgVVRS%jTdtzH-zrA zQc^Gr3u1fQkhX^PfKX{xp~}s`;1d@3rQu5F7h*j)^xk)q$nfs@3c;SJ$TmHr zR5Gc`B$HF6#o}YfZ+ZQ?1n|L3-|PE6VJV8KN^MCdD~QnE5pA_Uxu2O+q!2s0g88UP zI)Ar!G+c3rXDY(`j>Bw)mDrmLu71KQ_aYI!PFCeT7S2i$)LSl3THFeGoU3k~{wCDk z-H4nN2K`zL%?&Q-e<+aQaA+>o1}1acURzS zlz-0-*kUbPxw4Cm%C-4`wUpoB{^PDN?ZA1iaa^Wo+PkeJYemCOCdQ((MOCduv`#T| zE$I|=igX3tf(U;x{m@_s@;&bYa;G`Fx^907$_Hi^E>#)>A7(Ikj@z`$jZ>3-EhfeG z_T(Suvk_Por85!yoFfG)xx&VY8_`x8MK>`B1>l6rYtlkG%P!1JlXOR_KRvNG)1|{( z=!HnchmB@_Z+wa_yK7uk+kJlR($!ihMx<7pe{KFw3e{NJdBb15Sp~(X*gTT{eu4w!hIcG9{n(+TL>*se> z!f1cfIh=kL5$jI;W=qaWZ$M;tWdzL(iwg(5tv{6u30V)WW#-hfuDn%V(yYqTMqSr0 z?Fb2J&a(44YDrNbzI(;Y8sOf}oy(?6^A`w46S7%kYlz5T^BgxP!hv5*NqnZeO38R! zNHd=#-tskZ>~trfyj@@s(GGtJI^P`S2k1D9$Oy_mSfoax899auZ(o2U&cAqacI`^Y zZ>5zD8xVhvS{=e2l?Z@(P<&!jI}U7@m>nVR)VGU#EcuQc*&O=Thc*?e7mN>b9AasXhzN85yOLruKg=DvT_Am%GVr{UPp6MgA=N zW_-dD*k40+bbsdI8&zMURbSa-&GI)N!u{IHlG}M&|4INp(VtqvzqY`LlVRhrpIzJi z2@6>$yPsgLNuq{qu9hk$w%&hcgq568&z7~zrBg(LAxs&rrDjbawVmwm5iGmgQv8Hf z^u#pI%fCQ~9c1t~TZcBB6UwUZcv6w~vVM_O{l=Rg0PX*z+fy$0$PsqOQ!4j)-tR6U z`XdBpvmJTmkT?u}E;ageE_R-2h6ZU|#_mdB)jUPd`l26_UsY~EC%o9^$?)Ih+BXAY z*{a&TMHfN(WV>b){e0Pe+y43HC<5|~4{Ne<0BB=nx81Cch?2Q`>I@S9{L@IkMNHj{ zA?)d@SPb&cu8IDxu97M}9{N%MQwF_;8W33yqI3#7KHG{;B!3f|c^b$kEGSAQ!xDKY zmCOki^`7C6m;Q#sPebZpZl=1*AV1pGYx+Kp96 zAS`(lQXW$rrTq4DZ>ugby`AB7fb9!}YWma9PU#JDvc7x=965wfSQEI?H6M+2L z2{k#QZb$Y=!>&+9eEJ!G?z+j@nf%PTk?$l03wxlUDpC{`!zV0q!PvvsW|?O?Oo*H0 z=VWng}bz@`g?Z-?yn9kE#IVU!D1Wxq@+Yl3j| z3+{`8x}rus)BW@JL+4yzCIWeGZ|I@&oalx~hPkHHNBsXh0ykChO6ICBcKf|ig8&ni zr2dykQ!0I_4_3c+Mw5neaX?}^IYWGI)5T4LxJ`rOCoD`CB8Z>PB-0Ejw0$te5jBYC zm9qt1ZwSjbS;lb9k!A+FX{TB`lRU#}lFC!;&wuX}`CrYRrMHiyqO_H*6Q1`GAbeYG zDeYYm+2~d=+|FP2OSVoWfOQ3|iw29X#n7(8KU+(cTY2{D#xKNk<7+DVP1iRK$IpWl zqA%l%)#gX7LxiA>A3?J!S$;FOZ7#40R&4wMYpLvU&mzHi+dJ$6L48-g^I04G_Q3PsgG@L&$}?a9%d!qsP(_E{Rf4=;iY1{tye#{=?9O7b6$l6N>m90iu1Xo)|AZ znWm(`M%u|5^ICV7$PfZTFJwPqoIdLikI$afLb1!cF8luiTV^ljRe%J36b(D#%SxV2p!9(a#?`87h2rMXJ;-YTarPNJMo z!!q$aXs18uYR04$jLiG8x3L8L6P6owOL$0M&e|9!>n5+snyJ<1ar%AtW*u=B-^RNs zUDvGZYt=#fu@@xY9*$3n*!wFfs$0u(1Dxm8g@;fCLQgkh5(fl1rL1+ZV?bA!6`k?l z5I=RnRbyL;4WZ{0=_hKxO5>M2bizFJ?u6pgg%)#-xY}4w>Nf5Zql+K+FGKXj{n%W@ zh5MYW*j$km-SJ!YEa+AC1S0Bsi zUc8ntKgg8XrK5jg7SC+=2bljYb;|$t(UvfOjb+b5r~5_=y|~e`8_YXE8Epp{m==`{ z{fdyr-Zfb zS<6-(3bQh5nsq*WZ6-hci)srL?WpSC_CuDP?tBckRa(ACsMgCd+$odYi5sR-6%C(A z%E85*r4c>&IL&+q5h(F@4eAkjSV z<6pMJ%3Y{wDONMDCwSs#I&?O1$C6O}KgX=fZNJy8-2B9~_4n2Zuij%_2R>14+x<>03A%fk@Qr$(u+Y|QhkKrhn z;3lbyon>~12mWfOFJI6mM?BQ_-kvSr-Ply_xJ^>TkYfqan`kBOk~|K7@luMH>xrW~ z*ZL%L{%e$)|6YWsD8B)(d7p>W@UyOZWQ3}{6uo5@RmlU(1|mf~z|m9s8T!obCr*Xj zDKNcbY%ncx@y;d418v7#q%rF2=TL_kL`K$Bb?dM*Nl0(BmjCd-g+MuQ)(qtV&q*S_ zTLM}idI8_$r%s-O@{Tl2EW`S+@k}Xs%U_i{1~LR3pU}j^_G`7Kb@R}+o4>aAKJu3k zgTdD|+N-`g1{aZ<<;v%824Fe>6*n)Qi!r#&slOKLz!zjR08|aCDZ=l#3C$%|uSEGD znlr&~IB$0_8JzA)DbDS`d$`XPYwc?0C86$zr7}K!BO&^i(yd{#aH`(Q_CwI*PNjyGR8ji__z$f@}Bo#4uBc90%beV#3E#0rS zvb|=;|J^O(r;eLmbnC-0MkEk3nkH%x3wo#rl_9id=+S6745}e+Q%qep0R%U-|Kx5ny4P|)Huo+Wc}<^U8MJu+~*wJ%3;dV+;sQIy;BdZPG$8DN?qezw;1 zyBfKy&@ji0I9c|W(e9}{DTc`f{nR5Ss^dnPQ*qLm~ z7Mp)yF9Cq?QcLIRr>_QIMOLnSte|)O4%5{$H>=RD@>;2-j){vkFFV(Mv=9rxbL94H zHEoRfwO6h=zjwpc-3wtoLWrq5Lt+;VtlGSY1nf+;8u>Lx_~(#q{(T=+=LSZoJnanw zvSdUZu;R5I+9+i;l5oG;5UG}+N(w?6USFNAjqwe7HN-WDU$XcNGn zWkh@?o5$Y9ZfS#I6dJ27+w3-DR%%x`O@Cq^E8hG45`~OMhxxh4?62u#(h>E%I*MQ1 z+ux{L046i#HHJPiq{;zgJGoLn{WJrcwp;L&m4v<#AnW3P$tI$cShk>)LwhmoUj;># z%iQoL4~jZwhglR7iiE$(>GGnMBvxP?6F$-!2y|#S1OeQh0}%_p9j_L=Fb$_9Cn$Br z>EWjWD~VpkgO2+L2kqV7v?BNfdTQbcbO4S?g|76c}Rwd`tfxBGgbW z2lbW940^oUz5MHtqwVNwa&VN5o;-{6*?ILGc9-!u|K%Rs7)&#Q=ty;0ASFQhUetrZ zNu}Sx0=irVRvV==g4eS~T3W$TivYP+eC3_ARhe-miGoc#ORNgQ2$bn`(+veSE*J0#=hc=;IOR0Q-nJ`I6h$rzpLk%opTZ#Wv@3 zi^yW!0mP81(K$FDilZWjm+cySOCmm$(Tnf}7to9?J53m-;0+pFYR}BK91*rTr}5bl zEXXo8-Ux@TFPnh5`qE`;W6}_Abv<`^FY)f>Qh+JE%H6B!RW3YR_lMv-#PSjH8P=*r z&wZU~{xtM;n;bRrJTJgi+G5H1PpXsjRw<2ycr}rJT3qyKgV_%K&<{h+&YZd^dCVZkBY1cXqRSR)cT=W3zgHu8H%2Bib-})TXuVC+_ zQSo*8Tbo(a0<|H|+(H9xI=9&PGYopimMWaubmfT_N29FX{t zya44_Z;JL#>c5HPb9Lgnau&RYU=$B4;pm+c)q&~L-+LCzFaUF%6>ImM*n|vkKlJgC z)jQ862;j&UQC+~hCP)=Q=v%53YkphO6Zz93@553%+mK@5*BVjJak2nR zNgL42X#2MB{bSjw@ZP3Do&{JN;$8ybaQ|=MUcEW&RRnHc%p@JV8NsGl#tRnrP z%hF1x&$@^k6kxV1J4)}Ql}4Q&1(`Yv5@VfF5E6_00gAFk*d{m@pb;wgsoC4Pqp)s# zcobUR_wY$IdKVQ5fErSAcq?KM<*1O{d_rO$sxG0MO0kxR(cG&DEVQqf@1)U&5x{Ej zww_eUHeKw^Q<}Gw6{>r-T~Dor#VHrvxNMqk6ju0Mk9Bh#w-plT|1tqd1@~k7$#0KZ zf&!5jA+PO>zIv1f-Vni(=x)Gun$z#3iGWaVnOzapwc=H9iG%PV{Z%_>2a}C+-fi?fsa@?CfbT$bf{WRxYtYCPp)mvPS7sksD&}t#ki6{nT*zkZ$|&r(%cB6A z1-tuV<_eHwV8<0IbH^lvJ952y?*n)v&c<6$n$!NWPHWE`0+9oxn|Qee`?kHf-@Id z?*H+pY|xZMd%YKNR;dFpG^Z{bypq?Ac0#ld^f9iri;uxiWlOi1pCP?uayGw{<|G)$ zOxN}=U+dA~@qTYlMzag&O}`zuHxGh9?S%&``_Hp?wKNK8iK#P2#F~QIg=HE$^q`>e(0nE+;FgCIX33mG!6KQ?KHO0 zplKQ>jm^eZW4p0!+iYyxwr$(a+b7BW`TYTN?ChM_-I>`LK=)Uc= z#c(QUf7vNA<>Y;-!4l6xIxjgAIzcia56`v%p zb8)^hB}kD80&2nMg;9&{%9a#}9pacQa+_~o&3|FK0A+R&Fjf|PEPRPu96(|Qf@_xR zZhmH3TvX8eFM%MYZk(E}P)`FHt$)D}E>eKeS7dG%h77V)|HJ|M4regz*|{atoNS!o zF0k{yMeVd0fJ3}Sgrb$0M((_8TJKfdW7bS)*+x$#jy-?Xg4lOUC>&s_7nv!OVTPo3 z))Jyp7;X!YhmD~jYcQ&|26$QwkC85_6XYz5C%?o!%TnmuEb8M)Z0D&JS*m{Zc!zqG z=a3_2rZ3m$=JoNS^#nzUsp{bHDE=}Wo5QegEHsYX3`V?l6WI>a7Lawl)Y$i(dRaF3f=E zYRd@(*H@JV8dLzwc#zMx?gSg@lGUv{$NY209ee(iB0L$q?AMa)Q-L}~{6A&<+S766l zZ5PZV3QL&Me29rl7O8{c;mfb4D9@jtqj?=)(kt^jlCf=4U=cAX@){A0s~uj< zsS%!(^yh@Za~R}dZgFojncMsn{x8X{xYhkAg!ea{XJTEEVGl)qYxapbacqG2Vu2mR z@tWGX0CV8Y&i$GI@ge900Lu(nD7yT<+Cc}x#8w>r_Noz6L~R>>%k zQ_>s9j%_`P@((!ISy(Go--}NrV`^S9k<(hGwq(wP)^N!r1CNDu=TD|g%;R^Y%Mx;b zRkHmBcNGMc^2zb3;7T(8^s%(p$#g}OAB*Se^Vb{SfY}a_PIF0!`(%fp)L^6X`mf5OpJ+2j&Vqr)}pcL?fsrz~!Zu+q*Sp=et)< z5Sz7O5jbDoPjd6@|B`3Q)w+aLidR&9otlot*f-D!f~?V7oh%Dzn#Cl*M{V93ekBgO zs}T8!l@oPF<-_rRj+X5W28q|q24Z`AY?U{El=P^#JJC$TBnpHq(pQJYr5y}| zQhF4Z$RR=hWoN|e=8b2fOInB#pW`&ba3nL@P1@mLdFi|LyzTtxuJ%t85MVH8wxe*a zq!hoW;Qa5j?T>ZH=~c!sR%QWJ+DI6}(?k|hRfhB!&0M?Erw+lxoGYF8g~3kw_P*;U zLwteme*u@w9&j_TMqw{kT$jq7TT$O2d!=t0PTyV&gC>vkIA{`^czzMrh}F2ptgX4U z6leVB%nh}|{!Y6690HZojcT+PJ*4J4g;(q};sgbL4Q$S1n!I4-E-Nk;BDra7J)%q83 zfA;`I<+RC+YIdrKLmF$TZp*Qd_}>dZ(ox*+{Cs0uo0E)H5D|Z4IA~fTRODnUgX*`XDE$m%r8jv>S-rIJ5f=sNE%zJDI) zZ&zvQDsZG3c;Wre=aev2G72d*;ck;cvQ&Nd$>aBb{=9Z)n4r{}8bo-MlgzWeMnK#| zwEuZ${NwjWtNr{om?O!Ux6?XdP<6pP~ItH8QzH5{@d`$>R*`n zfAN<3;wm(!Df|<`{7|qhqX-qA@Bw(q=X8{uMxm%9Bjsd&E;Xcw(hkomIr2KQk$sE(F83&3Wrn2Ht6V0!!ad+7hn9QpJLrZ z@%d%PZvK6sv(J^2Y6mWRAcxnhSK(24F7;Qg1Px%Yu*wEvz*lWed{&qnY39|Y#Toq1 zN0=*{nyWNfz2_kPckVniTg|9w8be`$aBV7B+S$O_KZVBhtcn3p&_Uz=qCc^f0!H!FALKgImH zQ`PSC#xd7I*!;V82Z;n(!X zPfh%_hI02C_&iYG5PgQx{!opp`Iu?sVsb|j$ZU_){E*MX!LRSXxnUR+a$^oG4w2}B zG9Fko1Zt9M-iKiHDPJFfzA!eNHGg#yzl_l#0OQ?Mf=uf%_!LVB1~%jsVOg<;;Uxo+ z!)SW)FyuU!&&r^5=kBnB+Eofq=3fn(NuoQPhCCh+O;-6&$ge56b-sOdM6 z@+w=2NT?#Mu2}D-8tnj9JaH(U&`imi%VQBQC|^Fs%D*)wx5?EBsu>^)U<@LGiOz)l^@@10Yl_G+P{J#k%1z$*V3r)3a53=D=n%p>BOmpR|&;_ zwTlAXHgc}#x1(kk~X>Z!ayV@ zsNO7HO$%5KkMsva1|`yW{(U)l`f>ikfd%XFX%8QNbpR{x>Z9Ek;z?>$JnnPZ)=Wc} z-LlP$c?F>-6_I0=;}{_7Y}%a!x!#n@m(KuTec3VbvLheqnV9!o1BMO+HJY33Fl=P2 zcDzIzcjLJ<&EI5{hM|iHT-hAMMa`De!mRFzzuhQ{O2YMGj+rni<1G)x#fg8T7cB98B z^BODtDdO;Nn?q8bITVtR}7p-AZRoVlfo8q zM*Zvco%HmEx#QUtB%ZM7z&iHEPb*eHPr3x<3s>iIEs=x5Shmj^;&`1IR3ZIfzplxT z2Sl;L-MyOM^S)RaeS6Y*kxl*-i^30hvCAh(jdG+wF^M8xV;ykT>IJH7wk0R>HE?Z< zw)Y3Wz=4%A_xk&-;?~-`_fsr>Z--sFKLbahse~Mu<pj@mU;0%OXeLQhwP>*alx)|6Nf1QLK33}SHukSqlP^33LBinC7$-i|QR!tRKj(0l zX`Ms5g-?$?E_8$ZFQ2s@T)D-BI2>I6R*qI=4GJ4f)={20{>fa%K%w5`uHB ziWhc5Hn+v^OeUX+?Cqgjtd9s~HOc}zaTebiIiESnZN$ly{a_kjS`} z@uN|rR|)eC_l?9%6PT5OtT^E!{5&N4v{O0T*Tw?q#D z2A3sh9RU36I=35}vmN)Do!FiUsY?LB_!>I?q|(=`<*fHg*v0P)=KeUPS3QZSHx-B9 zEUbK2d@vi4eApH6*36o_I6oQtLI9Qt^0P<`G#jYdM#3ULc~>1z zuCRF;uT`J8BuDW-#Y$>j6=PN%Oug2|@9zvPFG}mK7D8@xfXda8PUgB>@2_3>?w;5b zAvj`R$R>JsIX=a*tMzXmOMaUn&54giJ*@B2XW~=^$vSgC6q`50Pk*Q9!}}%_iLShW ziZvT*4@CGcwEVuO3teMxtUlok@O_=6&Ufg5P)Qf|Lc!%Yo$ zmzLw!gHN%7w86>0cDPhANDsMQixg#1kVD+5aly1$X6=qjg^ONL!i~uTP`&F z_-fj#DYwtBXiGs4*Rq1+3oD{>XQ2LNA4ICLz)v#Nw)Ib-*HE%YL6QcH0X75%?uL!l33!y6(FF9Phau_G8ECP&6r(6VtrXIe#kQhO0-vfUjM6) zbP8G;e5P>;eAEGnpN$v~N+ykzsh-S$BhRz9=AX-@w-+aD;Enxq%04v#jkfa9z%RPl z<(am{<*lVQM5Bzgxd0_&U zAk*I5F}85M3uix7>GITw{Kuwk&o%5xUbo3^=`grwkR?-ECu9=(<*Yp`K4(_XO_{kV z@Mr{66r3%35bPCgF$72#yAbK)nkoYBiY#s;rO%^Jy|J)%S-O_8o=p1`t3tu7MA%)t zKW#6=3&7tU?|8aZ4T|xtmMbHrHnzH8r7nSj$--9nt`t;5W^Z+V^C{MF3fW&H;YILv zWHa!Ba0Bdk;d8a-C}=V{&a4i{@nxD2HfNNiPBL?qC@)jXC9wNbEU@`SmVK9VVqIHB zeha%CGkHt-YlL*W_O-nXc*0z0%~vR}b)oRMI84vVGFQ*>+7Ge%B0&|49#*a-^#~NZM;H2vY{<9MoiXdf5_=H!x$()oPMu&_AJ5T6 zSQu^DvH~$&&J<6#^n9#a$$gvs`auOf&o%ZQ__^@&C)nkp7&=U`ELUshrPrSO7rpq(@XVA$s+!W zp&xw58ih4)E06xV(Tf-U7uMOKzV6jnU5k5mdW($O=Vd0zT6W>l0U7U)DAs>u4Q@UN1K?CCECa zOP8hSWP?OmRu4~?%y>$l@sat5e2m^sDp& ztH7pB!ME7jADUt^=%6L(NoU~7+$|D7_vUZ=islH&Qg|;Pq!FqGO}-_UjE%thakT_p zJ)mx??gQ$Y*+Fgzu9Di~_M8Y1iyZRJzR@b2N5Nkt^$+-6kN>X}xYURd%l>-1ZE6*& zGVEVJBj*M2CGf|3@#5w!xAJ){-WAS_0>ZM|F(+RrcTe5eb^yOLp8fA|=X7MP^G&|b?UC96lCkglQ?XM!HP5&yB@cdzO5IgGN?nFN%PJo4c zuK=EnR`=Zl;Wjp9nPp9<;$&EU4ZA%P4*8ARhD8Bds7Cp5)j2IS`mMje9Eeyi^zs() z^d}I^0VRHgL9v6o+7VV&oVN-0A=_G{vrIL-=aBW?rXd&_6sk`+Vf80yVc&LGpQfD) z<}k8ZH?`m_6?z14nz&vdjKQ;w*Ja&^pVGu-U@Rv&gsM*VhRcO zCw$LE%w#HAAA#v2pCKl-R1p%tzQ?zj4p!^^3obTozn^8H+;U}yao=YWbAEnZAJtD1 zVmj=jmL_)uSVWYYVgKyzt46OAg3peB+{oeRp^9?gg$A5CjL>~#5M)RQVune43s!O& zn>BKnJ>lYdzFRDejH-4=W^1jsSm(ZIr2y(D{z{}eX_wY>0dG6Y-(VwlOI&MUK9%m7`fSM3x^O<%OZ3i7!$hA$LbE*}s3Y^#InL~xU z48q0Wk1r}LI`y??>?8v{7n}1}JK)(ulqP`w-R6ht?7ZZVqZzbe4@wggO1=GK_ z?`wdcLIm4*=lhIAyrI{OxZ@@NE=f-0Lo$wS_*quxc!j=0ixOI6jyzhi%~u2YTTAn> z2V!lR&u+9)iN-3j_;unYJXl*(SK4!cot{U`C}2i^1ALWY;E$P)r_aoI8(4asbelD_ z{L0HG859pu{ekE|DuGteT;Eo;1$G3CL@44mDnWu2>{o@lDgEHrxI)pP66v(o?XRTo z!v1=66#uofkg5!z0m=Y=BUet7iFX5ZLM|S58LC8KIYm1u@UF5B6OcO!u%|^S=>E-k zjcsgAVgo-lh7xd^L-0-c>bw&H=U%iXfE8gbhxmqW9mRIf$-KQ;XADBY8`xgx^z@HH zSYEaoJ($z_EwrKH+;czg+-)mlS2xOKgWX>CwzfNiowsLX>} zmdHNs^^|s4$F4%defouj89DooB9~$h{Nl1Q-of0Kc;jbUstiNqMN}ROM)iay3-GLTrMnyt z@yY!`4}JhssDP!gi`o}iI4MF^jV8)^n%`ZhNY;$58i>n!ikil&VMW>56;46Qnh zH?ydVFO?`oxSS{qGnLR@Qm~nB$~s+)5pwwN!0 ztoXSPDH~KR29%y2HyeV)J2V12B@C8A%QxiPfeS!HgUxdr56i<_Aa(murQ!OFi$}{F zJNqiyDmvt-jc%B_dakD?d}?2-8h0T6?sQvPv~-|J@ka}gpk<3m z#D8_X?8A9nj}}8;e@vYenEgS^?ypN(x-62S1dY$h6Rh*#Yw5r|Q3E?d1E?+(?VI^W z5FIc;Ht%(~n6z{Vn$D8qR0zP<50MK!yld)n*x7F1ni?#sGaTkKEhVxz|MfGo*Zty6t+{U!qGzRnrPD`+k@tQ+(U9+ zM!+3En-NavbaIL-c-IZ`q|aY)HCm6-gvJHUtK`zcxqq6rXGY%{yrsxtm~rr=%|e5t zZ`}X8O`MB##4C}%rDD`hq22sY*4YaHgy4X%$tT4AI~@McU3V^3P3OIZ5iy+7(~U6P zNm5=|qV4N6`}`x)@Vlp|U62KaW!?=p8Bd+%cSup2f=fwo07|QQ<7MYViGQ?2bstCS z<^%cCPn>#pF>cvKbm4-n_w_Pf%3L~62~27wuuj5nQBa`40yPwOzj)Oto

;W_5s^ zKV3T6&;E^jP=8CFc$f#k(}rB7!}`nsPdCyZIqPm~;TW~pm^e zR#CSSSr_^Z{Fa63M&B+S=^OUqE9kN=QQ{x1a}p=Z${pw=;GaAoDe2!b8-jdjCC zC`j-)4QPmlohgWc;6_DN8Lrc<2$~YWEx07{D=Q~Y6LY84@vuy>dqh-!gW}Q(w4#5E z#4yMEOOyXB82y@9!_0M21w8(IxxW$Du}^KqeY^|Qr&g9eNVh~@gLV05x5Ymj*y#M# z&kfKwvMoEApXhV3dU_T96Rq_YLA8y*3gOW>b;fpm()AtcZ;9PrxTmyK5&q}(#Ck{L zxicryRa!IEG*_3)5OfWNo8h_9Hx$%8sQw1&rvr`bKE zUu)|&dF+LdSd4)2$&}c9vV|;Ao#hSG6G2k)h26VyXe&L}I22Xtx(UAsD@?Gx*rQM3CAQyl_sQ zg%y3Bf;-=#)#;5=QuVwf1}It6i-=wGXk9*!6kd#azGAnU<;diBevMIA(t#5jJT#uC z@G1^{04LjC%!y-UP(O1J*BQhVJS;}zBDeLr?!DGvrYf|LlDt7!p^OZxH9RsX+sZ;B zpkGK3glR%~|G<)XcuEegI-)z0UgdOr=fl}gPCm7S@O%JtlLiC%ZIzQP{jkyTnBe}h zmKHn}yljz}28Z!kLqw9<0UBU!9ug3N2S(}~vW9ej_lP}}};A3cNC(y;C zn6Fc-&mw5TZCMMyApiXPza4x(80!6~n^_wn*;XDy2u^H)EWqk!Vqz66GGVy9Z|qw) zWjuQL6GlKLK@n;=0q?+!q1?vZ{9mu3N*X!?A_qTFP}Op6RjyryD@zaOxN+2E2*24j zP{Maj;}w(R_SbgOQ_Yw$%}@?*a29!Yzlgl;U-x0h5T9-zc3aAe#urXWLmngKWxPlB~VsF;z)01vL^VnR0bLi&D7=yhnJ=8p34+V({ zxlv#%H}Dd?8DF2?>@|vSv$QBe&E1ifj0g@jU;&b0>dMY!my^cFrDXSMCx*pSA6bkUN+;!Pie&X>NDtJZMzTp6hwBqC;CR2|HTE&VrJ$O=Fx2oQ1e{8j z-pr>$T^Jw(`oo=9y;r=Xn->Wg?S>Z#U)G5q7rY#eZJ~LbL6<+Ce&~sMPp_uGmp}*> z1a-V%<#Cv?fbvL;tlpmu4gOtKIvUI>oziOD<)F3s+Jd%v^>1vgRrzugu$R7Ha;ydlL5Gy!f;~_29O6hncoQe_VylVqUn(rSOcez&$ zvJjjpY=sS-Dw>TD=Rc+dN}F|C@CQy(b=5JQ1|B?;C5;?@&(#ix<+ZWs5CO`f^xZ4K zPtgiFx8jx0T^ezfH0)TDABcY=p=_z4CckT1t@vnXT>x->=u@z{x|VDl&~iY>fu-X? zjnKPv-Kq`;r)yC>{9}6tzpEo;>+;kO;LikF)8R=H?1l?#zTO+|V3b%BK;Ir_Z4^4~ zahF(qhbF%82<|H964za|2JR9miR7X<9E!}pB3C7|7DbulrhD4=K2;Fr6<$|6Nr|T3 zrvN;+N0Y^oa0Gw<5v5&3E_2R>1Ap3@H4Ba#j<%HDl^avtvV&+IXRwF3>#?DI}dY&Vm0G;qr`m>EQ=i(Xy zE3~l4HQOxf91EO}%GudnmAETc1f+M2OI)@!`4-kA*t>)fxS`})7Jkf= z*G?Ti4HHr*53(e~55-}Z8a{xYisvgk%fUQm4UEXXxea|KOi>X8y71eF6eC`NRD^d; zOShLXdW~yk1f)A{Ya4xkOsR zbgM+5pvG`0fglKVtBF-*|Wx- zuSa0jtHKesGo4pt4dQ)pj%kSO^VcE8`w4y2Qf5Wo%jFADVh!TUyN(gnA9neZc{|M< zxN}R<#@16;rA!>GjPL%gY2oEzhEm&`&=%+tz7qTByy>rMVButM9TwIMlF1bm2$9^w z$ONdv1zG}p_(43(IKUX*v@LGSU(AN#s##&Z{_l-jy|V1fvMFgZ#wuzmrti=S3F_3y z`4$UBb!%U7>|~6j?^G}y_o;Pp&X5<91)?mf&#*x?pH`H}mcgzDKOGPui}+1NujB@OUg@m4~vy z3IHKB560p)_OG#~K%w^+$kR7InQC_R`#kR|d|RQK zs@VZrbxnG~`xbTBL)KycHZ(H5&8P2;TnM0JeZ8P2S)c85dDbET>YYHFmOy^9$ZSu2 z=~A5fchmZRZdV^kZib&YvSXFCt6;OluN(QBrgFSWsb5VGGoz%OQ)e6Haf2 z=uFCe;~N3U5gJiRF|s6yvY&_9wI@n!5$TJ>PynwHd+W?|&wezvDYm4@(?bD8q`%_| zMK>xgt*6o-7)irmD=!F-4@aidF=*L>IV+}!6w-uC%XIH}0)TxL>t6l+^O;lbDW)=T zHbM!+VB~t$_tCBDc9&)*@LkhLPvF0n)81I8_cV>_ZDC7|D^#8RAM=CePRlkCDi z+lDscK?4LiN$f9i-(BjGt^)dV|11@k7e-K?aAaUt6Vz-o?^WOn|7==FpawWlaFUu4 z)mtUOfalzHBVXg)r74Ysv2Qxz@^Ksv+Ndj&!M6C-%W-)^ZJe>vZ_ofBHPI_!%QKc_wXr*nmeU5nYNcG8AV-J3!ohcETjHQm$HKRsZxTyK2g^i>uY^oNo8Oi=k1xy5~}% z#Xpk_0zoI3{2#E0dw-&h3>?LhrF^5D=~;%h_vK2h@!6oKU*n#jU~Q^@jhZ?G80e?7 z8aXa$pS2XoCM^y9UE37A5k<$yGLOWQ424a3cTUtM4v%Y&^FA5P2uT0A&Pv+vgJDye zJJD~46Wg)QmHJf<%g22293XrIp8d0~&qx)Z8D(-o77Di`1RNTzSVhtmfuZlbRQu~u zB?L_Z=c~xOSu1^j+8gJ2$_*2PcC4YbAi1PUHO>39j)B&MGX|Bl`4Epy$defF6Tq6j z;|Q&G2Lm88;_PZz@!VVqZvsOd!!wjF{w&8*x)$~Pp3(~bt^5wnW!?kPS~hLGV5UCc zq{)>P4lhVu)-d%Q6U3Hq69A20(viRrT@+h`L-r8pv81;K5Js6@9u`2Y__N$XB)s6$ zcM>YR9iX4tu$#D6XhD zn!jLGnId)nJ}K9!QUg%^$&iLwsUZ1!Za7z@BDV$$;dzeh(?MCLwcdtp^U-`Tu@cWc zyuwQyCoK*tU9gyo@rN_!9x|TS%JG1MG{GS{A{cC#9jtYSMm`vxk_tKaJLE5vj=JS+ zgdYd#_>SnHJF_W1&wIGEjx6p8Fo=UJ(!`0C|k)L&D_f$SdP{{`maUrR3obx@_CF-Yd?utz2)>X z9R{1A_S4W4&}UDZ$IL@YEi ztr{Sd_Utcns({(d;iGot>8r8e32f)1;HhzD^bk=WkY*&kxZ{GO#&>9aRdwDN5Y<~J zg0rl3Yd^-`TRF>9xE6e&a%lmXq&L%F>)mHh`E5Wyj`$jjUc+w^29{B(+r-p1|yZGPfd_m~f~adW1jEbx}Jf!{8Q+-$kM$ zN9PWH5?$shZ9_-BbNX|MibkIQ&S|-B1F)J#4+%)W+1G&P<*;0&-KEm7gc_)CTtti} z!z5@ed4~pWL>APp%M^|jSPO?N7f*Q)h*EqZm35tQOI{NKXEPhvLJ8!!ULFaNF7RS! z`vwJoO^I{7!IwQCn*JnU?kAjgV zK$f%XbYLxgxq-I|euviBbFSM;?1%83v25gBs7&XY#NQ7ck(jAn9VtTW0Jl$jY>IjUub`Q!hoXeck1KgS4#vxBUq16MbC;@UFLAI^uOJkZ_Y} zW5+*pC%r^9<{DO%$;aub$^dkGRJ$s zd6B&DrfS2Q5zS?Iq$xQ$8QCGP?l~kiNIqo0kBU11cU1mnL}3d$Y>p$l!}Q7)&`YVl zEMxl|Op3GIC0}VqTlb)KgW=$HTQWi)KSDYPNVA1Hmx^$jx8TjhjX_Q`SA1JG;|q6j z{^E@h6aeHE-=!qG@67$gDiQz}S0-ylxGzTxEDu;osKyIDsPNqSH6<_8JzDn|-QUl% z#q|n-Hh`a_%J;rTWwQ4X|I2B65gW#iwpjLKL|iQ+ElCr9iT^qzeD{<}@9>ERP3T;FTJH>LmT%F1yX$t(pq8aIq%Sb zVWr^1r({=j1*{ZicSx|G{hVyP!Yzjgm#RU})$2Q`a?-Q^`WgPj0!r1M{Num|K;3Fz zb9ix?6o`eVsb{D-WPUy1-?vcx@&ZZgk1pf%4voH9vpu!^g2=;%1{+}~STjpFvr-pz zQpszaQ=ZvgG{Rve%Pk=)FHoIDwB84vJrBTDm7*VxxCcqGMzu0uWokB`hy3+YD^`1= zlaqdDoAD0y#?(FWAio(HU{*p9F5NT9PxMsE^Bx$lgPyI(zBcfv5&_y~{X0+| z%#gDK*q%fLncDPP1-Y2LFmLjx<3LA<@k+y3p+H3Dh2!vhhvxkDvJTH=)_R)#b0lEK z(eGzq`(i}#z{zA%sQrC*7SZUI|F{kaRa$_x766uGKMhc?7i{t9U+Yj7^mm}_V6Jbc z8vR1`;%YHy^&VAi8*nId%C*W%@mJS=J?l<5HYd7mP7cXUPE!)ba9%l z!^t*XvuAT&Qp9!#Fs88VDJX%Kbh+W97FA~frx&(eG~N7$?hu8s0wtg|TAhy32jlCF zrhI|hZ3?jd6YuW&>)Fs-=XMr;Fr&j@3Rm(SiJyQ zd#+qJT!Km9RhqJ<4L$2|<>&+i^{vQDrJ`<0^B+y!s(y`Ko^<@V3Pd4oRGfolYDu)p zZNO!(qMID$@&m0WDSlzqK)JH_Mx6`(%vfOi!2DL0Qdrby!|{CgT#@E#*&!OVL}0k%S;8uQx0EoV*yB`G+| z`+pFeB})L=e274pcl?9s;sKaky`uN4eIo#bi=KY?R4hkt(rexDej&>?SfL$szwrpQMi-d?D>ajGT zXM^fI+K6!os$LZs*&TX$@9$~(Sb}`;4<5LZKrkKGA43*OD($56v{r=tS2gpH4*Zif^5I!$m0$o@ya45?j?-f}T!_+y<^zK-C~H;1OCG#$o-DD(fKY{9_CE9Q2>8Mx;0Ac|$TRd` z@DY?#Ym=12Jx|o7PjTnm;ucrr@VXAU{#c_DvT-ISbcW#mH6u~0X_gusQXnLK1Awub9SCn2M1*`3yS*0q$~sf0%w_;fwugPnk~-TTDlF+WAvLSb&PAnyPaiQ=2^5 zJ{GWaAlL3lrL2N}VkVL6yu68fY4Xro=E!fX=77T<{@ZcoApXE zHN1o?2g~Hcb1$}mcc`zBa1I;4-poLQ?dreefiR=ufpIun_BL}#8N_HfQR-?Trrj&g zAg0{u37nT0=TjYry6ohLwrsvjGe<+)x2&E+!;5ZIMyu|T!)}I?G zaB+=r0R1qJ1mP)L_-yzn9LnNvuAHz-dlJPIbhJjN3P zdP!Ch)7-Rv;MYp(7YP_NkTK-+!|;Vq*f371(s3}qKMKFU1ui#`NGGwP&);^=3GnG< zrcNTOrsyCsI7p2U`kScRqU)~b0;Q*u6AFLo^@{-N1lvv?<5hIe2yrjB6MPyQUtZVw zTI^}2QkPw(!L;6?MRr{Rf~;V3yFbZxM`XZvRJyUL;WD}4!gkI@^*ka2O6k(zy@3^j zmMrEaOvZQ`0ME&^8;0BE4YdTyuV@9`KkUW#RSm@+c?r68uu4)O-=U%QVgjc94JqAv zmfkHjX|J$c)=eQu-%A!f#!dv{#R_yDtfeB(h<|r2na=K9(E@Fg2I+n?^6^PNod&zGK~ll)3@0o$18i0UBa0~3)1g* zRhzegu+uc}b`lfTU4aIV0KT7bd`BI>2`@ zk0c(|3)vr=z_jKCR4h{6I!(BeYP=Fm_~HID-I5 zS3S{`cc|}0y?S7WUkUcN04S+T!JBRNioa|q4T*?>$4+JE?_e7wM zhoc9l1O=d$d-F3nxc;i`w{V$1ujaEAhV@1K7U0E>0gPpRJt#sE9{KqdTa;9A19vW; z(;ZW-1KF|p$8#R@^gFcD=*E+%fH>uwf7C5Ml?+>07f)f@G>SM|sC=`4#n>#E$s`=f z8eg`F{w(wMdFxjI4+&&E(*-P$>)Z~C!WA?tB`pztFd0V?mo~E~^bf>$Xt}jK17Gj= zzX3D1(20>n3OA>Mjm+@1Hxy?Qg4=6Y+oc@kein)D*5y4sl-81N+5mOSf-!poa8Om& zKW=5nb@6|;O|kDWyO5U}#=Zv!g1$owzXeINKo)&BpaL|zQ%?5|w5mA)2mhj?X=z&Z zY~Kb6l~cS=IU2!o^+`%AIx=hrOkG=2nE9zHB=N@M|7eDu`dd*n)%)t@Az7C2xJmNs z9U5?17xcnXF0CikB~|u?IzE}=<}0GEboxZ&bOEH0k{!O)X}C&9-`ms(vu3U&S1X_! zV^ql)`#GKRz)+nKT}*Gt8WpK6>vYUloH966?gLr{HW-l~#~HcB(IW+6V9`>XJmQSe z1I@qrs?$g1q;uq9HyIK2@b!0Mzc@*3F^L&qKYn;Hly;lQe2O828Tn1C#qQSI&&Jp` zoL-6wh4Nz+DupGK3dH``lhCTSEOiq>ogbC3IJBpmu6W~#$LfMn==C|0XIz0R8K#*O zA4b>O3h*a1Wv<`LaI}gkS(&%4OD{fai=rv+Ibi{mYmkceBaRtSiP;fn7UeU^O)~lT zyGWVP#%VN3DBa(NnGbebC<#-EQ9@p)?o=+}I2%s@Uz#4^62_}Y-r1z&z1n?hVDn@C z|7bc3hB|s~3lCo0-K9Wrm*VclU5mR@+}+(N?oM%s;ts{FxI=L$e)}EX`vdZvm1It4 zcCz+POedjG?mQI>w|nVxl3OBZOdF@Ve|QWA9B+TfpW(y}WfkI;p;&C!b-nfOTyWR( zvkSEIA)IVOjqlh)LZIEIas)QZEPQcdRC}eD-Uu_h@**LlmkIif$BAYoYDkcg3_;Ko zJEuc$oaY9$S*qigAq)FLS$h9`eNjk}ReJci{ppB1uWj`xN#x-HR7-u!$8Ihlj3RO; z$q8arUT3fy>BJV>bI&gP1tL+eXjg@@_Ft0o|F+0u-HPM?P?LVN#<0BK=zyW#FAwiT zQFd)leGRx=N6Ket$)$|#xo<3lOkYs8-vP@2db0#*EK}HBdBnfxpA|iRn=MLUA+eq4 z+TX#8p5mYZL91H?9ID(Fu!lYgB`+VYkDgtWOb%%*?m&2vK#!5o(Z`AQ&G&%?ct}_* zed?cs!v)rHg1VSS>WQ98Lo+r0dpuSG_x`~(OMlg=c%G%ab$eC~$WA!;KHLAiKeBu2%=UG0 z4$kC+-JXUBcdJutVTt@mEha# zyTAmpyUFwnVY?^{qfO{b@$vC-Usl(s@`#?6dOtNey>eYp0Ne!*;44Gg>gbttz(F(6}-xw6!nS}@Wi zcLG5}ngT{p0Bg%>KVN3?ZSa4dG#2?1_|TKO=X4F7Me59TmKqVns!6V94#YEH z>LAX~O*oLtdi*Ab+0f+o15g7w96uY--)@ZMDNO`|rf=bF?p*OCc_wC1MYF?lS=Fcf zj)9bi(qrMQ6orxBu~t1?(fD@*qhRb~ZkqDXW`JFzsA)i~22vRvc3R=alC_cWcD0%` z+!Mp$)R7=E9R#iGX6%XI|0Kf39miR4LU^yLjsz<$U2wmaem=9tGRilYHM!y7p!s{O zO9)yGNv#IhNt?=Fx+r%;38(+5IOySV_SKi|Wh|r{UhMH~B_GQ`uBHorF~?f++cMNA6Ua?n`)&}c(F$PZoTL>U zp0TzVka&$JOVsUrRj%oH4{FML$;$Yo2VDGuECXJczbH(vKR9-6{mOP#en(-CYN0gd<1(xJAEFea!F9#7r2G4&PFm7YhJ&KRTS* zoTxtm{Z8VRqtk6-{RQktwWc&0^}tX&Bh+4za+-#>p;_R~4M}OO;?v%-GVuI;PAExp z!WvAI`bjw? z)!ooZey^h&bAeiUxqGAHbw)9kXNv=*Bk^z|`b3ik6nuNxGLqJ;Ro)`fr%|Ma_-Nix z{^Nb38VX?F_{AVLAn#B@M~5vA9lIXFb)Tf~IZ$qot7I z3{a*TJ~?_>@IxM7O{v*UR{4tNX7p=!gpzL$|3}r&?+*F^6FMYjA@5~_btHFvwF$lt zvnQOG9y;Mx#y=x=elRzj-lF`pdrD)kB^<0YAfm4YIAZX#F2q+-zndNRI;}FBe};dsze=PzN~~lDE)E1OO~$X4VutuC zUrf*D`wN1t>0=NbqP+Zh@$1*^eu6|U5(;RPekVDMOtTUvV%k+cU`4s$v&<`mfw6ko zbFHmMt3oa^V%P8wVm4IUE&R&&LR1mgG9{B&d?5!3!m_U1D&t$3Np=YM6fP$oymS4ZcEhInHu`U*&C zyq2-m>Tr6SZ%0y|c7V$BCD_tlV9#F`@i;m<%D}v0phAns@)6(i_q^dO+(1Yf&?H7V zTvl`ovE#Xq64ZJAjc0h0fvxOOt6Rb&!$#`eztlX~$_wSrNF~$um?X~V4y*oI;~1q* zG#t<#CNvy;ke1W4&?iu*Cxz(PX$;culF!n;0R;f|3Z8y5%_g=}wq*}@j9xZ!{zHAC^ z`2I69z>$SFVR1g?gP?rC?DYbsJMVp#Mw;S~us`|3TzmBq1Wl)5M4t(!w9;fi0rNwu zgUl-3yK@#+=-9d0Bd0IGqjyVK%&4+`aC}Hhh??2YsAzFRmFnPWn~!VPY>;Y@N}r)|M{nr{)NOvR<$Zu-xj2K6A*T6$v*!jd~#6Dpn%3H0t&?k}IJ;CDbYb9+E zv|51zN4rt7r-FaO-%>WOQejKm77^?v@YD!na$8{Ng)w)ptFK9~U!mQVG*m}i9Qd}e zdsV()nV>;PNHhQj8?SLdv|vx$_&HQgprA|n{lGcT=JB+!#LGTMJ&kc};mN2nX7$iX)`!#k72;|%+4C0g>V6nLT)Ap4ye#4@UpfkcdSfiB)DiyZ zXkE4fR!y-;Is~HsDkX6OiCm!`s^+3S;sLoQ*8BW3mg2t5wi0?m$ zZhTlZ_La9kT6dSy^0-FF$G*pr;zv>A+qOXdU&yhp2J0|-6R)`Z1uk;C-@P^!iu+QrcSZ8l(6OPz9K1{cLr$4~=Ut~eM-%DH zjwwI+bl}}0wENQJ*~X%mO4*`;u)ajBR0(Dx!(2lIY#1Itml2IW9i-N`1*^_GSq1N( z=fQ7{@Nq4fqfS|_rK)358stEQa7EdDrV%QE$@jy1UQ#!>C`q*4CrLv`!3)+e96+8u z+ce#Y9Mr~LIU1GI^NR7D5zE=jT8yQ25wy<$1*rQ!7-g#vXN(Ev=PavP(-~h%maton zCCk@yw*O4*(XYeh2M_yBB5|4-UO1C8YPT5y{)Hc;ecfh%yB>c35cwE@wzl1acK!vN z&-HD09z7o%1g+PFhS=F^sF;W;!8HDbtKyBOe-Xnq`!e+iuNVs7=v-k`I`oN|q}2aK zye9X+kpXaPE}b4%G7EC}V|nhTl<$`=MJa^e4@p25_r=x@|Qx1=4mQ?J}WN?TSu9i@mE=8=xpODu=k7#>J3P~nCm^zc9XJPqWFqVo8` z*b7AVcjJ`4*cW&%D*{vUJJe+niENk1d`h;O=bA}YiICcYx}tiHLCC}_&+zgp(% z_8XfSu4ZrJn=$tEPF>=>982iQLS%XWS7{nPY$6h45E-&lQ>2q6vmC2s9=bOpPw z9|+obNrun4mC;z+WjZN86&0?=Faz%x&*lW8 zu(=T$M0clV&vdcT1W74q9+;0;YYyK~J4Z*-1>d8Syt5QMce(SA7V_(k=BB2B-os=# z&Mv4WDAH0MhG&$L;ERz({I4`6xDU8L?W#m~fB|2Jm;TJQfxl^y6ik)LC(ehGVhbMT zlMr4hA$7=#Af=VQHZbCgGntUaY56W$W|rx2GhR5j?xfU*B%Da|S_|iXmCY{}?1Wmg zc8S7T0(F4@ZM?g0?qAA&`Px|xpOq{t1dZiurK%j+H2ZYiwD-`w*wX`gD37s(BP6$I zH!~aV{O_1I1vg3KV2TXftK!lPii4m2{cg_*UhUcq^Pt-c(2tn{^M@j4^bG>%jf7MT zT!u&!YAxJesNrF=;&;HifhUmsNjufbwz(_9VV3oh_~;w1X*i1CTJzUj)L@&aMO*7W1t?NvXngq@a?uDsx;?f9f`;*aRrkXC5JVOW(@^?qDt-o`^s`B6OX}B_ zNT}Q@T<@wNim|!9C)?ln-Q~}xWibH1S#Zk+BwJMv@lbe)8O#_2R((=$VJA0SnB1A& z`MWD3Evqhrj{y0$@aIRIT3{I?X6M$7necnXcsHBY3m3~m1JVdD)RsXuI}%X|Izx36 zK=F-VRE?^K!Yua5k{QlvC40S+zV7QM*Y0SNNB3YbkkXWIUpP38jFa8ee|uT9RIH_i z;qf;^?{fJy%zbm-S(GrF=@EPWlm0E@Q27-aAIbpu;pkG%DlRez8@Ze=zdQTD`Q_JW z0e%Nc(fKBk)UPrSwA>k&VR*rA#%yoSQy zXz%AYfk5c1G=MBU1V%i}u=|Tan?|oD#!0xw@QhieTp1jgAdAnW3J99OI$?6*OLn2s z_!=>JI!79)pK?o636F?q8jt-+OMr|q(rGK9+P-PGi?THmcJ={)JYwA7Qq1!ifSVLz z69}oZ?XIN3tozjc*RmQ43C9rxEh_m}TI)nssar zO!Y}rCf~hmh!<14Q5{}WIshb|wvS5VP}_cSWbnsN#+xRUfks0_zuaH^UD^AE6a)>; zF~(6v(c~B_5nM>qlq)LtNiU9Up(alaB7CEUsmA^hbg+Qd&sl?@*`Y8TGhzP@LequCvCen-Oj87R~KTT1{0E!@GyF@iMYtb5uaswEj6v0?k?4$LdW zoBe6&B31q~`|CBo%dV7M2n*q_I}&QhbYQdQlPNBEZcbIwlC+c`t3SQ#5b3c*+}D^6 z+mq(W|BSn)&|=P?tGeacBr-|cDfGTVES)lx7VE!dB03art)F zpH@h;-3v8Lz|9U%obp$5GE1I%ceWSCfL_xpR(xZp303rB%+Us2Qi`NZ zp7^$1@beR^L|>6lAZR>sSB|_}y8HRh<<#%2uySAem99~0cp=kSz7Yk5g@o=J7zqsD z)532;$k_7ALVlw4xv{|% zm|QE>R~RLlqh~5ZETTbksMF6;AZT@0p^zIG1ge&@zEBEhq~9=g>3UU=?BVJS1@A1LAxiJ7Wwd?@bx#)bNh?#&J6?p-HQ+g=FVmkPfY_9qN3(0RjQu^CyVYt(AHk;3(Q^ox$uN5iSV3|luMPr_THAY zEv_^8xOoIOuwBa46NM1qarNK;;nRU%6ac=4Je<9#$p!80fzW<2^)|qwW2kaqE@7Zl z3?n$X2!hs$Vrle*EMPeh91r)75taU^Fis&#V2^lPZHL=~HAY_Oi@T35N{Ksqh1BOV zR9yfRKD0E2@lJhaa%=xC6PK!fv<#*2R3C396Wo*3hWG@6`k#|4IWKW z&;()}vrNm0h-O3iuHMvz8&qN$q(O&V`?i)oGHH~=15ZCiYGf;i%M|}KGfx#m9UKd; z^1#}u8Dbc`Ws}pr`!~vhU%iAA>9KQ{24@sKh9NZY!q*Wzk5@8P)WkZ;|N3ecJ+M2w zAvUwVvAH#NKH&j3O9rphVqxuU&T-{fGw9T3!+E=05}o zE*57t+w{vTQHSzWWRb7RgIxZE2T`a=5FQk_^R_@{{lW=>wkXnZ2BIXfumkQ&+I{Fn zq<4b0?hMM%)pZ4MdGIjoJj%Yk2WQo;br1^k%^ErKNC?wkV}5A{E+s|iajgj9*~NQj z5bx;&{d?l=kfoA?E6xm^)387evk8Y7pBrOB$anVKkRD9EG#7A2o7`3K(@yoK?HtgU z#@KYzd@>{4sbheD#8djFcw{Wxq^FQ46>Y8@!67!ZL-;qo(laNQ`_G|4f$SCoG0>EZ z&v*Mlpyvb*!q>)70>(nl=B|m!I*2tYdXD~!9tfJBo^(7Jle?Ca&aiSb*|QW24VIqK z^mjeqFCiqg%am)`kAp~hLbIlkcC@bS;anBC&?B$D2`Pke3suE@r3l}xSn_)*VmGCa zt0dva`Kk|sM!m#XQVlp?RO{@^uDB-GB^*C~wXN?GCl48H!)k4db~llCzHjy}9A}r12j)Cy{rVw!iFkGJ{*P)fjeo*2qZq4`FTT1h z40abf3j1zMD@$V82}1PlSZaGU=T@ zob?ImOjG}wFUj*?`s-j*G6nDar&+s3Mrz40rA*h8`)BcIEYseIRx7fd|0(TBM^0hR z`P^3%c)}CX)`3!7qjt)=5RjAqxyS`J9_(6sxN2E|9=?5VInZbVhQw*_zmhvuUnDCN zQySV#NJF9F)|RJCjcpe&j1$oioXYD@zu=rSnO!8;si|dVN5WqpX}P!m*R0~3-Zru? zE+Q^D^a1ynsD7S+?!qB=$V0F6)!`+Lf7qtcb22S)J%v6IPdD4p=+gfe`1$$!V{0M{ zOG(*STfv(b=B4SdSuO<)Z%mn63&y$t^b%zN55qe8`U{E9%;!*>v;Ug;S>fC&?Iu*( z*sv`16L{sARW`17FT5I)n?_?xNYNR)+Ai(#j|%OJ{_3)4Y-L>if06AeMi`ABc;kDA zh+!d8{{>lXvY62W1COeC}Kxw%K|HS$>_|V3e?#Sf&fqxbA%gKjVIR#JwCW5N-E|O9lVI(9{ zl@U=F>;+1dhBR>dFEjBvW>p3G!w?tpT{wg_UAWmq8ggjd2( z)%GnKSxcE_5Ju>ILCCwG3+-_Lfa;nhIZNFd;rrHXAr*TOpY`v-iDM;Z)}v>VBE67x z(DN4@?g^b-ua8|8s34$yFZjj*DL=uSMJORJh-hIg;ImPIQ}v5)zYXRs+@BZG4yO>P z1&aLGW}l9&YU*l?GL|HVqhWU3|AL`}B;Zgb@J+)rEnj0`jIQNRV#U)l5(c%RI%#TLnae?$3H z^I`7Web~i+m3S}Yi#a)Ma8bQE*N2Z%M_l0_OD&&Te{eSn5muYJmA{TkxJuOn&+G5DOw1~MiTWuHkni9y9I zo=YgLW-(wqBO|en?DlQDb1;|@`UsKwdNJs^GSlv;9c~KN<<)or(TDkkutv)*)z%yn z#sZszAy3q#w4^tFcdUZ8;?q!|si;p6oI-1l`fkYm`m?of28;uu5fcYyg>^Zh{7ii$ z2HoRKJ>JH^Y3JS}oqGV9l?Mn$k>^+;>;Ex`&fo0K+^rhzPB$0ss`@o{!!|d==lw;{ z8jEE)XhLuFG6hFCc*q%G5%QN!*HuvWGh$a4f?phRmgdi|j^i~WQxeOM{GTLh0ZRre zZdXn&ur+)X9V2g!QA-O`g0;=Pv^d{NAt8K z#b$XJu&%uOGc9MqGgt5K+k+dDiu3e^rf=>X+sn zx`!RJG&sR18A&#L zvBM-%Y434)DRO%Q2nVX~PA!Vsonq0j*y!4_<tzu>^X`rm%z??HU9ZI(SOln5Xw8KD%Kw;Q=IFUc-5U!>Pc9^=imAK}{8D)V zDGj^drtS5`;@h@(S~i3&*~eOug{;j?97B>)@$x+)%*$87JJ2+8BI!2APSy+p&39iZIA4V-OJ&JVUrPkVVAJ4Fbw@g{_#()SkIPE$XuRIJ)eTuc zN&>A;{l;omWic?Q6uDjg;C_v5Ov+d^(xW{XY0&ZT#o_t^Kxm3A2eLzEU{tAL$1Sf0b`#}J?KNw*%6`8j- zR%(oM(W3xIz*8f4?meKiFxUyXv~n+F%AY7XqFzOkT0)y>^QoLYMUatxUk3zj3^3F9 zi8<Amf4fBkcx-=_Gkgqo$~Kc>EV* z65zCqS@E@v+l0F2&fLP_1~Yp9t1n=@&s>y+Ig0mU6tbq2_}p(|T##1baLOb-#Vkoz z_P(Q3?)qteZMC>(>rilnG~+NO((K<oU!>D`&RH#nH@EGU zUzUdAV8&jTbd)>mvXbgI({?A6SWRqEN^$=Zc96#m(D`8BXAc4dnf4ONjnh!-B~xqU z`y8sj%VVYXpB$8*j&nV>`IbT54{*TtuGYnQu6aWx*K|!isZ6c>!Xu%_HShQOdJz{? z&P&CX5PH@j#PpEBm1DX`1Z+u^FF5VNXn(`lMLsef+2~ql+vzlJAD5KABP1<;cd^DQ z=2SuXB)DN`v{yJbJ1Qd^*qfqL`jBhs5=t8?639czD;M8w&5H>D?z+wN+$aFJdscoh zTg<qBzg#-IZH1ps$9ro-VYAiHr-v#8=bNB;|E=Di?=;pV%zn1 z&8Yy1{WpqAa;q_Q9bzwg6|MX)5Vy(Tbri-uRLob5D(WC;>gcyI)D?IHEV2jPsv8${ zDWOYZcAuZ2gt;H(EE>&m*4l#j7j(%+_2ah?Cr*Al0iU7YZlZ#ma}N+I6Sa4;hR)`l zO74HddfM4h6jy}2hX4gsG}WA#d=VP|F42`W6d0Gnm`eKd1*cc8muY-mjm!ZXi!<3t z#qPA8v8$HulBEcU^izac@rrEik*T-Ugl95Nq=+ZRVP?07T??A=3(^YKesP}oAQ@Ek&14FIAgXMmtd;#lbG}J&n+DWeev6xn-mC9NShw#XZ!so z#&mp4u<f#APz?=+ZHo7^||8j+J;A$0< zV^VJ>j6X0ppB^kKtYwh}KJh9v7#3xcH|ipH_dd9}Xncapl>HmegzkSLxYJ+)Qd(0j z2JbKi>uX$}m3k}&DU3p3Mk@T_8D1=5#Y+$xFC&T#7AY1g{wF*Zg)u>=zb&w44ckVP z=kv0?2I z-J`vpJ{Cnw^z63P&6i>h@p^Tv6pVWu2>+t4Je}>Wyb@5!_BD-wGq%lgK8dBa=6BIg zk5Cv{5Hv-tGD$T)0E?qbJz>KFyqC=;g`e9t;AB*SdWgw5?PDErQeUV?WY+3UFA<+i z86jXqY&W8g!yz}hDlef*dxwDE%&6H`Ih1|32RCrxrV4_#I>s7$BfUm_0JDq8>QY;< zM1Z*-K^!a@XI8uYOxsUvL3s@+a33UKS7J2p+T3;y*onFAGPb>8@r}Mnl#QNx zb5rc6(Pk_m9gx#os#W~Qqq$nKdIzu9*HZP0?PTc7f5Mp6RE0tTzHb1 zR&}aP6Wj;tOStKtEbJiXmt)mXJi5e82E1Bf&Fo?xPNnRB7sE^ezMJeAm2{pHI$5Ym z3F$!=ma0UnoqDHYggT@7NkeHMXy8{=R7Tt8Tp9P>OZD$6il-~rLvQ&jyA|Ki8QV`a z_{b!y^CfdqD)xjqbubBe7XSt`vqnXK@anCjYQlM~$gzE``yyPwOlf`0e)=(+_mlZN zk9=3FTtnWVSlyF)|9Bd zlIOk4^;xtYiHHp)GZ%|FNYNkObw!_6uz~D8cvcSAgea1>g9NUp!E3O&(6VD^V6Pc;!;Xl|WYv zU26ag56n5AeQ~1cEh%0*MKjj*^)liDQ#bE;2eyB%sl8{fB!01@LdJS)6Pe{#tQUH- zQ!?;0B(mZ4wIFSJn$&=}Wma-H)_52fq!WXp@l^fe1GxXj6GZ)DF(#PG6~)66V1Qi= zPF3b@mVQObj~VUd3R0TKtK<-hW*|YPFwwbFv@}-0O*lv5O}`B;o|p4` z{1|FLJn|J=_qJ4;ldx+0&+`}_6~ixxTX+E>%;(lt1RBWfz(f{IB*1X%Q-{vcN5?!v z(;z-u=|^ZR!9Z{(nVB^SBo6XI9uTxacd^w;FluFFo)GyakmBwW*KcCf@##iE;<)Qw z1lB-zZqCdQHw~ApD%R>fB^D)M%M{xA=VO!czo3f*YgIL}r~0i@%KG{XHg8-H( zRm#v+#uvzpD@NyG7biyQlwY}vIj>TCMJdv;@0n{stRYM2;YkzHanRikx=?of+!i`* zG&qaSJ}DaF+NiO6?8JTfYns_$f8wf3Gc>q?zz`J;$>c03+5NIf-}Xz3F%95* zPa01SmgDdCwz8V)w=r+o*k@XTlH4^Z3#ydrq#eK!K--V{Je}q zGG$aOIH2Gt@QbsUt9}M*5JD?$9rd}Ak1q>uVRXA8e{D@J7}Wg)LU#5Z^5*b9`s9gc zvS>Od5lD&TIrmiFkKTh{1_Ohlryxln>Z!@Vq^l@soY7(c-KXNH_|N70g%nC@o6No| zGuJL*y|@pT-GOXi>VG6b(5RzJ6J18-W3jeWXPaJGi-MjY>~w-}gsj_+_6pk6f5%dM zw3s?Veh#JCawkRC0D$*``;LsQLAdwi%=m9Vu>#&fr(nMy$Hw=m>x+f#@$VCr{5pj@ zfF;UZ1Fg7J2j(&qu|(mRqjYU1?9=iCkDT5f9PTv^ms8)}ES*Mr{yGs@DO=s4t|~S4 z6 zf}lafuN06qo^dDBm1lo^nJ^$ta+$v1yri`e+Vm)v0Rfdem-lZN~L4Y`;dZCVW&2yWp}=g%5|8dRZq<^!Z%Fa z7`vOY3- zYKPjFY{oOkgERJsD3iGS{N05=1IWK<oI`y@J41| z8U&5JX?lS(5_>WSC-sL;QK4}+#t?Iy{59)bGW#*W{}Rs0C+kXeF)_o-(r@Nef*c}0`0sG(qQfMPy8 z68h|-%Sv$f5_E39P3GL6JC*3SGNy-)=_Ik_156G~m59sEd>ST=MYSfJ1^iXH;Z=&L zruw`bX_Rz~LC`oZ|5kh=JS+2I%&3`2M$b4zR+d4XXOBzDr!ZgvDo(*OkLeqPZ&Luu zX=LlK7DeE@J|*8y1;wMe=ZItCE##l)-vW_Igy_jBF=>%pChs9nb1v*JXwm4lBx!@T zsE~Hcbg|Vuw-{#|2OkXAl8kx#4Jb7Sy+Wjx6p}KRt|^N-U<5*W)}clX#tlu%@>o)p z7~hEQW+Q-+$>*w8CLhxiq%<%?L>grmA?m0do+1zRrR44#rmrMLvhqUU*BT^@>cIZm z&%E*9qn^-Xg8UXbXHtRqq5C$^ac5~}>JL{8bJ#TcI4qGTi>R(FROBC_bNS!LRKRZ6 zn%7Nu(5+ssTWI9k=KSurr2Z;gJE1&L3e&>p{`Q)DmxO3Ct(NBE!EQt<;KsPkija@d zcn2ezU#D=M%a_tRR;5K<{fDT;q7QX92->g{+v5Dtx|K}RXOf_DQ;(d?)3&YgF(|TlA$z%uLLeRDRD#Qf70-Q zpXP~Q@e26Ap&1?4#m>pmkNxbxCwmPu;KIveam7yC)8% zzrpd5(UaoRuYJ&4-S{NMrQs2C(h!p86FP+R$_#99zqDz89M#`!;;%z;$L&w4@WZfs z=FfH=wFLg$iGrXNjcO*c8zV+VIq3pZS-R*+$z5?w&`3`ASmTW{VP~$BeP4oz=i&lF zjXP9uI25=54$ZS@L3y|84s-u+icBI9e2$cN=act)=4??W&9avuXaeGN?pgaf^Q<#G z|3L1D<;z*WmSiBO^mRATVI0R+H~M>d%~Uppylfs}*2~NE9M}z;gKCn#f)xz)79zek ziy}W^K{%cXT^jqCDKyspUPrcCb_svaJ;lhbj1NX8!gc=xB06oKwa_btPQuGjdVAb4 z_=24J$yOcZO#SMN7706$vYvRTg7fDr3GN56@SapC(q8ObG6Ei78rNFc3okE7Y3b#R zu>-%Qo}TB@kUk1E!!_AlpW2|k(W-t>aluONx8BQJa4)fDt(tUS*oP$TA|QVv;K8+l zl-5zZ)3LSZ+r;DXxExAV?B|?s+6F3mDIjQQgrPD#j1GpbF;cw@O)~}t0`m)P=m)Qm z)DYpI-1)wEs2Da)hmbd^nrc3?o-bv9cNjmo#Mh!bL;Za9YpU*vQjH&LBr&?#vOSGj zP4}B1s6Vy4$aJA`hd%nA;z@_hU$%3-xaHlEG1!BsnWW^oot7>RuO1ARy7w2lg$pOg`sl#J_w}^41@&~}H{Dy3L({5(%V2+7 zydfoJDUSE8dZnoE4clHGI+-lkh_ZSu%{Yr>=jbv(d+Be~a`dvMp4@I{R)6(36(xzC@}FyNjGgH?_@fV?F|GS-dZa9(adWvJTCTP4&uOSlpksn;IR7f-CU|}Q-ms(n;@ZY{ z#*IIL_-kG1mK5q|CrJBE&5^1?KGzhX)fGVHzzpC&Ou0okNpC7;J3UQnwfLl&S+K8$ zOlStN_a5-3JLNCZ!lV*NKnoJ?&&F9IPIJs*2`SzfBYF+>`F%fX@^PixPo2h?70+!^ zD}fXS;?t4pPJ5u)o&GZPTSiTHd&@o8#@!?0Uf31ouG_x9PGUrPM*U8eNfo@xA8rMK z^kpoTg`FE(T3%YOwa}FT`ERqV;q(0aT*=MmQDQvVZ9u6+fi5*05yf%N6hXt!P;8m= zCO%k2Z~xz?tI)}^@8A5XXt**P+;yInCs@{5bykf%ChQqe=b|S)E}EfG1WUiPYlSbM zqZu)F@Yvv?jc5J<22v#yj(MrY=)WFfNvHliU+;x;C-^3X>7S6uQFcS#MM0Pz zWO}r1*GDr=IoObj=pnnvNWX{>=dAu~)4?eAcx6xCqV0B{s9k6Hjq~44VG%S$5i~uK zBxfX~QN$Lo6)Tye8kiOm2iMLh)Pz@zQzNMHB&eg6GWcESK^Zc&O&wt(w&(wU3sis` zol;C(wg1K6vhXh-Yer~@`e`?zaDzT1;+-^3f9jHy%Wb7aD0@uB;`t?z`uK6Ku6F~ zq~q(Du-L(GibLFDGtC4YOgCp5c;oK(5Iae zkKkY0vZDboMh>Rf@RPJ(&Xt{t0&tr?H>_#T=>*QLXRU78D8NlFv1gV3|5agu9ESU! z7vsLVJo@$$#O5hcND9p%z-bS&%i+j!2bUPp(ITbSYq}eOyiVdaw_iIhnFZU5; z-NWL@lYW**#G9sE4C!z4mAGIqTJuyLF+r$tHhzow1ZCdN%FIbN!2jR&TeN;uuMwvg z3%={S-~hjd&|sqzhZI1$HebrxM~qFG8K3x+C51@=mp72Puv&4I{NJznLFf0BaX0Eb zIyZ}JcN|=%z!3eyN#2nw(lt@ZZfD$3F8NAirz39`Kr$q(r=Yv@U$bge6sCM8HPtuK z=Ke??#CdZK38MQ9>>jI5?&fX9%rM!ARwg;+t|nZyydsI2YPtWK<=yz(m+F;SfAEGx z#{W($Z^c|N|Jr!kF7G;-zkb=Eps&u#`t7g0aL*E#U)xAM>wB|*iS*EF+3w_`mO*w< z=K_(BaY;2ICd&W^bdB?R=G&D`4Iex23b2yQ1!l7Bgir?FWKivVE_`#EjGnm^3*cLQN%O`>{FZM^{&e9#dJqZa&EMm}_ zTh@*+flupQb@aoqs~n!0l1(pV0xjSpr*KlH)4IQ{WWt_y#~CY{mCMn9>=PCnCcu|d zCJyUWJrQg_cyVUBtV|@vcf)XHfEMO)W_2tN4uTc~->D_89L*5P3{Uo&AFO0L)!Pm+ zdH&{8-Vqt8YW_s%7!!b7*nJFfOFb1V)rjiK6_0Rt`pH?u}SvdSX@Cr6DS0FD%=J_ zO_qHo18#AskcCkjKkPN-7QMn)%uY_&-KVOqNbe{=OW$nXgOr9*v7P*c7<@DzpwD)irp*p(6?sNltohDXj-K zdg|0N8RM8c;KUWtOddA#dPPE_Zr0rKRm5J z6d}XfjPZ_oKP6Gb17E`7xRPFm+qB#)k$)r$TZOyg;gesR44W(q`V{{i2SHPI!Bg>G zZ(pl7TYZz0!i4{=e^_(0iIlZT5LT|pDpTl@wVPj%yqp!qXIvML8}@)4&84Tv7p#Z# zJ5lWOvL6GyvAyg|Us*=)OQlanJo0%Hg6{x>GeAD5!G^aCvl05<(_mxhQbtnFrbgqTo^j~jcE@a0Qt79!w{RJ+}k zAf+_|+#(3QKKA7;U15me85H14Dm}oBMSxM($<`LUvkrSt5V3MUm-fTQd4~>G@mJvf zLKkKcwE`A0VG&9^64t}F81IIiK#&9rxeZgs>gjz;j0^xa*#I)bd|EY-t*ao)UY%nvWGm00*I2ekVrLzaW|&8q))|L zd?kiukAN78e}SZlhKF4H1cw`t8_Cd&qE6Ud@Kt{G-uhw?;=TI~>Jj?7Z+0JOx>)-{ zj@!gDR?xi5ki~Jrpwok$W!#5jR}JckI$oKrsC>VFRS^TK2CrvjBDwOUk>G|1DERv0 zlQ0ezN64B;j%{OWQ{Rv4i>rU?bs~&bY#K!^S?8E)2AUF716t2G?ZoPc!jqKoJFYMV zs>)1nkK;o{4ZjTw0c~%LzJ)OVi(RfYhT(3w=Z{OMbQ8{2?I!j z0l?d5uzv?Q4gH~N;iA)`t-9u}Mjj^CZFUT1;vOiJQQWB#7m=*-j`~y|1M|vmloFbS z9osN@0O!QF(5l1$Q_Sc}dWfPq=>!^dgnl6c2P!99o7m(^#3nj&_hg=~} zotDjsx39)|`{py5E_FfBCZ*^}Sid7WWp?N{7YRH?=ucy=J?QT1DyX#&s8ED|4hkjK z{C=aQBBK@5!~T|X0S*#>B~hSWdz|k{HdH((L46#gG2I!tz0VW)`&_X)3W8Q<>G)6Z zCpD+)pixzK05ZL-aNj294XL3VST(JE5T84g^;87H;>W?iKeQ)&K3)V!OF5v%&-j)n ze0I2bJ68o^W{%dfIw)tRC8V>?B1#$D)V5_05o>BXyBjUl9ltb%XGD4c!7`Cw2^mFU~= zDHaLQ$ksj?Zfqm5yJ4ml*gP`EP*`|JCvpoWG7+Bh>N!;kkTYw1M;)b4a%4yLk1;@u z*Cs4ioK^12vtCUh*S3vE6XOH;@J3+>mWPK-(0jISiX=|JnETCv@%R zt2)^Gw58q={5tNw48}#WMO$WrRNWs%cwjHozrtl@+$YFl1Md2FXW3O?aUyA}Hzc&f z65HN0!vc7jeT%atZb`vKAZRcl^79WVY`Bi|;+D?@7V8D&AO5oE;z%YnLz2xtE#z+3 zRg|rKP9u$0ht$bG7fJ`fZGO8O(d%?CkaJcqey}`aSx73<4Tjvz5290(F?x3`HTR&k zcNwFz1C1Y@ii@@OZP_3AD_ZSlrAM-(rDxX5R+owonkstm)G#q^>)!G#fuyV~=kq@h z?t94{nCbeFnyV- z4c`Bzl_XA(iGgvjX+)nk_9HqkVVZJHNx|w=Sn`bfiTL>McsTFvYlS6bCR=!}Eq+)j z0kZ*Q&Xtv@mZEfgObjSO@CQs(rvrqww-Kjq;%{@#WyC+UY?x7{Z zOB-x>7As7RiFo0D%uPO3KGb{uOTzcZsG3G|o>l`;?NSxpgb*Otj%UiTsgM1zW?A@1 z7MZuMZ)z?v>XHe9Mup4Da85cF3Ab8Jp5uM_zC63|VG>-+eM3$bnQAad)mrqat^L^= z+u!wgNX}M|5!lq*Xif;Siz`BiYZf{-cCh4@>7KEaCs?^IV6Sox0YNK`jl9r&Xa)_3 zkY*V}L#Qd#%vXuxW-P@1AjQossN%s4d-z7ExhFSo3?utVJ|qIx+em&$T(cM8mZEF^ zCCkDveI8lJ(Ku;rJ87fFwr%I?_npu0 z|LX?q^D%SwoIN|QnVo$qm~#r2$O80X+a8ewwDLvqN23dr)b$Y5Yx5Ja{?6_8i@TS( zZGbFI{9`F@hxk|JipjnZ8=rFXkPeATW8~ZCGw_D2zsl39oD@H0^3TVxl!*-f#0Q{LB_h?Lo}#n9g2g zoCN3otpj=C^O-(-$ey0&Q8UUHT5Q_@*hE5$ECu#C4w9n-HC0!AU0unR)VL2esla%M zNYPTXt3EYHQGlS04?AAYlOjU(4&1js#-bRJ$RF-{S8^7tX|mABaAsUuVsUmz|X2HyoijXzS~OvsP);J_pBW;osp;Yw7VnR(-Qi4Pj5 z!rlZt{(g>mn+P62N%syQ_*bBvdy-D6LmN>H92IVQ z^J7AXx+#-kT^ZW7IpD3E&W+EbA3W%RL9u>omGxFt`P5p%ys+gXw>`bm&MktX=Iu|v z?PXhPq*n|jUb(&$Rqe$#zyhYbr4CH=ocr%IG@8u9tE7AJhuK`cl@K-YbZa<-D zBW9C-AoXAFQa)!HUMOxWs-e%!!wZU!0>7m3&`FvAK55v69)g`4nHxJG%QvN)IYA@X(b`k?f}BlG^tvu$?lEUB_w=;Thvu@1 z%C`afQF~%hK26|dwD@nz^j|Atk-SGY6{ZJXMhax_PpqD~zZMyYd*3zeRK^eRln~kZ z)uS z;FC~FUrxt9GP^R<<`(`^Wf3ayeUm34a0UutGK^*QrNOfKsc%K;gm1P@aT>u**z>)o zK%i912PpLyTrpMROX5A}Y?IvcAwG5z=dB8;S+*PH#PbEr@qlS`_iktP?zfeEcVI3| zTCOTET9IAY=Eu4MWIx`0mfP(13Xfj+70cK7_Y-?jD^db}bQvd>-6-9MhM%___EqKv zVSd+~x_wr^xM<62{3T0O@;id78NQvlenv|hV4|Wh*6=PN$|q9OSaGXv@K^B}=E9E> zBmE8CRP6WwazC1S6nvU({`J0t8r3lTtk2|Z5X62Of5^Q^#W#L zYC*x>F$#Nt#84=;&yU0BlUG9v{6GJUUPdkg-YHDs#@NtLtC`2s_bR z7R~9wQ1z7O*!e%QWmDF(o}S4Ef0#yQGGSKEf4P?d)oYML@kVXeNO@V%Z4G8YE{-DSi* z3VPqh@VBEj{(67^yxG)_J+O|;W%$D-pF;Xw#tX0y|091Vcd~V*`RRm%ldw!^9f5u3 zDv#kaFM*zd^Bw$I=}$&KKJVV5V*(Zpt9zg`ZXsS_p};hv^T&|dG! zBNF1T0BZJ=8r=;loGlU*ag0>u*(1p3o?=AYtLRjA3821Xz0bZh^FukNh?PBe$8X_v zI1{By^69&=YvGW)%NUOG+`$hG(J|Qx2hD72Q8#!pyu5&E57e(RE2->)X!toqq zS3fVi&<7QRkEirqhVX9Z7pZU2{qNIdpjoEBXg?tW&$bOo^YuEAZVaew-?ee@RgP)fJ6r-_G7Ls`C1W;FO6L3a-%QF{Jz!8` zo=c>T8T8EOfA&%LQUCUlU}L!kDlZ09+*X&lNm4HpX?iZ%&Pd%7$gIyoy&NX{=D*v5 zp!tTemcozGWHd|?R9`Bgvf;yNJFfLQWfA@&Zm9=|2iF-N%tv_dJ>~e(2F`W9<^l$l zjjE4i^W@ZJu!A(SF9( zlaM9&SWWv63Ya)Z5c9o$LDme7t;v{y(tOdwg~#tuw5)DO3;dxUbV}-QPw@RwRG=VUP*vm% zm^gi8)`2Cs26qABw^|DBWW~WK*9ge_dRbP6q2J!#s*JZP?jNQPKo<7^Qs^BLTN9eSYw^XN8FyU8UXEk_> zEv|P#xAMIu{wKJ)^$cKK@YPn=YmQiaMg_Ba1BDZbh*sz>TImi1{hTrf}`NX>y7Qv*yV$$;(!r6bliUD7rGUVpo+KilXXcfJDq8V`x2Q zw`3O1n2G?L8YSdNe=OTo{HTwbnITzYuN3N4_g!z=D^udq$Pi210*|o4%dUV&KZ3Uc7rOAUbyfHDg%`5Y=tmG1b zYl3ISo!@nB-8z9IyThQJ&y)|p3AOALCy%wk}=I5?$n0d#qg8gv0Vylqft<$(LUuBmMtJrZAP+vJeXy= zhRnuuZZW3*^2EXV=WW?3y>lm2e4x-1iSF3WFYRkqJ59 z;9ZJ{f2nRUl1DFq*x;Vek18E@NaRg5FDpR!Jtdt zIt(`3VU^?u_*(_b1D!e&!1qtsGnAoO@ZSe9g!_2nV~l|`g^a0Z9H(YybrF#u#zQpYgalXd{8hN2To1-^%HEZU;)Q1$(^^FdV+t<^9dr^J`)dIih7w8+ z$rUxHQ!xV*d=2-!LL?}Ipv!Io40(hnKyh9xnbQJY6b#bw42PXcpP_obH)d^4Ix>yK z5`5uZM5wO|=H?e~rau8?6)2ZS_|-EmS&Y!$Oz(NX*rRv(v;)MQ08RQ4)~Tp5nc1M+wWev%v?p>g)Q2sEq@LR znkoCR?)yEIJo7maw9q*wancK?$SZr6GGJjBl}1p!UTt#y8o{0FqJ}qo;c$SOM=5n% zkb-(d*Q5qtY=yILjYVuOpoC4bR)SJf8+R`7Y{M&33 z^K~A53(cE;zGI0jq(Rz?8L0f%aq)?1J1aUW1@NF_dR6MKr9wdi%cWXg4*6_ZRBFB_ zqnV`A@~h7|e~4PYlO`dgytk++A|)j`hWB{!{gA;GqAaZt(yDBquLBV| zmm-k&Wo|V2t((Mij>BJez=zT?lAh9VVkF^Ap^~mA`MnA>=NIe(K})Ssz>$k~n&ww} zv6dmFF`!L!*NL5xmFH%D&pH+i-Vb4JL@PE&GaEe=zzaJ0!-uk)v3QCxh($EEcE1W4 zmN418pS~Zj*Cg~VA_PE`l0cprp~oe8a>zjt4k3l#>c3_@kaCdjT!lBJlzqeL*OSxF zd0Q9W#TO7M7Xw&3ujDYyxE6|gPnFx94&y3GsPjEG<8xShN+}vv-nZvfeusYgd#_Ba z{s#Ea$$bt>sK21w$}kI9k6X02b63h_4;xiTR(hkz5EhLJSPr%T4paK5%JDn0yT0af zzi@lipv>pY$T1uUCE*|p8Srk@@NK$JLBpeM}V5SP&JwQ za~;7j(K7+kr!A9Rpn&J-FB7oz&5xnRvv-51(7}O?qRzN3iZS}f0PM)&9SSxIRWJw| zvo#MVm)1wst3B4_Jlq_ju0QIRDi(xQM*6i;6k}G=9OrcW55;iA%%@*Y4m&Ho09=E) z3zo+|PHFiz!?4eRVEiw!gu|-Gai%r}<&J=9&?;5DD_Wv}%)nxMqZg7)<3$k>_&c80 z+j;AS3r6J)9@SVH;?}%q^67#jn4aY}J`(u(N`<`OM{jt4rchl!S_@ejv(H|ZssdFx zI+)usuLxxQFWvc5yrt7EVqEBgt0)<#gE4=qtX{MA50R3oE80iqxGlVBR44urPx-#L z3JxL;DcL{3i`$ovT}%FNX><(LShR5qE6|8xx`Jwz$`Gpu3C3)g)Sy7m)L(i6=PH{|tOJX1Be=8bIOd^QAA=r1TAWUqKp8B}G5$3=<0jmD(%wOn+ToYF1A<0> z%KANC4mA}C=|}CVl2;=no7N>n*RM<&FZ_EQmTIGDDHm@B$*(3-`LHOWKbHweNoY4g z5%bL+DAxKYk#86u9>Mck`sf%>UQ|XmM%WI5R&iuckHeZ5p2YRyM-OWckr_Iyxoo&sxqb(9BBm zpjdIxF?uHrRIlz)b_|_|MRGV==y_c%V)?6jV|A|8 z%$tQ%?@}wdAE*b|Jg1l2|7!p1|MBr5FUYm{$4#2J=MQk*@f|rH+}8I}C?Cw}o0dA1 zPUFeUQWV&)QkS(52B8OFsLe%W@!+?~VpOAibMa*iA3CIWqYx&X#)0ry!0}&4d2^Ld z8D#;nXbOlA1_NOV6go|lN6bq@kswP`KX|kgH)xCC*|;O!hz_X+L5b7IOiW%4RAxQ# znV`rw68j*&)nz{A_5gFv{K!86$AY!%#@~p4!q;VLrb!M3z~>~!Pap6Ge1%qjP@ccP zQh8Ygu8Fu2kgDJL9yQ&~t(QLkd@9-C7vs55HPuGK7isPreYs5zYAdT6=f84>g$6oV z`m41R$x+nOU7NIOS3bEB=>{PbH^PmVk1`J2yvI>>L)NB|!L7=H>2otWEQtPnubi07 zNax)@)$l5axjS#S>(5i0p3x@GHC;B+JL1D0JZEUGH^(d0tDZUJdA}Q9*8_ zVoD+l+jeow1N-(yb6NL4>7Nzc=aUfqGD)q&ZYhvgRT7^cfp{;lTwkm=m|vKCD>3Qv zfvWl5&=e&$w#~?T& zEYKek{8pHJioZn2<~acL%N{xk_@Y%`2pcdh7FU;{!|{%yn(T__Sd*XSe0)!GMFtmk z&Ds(n#lDpfE~9JLy4LqP+%-TP-?Oe`oLm0kP+==;;=P~bgP~Ze5^C&d1M<#ZHV3P; zPU1&)MwnFwgA64f#h2wdL~I>i}cLlig>{)Y?No&q2!!y@vZyJ?zy@wdCC% zzo_53QNuHm7e{KO)_shQe)xpBN&WAfL+^$}^L7M;V}>U3J|M*_)Oz4H zgy;lvKibMzHuda#MOq;NI}w?7TpG;ts+dDDPh5ka~u){P4&3$fQ1AHWWj|5%Y*J`X~H-Pzwm!N_%6=iFfFF7w580idS`$?Mj&|!f%A6O_6R$7mB=5~FZ z>LGnIUW#8`zREW|L&cGevvnY7DGYgn0-R~Rj`#^$<8a4UqyoxH#W1sL452+InoUT; zi64`XM3M5M+RWYdUE?hZz}#9O(yZ5{m9R;5dX)cFfstdE0yp6&s^I>f0j)5p3!_`o?Y#I?6fK4*X|&DoCjUwyHG&|;jrv#B*=h$5lyLw6rU z1b6!iUOsS>;h54L3G^7jHFgYsvaDu1Hrkn<`Af< z!p}PUex9nP*OU4iE5b8OhUgtGnGpGvog0;uKX&YZ3EU4MCC3lE1iaDIOj}iS!B}zA zEmAr_|DZ74zL~2bw^$`5g2y(kP+Yf~ec(YIt~xEXLi(5YXDT@^^3u%8QPzoc?i2k? zDQCqG2UAAGSPW=?oZ^iMAu}a12(8~utuK*^%Mx#*0KA1hUg+Y)YsofAjy-68(X*;t z0P}A9R5;b|*=No7-bJq1R1J?8>0raAZM2Tb5dmKCi?UL_64tHJ>^#2(OpbV(R65d1 z$+?1jvuD4qhrm35WEnYm;inW|EcYNXR$5T*$l^+q+0S}OZ?rhALfj0pG+8pwBleP7 zorRdp9{8zZqLQVNEY;>a3us$qq36^cxr<=i@g>wZ;G@78-zyur0Xwa5fuHGJ`Y(?& z=q=?oBU6ty1BdhFF@ywh6+Yg*pZ$rw4$aaLFGr7N>vPK9Ql))7o%A(>l!zK$Op ze)S48IiUOMVv8vq(M4WhglpFW(^ z$`>Nb&uYJ6>EKW4zYf(vnxkWaJG~L#(cX`4>XejQR+SYkCf|j z-6yuq#FOzJ%A##BwO#?A2wT_E73{)6?ngi1!tBnBlJDqO2W}Sewdb5IkW}C;oLV)- z{R-lOVCyJ^v>v9g&)yoRPI(cIoCRpVnR8x9pQn}^jvYqIE1GqfLuB6%oR2SZ&7|e5 zwEi!UP*mP0Rph$oC?`|0l699S=F!!!WRPkfF4G$bvbC3$2QQ!w!=j+(wG2=1PoWgb z0mj*gTgcK}xK+Z*G`nObQqn9q10qbdvBb?)o+~O>K{wz!v;B)DT0gJ2dk4C|F&XD& z_Ig;z?98K^-*!kpk1c%%ps+Ed(uR%yP_KREqO^wiklRrS$dF@w-;aaOOQfpsMM{Ov z#)OU1MUgc6lICqM4}ZW7iX~DPnvtV7>=VuUew}4HgI9c-^HbJ`U5#(~CC%x+QA)&J z`(Rl4U>yx@3)8?koskI8nn~*(eOH|=>gwEC1bZGo3PxKgCVifj>FWKqmGxc(UTr=e z*b~2Lw9=+6TW2FGRW_XK#&YEudKWsnFmmaLQ@lHAea|}b>%lBk;7b*v32k1_g$yON8?^jqu5V|ky@AC z9jo59uYcp17N+kUlD8ShF|iH<)zvHzC=qJMA?QDDb^1M9ZP>4PesgZBt%@UGR!;F!dBA7~~O zMg;^gRr)F3c?IO`h+KH~-#f0aNUHF<7N0spbIT0vzHj@32X&*}J|MPy7Yh!~{;Lq_ z`LZ3CNQA&1{JFJXLOi4g7LL61m13iyqGM<5;&XL{EfFI<3Fw+%YOOpv^ zncW8tVoKVp0}Q)?)&ts>k6HoRMMExEqYBzHE0Oo?rFm)2R%TdI00Exv7~F1GR_O)w zzTL8*@;7#_8+~49SG~@sT+!2aZ6<0WNz+Xo6?yb+qZiB+0lJdL^`q$J{Loa58qQhu zM?AE+a#EX~sr;8aFtemf%`{;7H@=RCIaX1Ccc!TvZZABNF>BeZ&)+`+m$y@%`5<9Z zy)d4B^$)LbUFdxV+PqG2*}gg$YYuZ;DWRV4VP2EQOlWX_$T<(scO@qpVhFJx0l;H! z7(~G;UA3m@LkyRiqs8_Q?VXQL;hv@!QviOV#e3->004Xt05=oYxyoCNl91y$uhvW6 zhp8$n9;2cqsiHrK5Y0_?Si|7cR~m3R^n4UuV8zXux2IPkkKE({W~r3bQ1P5P~w!U z8NAZWL255WaGYQtpRW_6aeCc*-QH^YrDuSqE6m>;uZTM z3vf#J`2l@?!Bvw5hTAvVeI?9M8-ML9g#tt|146Qaa6QDn_k4PyZ0zD;5H6FZ4iyc) zh2j0`Om*93y+|x2FIrsVHrtu{*DHe>OvAxP_H{E2!J}$`ZI=dsY6Hs0omK+M)( zmNt*v8x=)RUB9Eow|P&1)Xa)-RYaTj%$7F+3ua=?D&j=0tbdYq zPv`EliU#Ia#T5bwfd&}C{nBK05i1{YS#pJkUuW8HWepEs^3DcijI3wgf8GU!#?@b` zX|O+~?{sI6jdm*6u(gJCSOZ(|vhHAss`Eph*v$$$YdlaZPFShyaQY_ z(e+%t79U^Vf8H@4&0=JDk}I+gEVi=o1Pw_84tOX+_nyUL_jS&hn5V-=OiQ4}IwCha z@@FUX$V>oC{8WHShvTQajQwd&W zuYNg#vB9dX=_zTshbSlm31z8qTf!kyt|f>1C{_7G|1H*d4aoQFYVg>*UuiQ>XyIk%NzKvES;-5FoUYkVow7fxC@Br>%rV%mg;ntG}<^m9+}G z#VUO!sT0!_E&eTQ?xX&5X@h7GqYv)tm6Y6cEMY!%CHP`7$JEb(-NZa(0OX@K#y&B9 zr!jPlEd;z-d&<{>ySa9vv`JUlOaaLYAWQS;_`w@QhSwHv4kl?({p{m^UN3J-J5U_M8B*}_5Rks+Ao5@lXJhFh18hyi|02=`(XZ!2F zIwOgxzsxXA)IK7q@O`c6=MBJh)ai4ua12$|%Ye0Zq>=Um-6-or36bfTo&7%Q&n=Lp z(I^z5)mqoIMti+ahP`YBcuxh%N$Ni;4b~L1Y9__D`oB*SMg|5R7#b^x*m6bvyBrhk zTMujA_rD*_A^L0rfN#cic)w656@eg0vD*TsG7vO3Czwxpvs$jQ8MnwUi>}qEaBM&s z56jT<3xqW1Y+2A(Y<32Fh6?h`3}S7MwhRVf!*-U9a;Hf8+@G7ns);%+!@iAp=KEKe zgT^L}aL@l5b-hlP%n|C?W}oGUps@D|I~pTv6uCwV9`~R@@)9q6vsMq;2q;mNp#3r6 zH6o%}0?<=y8bg{MQ#nKblP7Tr8WQS7;=2%-Y<&3n2l|@^(SmExcQ?$Bb#r zNq2f1MWJHyIDBS^dbcCq!rP=})opdP0@ER{TjeNpUaf#|%ABq)B=Kwm<|gNQ4eSd_ z9n79reoK$bssN2i7~^fAwfa$o zm($L^{%4hUwYm&1KL3o2+>Q=BhOe9Scx7en#-e5ta#$4{QikNJ*ZT@ttW<_g_0F}o~@4vb_@y!u~q zS?$Q6hXWZ>y4=qRkM$$%55EgzUug5Mr8HQ1H{vpsWoDU*fNnoH8)U05+qDYXI1#bl z!+-|O$O1>UkG74i_v-L02pV>h0{e--v`EEQdbXJ*@vrAVwsb%~eMF8w^Jw9 zTILK}vje8l^6&cgd5=K2sOk8bhy0HCJ*J!0IFA!u)=Sh z(D1tOXiE+Z6b!>nHT#~mg{nK0iPCyBAZYy!gza_UYxMGL7D|I1f&Kawiwyf_zmi1E?oq4Dmb)uAyc+7{W zk6wImF1uF@0JysK1(T+rK6-U)7n8s?SeZJZ|1EaoqPkjfKCqsD=kH5iP z@xk*X7UnSI6{y~dj_4j9%emGxys2p4N5padxr!5u4dQd@#=Zkq?3z<%1Zwi|Ure#k z9xaOzKci-sYC+-&GSx(xXlQ-!gT1>hdXvfDO$=c!Fs_+{UTrD7sour9MHS#7VWM!D z?x!AZ+@t#(wYY6R(yYQE$4~^HI)kplFeeCF8;gJ}W?H_YIqsh-Dr^E7u_y8;`I%ZQllVg8 zk|`9mAZV12#Ki9Ssk%9XpLGe&MOfH?N-uQy7QrRHkrUmm?D0d4zi+nV4P&Q$Vv$S9 zbRBS;xM8;Z5QP*OIJn8PM!9Javur6CW8u6?ZpkN~^?uwf<$liTmHnqvd=Umu!Pm9l ze34KC-Mh*dX@t=yQ;S1w4sy|(I<`sEUT~3{Y8wfR!1OPYJ~h$%rC2$M#~{Pfb5;+@ z`0v~o3M(*w8t2B|SE=IUUy5jJqUS9<@(|@QuEK9ls*hZp1o{iTZ-p*+?R!~xIc>95 z?jEi=1mkE;`*?tJNy>Z@G=iP`Y7t3*WK&1;t4?E7PIAL>LC%K%kiq*zX?`2F%1sF< z1ZVZGwMI?qcOT*R8!O0@tPt(8C(`-YIlX`O*nh@lFK`rGLRb48*vu(bJ8Gkp1he_6jS(S7IW(@!a*XJCvn_c6 zCkLA<72y=*Ed6R6WWN~70_Yyx5d>2&%?o;ttDTMD;|DfO>gkOF_&v_{zTT_F4Ha0;N_?^TKKP#A1X=%Ldop?y8IYan0X zlbJW2v{Sff`5s5bJs~xv!!yqi$xMX`+Fio$-@v>z6#7CAfSFG!-KiI2rNj&zoM)HU zp3PstsO|dz3xDelNlw2~9`CJaz_0|_ywz&WauWaDVT~e&`3*iK7d+#78ooTt7S< zoN>2*VBCa;KPDZkW8B1e`#tdf@~^sJe)Z0LtolT*a&U$0>TF*$qyX!He`7{?Gc0y~{4KkgCd-s9+ISoBl}%AZVfd z=@N$`ynO8|!<7^W|T2b7-V`XxTxn-u`k!z)gVed{mc#WXGn?RZ!ji-GhPK*ZA9yCWEED z#krNYAZYln(*=|n-wDP)@gSF7 z*+wD_u7?j?d@shfaw8$!!>>gz{Wo^5w~ZkToa0@VG0oQqaHmzsVfwU=!)eEg1HVL7^N{Oo%l>yRIXlZAZH0Pkj#BQ(GWprLGafzT5zTlGvu)l3lmtvhw;(l!;I_4@(C@T~gcqc%`fT<3 zyLnq4=p#cE0)DN9A2j3Y-<+yKSx&dJ4}s;-IvcU|y(Zs=c>I;2M6hY2!Ru|>rY75X z`Pu8P_dq)Qd-3L%CW`_&L|w&-!0Lt~?M>lxNHoR_+ga#ZX~T-4sPntOxgr{0a4*{O z9t`JzaL7M7liZ3w=N|ksm)i*J#!e%$afF<@@5yRXQp10N+)to4q_$way%f4TG&X98 zvF1r!Ughm9*KDkn(>Tp7IdbNyHxPnEOi|!JLN?OMm;L{_PQqU`uwb~efR(FGwgjay z6KN3tQ=7R_c0zXSGMhaP6B-E?q&z*Et=*Q_N$b?n)&I3yC<)u#NK z2=#h1ho_^CrFq--s?QE#mQ``~9ki39QCRgC@57pE%C!!0w@^3}z>(&KTSEF6dR}Za zm!4(Ow{Q2QI@Sm4Wp<5d8(F_?18`R_+8X~FfZ(}yMG0mpdVOgAO|XXzQ{c}L%`qrF zFeVRc8<}L%HFdEZ5?>5&-h4b2=~bQRGJR`<3A|ncXqR0e8vu)Nd$^Q^hJ5Q5JUvN?ZQF|L7h8lT_9 z`qImJYypwE+_eGiYmwl`6%3EDZ|TggWJDgA^&UAE_Ksw|58H^ zVo$IQo2B8>n!xg``KMnw?$273nJVg8t~;0uNdNa7vzNdMwNN3;Drd`mOEdau_%)wI zeyoM`YHzx9l_&oW+4;S~NiF1PI6c?*bJG~%zhM!v6LiG=+I0*@zTy!tUy!*Q{?_ly zj7`iQ{)z09r@#>78_@1PLVfs>d)EF5&usg@VWq>I7d?Y!e2&@iRPKjH>2Zl@ydpnLT_*#ncjD(~8RYe+9 zge6>S`20PFR^ke|vdb3@<%Z0C`N;QS=W>k(WHC>C&R{ifovupmFpF%#* z)(|80`cNndOJQDPmVzaJp(esVU8DiHEnL7<$e2P%)ynTs%Mx73md>3QE=^CdHb@}z z7`5}@V9(`hN3a`9SF{2&Kj}lQA9jv=F{YC(@nola1(xBbOnrl(=dz#P@$x|XRB0K5 zT1RaSC@eS*)grw~27c5WITtH5d~wcoh40^GWi)JZi9!5dZnVqq2K$-V!}3r)WUM7m zx9mt{PvuZ&+`fZidR6+0x$}b;aYS_cIM9gfc21)m76A#oGIJ3zbDhhDa-*tV#cAGq zs4gYT7%igbLk{vtM;@W0kABE6a1<=Xp@~FLw4y9|av14g#?15s!oz=9@V`YA6h)6j z-a&NBhdf7!Jcgje9OY=HUJmVmHa-=0+$}4gjZe5l>;#|QRvt_7imdWrKNN{)aWX3F zLS@ZjPe#5HHsA&vTc&8fl+XdSg6&z1pV16p4-gLh#;n53mTWSFQQ-rwhiIrNZ3#fj zX~Z+lzI3)RSNP^{&x|;n>!ynHOm;Z)3mw#%3XJVt6?5dZq2dN7D-tP;8spgS!$5_3X3 zOP4jQ0rL%AZ&VqmP9uoJ$%P6r-Px|B5(3!RzP2!(t51?oAWLK2UypBMofvDJ9KP5N zeW>v@N9FftMaOK1{F|G;QlpP$)n|&!Sc?jenY zV>C!^v;(6CAn4K)fwF)9`ZUk`(W7Ismhjska@qDYIuzP$KWxOrfR^-&FK%CyZ>-r zKTBIW)#x|6{>;ClMr+fn`g&=HkOzrEmW)_(C4&Rl_%T5b<$Wa40DPM}6 z>~=hge!duW8zeFg0X=G13(vF(Aij}{dNvZ<=bXhT*nv&!rHHmNr9Sfj zSsGDVQNElfbJKgqBZ>QzL}3@%XdemfvL>e@wSwR`WgR4PiVcv- z9%HVjmo-@xy_h&D!&~lO*`v2%`4m{+Q2anNFa6K`g}R%i0^pg2VfJ!Fs*3y}GA;Pc zGfzkm?~sL|0^!E-Ut4v)DB-|PzaQ=7ID*eaac-I--j8NfP1lDh-FIjIaA#3@B zxtg`QmB}Dz49tk-?k9HhYh5odqLa51SDLvDMtitWWi(f~PkZ7#{8$L;FyNFG+iXwn z1;6i|fCs9@?+)|F%~cdfFUq6%fwfFNY7tK=w|k0IJj`tS@9v|dV@YFBih}pa*3ZQ5 z-m|E2GPZiEwx*hHtn<_FA*7l44`(Ei#Kkn^!IepZuK*fh*g*;Fk_NIEVSA`4dkc>B zl`i1>_)dh&!z1N#9iZ^6@+w+t<{_0Ysow#fBxL}RxQ=2lxwq<;cV~niW-@DGRyVz| zphp0sF?}+e_}|}kJAeDxC2&y7)lQ~jbYMN4Ct46yyV=@Bc=_uNb}Jr`#esb;m()f4 znORGqk5x?iH|#n)k?>^JJ>T&RaqbjXaEr4*NH4^Vd}pg-%F|VeaDzN8TF=&+A0x#hb|_tE5JRnY^Z16(h_p zJh}yjUuTmrjZA@LuZ*|4%a8_RHV&9RuJ2VUFP^Ps~bi}UCltSgvy?sb#uadQUsv)kG$PL7`6`u1YK-v74Ni%Qr_nZ7F=xo}J{-smJL%VOBUbS8pNXt^X zOEII>3u)c|LIO5sSBY4}!+!KtaFLX=SJy24-Tk@JZ@$s@M!wGOQmT*wLypGv)a=_) znHtM+sfa3t+9L?EVE$5Ezh%(V#vr0_6+zqyE~U?ZKPZBnXmNWDU#@Q&!Z98f7#I|kQw#~+k-B=A8+ew2rpZ4x?yuW?_fOB?db}!8A%&h2(c?`$) z1RzoP*{=lh`7>R1-jyt8;O2KiduYP}lY5!2iq;Zr&_C7=^eNvMFeUv)I!|`%c{$HI z{(3G$X#P92_OUtWy|2;HCdqz&}p27207!Ydzi&2P}W_ z>C^>F4_Y&f3DoazXt^le6Iv9dIEnA26Fy@L@~SJ%Afn^MUxwj7%C?)+(8o(G$Lfen zw(a}WUyn<}lHdUSC361`Wi2&peiwk0j_I`~v^BN@0crWenvfTL&g7q&CL8oUGhMI{ z4^W{5uu7**C@bfrWJ7POpS9l$G1uIJEsL3Zj3qShW}LK?x-#va0={l8gY>?NIxT@; zms_@k(dfq9uW^*4-XqzV;cVZ{{1IBz(%%3{@X3399L)2A%wwKT>(GA zOawo#>s4)bvU!qFjVyC<%N+3*X0tCh$)PC9|NY6V!Fpq*E|+U~et09*Y-2gPm2G#Zg;;ifiE*Q#D!|B3Huaa?b|ebdctF%lGES z>a6RVDjR)m7pQ+vMT?1FRXi5YLFqSJUo30w7Kn#Lu+h3Fg0sw(UG7jUqnNoRt)@PQ z{MYZjl#eBq@XYIQ zmJ8>J44M2DFwE%$&Yu|5!a}gS=)hi2J`$;7Uv~IgtMY0_iO#z>*#a;G&<^N|oVLea zfI&m>P8SFxf<6*cJZ8;!E8<+}wMO;W8LO|k)<)pSmHn)Z;w#FgYm>@`ZMqd^D8 zhB;va(Sj1zI|nE9)kt-Y7qsFWjjNk?%=6m}RUlTrait%twy0YRggU8 zqQf*_ZA%ps``ll`45|z3Yb*gr3%71ATJV@fot{g1-1VBD?GV*wjTFmG9+sM+ynW4S zIkj%17j8|BL~$kOhH`nB0b-$6yz<>*ch+i!ze#c}H|${4U>&pMH{h}prb~(XFpLgl zzDs&05uP(OnCq;#fIt7!ttM+sN9kBi8ROEaL5Rhy*#qi?u9q{NCPr69+bY%sj2LY) zcSwQdaw8udnP8&@h!q<8ZyGOI!MfU;Jxvp7Jf3*Jz`*80rpxiAAuqqwJ!}PwFeXG+ z7!WE~r;i1G9OZt5qEOs>qr`>bK=TNFUPr;jz}XU1Ka;V4|9bybD7y>RZWtdLM2=NaHgk*Zl$l%k*zml4L ze$gH?A9O2nsJ&veCAXB(wZ65f}sQN#VbrY4t{Hv-lL^&U*6FAsjgu?Ta2 zB_VMB&yt2^#vG^2)sKZ(U+-w?(${?yn#Ka^o_f}nvqYzygq)!e=*e{ zAGrH2y1{5?b^ZFyI&ZO6wUdYBpBS(nc%6^Kvza^m{56q4*7o#bL(hA zve1Q?{q~BgsmX&QpGve+X%}Vr$>1`FdKvaPRfHMCq*W}u&8?)G=cZ|4Z-A3bdyE$z zXw1!@dAw#f;78{_RjCMyfA_Ve=ZCV#yDJP8+WY!xG^Zq`NDAFcKYqFnh*h2o)?x>P z?s*l|L0I@yu|J@nX*TsRm57hn?9+PV=z+Tb=X!sPW!D8*MPu!$Gy!6*K{h`pY1W!@ zFDMD35i9Pz_~n**`76fJEHi^ih|9N2m% zE#s$l-b-Zrwwv;KmbC(66voe7k0fP5V*&qdUR<&Ypk2BGv6%UI)%L@WyySw}K0R~r z|IBq(sh>Owo^%UU2*CTyNCy`PAs^$&Q!H;~HRS?pMgC%K{x5rDd);PEJ!g@>vd2a% zsq9df3@ue)4Vd14vx7gtdT6a=DWrhe6go{Z3Nbal!9Y{MK=;-rfojjrf@u}#HHSPg zG<(~2MRFu3e>!@-WI$xM^;(Ka|FRz&@pV5y!e`>G!dVy?XD(_!p}f?#o)F)X;6EMj zYhiTKR$h@4%g9TdyCisb7h0ISHBw=LdusAZ^1yd;ssO4MPFkBa0|1xTLx9?`Lc}D9 zVIa@l%iC!Z{#5DDYXQf#D_yp)D_Zn%4O^~Cx8A}y5UX^dmAkXxNcfRIrWT;wj`2%R z)h4QCiQR#5KJvLzV2r&6mxiDLkWIU3yE=q4P!7Zj;G%iW*2RJcX*zdT2#0r*mpco= zxpK#>UoGE7JU#N-R6`17@}D3^!_T;LB{v;_ScIajB&z^%7&K{&%Xud)#czgJ12aj=D`jqip!;awB>t&3JnVxKw zL**-9zd8WWfRmjQ%G+~F4=VwV7B5deY7O%q5gpBoJMN0kwGDoR4S|glW&d!XBeon@ zhi4?HQ$AZ@DbrpM&NVvC2*g@Y+6fLBNFgz5550KO**4iD^mkqOHoEU3XWMZp@qA<_ zs}aryf8&v9DiZLnL9GC>nn=F#&)X)4egmoIFa~~fZOOwk^ENFOrqz3}NXI3YLK?Tf zWQAIl-Vdi_vGJ1q#ZwF)J$4Z8pPSh7 zaV*L83lE+&Ndh4a8-eb{680pEB_E1z>v z-SlTG%c`9Fwoe%F0Vt@$Feg&Y`Gqn?ZvExZdiYDjSP&=GL1;2hLJe*=>PJFEIa2A| zM}wkB<-DU*u3?~RVOIkxPdHh&Bm}W->LzGkI(f9;@iWuc;4kSvn+LVwKs3Ttkxp zVT?jaq@?m^pk|S^n5_64h=rkm=KqcsZWm{eaamh&3^(nn#te+3pHoOQUd<~oh@*Ox zU6Fqgz zv1v#(_V;KkRAJIYzumyQjrG3&^Tz2MiNn479)Z$~<#>aGgxe4tKxCtP*>p<XWX1ICnu)>XFM=N;Vaya7EWqAgv zSS%uoCo3mp*x=UMR2#h(72(3Ygd1S8HX+lXu#m>)*ksm7&`UU24r)n!f`cz~I z-+{)j^*^u`JQa0crFg9N--0xQnhW^>uw&E;i|z5snSam2k;h<;8(H>yd4lwiT~ z(pxhEO*6u!{C5;f9#G77Zxp{%STg*UF0s&A z*XY*f|I2>?@(FW6%x0m_IvteJwu+jC%{<%$DHX zm2w#wjJfjT0N(aMnD%A5h6fh3XFZXJxhpVXGcnq_E=Kq7gQMyL zbEShcnw}Kx&{=_pbZxGD`hXiw$G4^JB4o<6mRpf`e>;3zxSBQmY1I|S+mcBQ zk@IegkfDB$&6;t*9hO7v-erRJWshN07{i6UR7yB6=Gcs{n%3MXsFYhl`^UwviNyBM z)7?f!y6o9>#`2M?o^V$(V$0v#h27@7E_uK@tTynot1O^*Rx?b5&1k98Wi8R{y4OSN@>)v;g!<|CTjH3Sa`BWR~b_AY~rBL zI#-VvR3n%f6P+H(nJhR3$=67X8gq~U^g$SMlW*tK*u>tuQl!ewGBWIqMR)eQ9B7%-Cr0`b^BXJ@Ch)dL`I< z(}3_jMRBjl=ahn+HJonOgkec1Y0XpHv%T#**?x8CzlTtzp0xh6G!0CSojn1X^`kcwSZGWZMh(i(S8i8aUB(GU_cTr9iaw%@&vnO)k8}U?=WASfxg6)%_) z>MO-zwpUl}q&*-{>k}9g#9-uxkH`82*4eg7lWcbPNk8~I=f25QD^+HQ~^!DV03(B!a+F>73 zd0On(Ih-WljYlq9#=_s4kjI4IUg9J*lREbjnC4%yut8mZ& zNN+{G^%5C43=PKKPQx71GT$AvqsQ#;uH>oeu5#*s|KJHapwDoFDu?`0Z0s)>y>sQu zc=uD~*H+Wu!U-!D@eLvHsR>AiDUZ)|*>5H_v2noB0$H9lhujdGch@lONMOm0`jgf0>nZuSAIt^{W9CY7EdA9q%RVCT+!QsEr`Q0&87)1D&SwxA$8uhy;*d2=OTX;hY!C+WsUh$uA(qU zeJAc9nzkrsXWbZxvr}*x{HKnxax_!pJK$*5@SV0;oC4KGr+E$qg0L1K^ZQJK%uU** zQ_Z$w+Js^}L|X*D=TaX>i=S*nza{;1C&M66;8Z|_PCeo>qmG!4@-ayh4Q4GMYUK?) zh%&vAJRq&AkNw5kY9xhE0npg28(Sf4&4%PSI1Hjp*;?w_uatImDcf47 zx_8@wu7(h>U+2>DELH@D>0~5dhsAdMZhh>eT1R_B~FE4WHwfzK>^i{Pwa%?Y%o) zUJZ`;GC(k{L?OW035%;;4SHn35M-@CH391`y; z)nrdtlF3Q!xmJfmIqNO%9EbrlW6S-?kr*>hW(O%UL8YRm)aSB^If>$hUi#9h%l>9P zI$wTr_J?u<{RP2$9cql;f6aCY}#?lxetgH?P(gl6IXC+?Y7ZL{A_Mgz*D-7#$CNDF6%m7=*8oEK>9e0f)8$N z?U?c;Hl*C0(h5gUW0}mL*W_>~yFPb1Wh%0{I}nkj9jCPP9`1kgT6+ zPQy*S3IUFmHx%3Na0N&EC=HA9xY^=mhQ2GtDoISSaD2gN)a6hjtApU8HW;Dmo_6)iz0wn ztHU|XGOx=c_x>`|?{^LKLEGX5WpmvL z%#xjU&X2H@mk!444MdRP@I+3xudz4Mt#fnpNz-PA6L6n9tB&mz=u0Yf~!bs zw8%G7r~Xj?YjId+&hmcu%p?~1{XM!t3-0ewRWNBhZAWuIvce3u1)X@HMe^Di9Pq^v zJk?;8(Wd(lFyr%j1KNHV>E=h{!Upk#^rTz)WC~aJP9>rKO4=~80tSkDunx9fR zx__a~7JHLJv?urc%JJ-VypyW=rqtWDExYe~{4pv+mNZxD=5MexXP`xbJS;sv@&U}j zUktRS^YN-A&Z-PeyoeIy5A>T0uqoTRXo^Lo<|%NcOKrnYB5;5a?o0V3mR+mYj&~IM z!=y~-PldnbetnKt$8eI!SS{_(Hsvc#U=RDHU`vcWi;GH%Yqj_WSm&Jdt)&xj>a%P5 z3~H*-aE_LZ`nVUCQhjsqa5^VgFoFKj{_@u>82@0tv9BkXI{&l9XdL`Cv%`gE>hC+GN#{lq4S7lYq6=BNT z$G+EUWeGMu24#Q$@8g8Rwr6qZ;GaNo+y1byX zpXostjdb6@g$}EURv)&dEaM-ceq_6Sq_{rdh$l-9LJI2Pp13-L`OWR3;aJM-{0yVq zOSE+t`Jaa1r-vo{JMKhN0fb@EW+wK{T*BY?zeR`BlHowLL&;5UGnTFDLz0vq{SjJB z?GE$(C;;8=J*6>>m7^5rTv^~CU086yg(J1&o)OCDOl3>gFYU3;q+m`VD=u_BW3SS%2&}7$+WUoAWx=&@mj*h^WKy~Kw*M--??5*$ zaF`=Hl5_EUfeERwW4(_2cfa(HL(4r$fV_BKNkvw6(D>R9ttYJi#tXY|iU;~|1+$Fe zCwN!?mOqwA1UnR5{KtyRc)y2oWrao}A{GNd__B=lJ|30>DYFO0?17qM7}T;rD@l(d zYHAM{A}xoH@c)IY7qP3)=2N@0LTAyHqgrl;>X{(j+VrRsAhz3^|7_j!qML=^)nf4!rNlEH(NWpNIuzpBLG^Sr{UK|YVjioMdTNK6BsnM z>+kQ5kmMB_v*LIiW*;`~jd^v0*SXiyc$eR?3QR^)cpEPN4@4!%VIjWHP+r2#rZ_6Q zCtH-9C~P7I2Hr8`BUE~YOK^qTTbS*jzQ@iS{@s>6!lz3l#dR{lpTEfI(cR6mmsS$P z8~$6-i3(=tG=sx!I}94@zi)7mY=232iHj@aCqHJeh7`Qo=ki!0=vXiYxS$A{^ys4^ zOAUg9d?xy7C%F!`96sO||Kt8VYVkydxL*=aUJ+r!0XC+A`6bJ#m{QIf5;>>6oEM zd$+{5;!Suwol~RwQ4AV@!=rC4i@7a9pE-WHyPzZOE!-=nt-;I(t5)2paq8R`?0sZ? zgi~*o&L{`z$(x-g!>fA6*QBd;Xt}OA3&e}~@>P{ldpRfdz=1Z(ug>n~lpT1M1Fp!( zrWXd0yZL1PyGLX};Sp+INjgc18B;znIGiUf{If>`L$1G6+dt}wf0+^}A9v;Uis?%A z8qsTm?pfzBX@v4r0@Hg^Bv6<>Mq}fPf=Q79n4XfwYY+8YVt&IpCBX`wp+1xuU1&WK zU97hIL;G2%pkorUH=4IIW&V985kFq{i z+Y!Vp>>DINHp2_Qsx2_}3_?8q{`}$W-O_6vaVx3=Ne9XB0bTb0Zvz6nM652tCo{$S z)=`AL@eSXJBhT9p-fMTkveE#Fpy_@-j$#y}?!PbyjL5_nI|A<1qY^+3^hdw#6~hcZ z@xTR%{#;jY+NK#$x8iBi_NB^NJ9<}pxZ~&uGdAv(5 zmNuF%fRly8{&O`FHk%4VnU!yK4UlB5+CfO?+l}SZpFv#S+2ah*R6_Vh4s+p=$V=Az zw-7Rcmdd*W&aFalprIUK>&0FloqS>z8Fmh<#Fq9_hwyHE*W=3Fk(JB&cpmP$&?W(R zGIa2-4JR)z-AD5^i?>G?J4{wYXt+(KjNIRsoL>Jk(}FR1kEG&yPOVIV$aqfNnFV25 zNFnqK)qp2XPt%=av`&7UI z$*9w4|KWDVh(AIbwE3ubwcz>tSCQ3)uha_4hL?2;`b+v3vSSGxFmG8Ug}XSKl(GDis6JPK{t{ z#V|6OM}r825o&rb!gPfTeg?I4`>FBMD8%RpQus=T36$o^9uNV>zd$%U7_D-N&_Uxk z??;<;6G6~QSF5aYH80Nk_iI&|mmj5ZuZhYNBXnZa%F-br6tS7lp+vgi8hk!6bKnvU z)2r$_maz-pI->Lnd5;9Z&*r@6sfmOu@+h|DCrhop9vKsRB;qeCjQm`I-1+;D`oU(l z1cTvW*y)9M=jL%%6*X}n7&)7L=3$-C5?%RfI0`upV&vD3nH0FkiF#WnQvkOkp}GBS z8P+&Vu?Z}2HOrhrk6|$7i=FaoRDCkkzs03ZNx8cDU%yJB7#C3x?zcMUn@BsnGuKD9 zo}`w>`Lz!r2l$!9W~}mly8TKF$x81J5PAhWwXPKsay{D`Sb)j79*{VLxU8hwyAlMA zddyJzlfTMw;+xlTw$dk|eb_8YSTP?>@0@cf%x2GIS#f1P$I)-(;PS22&@c3uin)cwZ3$!YxA zl0pNvc(5uv*Nk0(@tmj@?ix0`sYy(si}hYA)jZ$`J0p}CV8R<$oB&0Wnp5VHd%vWw zQ3Y2^SyFuqIv>RxYPPlZCl4kZ&Qt1F*Xq&y?h@f%?N^s7&M%hPW6n}9FhUoH{(e2Y zU$NPn=kAR{bSI>3h4DrJMXDguEL7E1 zZ2%Ne6d|&U(pV+)x2aDe~T3 zUtBc&j1;;FaUY9^svape8P|qCbLNZT2>JaHni!WL_{-s$z%1};i`FZ9$uVUVe#Yb%eEgiOB6rS{5eSZbX8&)hYn&*akb zS`(Xq9@swi!q*;x4!}u6tOAtv8i@(j9QoR&-H#m~h3Kd`dWjNgq zeJ*j>VhltuVtNS(H4$|TW@+<+r=m0%+9p~dKW8t(=ys-95=(Llh3 z&ON9aNv;H6`d4~h-7$__DNCaZb_Ms+VlqH^e;{a1I5GIFjy%YtY^oY@0ejG&Y6rsH zXbK9KW#L0;ZzEq7(h^<#-eV;|Q3uj!1>Ug9LD6Ht?cRugz75fh=&>^}i8Ov$KPl`+ zPTsja2&xS z=soN!5NmT$=8tC2x|`>qRFL|J#q#iEE7djMri-*C9aTpb!!CePo5p$sR(0Gy%t~2L zRRb}E4-5^t;qF;*3w|Tb6?+$uavi&e7M(q8{aa*BzST6cuvD;P6dHS zOugk{TT<=5nrTG_sK;-%U$1{Y@t}cyRp!gH=x4pD_YcSrXME}Ca`9u^U zg;!s21Lx*mC`cm^G7q|i^g;+{J!DZEcTldI2*;@(73Vp&vwh55F~2bU3xvgh*(#Hw zuq{E}VmIplo<5|ZhP;)eLR@!zi|cJ`J@BoC>n1Vv>>XaQF>aB%{b(`%5z)eMzm&&g zVlZ-!r9D0KvH`pPV$Ni_B3OwPOr*jXaycGPIBAK>$>z*}6JNV;sB@5D`Tl=xAwZ54 zd~ceej4sl+#m`%K&5j0n{t7txjMF zBsKW?vpmymC!Q3%5eRCy2>bJq{-sl^30HTdje+GTR5&;(u5bD z;s;h&P}DHuXHQw<_)Jo$39&&DO;l9B?P(uy^^CpH(@kX-f*FtgI|B;%&)`S&-ahQI z={E7tFZH>7ynYFaY2l3usrFhpa>)H`kXxf!hv@EH_~rveI3)j`#=u^35-T|ZJ~UdY zb8%Dp{`Lr*1q>9veh)T^*obpU` z*3N4~s#r?36UsPG%ZOY#R=BZ@`UQ3VP}MY)P<#9&a5Vof{<8cRTP12BnOkc$e%7!t zx?S8nR8>dZzw_iwq~SlVLA@cBP(LjVu;nkT(fk*wFHq*IusBxht)>uq{pb%`6J&Un zqY&^|^%LRV-wRCC%#(;A5j0__bTAbu?+4k0HPmY_CaaNL zEYqYB-J1vGa{#s>Z+c|GpAB9WN`I3A+NjInM}}x-oY;QwTA^RJl~yxef!D|x+s+Kr ze+4AH9z2DCx}%q@e-jB+bUte*0kPBr!cp#FWWwHg0|l>3LE&;+D%kGlr{#J>M!j<$ z5LeL|3CubaH_rwN))~3kMJOQFK9&3fISz_pd@DAa$FvsGjb$<-kmO3~7p=wjzR){sPQUiF^0Va2&#)1HcgB?y}?SHJL_L1S$3=&SLv4^aLk$ zk?%=yqMTt1sXf|p?Yt1y0*zSj0ii_{l8B)G1O*XpJu zf=4aWvX2A;x_fWit!KbJ9GsfY_f^`qMf?d(Z^&+P+>mD437Ob;G4A3(R##Bh{@gIQ z?!11RAVpg7_UK3CCQ!37oJfo!!4vdVlpneYlozn%L7~*(Xa9LK?c^VS8X&_Gy z=PKfK^$xAux#hp4%>4AJhM@JP@>&Z@cI;Kj-$;ZUR0tQZryL8`IhfCzA;UGIT28;+ zw57gDwb}?@a{@<8|8<|l#!?U8g995B+_XE6KSZi>4fUfVx7$P;G&87-DI~J1+gLMT zzV&*bR`z`vh$UH+jE;o(q;F0Lh$2qc9+v0ft8>~bj3qqm(f(Zcq0nk4dR6l@yoyAS zjygc`_y)w1*JXJM@CCJ(tw)6>*L}3~Z;w05;usx%*{JQafOhT|sMMMU=nVW0QI|zY zyNLby7i%lq9@WJZtBI-WcJvA8YS?N^tDE zInUc~Xo}y^y}_hrO<^#S)w^~Fyw&4k7Kk~qm5Wlthv;g@H{|myhMkZ-7}c^G2inTi zO|FK)(EnRDjO#Y*p{U~){Ax1@6_=PM@|&77AL9t?j+AH@ONlg!ILt9O*n@70P9H}T zauPLC(4{v+G!jF!-arrENVdRZDMd$O$#46eO5Z4jZ!q@j3E_`I8$l`6?0Z9QBOqe36PEp>_*j^4@Iw=Q*-7Cq6*ILNgc)2 zTooy@Wx+Q^;{Wn}OJI|{9LwmD^~J74!b*7qY&l}{9b|?5;d=r&87Q8?teY)t=p*dM zEEkKjThT<1faXtm=qjEP(%kKmjbmOeGw351y|+iwaE!YY?noW*sEBET+PLjg!Zzu^ zq)I=AYq|zv@$iCvh{JI2EUK%eP^an`(4>Cb5)yWjq3HEE!lsqUdlYH!_?BwDrd{AenG41H|0lS z(2kKn^QTm63_91esrH^b5j5>Cpt1f!JjLt(NsLIbpGtjCnGHsqIW?~u>DeSCi^mBrDKUj^Kg9NcZ z_wQ+N;Ch<=e`>o*1YGPOBamU64y%P^XfHpjCN5P;%-qFYlF2UiKzWEgNwF;0t6 zr32M5u{g+u9*p>oXjzgH=xzL#Xdq|sIQB(rzSu&lDj&aP`)!l!*&1Ewc9|PnS-c2b zv^2kdF$}-+?KL$eKSsW05O%jw8^LJ#c)@ z&kcknSB}n7A)qU-2s^VYrQ?BOE5!RLc`KRptM6cTFNmP>+h9OVsL)&_0uXDUnZZ(v zB4WE)C1xK;G=?k2yTV=e9^GhDTx7_YbPi!mQJN*`M8Z447}=%Ips)jC1rkXK_kMT@ zk4CxL5`ru*W!Hg21sE>G=TzQU>v#~==Ph%X5zVbgGf~9gOg+D7fLNvK{?t(^UgrW| zU&z~A8gY1pS+ig61&kWPRy8}sFCA~YNdv_Bgl*?!9P77aXkhkNTX^kGYU%+r=LLtw zV2&*YMAx&}tEije%$#g{m#iTjQ5NGJAQlg$k%$a7+}%E&KLZu= zi;paPAjC8F+4G)Nwl%M|K?=DD?Ibn_$&x8eIOwIfaNBmY(q_do6B?F#>#`L2)ygI4~Jl<+@wQZWIKdPQII*s2xF!7l6& zHuxmWjdgUCcyw+B#z`3ced|H(FGRzf!oC{l^%P}cC;+i&6gMz9_Nic4Ht#;>PZZrY z93)iI9ZfdvMyO44DqOr=1emK3pq&0EQxPEA)VTOStcl1Bw=B=ocZ5bm`skKckGRt1 zXueF(-bdGw+=MUhabj?#xmIs*>^}!(n6S$ASs+%#jdcpunmNibULR`$i(&SSAz=Mr zob-$ahqRT$Ajck&O&4XmEm_iLwrD;Zq(BUaRhf)&Nm)2P5}{!b5FZxu&$^V&fP3i+ z`}}7*AFTG<6;rn9%?ueo-*1N*99J;T=YJT6dt36u1tRYd?0z0H^ks`5GPP}{_}!9_ zJEN34b%%RPvW1ottLS(-!&; zDE#@@guWflCNLB|Ly~lLQm;p*_Dva> zk8VUDM@x0PZ5H}@>$s@NsYjIT* zw5e_$1lS_cd%Gsp`qadEzo#Mq5_vyc@XGQRYip2Y92d(W)B*RjPt?LGI>cn)4aW`9 z@B65w$&2+`f@y18yl8M8>Vhr5_1O!0`tu%dt9h%-2>juCJHRcT8!W_YyI;C4DV*R| zAh=QyIHG6riW2*ttLTc=YWz0eyOCz}R*Fbbir8CU`Hro`g{l)0A9FJoUe^3$mNbrx zBbx&!tApLI1%WbxB2qt1>q{vfom;l)XHtG(!h1a;v*d8HE2ZloPmoB^u+aH&+%nsp zMT3$qH)3xl_MT4nMF=tXEM@o<0=oaZ(*e*P{wT--$JUe7u8Hiq44tl`FJ}u&g_L8mwgLw@RfbP9p~) zUpp1-j-wXkKhvpa_d&oPp)OznGbY>eT9pImuwXH4=U0tE%8H%^Gm7+JmO}d zT7PYgiF77`4Y)a$<hZ!>$=I4+&YU{YX@SswDu7Jr=g*gy1JA8MVfTo%fbWoE-Z^j8^tT#6HdG zJMvH1Ly`_guD%NeO2V&34Fj?Ca|lhyjKKS1DcHJU+Ab@GZjtfpi3_e_lc4I-@4{J> zT6-o@S*A&+eOpvM4*upqEQs*iS2j}&z1v_0FN~{xHAIFab#D^*n`tV+o6G6IRp^J2 zZ&^JEo00TuirM{jmO!jg0oE6dE6oH>a8`u~0h$0M>}?bkn(JQP$anO>&aH$UQS3E} zOw=h?mwY7U`FRpxLxt7z*v~w`i5wixN9VveE|C zX)^los9N!Rp*I8^3WSg5e}S2?zK|;HC%jP|hZ%bJmcxB+P|_i0-goOBSr8tWBpCa- zN0mtA)`#$U9HCA_p@5A4MEK$OLP1$v(4J-<>cu~ekNWT-Oi}I*)7t(rvM3N?xRh_O z-?&X96GYc>u(6ojab9A*n*^`-QVSAx%u+-fUW8Aj!Kx5nG1B6<-V}d!{x1u_`boJK zdbAxTdc^!W>|Cy2x(UYaO9=v#xp)ZO1rD(JpAnYf!znvwp(K^lEONxla#kNGbkc|4<^EW*WN4;QnVpHO!ClUSnab6rq zCZBRtTISCLM~k;0&cB_NDu?L{$Du{};yW;MaTB~T>-hAunrKzQCM(rlC)qm@JsUVJ zzErvgj9wM=64_740Af$hzWJ&VuGI0pkZE|%Wv9(z4}b5-G1yO~oinYC|D%55z<*VN zCfB}6)JhUeQ`}I7J#FOR8p+%%6^x-ylaOVMX=Zyxx(YF3d0%jIN@SY=tE4S9dfF;Z zH;qG9gWyWF;A#}dRdoZF1oYcO2)L|&gr>2fz67C?B=77}v-5Kb4@N18CiRSa(u9%d z;)3AX2ERYu_b3NLCQH%}x2r#m6#-N{TCce1c*7Tt-{p1h$J_j1|p{3w@Lr!w!dD-mNENUily`!8)MxoT=7Z%G4(pt!BPl?_l&3 zP_mJy_@7sA_yJUB$us%hvL3b&&hsHTrB56D%`5ufB#q$J8foyylN`oEBAH)J)89F( zS0PjK#}rE=iHO<~H3_uo_*C*8zl8`?gXTNb1tS8EBzs23JHH3MV`9?#b#Y-G$W8XgWpVRi=Z4YV)xmxlTfJR( z$)mm$>=}qg-vB9`X{r7(#afLnd=(VjQ*JayC25CyJ;Wu6%!+dZfA7$4&Y5LPK%(Rh zK7Kek9)1(*U;|f8Pj|9dcPKRqj~&}`+D4J5#_0a381iHA(>{_V;3N}<@V}IAl2~|H zGOYtbZ*}hIuwl6%HSTw>PKu3Oe`Z>2#o!_y^wniC{mp-gjSwsYe->(#KTLD?OX(br z6JCabRSZP$n_t@_7_wS155q_4i*mQuNAY-Qr9x)20Za-tj8Ttzlg?rVzZjNe1=0PV zGxV{ILE*e8+R-eqcbOMa?*rj_3MztBg)Y zM~>YBU&7rMX#jVb?;-QC^Y-Q5zL;Lgswl4pO|U(Wdf_tiDs zvwHPZRaeD*cv2!rHy~J>E}5)e{JldAzLcMMk*kG=i2jgdrve8x$Bju?sZ3 ze6L0(eOuT%h|-p19v3G?htB*IOO%@ZB>JMby#-pR`l^*cgslS1lAL{vkogMA%WMj+ z5}{0ltsFyHxYpsPU73q0R|}w1ZGbyturwvuZpoma4Kd!OA(G zIXo-f=v}~zrwwM4*n4`CJqYQ{BQdM!&W#bx1;O#(zYeBUPVqpNhBgmcgVp(yPzZ5m z8N*CcU#cGx?54msI<+6peyMTVfOHzCwtRZ6JD{-{7izRq1q!)ici@Vg*@{z4!s@EQ z>+kb=&yM}1B%s4^z;dU{LD1;dgyTW~*1D?h1BDVIc6~Pro0mx~w(dk+WMpZ>pLW>+ zQP3P8j^X=JmAu9cyu5(crO_|Fo$VKz6|`mD+|#8u4#G+Ju;2w@Od0uVvO6HC-)}Pr z3Q3oAt;y6CIIz|5-r1Qql-qAAXn5%X#hk`W@U(xD@H=t3H5i5+xcf`L0Q?JIa;mmy z+NK{jTDe*i*xS`8=p%y~bK3}))uiG7*8DEv)IZm;vP*vX`3S=d?fe~oA2({rD`y`f z%`~icG1x38(@u_Ht84TkEA;*iOBD7`19{r|d|d~@pvv#1%wyFTx6PA@MF%S@l%hUg zigYwUmNundi(_pptm5i?BJr~`hX_o7L3uXBuicVneD7!vb`Xz8 z;0|b|3)J+yo<@DIIY8-%#5kofnKyC_xAJ&fl`-K5pg_>_?>`6Dow3>?7hH}VJC-I$ z@z^dc#zwv#35xhfidBX0&p8`$>ro>=y7qbDXGs_VYHx}1j!-$7%-hg!P?F^-4|Vt1 ztX&C@YNz8+2{tbvXd-up$;5g$TD>@>FzK%PDji;RH07y@ja%*)wD#zl`15%=Q#Z{8 zljD;?q@4)CJ^=B(T$C=S8wa*1($&1S{%Odh!bLWla_F>8ejO&k1PB__Zfg@&Dst)l z5Xs8y+Uy@)tNnpnCi`0+q5;N0 z=W|Qn#%RWcM+0q~h2IlziBbj#TDv=pIsOxmy#Vn$tvJCJcAQbZc$t^`jYDYTN79={ z@Cycg>M2@XY<#47Bp5g_F<>^(BU7SywlgcWh}QswEf_1c>Vnav;m~%2?!eU z!uQIMIIx*m@1>e|w?k@{W~b?MoDf}1e*aRaj%_oWcs+8izbN%?zI3~GFY^l6m-&h` zCtG80)C<410*5ufhWat{fv$$!VKP9o_(uc?nqS80S$T?hPhOqE zTJfxI8zwn@-}tU}kru>)l;jQgVT?F-!6F08Lg^*#4S*=)poYHH6~+XF+yUla7U+mN z5h#%GnybxGC6R?fkRVHojR|XN4o&^QtsMsYtk9CycDg=nRTBE!AhC`M)G3VOl zI!Rx`@g+&CF2_Cx@~2fCnUZvW0B8~BsfRz>?78a*57X2yXm;sxu$_%{GVcKEm?va37cx zSohMJ``HxZ#rfRfrB*9|<9**ekB7`FQ~_&>KvQ!@*u zNySbCEH8WsMQ$`x40IFS@TW_QVS?5*;}e&UJW=P3^cUqxsD7Ad?}{J)i}HDMDD62b zA$79MBhZ#2r@WX8mij_fd+PV;6dWGQu>-Ca-TS_L-UCYysk^;C2wwk;47t&lL5J$c zBuMcPKtk*dCi^+xt^Q7FKxp_~`?Ym(T+LwwCLWP(HKY(XxbYU|e_^Irxes>vihg9I zkeDbdee95#Vm5Uh36o4j;|$LzBQNf&(p#KZi^_c|M1(&%5w7$8@064}jm-fF$Rzw# zD~K&N6u5pR7WgHTxmUvRxwYp-I;z zl20b=dE3-MTWvl~hcOhkb~2aQI%g)Ln29I~oo8!51axQOPd1ncRRtRYs&vm!^FS=P-bseUgT|R>rJ69dD8+k<&V9IHpm-&aqJ!mY<^s! zcV(#Ra0KF;BdRZ_53g3q+dGn<|4no9)}L*};An^ieG1#W62F&si-XxryYyZ;TrD!r zjKsHazWS~ZN9DA?%td5UOqb`MEQltyyhv2|XSRMq4x#?-h2Aj~5|Yy`k@&RU_?ar# z;9+SKV%MDQ?g+&tl6q{_>VNM75vm&^d!Q+aH|woY^oCFDC|amyd0}?#J7EO1jpdk9 zeg&J~QV^LcV(PB${gCJXWYueJMV*W53s9;jIpI}%RA}0&`0tJFm#(g|;n5P##=6tt zkb+R?2(O4!^0FB@^fcS5k!Ey-jK7_t;BJBv*`Et;2X ze8~ZlqkcF41#BvriO7`lr#r=igZ)BH_Q#=CiQH=r1bd9{HInAI7ZVB$ZQ&`lOj3hT zn~&p$iPis&R);;8w|*q?DTun8N|WsyvA{=u9rr#}%RYZ6t`giQocla{0&c z|G7TP7g3&f56W+=KSL+lU{Jf)q!;b!b(S0(mr*)};pq9ea97mhG+Yc&<#hM>j1`jp z9jz$}@dxuaF%SK?$E$MLTB~2K8T`Xh>;o$H1X1%Vb`~^~0piDENZSpA_7+{IlUm4lu(S>65j8 zvMNEfwI9sp!(5h6xDP#&m$;o_J=2?t9bPNh_$c78KiyM`Frdm-;U=oH0vFNYGXBXD z8;$p3EmRCsh`8jUIJ<4@BJh4(eR6@G>OvWj{-o02(yzFN{`Pp*6#aF;>MpwTpUh{W zB%7MAqR!tcPOiH*^99cPya^`l$4_oNPrt=iH67lQXX2jK7=NgC?mOXzl>b660ejiH zYF3FXrJAX!>ZfaL`vkb6I3l%;OW{>Y!jDO(Be|}&?z+(8ZTJRXqJX|X;d+n{Kf%ip zs=0VBi`hSnj#_7h-_ZE8qp;hSe~KwW2U^T%%{TFlwrLkTDhpT{Fi3Q<$A7Y73MR1> zHeXcilzyG>-sME(GWY$tb>B1;>7(l0bP`KZV}A7R5HWFYrPz4eFp zi>750R&t5wJxR5p(0AB^_&pR5+_qZBnk__0fZ zZHKMsVgPl{JD&o^HahXDeSQdiLNz$-GmK=l$6{cITMYJ`uV#N`7m7{e*Bt|VMrDXy z^A;n_TDykG#ykFc0>3?)Na;vpsm?x4r79(^BWyD29Z_Y`X_o-pcf`cE$H^OC5?#4y zZA5!3<&7-2M50N4(b(>FH-Q?6{IC2-d4(hQMR9Mp?eZ%8ev8sQBj!|$Ioix5wbl1e z4a{Z>oOV{3#64wPjynX- zBbqwQ)vYKQvjqrZ6mD-eiGaX~& z<=b>ZlvR!g2RfqWZq}W7Y+=#TgqX~oqPi+)r1yJ|V~r#p$)2J-v-=lJL*|J3kuy!0 zE&iYy{u1E{XjFXLtXh2Oh*D_O;z-=%Zd#kF!F_Rr02=J0Ex0@8u`tZiK7WuW6iL{InHYzOs;RuGQi(xxxeBrx)u*0@a41=q%qW zPiJhB8usmc5MZ9h)$!9&CLEQsceA*!dZB+W}?-~NY>_Unr zJtl9%wX7Z+B`x-5D7chmuee4pbSn%}v5OK28U+7wVxpho;7*|R)J>OMQbkO^ch1AC z3!QH*rE>OEVvs|StM-#F=6(-Gv4UgW{{L6n=O1WS$h7$$eY>wAlqC6+x5^^c1Kh?2 zs&~YN=WU&7P!R_CqukTjURSVDpc#Z=F^t52Nx9{uiUPcFhjcK5ERZVhR|zdh5$4(V zI5hsd{dj9tA@4AiaU~Uha_WwZEKM%tuiF2&CFDBQH{Ib?CpoW3O0*pH$6a1IBFr?> z+i_}V7SU7cVVj>+Qig!%tXby4>MoW2w{I1)(6#=?9m7W_a7H(Bi%zfOu7qvFAmr7{ zuevf#IQi{g7vKHXABu-P0$16j5Bc9;Vl(z$p46!wjxzNl^Oj=%#9l}lcQ~q62Tq$P zi3fxUhproMZWd||!{DNo+<~F>{XZkC8;_1}E~KIK6sxmSPqXWUE&EPSMF+2&9}g+p z@DpN^ecH#*z6j^ux}bYRoI-8>lhqHe_O!eOR^J4z&rtBQ%2C@-hs=`eUaRFxyvjq( zM3?cDdhgfHRtONi5B9XB`7dT)tt5`Cb4Y>vVKIB%S(Hm63Nc9Qd%moWCIL~K?3X2i zs;;50yC+uAuX*zQRU}9l|BYr-#k8UeJIG&X-GmQMAW4M!^yzbx+0n{Zt#(ubIYA=+ zo-@Ll0}mfqb-apg9k740z&aV7wsX_tV{tT>0CO8lx4Ub&6KxHXjfO}v-44Ef^Yv|a zO+~e{rYxDE;ZlX_f3nyI)UsH{yl4eZ#-GD0w+y(1s!#I8nOQe9wxL`mxTdN-eOjB5 z-%-}J1#iH7aj5>u8ddUnv$H&o(Q zjQ-*eAiMdn_fHo6WhN@3-Y)5N$%UlI(_Z1XMF3l$6JF>-U;VtFh>X;0krm~+`i_-x zMO`KFSGoW4XLDoNv7cb6JVa70x1k5d^k7OYHQJ(;26zX>4UuN_rQdIZ+c13jS`;p) z78qy(=J9W|ke8sJI`K{7K0|L_7^}V&()c2f5nJDoLu%^fBKS*~~1Zlz0c_osaZe@dlHG0CtjyrJj+ zDLcir_vaEPmU#?3L=a2xx_N}0j#?8FHNPFq8`_03skMfk&VcD0EYe`5Q1CJ@8{eg& zgyScGV@GM+>2UrWtOO#OP1-A_}cQJ#=!Uqm0Y^n63@f0_yDXs$Blu?LY?0hr{MDm16G_v1*ZCE0Sxz$k z&+w@PU#wbd)S6S(ViAsI=bBfw06pWE*NXT%Gv^2%4uB8kuY`^oVlJjytp0xL4HD z|85RLx{d7F7+HTUaIVDuXxC}({YHKZoUbf+T?3%ac<|;b&tr_Ox`hzhW|4wl*Bvly zWyoaVGBoN(U^wJ)&voxGg)V6@FQtBCrUIvy zuu^QqTn|Svc)y5I(6iIlLqZ_i}?^jFpj+Ze86K=)9|8 zoK@6WeB}VS^W?HN?c%&V6kzKLMR=M<#9}vWs1+~OhUi=zxoy{v%D%l{G?Hx|%1%VG zG~qf$^mG9X;svzD@MYANo%ok7+mqg9E!G{>?rC)J+;a@YE{B3v--p+}`HfvHwVfrR zY+o+4DCOlOdazeo+mq8ms@F*S*nzm}u?rPiYf3Ns-pI|i8fc`K{MmI|X`#o^5-&yI z9Y-?e7B^wa+UN5+>!1681A=B2^0PTF%ues`};U_%s=z&Eq*fj`FoTql< zxiY?=hv|e+*mu(j1y+Dx!PiMik5T-lmK<rno$yWkgQ3)k;-vD0B$6+I|A3`gDtE@C>#wy_J$tYyLv*+_VPRl3>G1gf2>pe=J+ z_-$;ER@#5gsT!GQExlJXgLAl+N+$ej0D7eiVG`x2DhT=9Oz#^s3!R8>-&$3Njw@_+bcvMR|#j`dm9jkPh^S7HIbSR5yg^;4-Gmk%1(E>PlSsf7iVkoRfv(H5{1 zmgayAIfx6n7?gzpVLE0Jj@f3Xn+!?ZTQ9axoG&}3cO~wDL(-@W4bKvCn^!kTH#q#O znxEC2fZVzt=q*@(s^cDWRX~rWTsHcu{b0CpoTjMp?%YD@GYW6gP1$tz0=Xe3rw+e9!(er5?|OLvbqx5f6u#U3w`cTZXV*q- zboCb*txpV0N@B%Efw3K+Ic+?b)F-AYrgNwqd&$5WImbd`=McEVubepd^kH$lNAoAQ z_Sx0ik0_AU(yn`AvITrv6$TNw=yw8XgN$sRs#WDxh3zrn5yu3~ue~Q+Z9&j7Q?v!y zfL5&_Eu(W!CAEovtrJ99I?!sH5`5TI^u=$}RlS#Xbo}50XvVtZEf+6> z=Lh}pyZ&|W5`-CM_~8U=zv+{ekJIhlm|9N z>JkKvL;^F{DJ7BEOELgnL)kBAxq>hh?>Fz&_y=Mb{C2spyW>-V zEXw^8fixyv><$*Pm{#Iglvh-J>~L%?+hWrq*)kpwG<3Cs`?OJWoWjY09ZhODaYaVq zAcsYLt88;%tdU8y@WJ@%I5sM;y?jAXnK5a>32*_x3vFDDgB~CD|6S$pCo!S^C_^4r?0D3&w z*TxQV?@FN6(Zx_v)7wJ6(Z4b!O!VFbJ+xK+6U&5uY z5A6k@U1Y>p%ba5N%6JFC&_|V$mXvbG4|8>fDT1xzH&EoCf%a9CO7a$DOd_y5HJ`D* zMciF>*EozS1lqTZvZl^J5Y)d3T#+aM8Id|F-7g>nhqS>Nde>Q*Oz&Zfti}Zffa(jB!{D80+mf{aBw>8(36Dh+yGzp72p>xFr7zRH}eyef1;@i=Dd=e4-jdt!= z2z+f)j=(ehQ;ES_zml;zbA!EsQ`k9UI3Lz#-re#h69g^pp7b)J?HPjbbJS^IljSAo zEhoz@sF^3%dK(k{z;oh0$6{Tyb6N`i%%-0rg=pnNNyu|7Cr<9PGw5{$o459gCwk2%1cI z_Dd*6I29!%tx7s%49gU40@nr}!NWt{^6(AQfGPw+x* z`AE3bDp(9ROpIe`#PIuF5fLzkrKy;dmhzT#1`x^wijly24&ECe6J|>^} z_K$<=AZYU}@diVJphLsJ$>HW_vx=%5u@1IjxUUt{QScatzCER`GQhx;+x#2^-R-OH zr7qAJ=xTDUlA=JPnpk@cn=^0|LV*(c-M3p{Ni8xTECvM472!(#v0z^UTmHEBn^f>g z)d4aw(OnSpUE!y}=FWx-x1|S@@Jc~UGaR`XZtne^pSEkzdYp}K+s^jaH@MG9nv~wn@@e46ZD#Ua7~951&~{zIu*I*Xq1~7=;7ag znuK3gLk6r?#vB8%Gar`^z!m$^J_gFO7(?CThLp@*cGjY%mZ zi6ytPfE$U9jw_bo86!-^ZWBFtS=2b{G2vEyTiy^&>8L^cTjG=^8qkpM3JElt(LkM6 zw~ZTZH-C>mo{wIdzyr)tl%uS8Bc$@+KatLfyJY#O-)&zFupSimLY zkKr!F2h#5hF6>mRGoQaO%h${{FbX&sE<2F#urE&^*}x7xJ7($h>(@iEBMCb0?8}5_eeCytt_DG4han;muKABHYMN(q z3Ics%22q*$e`^r6wDof^>+vYvo)ST-Ae8XW=c%fSB*J9^2Ul`Io61#L1d!IG5Wj+b z{YEjIntxO^vPP2n{%K+bg2st*2HU0*>os6g_nBx^WL%(XmmrtkKlU8!V%U7s;Zz%# z{a%t1595aV0b0nlkP|RVLQtcrP=wc6Su43?^$dpo;MP4&*)(YVw}Bjb`cZ=S?t zOKYRWd^Tq0)*rdJd~ZpyNO4TpISBNAaAB=go5HN0W7sbVDhd9UPdpT(E4KF$q<0sGe)1@!&z+w5laZ66Hd7CYW&FutRY?}{Jcl5{agkuF zS1A$jitX1l!Fc9Li!+tfOts0rxH!!`3m?+>CL&FB49^aNCboew-4&eCEgg#U`p)9? zbcaO6QB^Y)qDa??o&P*JsC zZd%2xP*`5C zVlp7Uj{=ajk9~~a47%+vWl-3q zvj_{T?f)*+_;!cQ01xWuNLU*eO_KP>B-mkYmUhXR)tw`21nJG--(YAtFwS(3QYw%f zg5Eg5gMDp#U0v&_Qc>OEbTPQ;FsG*SOoSpy>TpXl2ziT`5F;L=vekQzK7vX)UEk}3L~MmA~{uqb^yT8ui{|!)%;R)E+=ajO-R%Y zk)j?iQ+nslcN6pY_cOAd$(svziY+rCv`E=IopqpIVoly!i91;9$c*Od>^V5Hc%P&T z<3mDNYG}jt@)bT%rB4N0U8B;5vfy~EeUjK7BpJdH<5C&jn(vmJK}H6$G^X;@*dc9m z^Zu39NakD_3mA|)MCO2-0#tbyJ4hjS|k|<2W>w$kLoZiZ$O3nRjl^~UfRQp z6l!|I`R9$^ZQ=*@0F8MYNShW_-@gmBjOYFl(Rqj)Pk3WqwW4GfBf~l zUBDCa)%@F6>|Y;oojxB7S@u)`5d2nta!UjTr!T#;`YqXS?^E|(GTeT*(nIEG)900f zpkWxduTx~O{)5n8QYK~u^6U`2&^4kbBlii8C}!{JS>*7|4Uu}Y3O#3~$+rlSLIIVL z1iSz+QQ{dma^a>?_&9@Am5f2&(WDpatKe#r0T49!dxwLI4y9tm08caJOhPtSBr==A z0Ag3}G13p!^+4G|(KSkg!!UJfdPIqGvus|#&1Hz{v$rz~2l|u;(if<5cSxp;F8tF2 zbBlRX^r^o|+l^B$Q4cp*#cE+*q!vaG!s?=p(-%mw*cXPkdPHtZxJAMqpAwzSl1E6O zs$or02>^Ewmgq*D`^|4$8l)q;)%peEGjH)fZEfm48`F;-G*9Qa`XbdYMbG;UymEKnV=OjHf!bMJ@}jZK&*MNn+T3pKEmr5=7UIh5&q0YY;T5HnLgY zhG!k;MDo56%(;K=WHR~3VUeEZ_^jz_u-Z|xTnF=CxTco!El%p3w3IWonNC-FK zBDxm-jfX%hR$}13n#L+?ON^*{l^7BTT1YMYm_C&R>`iPQzcr(GObx?Isj#Cnd%3ZM zM;||D@|o;)=xB)T;9L{RpQL+;12AAyPO@=BIoQ}(5ooIN4I7x*F$n~Do8K!!$8#fY zLD0CxWJ@~xA839z65Hs^6EXVRLHG`aU;JTYm3da+T67CZl^NhC8Tld(+8tN3-T;8z zY4Sj+6(T>?gXt*BUnGh_O%_vTuI?ryL>P+LR|EtN+63Er%O;)84YIilkRZ$}VDWdk z&Oa*idI+d`6f%=vM?!p$F`DT&T;Gd}0sZp~_->=iiU0xEHA45)khzEXfT>ldGbKS-r5@zM^7qR+>$@LtPLS4E|PTgH_hECLe`O$~< z{7q4xgPX>-d12GMn4{-f?Q&8|=A~W&G`_VFsUpF|QU$vB0=o}*Je@g~0!XnG=Za;G zezv_?FtB)KzM&&I;}a8qfBPY4v3Jkk>?nW4skK~|l>Pe7jXgsQ4cFK^;E38FM0oc( ziIT>2k%?2wBI&`(8H*CgNb1g*RzB0RJ;YJWbqkNEa#QP<3Aol0a=HFfX~hI&X|f*< z(rI!d{?85(y$Wyd7Nc+IaoH2_?0FG8*UsjGPvWvWUGSdiT_0Szw^bE|d>A~7K!5Gim0Mme&uMI;U;!)MGfh;ciY*Tp-HR~Ubu=AJYb zvvGz0K@}?*0?;p%{G0+gN(tAQ9*osJlC@9&j}fGPIi z8CuIh?FBxjv?sI6?~121ssI{u5cjb&STdxWcES<^(@E-*(wH&}dWOxo=@TJ-vY=^= zA-$USdrE1$)tip_PM0MES!|ozIDi}OlHtqHVVAF;_l{IeBl?H2L|fJpl}sum;2&R= z=;#xbFvBeYR}xEBsVxT-K?8S)CsvD|+9R{J3s4jT#BtiC#%NVp?^ayO~}_P z7o~+VegHv(g*?J#f3|0o2IGQ3bWhQiqmYHn2yaC6YeK)0yQY5E-TNJPzR-Ir4s|ZG zHC7-F=+Ah|cPBs+EVWlZ2e68g3SQH9HzQ8t*|f2qSA_rdAx5jM(B%GlWe|aEny!o{ zU2vN}x^jCpV33g_gbxw#L$&5c4&2}^+xLy1q*0n1q6fx4Unt&hINhh4|E6+O5)9fY zXk}DbqEESw{asNyZVs}v7((8Xrb-*QH8UJd$OVjk-JA_pquG98sr37?5tTt;mMgYE zn3=@)vPCYBkzkPsu=M0xFgdA3+G21svi{;uogk@>fv|XGET*bi*K8r6cw1 z;lF&B`a@axzUF*p{oAt*$qCEQ%c-XK|1B#Da6|mfKKzp-;uV4DvJ%_ZhlhB2azj4O z@I>{V|AQz_n?VJ9IR1xjwfup$@a^WMl>(oE;!LY7ps?Fl<_p`rPj-0vXRYAunbZvY z+Wz_c`TKZu^b!&ukn6V*QS#Knx(+Od5MexzGb7uCfrZh5KH=r0~2%AsM?p8kU{NZ9< z#X;35L2X=x&aE9e@Mw}B{UWkNSPsz$ffNoo^n}-~br3WhgG-?3<%*wdjs52kQI195MvF2u zpU~vmI5VZ4fUdjO|n$S#Z&b#ZgrluZ1(5RR-H!;RF*2g!yOT84-mK!=NP)|BMnLOK)r}JY+ z=RCWY0fQuHCg^r5fT+l*Tp@~KbFb}U~*E@*zmcp@vQz+8j@ZB$nlk#NzN+kp}OKoBCIdA z68A*Ku3=M}1Q zDv^d72ud3@(zpZf@0>Iaa+lVm94#|c}a6IE0N*y4J@EOHFg$5eO|>$61=tkQY#n&k$stf4;*tP>nRcx zs66z3{q};R?EzM>QNVi1<(MhE9EG>~_sb%mt-&OWb!dg}@LQ@BR#(f+)i!b+(0@tn zH)NjAevZjJ;4fj{?0oxHq4ax0;F~7Easc@SdO`TDqXnGmiLWcR>ieshdiS)K5#gWk z8Q)(|O^sIup5eCpV3mYT#>1mYa)4D+3E@CG_lX&^&U86z6ZKqCMBky|HfA8Di3Ib@PsiP*k4y zw?eIaZ%*w38zB5US8ySvqi~>Cg}FeU<8OSWH3eGxW*}%o&9o~doQ1Be z(U}GfEAET$&>%X=?+F4{eGNZ|%X!^c{n)CKOx%_Mw17p2cE@O7q8ioOM*90&e=qw- zIixXa$W?wwqdIHN2rnd2M}@zxiqiKf_2CVYlyq2>t{Qi%CnaaS;PSDtwc$&T6pa;I zvZV(Sq#OqZm~ht7l#i+>(m>@$q^j>p!*1?w@wtL)xFzn=Sg+f@XM?4-r+)H$Hzqc;_Gh$fhfy zYj_g=Ddr9SDSe!M_Y{@tRZwr%fo=lN9pC0}T~U8mNZ8Ch!OmEz-%lI9@U+2`ROdwI zUs4Q1x=6IgOT}pgS(r;Oo`=e;wuw;}5n%v#e)B{AA5q37UC83yp&}UAXUC`?y5Mkj zY_`3#ANWCYT1s5ttq|0gWl2kHE$5`#7MSxKM`Q5lHM_9U%90@v;<0l(iU@s8w8l(K z8e65D3Dnutq%*LYqm+|!(Lud-QCqY$@03g@nt7a^eMw%{13`=5PmMr@tt8pz zNHa#Q$0z4nbvR&?j`X=q#LjR&0fC&AuhG6y+yChAoT@Dh(VAo;iM3~b4&dQ1%Dytd zvzD%8+BugfG8GYjNYMM!m0kaIV=8z_gOkWq6fmaV>)l=+5xG(kTN*MEPe&#n!Z-Ut zz`epaz6$2__roelDlJMN7?H1ZIk2+t0j!j0vq?`0re`;7ZM&G8Nj&%`<4Pi;1zW@= z$)%QObom~j_V9d*>GhzIjzt4A=_|B2mfK%Uv@gzH0=Ybx3iWqGsUUpP60T&Vkb3N$ zaq7YMoTx9-;81CwI;_Oth=E29Y+LP+2EcTSpKvyf&~{8?t6N~; z`M%{HUO^HG4S&IJ4KP3G1wDQgU*D4Bhq78dAfxwfxJn?kT1wRh^eAZXl`Q#JJ-TSTmt!F@GropXKikbFQraNQu3<{1!*$ez8=2$vexhKxY zjT>ZXqd4i5PFnS0k?k;vi^SyODB5!Cv+elPfoP1NP`B*?WQo_#HwtHHnk`HC_V+u2 zz@aNOgp!P;;NVn42H8uZkODFIA^22)FWtvyPg>f)4uG7)0eJApZi_NOtG=9WU9Bi( zh4~$e)0Qazx~MRBT}a-@s=!T|qNjn0@Tm{OFY3SwgR@XI{tm`|w=PFHE5h5{1TTgF z2f0;IrLw?hGAxj#wYI2h&ag7jwE@H{)dA5Tmzd%7Kc3#3ohUcAU60aE?|d&9bQlGv zuAwXdK)df?PJ}IM+YsTo`X9bBs z10ZMmfyFS~U;bob^~3^I<-->6r43E2LRVWRHV&k46DkXdvQQT|HtgsZ#U zwu3D~_`U2@WHbpK5v0*qan#c19a-1FvH%{+wUwgRBqcPD(JycY`#&wYk;%NZ@M7;N z1fQlskM9kcX)Xl`{`^DxgSO|};D?+6K0#d9aXCKHGz{;N-jqgzlU7=auXmK2p!@6^P zI!ynmH|24=H??601WklAo=@Q$)@6^fQbzOWF1Mfku%4Jnu(R$QV0gdgEg)r&6tcW4 zVBdE^wfFU_{`iWmegmuM* zfXJ2NsC8^kWK~*sp1GdgO;S$|I-av3le*aF>SDuN#Mh5x$aRIfgwemErT2#IeOx=0 zy3pY=Iqa~-(WG5~fcTvCJOpIV;%gT1OYuDc1}q|`Wgr(U-F0k9?ydaa|9TXzn9g!Hqa@<8>o@4 zF?tbzgZ=tB&`l(doh&i~(NLuGLI4vvVcAUXz5v)%eJq%s&B~hk6bSBX6|kYB?yvT) z2yIp6MQ8HV?{5-CB*O+L>mo+t)han!?L?DoDAun&(sjBHZ>{N{Nj*45-w9HK8Bl5kc{7A!_P(Yp6}K9 z$KJ`ojY~W4YHYu`FF-otGnWhqnsvOi{KahZSDDB)9xCRhTI~c@koP9adk%VtzqEU})Yl!%*0$EiS{4_5IzD@7E&ar&%$|KH?!GWnn5 z{=|~L&ek9Ugdf>xouKyK^6&umY}+ZMl_NP?H@jyZ!CKY zgmVSJbron9PZ!hT6p~ic?Jz<3b=?mS&~1;(Ejks%08gVl$k&AGNLO7{;;(EKJbE~4 z#aG6(qD+AuKMAR@|3JHH_8`lk(Ad(@Md5Ju%@)7uwIDa0@@yx43YSZxExUlP-PEXW zt>)%vg7Zu3!14L-;%y{azP$tWrt35YcB%bk0J2Z1xQg0JETNM?+JL-q87uW+rEmoV zi&K0f1S>j>O$hLcAVY*8(^Wgm!g+l3dq`0e=7@#bfPsXIMJ?S^k5kiX+&TYCzyWSynXiPhE78?y{$4JN5+sPO8(=<4!V@M)p#H-=FB*z<*dBlG1uk zN2#GKudvk#YyOipM2O0B=^P!;nwDsF2na}7bot$XuC6y$iM^I2b#U(MFi)cwy&bEA!Qy@h7AU8oeJ*W}bF|c7%s5gsG5VdhDtX2FweRM;Eou)7|-(MoeS`&^jm1fxtc_t~-qsb!gSR-@10 z)2>RC|BaSUO0BWM@~p&E{21+6^#*NnVkxoRonK%f{97?9Hi4{m13w&@yv}#BE zOV2-9LQNqMt`YZ609SNcMzE7EE+V=-o)3`_Hzw4&a+VFeKkMNRE{vv0xn>MGX47cw zpDcpgZO$~t!?53p^Tkew7W?8OJ?C54mM7VVSDRXXr5#tOGk_zX?(S~sM!FlM8>FSXySuwn=>`dDq+1%K z^YsDm&+iYIYv;_K-7{z6nkFK@`jVCfbw}FA1PCo$AY&APVn{IEPPV-35M}OPLquzd z7Lhxbr7Ufsno0R|f&B=m{L?KpZk2pm1tU;P0o{AIWjNob zVlwa``3IQO+C$s1!u$Q7jiCzg*y zIvUXX(pZ@{=ThZ8yN_1}givWUuoL^EvfN$Sxc-(MJaDO>ja_~GHvPkuwftSIwO0LU zU+pLVybEsD-|^z~KEHlC`Wjsj_51d4ffVwXKglDq`jjd$p6$C5!Pq}Oy|ja;wRZ=r z3}2rxUhd;;dM+F=KM3d=N^5Y~%C{cLN1XM54MSS=;Y}D9@qvq`|LN-3nS%;2#o_z_Ipl zkqS^&kCBaIq!uCnW`N##Szr{z+aoDjdL-ueV=Vq@S+Ya<-FczG^q=u#a_;%Rug`a4 z6V6W+*gJ>tCoaP@AJGCr|Lh3(GIE0?jV;_pKF+fNL0!7|O#&;K|SEnZ}bD-~y z84Op#KC+Md`1uybiWEa9V~P${X4{$mr4%$qiJw%L*k_+kZ~yquA_Xc__RCprqX?zz z%(Z>&1V(6QKP(0y6;^(hGiRvZIJcwJYt;X0;ffwv0WR%TxBpqBaE7*UBpna6%Tk6Q z%L$vixI;RIciF%4btjsCQoG#I3-O@hQte<7$izDaU$3?KCl*Ojy0;%LyzYPu)u)wP zpW{B<`oog)4EGf_{>mab)pu@>nzcdv>#%9b8ZTwkY=cI-x*o<*ltl+5mr zERoDL=|8rig8)kqZ*V!P>sY-7rsD+1b3vkTdSnVIEen!b#ho84x1neFakjkcs8!kD z9spt?00Id7uav6dLqW08!O<&lqAu;KG6Drkicv@Ru^GvKeOC%8Ii6fAu7TLAkMOx& z0#Gy~pOFLDzKr)L0i;J~`>}*Zr!+Bg3+LnLOx7^!zOgsMmlV0gbJ zISCW0CF_2F@@gmV)Z75L_rX7HmxvGpU5Doz67kuQ-UP)~i@sI`_wrq$qRq5hl@Kd+ zi%~i$J|Zqbs|0-w<>&!`Hd;|9U47doGwYsyZ1?~fCp7`Y%SN`LH{J1H(jmS#|1TV+ zeie&Ow3Ox--qWusaTl56T0O(DG{+-FII06q3k~~EyS#UjoNV2UuYcP$Q#OI#3G|of z8fJMKF09GxQ3@MzRczi=xkOBJ;`5 zUVZFd;E|l9PNV045&!OnB+jv?g~Se3eUoJi3D`sJhztZF5?RL$jXVC4PfL^tnf6=| zAG2x`k<#^3zkas|ULe&7Al14Pe{zBzB;G*v9HIEJLfC{9tEFA;IW5YSj&+3 zebr9;B$gvWP9S!mU5fVKfR*Bhe0=`pr^wU|i=_WTH!#fVi2*v@a37w-)yvFIczjddFe!H&YyTJ?b8(}4+Nbu z));;5>OfXAB%{Z3fB)WF3o`T01>=8zi$rw6EgCTME9F8`5$2^ft^CBIYc`nmg*y!g zQG!U*Ad{Nb;P}OXWALa7cL8TST$(zT_WA7y7`HHYXrP4V0g!RIGc9A>d z^vU@IveJD81{8IO6b1TFC;s3@E*Gs&2= z;XVsew@)LmsJ|~rG7;aF)g4s|CPVlckG%7|iDX(k|NHLgnwA6&-`EE;S?2+BUxd`j z=-x;Cxre#5i~H$&iP?XLPaLla;@RWP6^G-j^5;wn9P%{oN;smySMz7wg(m_!*{HF` z{saC%w1p*KxBOa}NuWGjro3D;V_CHJ-)yU8+`48h zpCH!#Bwn|cx1NCd?>M-J6HDLmo-`?+5^99|J%N$sY?X-7ce^{2Y#{Xfr&HZpZY0!= z`SS}wufXA^{D0(0@fLO{<#dz>y2)LJx^+`k5PI{U)13G0ImUFx2CAUZ*qSv;7W+Pb z-#k-DtedMf`uDVkmcYt={qkKl*YqudTu9jutp8WIJBDhBh?u=0^&YMG+ETX?GwHtZ&$eDf3O)?%YYp6ie7}(v&gPSM131O3wBY0Hv*|dUM?Gz? z6GVdyqyO`UQbl(T44W$_2dk^|4tIv<*WjqX3Yo+V#It!3zM3mObo`;F;%18aK!yx6 z^7I);?w>(gxvB_n9@fTP}$v>Y!q3R79CgskElUhYYo|ihf!5Poy~Zr_A!rGj3@OKT;BC@ji0o zK7W}9)tv7RYSj2d?8)=1eWT%Y03<=RqpsXdWz#ZHWF^?jg|WbcZ0OXw)gO$qxxEf--!*=N!|}3b!&>%1SaIae&YKMDXQ8tDa9(%MSU=uh`U~GfzqQOc2 zXT{jeSFlnh8J|OS4i)sAxNRyX(O-q1@e!ZQezgvdkLB!%ym+dBfbF)%k%N*Zoi6+n zs|HO$9%%T2bzD3eL83hXwQQqSIk(f`>xP$nf0QsbXF#FC3oFn#GW1a1D@{#Z^-nB- z>dL3rgMiW;_5-~v(j%5)>}J?6602?|$DzCzFwe_6k7Sy8U#b?T9b-|FJdz z*^QLlG3_TGxJGJ+1-Q}R$I$GK6t1{_SL}XS%9|*MtI5?=&aqW)i8nllzt4gn3pen= z_-E%rl3`yy^TUZRDX}>9*_(H4(moJHDhhsqAf?kw3%{K2P;JLL$!=44L2gQ*hb8_a zaj%`WZm5JEuKi~F=lA-^9D(&HtvJqJ#bYWKrJ^7502v1a?@z3vC;KbqC4{2V&i|PH zOI_5iNW+lL^m0KOYQbjnhWGnI0jRk^@c_qSYn-9hjz1|-b;KK05Iy{pCRwrt?{@yn zlq}|e!m;SB;+8&hK4Pe2d9iKAKD4}W%F0d8Ma}uOk}i+U(-Y*fMBW{(qz@DU9>5LL ze_Y(y3f_gw;WfW^bii|9UfiA=HakzJIj=L6%SZVec`f}h#uVCCmUvt*zV`&a$tS-7Tay<{1Ki6pT-4|lqohyj_^R(tYpHo2 z)n*Stt4Q*mYRVc%%bmu!%6|>9v%A-lE{ib`T5Jii)L# z-8Lm}UrEH6u0L0GG04^W37AhNekzt!qFz4px|RDJ^^sDBpFc_4;*efvwB~C-``hv# z^sLpqV%uDB`WZsXJhdW^{9C>uty*k_^|dd#u#T~f(=K*$vc4FVXn4B>4Q~KEJmvGa z6fn+)=DY;5G7ZQFwv#TujZFLKn&!xSeFcGRtG|<{W5%FmAwGMA#IucdJ(G@z_}5Ae zhnY+An>7$GCMJ8P}hT}T$LTZ zEJ-V*z0xu5Z_AI+3IMa~y!4399V=AhJuVn4(~%vP`nb16bM7>eOe?|{YDg6?MIcyV zH7!tSCEyRh6qe4$e=e&Zm7L?rz^k?fv+1m>_Oqs4=Zdl?)_<>IXbyC-i53)8%Bz;r zWRjQlpZ?`4l%4^_q6Jy%P91c1o<-8doUglYiN1U3j8b_Y0R$m(rw}u?4*iqpVK(cCt>!^(hgV2`xb?>Gp&AsQ5|K)3KG>mNhxjK=-|6I>P zZ)=e~r9vfVXtc#)8kMJ4-#E?P-)5GM(Fr~ZbVCU*1i>wrB4i7SlTN?>d<6R&)On*+ zs@PvNEY95Oq9_^L$A~`r^xZC@fzpV|4pw6JJZyz7z|+xL?Bx=%3}x-sHj>?F>z`Oe zMG(}>mUX9;y$jIAVVOlR`)j^Bx-UxO&&)|^8%`SmsHSuMIMl6@Or+=e-B$ZQu@uSRc_;*kHW#u-8=+K$K;R!7V%i}|qZ(@|y=Zv8W&c+X(cE{4F(v)#4ypIGw+wAnI? z-Tf1f)f`FMT8Ewa8*5oX(`i!)&>k_PS94V;$8U+ zX54g)_Mt#rOMem5R*^VYc2swKoy{Nq+c{pVk4eUgheV`h7z4h5=FumC8f1XD?M!7n z+9Q8-akO##$<)2bp6;ZtVORbu+{Ps^!9ja%8ZsMa_w!6L&7*zu2Ar%TTx4gO@sGc5 z!{GbO)5H{=Up$=gpeC)y*rq5=b3T}T^PrJfc4FoMA~G&8Ul;Wqt5F%L_pJ6+zqj3b zhXcU@TIAtXSv4D?(Ba~K=P2q6Sv02u0V#e&-&(H>P2M(j#aG)Igrc4F7BF?}wz@uO zrt(0cIFIUCDqIP{i?K~d>>da%)10%G^M?Ko1sxV=AgB61sLh6FGajWt(4X(Kz}#vf zyiFS6y_?#0nZVHO8)ywkFeE-XLmG;1#q3VO>#gR{AEE3tw5liUNtscWNvI30RT|dC zUKI6OzMeRlW(OcGj>hY=w?r^Oy=Qp3u|eRsG*Bd5N>CPW4&H5j$bY06CMc&Wrz+aq zd`5!R{?9a!>+e=)3ur4eb+2o|8lCW7p?@?)cxVlA8+IQ!I^s|0mf|p#MB2$Xq(Rzh23i_0Yv~ZOb@C9^g ztH`&IRw1Dz$na`6%0~d_>*>axM%bqaJ$tCGP) zH6*Oj$UC`9crLRCg+^gR0wpvBAgmng5u_u2o$Y$!2dA4-udJb1a0_Q0_srIwF9B6D z%+kLGjKRfG@|W{zus*EIr%@orxzK1xo7pb=ar;AHKsuZr#c_y{!@Q+%g#2-~AFK6EUJ;@o{W}^Pfm)KEoYb$=#Ge z5VAyw1=`pmqeB<~)N{s=vx_v~*+CQsnGew()ZZkE#ma%-Yvu}7WtQLHK$|Qdh)t00 zEf@O?yCu0%4K$v`WbcTN17~>f!hsb-*n^KgNi*z7HFw^q*EyV*Re&BicxIjY7V6Zv zMTsD~HNv@Jk$I$|6C(3Q<9rqi?i*-pBr@9RY9RdzT|6i>yc`@ywNMwhYU}q%7rO3c zFE@`$*3a2Oj6g`a*4~x#_MQchR)>QUQjFS5=e*XFQQn!Sstw8@ud+n|Q^wUJ_igQ&AKmT#X zKDR?yj-=mT*($20LBN=@T$7jPBl%~}VqAf%)621;C1RM)zjr8=en%y;AICvS_3R7x z(P(0UH7{?=PhxPDe$d>kOF{cMFwpX~f$=GaJE7dM4Wp{j(3ph(&!>IX%k}Vd8}x+J z^Pl-v$AJBM^yve=je~dE?ILWHf$Ff;k6?BaDL-E0G3v&o_efd+Kkg<`6)ay`#!}<{ z@8lFbCHhCN+NVG1gZs*Y_D^hSonUE6XiTc9*Xnu~m*ML`$C1%;E;ppju&Z`4rjby5 zXq8cW^6hGjUAAz;N2K>ea%$mr7Bp$2{L0O_lDA#RxV7+Z5Tl@a#Y3?31uCQpI7?W| zmw?!41&)xGre&7FB%sZ7eLi``C5+uCXwh_%o`jckx8PDRx=KG5Uzil^U#Xi0Gio=K zizOy9W(OTQ{e5)|TEPK@ z*y+nD@+`({mVwszRe|;IX%FR904fPbv?a=)YM#^OZvLJ@70bUd}8QiSX@O zZ=j{rNO@81=hWjmK6^X?Yq_Udiz#tNDM@FcIyt(r$19VNk|AR-YLUsp_r_0=8U+B( zL8On5Cj0jZB+E%nWX{vnp28A0x#XU@z_f5qAD=hS)QDzsuj>$nUSd~cv(O=3<4?el z*S?buYXdGB_4=pz>Xl1U_wZ2a{z>Rk(cN8Q;BIwahna5NHpl4`w0*N{#9tz% zcFNEzgx!|+3aVmkms>rA+oJY9uas=iHf6E0;)&4ar)+OnArr%VC(1HPXUEt`X8ENP zbEyiwzgvoWM;HGPU#pAr2RM8A1`;hc$yo_uM$$JmHpe1F z;jM|lUPA9;u?Z-i?W=A%n+5{sFAQ;wO5UG;`xm?Wezhq%1=23IGoiSr2?9Hu&={34 z#H#}T(QQS$oEflN@@gu` ze>4QEJysgYsu$1p3=IY}hmgW;0-WyIW;EjyPVcGh4AUI!?mTY#QlmYFPb1!J8u9s8 zc1ghAx3xo~qIMiA&Qj0X5K5?NlY9YR^AyWuI_F=0I%xiK17*TypK+e>_<;%8Oa6y? z!yFezAq6hm`=FImcpNx6eo#UlLKHDYByV(?m*c2wL<2I0 zgwUws)&P2IjfHKQ<=S(_(t_Qa2fHP}*)*5b`n{Bam%~~>0RAjzrgEQ z0>HPKe_o`9Rk}t_YdEjW-t^t}D0HrrvO_jeh*(lM=S|ZR)$#fZ0h;=6ZJZ5h#YfHU zxE>>&=IG!qTY-#6z4Kd?ZphNL?ipK@ zUz^Fv=LBV!vvT_hQxheVHtN><2%g--5~4(-Gi{VDo7JXCf=pxqKL?NS3a*RL24`XB zuXsMeZ?aoiwJ+z3!A{zNXdJ$`I#pJ~aBCBww_WZE?^dFkFfS6D^`>w#%5QXJ5H4&c zy0zD2(a2}lJby`JrDHh!A^`;W=6D6Q*Ll}JTV(f+>{PVYd=)j<=iuGE#Nc9rbA4NW z3saiP$5a{jOUbhZBauS2lG5jV(9ybRnNxA_T|?m&pZn%IT>XE z_-_45;4q~x*ojB9Nxag>86)2g972qWXA1eKjEa zgvcLf$VmD)DV<=;RZ+5SWs?{HPvjk5 zaemsY-vPs*wxTTvqhg6z%2TtbU=BKcbh+;ZWC_9iOqvA>Hd;jm=Zham1Kjsn(R#JQ z_d#e{R)lN>r|YB_OtRuijDsr7KiU;6djd@Rk5ER?Gwo$K(@1!)-+bn2#+`nQxu4qe zn)c2A^H3r-($n`W&s}jxCpx|8U1g<$yg(qqb&7gxfB4-kku&O|yMB>7&W0pMCQ7Ab zYi|Rr+IP&tC9^6WoHZ@683R0gUaFFf2KRz0U4#W(h2Oj9Vv9*5B?5YbbVOEIhIyk- zrx@2xguB|Lt!D9v0lVjBqiEMyLS``N3|l@7huK(D zXU$C>GzFgRF$s}(2Q9(yDMx(jdnkW$-hE>Ob=eTPt=I(*bx>?~75a9MwNsOD=N-oZ zZqa6Bpe(ZK!(aY6di*?D3|QR!gC5)7&7fYB+v|mO2zE)Ev7W$rviBPArY+5b8wo<2 zZcyvA*ujl2tkH>}Av(s~e+F#M2=Zry_9!*0^qZM?9Uoe#&A!m{0#bJ-YN|?w-1MGd zh5Sg|JL&ai&(aV1svTQLiVr?e!4BUNK!h-#6$U-pMlxjG?U(dTE=9!im`B&I2>HE$ ztTt)otTk^tq(T-}{_J@Y6`|#!Z5PCb*>RdcB9!hbdv_C7GPOu?R-KJ!Cdhwy3?PlD zt00(3P?%M5!bmGWhRO@`Xj5qv6Ad9s=)R_pdebzB+(F6cf&wO(zCSQ2pc@seC~&C* z?T$yEFc^VH%81D=rSR7vi;MC0cPA^v;e#uH)t(w{RQf@&Usgf5YzZ?r)*hnHA7XS2=8hwZdGYRcoi|WF33kT} ze9QPhk>&ELste#dPDnF^2x=(sBkTTg$h&JRo}|ug%}S{Dp(y}9%0@J>)labi=6nC6 z>dU&vKJ1n$CwdvqXsyDBtU+((px?jWK;xFFxoCD0=Ev(KG^C?zR8TJ*WXK*5U*hq4 zuv8TD2aR~C9vw1Nj5qF$TBi2K&H!9=?+S2+GX=LXDZ8c4VC-s>wFZxo;^PfQbl`V9mmuuAPhUv_{a*?aQ?Vf2)+MMl095IM2qi|sExNv zIM8}iG(VFgeP~@dL1kAqQn+^H&TVRn6;`Mq1RLRc%N%hBTb6vGU`>BX4ZE_&&MggRk*_+Kz%WESx`Tf z^m4i86oU=(Oj{)45F`Dihe$5GacazaWFppD((miffE*JS_sx@>C?|zW%>c1308Y!C5j*f>>n~V3topZLdUUb)UDy>o$nTy zizeURezGBLt}m{!D(!c(kE&v{pq1dfOL29uu;D%ge-v=Z1piE4sij)1{_x6!^QWSM z*8?VQJ9=-1q{#RXjSq|-a}R$_B_ZwaHO+bZm{{x5d%kZe(b`Pej)FX+cAC@WWAP+` z)kw=;5Z@dnW$0cf@@~c=_We|!&~(ZfQm6TnU#wpMY|bW?g9KOE<2>bw^z&myb7dp% zMkOk*8;`_9dc^l4=hzmrK^pX4skA5CT*NU!M65Lwjk8MAXryLAg0xN(H*t(*#*A+a zZGQ8P)8-_c_rQtHa0tiR=_=A-NrD%#iJqMYMWKJGVv=weE`qRuCKgyEE(#xWRI)Gm zwu@~hNND=V0@svWNGw0EW(qg|F26fJ&ulNNuhjdu=2QILjUkrJl8-f;;R&g1n+_j7 zcU}3coD^(aQg(m7FW2aB=whx6#2c8)(6yIYb$haaGvpS}K-R+Cb5X zG0JC`CT{W@)|uoE>U(|-sHn>WB<}(%8=*W=T$hsQk#oldnbcFs@IgjpWc3Gm!`mX? zvmP!E4imHq*SbfnIAZrqwN#eGs-+y;Sqe?Er~w;%0?KvZyTGY7t-bM?eTv$2JAmH! zBXTdexe@&7^U+=PI7-Cvo(Bh4>-YLCF#Xl@-uF#2g8@~s*OWq142}#@{oy74i(NC* z4^0CJ6e;fqb!vTs3vWalk#_KfI(9M3M_1}! zJ#gkApuX>nKtX8U ze9nyuCT6YV!z=_(`b*6fG)Y*@zo@luVkdO`F6GF&a zH`I`PRVP%z^>YcJJycRu4#kGVJBf78Ppvy) z=!UOL*??#O=xWE!77MECN)|~YOaW58w8Uq}6H1-iH2BvfEaK{B`qUXzt+0!mkm#$u z_tGH$8aQgWC%t$kcfG7j$_@9%Xn@6oEPdG zbXWC>BN7EdQ{Y@VVEWg(j)PUhsejBd5>gSIFu+8)$lSM8?cD@iUlMRDAKEUOhs(T9 zZvI(>yZ`F*ezM2RCXwOjm`IRT2o@czH2b3!IM1ux={xnTid}~~O|B;E75J|!G9~zE zh_3d3af|~%z9xx`w`s_=VEMl^lXv^ZsA-~m$?`}L0* z@&}`RRV7k$>CaYQ{?4Mh^+!RT$6}Vb7*oE)NaCi9W3x;6)&-pYAo*jRWW^0RA}LTA z($#J`wOpHBgcEuzq-*g#`2C(-ip{QIILM#iVN_`cmvMuQ$*75Ew9UGQ({6o&5nb<8 zXkA^GWD(Gk`0`Sar_mY%++MaU)c2AhN-Ib^*~XY#ysBKdMOJQRd>X^Pg2Z_Lx2M<{ zDyY*;8&D9MPfeS+QVyX(wq$z4w=vF7yt>aB$E z^{^;_dzLReh$oMT6V_r7^$`b*0LB$D7+?u7b-mT`>m>N9gxlT$fB(_&D zyfX07;k73$^QHJh%?_*UmN*z>@Tb}fF^UI8mUb^5&-c(vRbgRb;JV=_GospfN)&^k z@$XNsPal;%)uh>YQ!}fmqBmS7eS5Hp>(=c_T&*p2fQfXh(tEDWfe(TwxuRIGun?b0 z$4uF9vubqyNPfI{_m$Ihm+d(R=F5!wi_L$pU?em`>v#H%4QAz&!W$Cqp270Q+QX4I zUTFCB^U`JJC3yffG>~G$@!CYV8h46mW}9B*Xf7KxVv#Lnt;VnI<6XA`G~Bc+I{h00H?Mwcxdudm$gx z!DzLExrnDMAVOk25@LjeYOaIz-awnT9b-y$d6w3T%;rItI8W(r^qNq$WZ8AL2;GBv zmVP!!3pB+zjbql^pKgqt$TkB~@KWlDT$lR~G#q=Min<@RB zbIkfW{HlX9GI{Rar_~~yR0KmyQqGL~Pb@G0wP#Kj!QWd=-`>w$(US^RW0dn6fwC~Q zZvD}+#7n`T_Uzy>Z*`B>F|Hcb^}i8J#pY`y`SeS4sZ$Aq_|ai|{`vS113u2iTP%Ae zt8gtVL}0$9MM`YpsU}nD67nkg|7A;?dt#xC6Q*F6^7+!6aX)87o>+t6%qWCffgtTu zPaS^FlxWsrDssrq+jr?_hZaCA4Q}ms5DTi;C=Lsc{R)4(n_p`j_3p4o?#|KdJ z=RyBcw@;v2BWPOlJ*GRUOWgmGP2CyS*Tb97M$W$CK9aQ{8n!RG^~szp>}^`Nay-f` z0%CP5rS!}CpEx~(`9Mngzipkw$;4x$(AY;|@1SU_yzPka<`D3$s3oXg z`g0MzVl5ib7*j8nc)wE@~k4+Jd*b$uFi9 zB{Zq2J{ttgXF#cdClu?9?c{}{D@EZlXl??5f|GU%t)Wp;P|q}y{TpZ;vZ9^cO!Gbi z^l`Tn#vxQ^Cz<6%?%yeARW?eY&Ag+6$F@Q)m_@sGZ2_!ib>^2qoG;h>P);%UmzDLP zP`C;W^AIG3$?Na+jKy~_Gyd;EWB-%a@gF`?>ZnUBxu>-5U2!U&%vpBo*s-utxC773 z6%ULAW34Y2AstQU@<}J?@c_;U)at#u3Vv!`7@7o1xe`))hXE6;QrLP7NRkYJ-yKaT(n2iw1JBtI~q7gIS?yNYi5|?|qFVMohxH_Q z^euo?qaiDatfj#RAqmO)nqG621Rj704M;uOY8`PNGXAKWHf<$=wm`vNW){R0sS>S% zU-C{ed;_gbuVnptDaQia>yFU9QS2?x$+fIykFLbH$(_0QsQ!m&*dP9o;1hS+YUt(y z3+*O=woG74fBRCzztu%5#lKShDzX;zB@%X^FgLn$j2EM)33gq(7WWFGSDT$312?!}9u>bTpwX~OrNyTU<2jD>gjHXkr-U^lvihjh>+!fq{yPTX^Il^N!!x$lO>uc7@1cVP zD9!_FlUFnUJ5)DoWr+$Y)Y9xQJG3bjjMw!vQQp_+Q$)eVpyJ`;zWjtLo4;dklF-ri zllCdSg0is@!$BdZ34E>_kheAmiWwarxP#x*+EwvL*6Z!e?s3M$D)Yj35y+OQ!#^N7 zAQBQk(CY7|q^AuVv;7!`NazC3tjW3i4gsv9P5@PAwV>5;gqhGyaW}q#c@z|Sx9F?T z!BNkc7jMgNq(#u~aa?GTb4&`1FXm{uTEb;D5tX~nS`Fgh=Z{|h(z|5Tv!1glpe8PV zK~S0oAh6n9<7YMIqU0-oY~miKm-L~x`_V)@4!bC<*%@^G1{w$1yNm6&EZPPlj=n-;0?1GZwo$^)%6^->80q)P9^R}(;Bn#XHhx~LQ)z$y4@2Q%y^ zLMVKG;Xs~r*;4=bI}c=34prOv_UN!0QPZ=h`tlxbrH z1G(xhh7fizcNvIHk3eII9&N>%g{Ji5aVDeawDD2c3A%VI;l?%E88JXFZi122j0&Q~ z*SE55i&@_7I@ zJq`wkK8?kKeY^D?g9k|a!arklv+iFRzlK0kP)xsp`X+P3WiYHP#@@Moo*e{7_ ziDq3JPq^$}@5jmC2`GPya<wMSP$c+quI3nV_{S)g;a38PrcKPh2; z;$k!?ohpd|1`hHV$?uiq=XDDFYc2v{N|VeX#cx(Z${(}p57$ZFH1#){8h83Vb~Zt0 zU#svsOe#t@TP)Wy@F8BQZPe;+Ry>{Mw%8lmc-&$sqbB4CmIN5O$+9%HKN!iDxr0Xg zJWCUn#=Wm6LIn2m!`IP0f%gqGukGsKv?Eg1GJR)Cf6LNbm#zQuMXG*7yy(`^%0JDP z-M3Sm{_(uMEd7h>K>v_1FwAk7<7_)9irCq}{OH4#Av=#Vsg03r1lfQu{NZZu4K(U- zZAIrw)4tJRBMhlVIxrzG+cz`sfW6M1Smi*Un9$i?+J0 zr)iIF!_Ru&K)jbzTiJebGl0j%Pr)w~5bWp=$dhN%)NoZk)u`FdXzaH7%z(}pddEjW zF>jaorfD-wdERHDIWb#aNco2LogOGY-|wyNt$tJ?v|pL)ioaK-rSUvLACw!^xLGAo ziB$lQXsK8 zt1pCuXCeoN_@$|wy5$X9ll^!jrd(GQ8i5~cfYmE)fKz_|C)8@Rz>gTCG|eqaGb3U@ zA3aoLq~R^p^FOr7Z<@vyxhKy}YuQ|LpJc%tQT$>q^u=mugM%i&+RwjRS!$hW(Yk+b;SA86ZzKBj3#82MdH z!Pte*+olD2n&7}~I!4oXNewxI`UVO)Llh!s)EfA6iuB>T22mZRq z6?g8i+P?47s^^oMyVuY|FC`5SM1nrZ$=lye3LVHT-WCx{7XJ>ZAaallY=`mmx%l-4 zS{mEJ#!TU=#u$v}mnvRclufMDRB|EVxshRvvprYKF?4VbL5 zv;YQ&YK^YYqlP4Pv&ZM8gjjOJLO$6O>e9NtXQ1Od;2DHfMQXNH-HOkqe8tWcF+@Yg z3`9_RIg>;|&jbmlXb9lbDKoZf#fy#fw8MetmzbwBooe(HfuQfJB3(W_YNhRd0qqsp za-mehMg4D@<|c4Wt8=4Dpu;nx8+`4nNhJv@V(=64?H9Y3c(nBYh*`L^o#O&6joEG= z_IsqY4QN?3P~H02)vql!oU$r@=X6W)gI2mLKk3H1QY)5 z!*;jy5eWP+Ou(Xf>(NiBh@+<2QgE80$9g-NEScuznX5n`cS<3%VLy|f@l`-u|0@k{ zybmAWv<^Zk=Te6^5#9TrKj{emlnF;G%kDK;Y3m|>+1iXblZl`dAYn1?;FN(&OH#TN zlBy#b5DBI^0{7{>1YCXDEHDkGr&+ibl6P+^9@7O^4Uv@qvz;+iF6Lgex8+xg-V=H7 z{rJ_Q#_uSHij;$ALzpEgUg3Nsg;BxT5Zn0hZH(6r`}flVW`P(~JKb-f+UDZsp02l) zXUE`~{zDaN#~FG>-k^fXn{c3Z(clHTRcp&T?32~GCh1@P!U*zxDXEd zF!(1dfoKn$RI^e|ZOHJAo(e40cmQMVnWAGbbxFheK5V6W7oE~gzaiO6KH(8^1aRZ; zd;`rBfhD^@X!`iKePaKaCkt=*r~R3Z3GXCKnrp=uCBbhSJ0vbJFl|*iskAdW5GqUr^CZd<)~o(^2|iayvQ@b`apwK_ z=`g7YquD-ZH#GZW;E%0BJ<@~kJ+He+c#JRH#P~ZUK})^lpKI-(04gxeh|Fx>TMPVW zKu#b!tG|<<)0ASzuj{340AFz74b*Q&-W{43WO}HCDw=xe?Ir9Dvc1DGZMh?@D;qavSugqjaJgp8Y$_GRUY%T;vV3 zkp`Lh3%?X~$i_T<%#N7W{|Ie5riqfNqk(C1a4&WzxhBL(_qNzE4F_8z<8)!oV(U1LC0+{c5)jnwLMTAo47aV77 z_81R_A%*TP2%{t-u;gINS5b+48V7vJ<2`^YC>#$s7^%hMwUlg_2$dp}zbULUzp9}) z7$;Ky(CZs$h|?-br|TIF6dfd=07{I;Hg(1YX^h@|fMeB3ewh`~m?G+cJgVO5JyGtYo8vbvUK7|A#q%%+X8))EwwlHb`FSWC;`;9qB zYwQ&ipMwtd!ywYXAY>2fgs9~UWURYXSY=A(&)hV8Cg%ly=9B6kMR;Xeoj3U__@|qu z3NZ`x&q2Uqy7x0Fh8n$rwj7?O%E?|{BZoIY@i6JWD(5&K=I6KE?t=#wf zo41B^(s;~w)!afrN?4O%T zeK2jIg8gu_xT8=n$cZG>6!xcEgYMoyqlQfat>S7zA4mDhm^0DMdt?_;Q4t|uVZ_d# zI@1a?nW=UNLC-_f(ndb5K~r5300B9=(J7{siD>yxXxMGXhn9KN=2}>8x_@3gO}LR8 z-axCeX@0ro=Ty)o=?LsZ^m&O?f5loJ5TN%j0-GhTgw0hjcILM8G{biI2Bzsh(nkp- zh8s;;A>21lO#CX@o`bO2P?+@z!Tg;0Y5SZ0eddq1-VAyzJpTjw!6~K|uBaK7Msthq zQQd*03h?6s34&nC+j?XVo)53))27~ zOh+*T}Rv(s!IYd`vV)K}oI||%iZ#~2dILd6vUHmognr|Vl6X&51>#OOM+Q=Pyv!4HM)y|7>6Gy zzx@AHDA^%nwG-o8{W^&`*O=hacrOymJxI*y2B)<7){RGv3lS+jIn_k1@F-^hE{G7n zT5U3cD>YVk&Dj6PHdyGI&lpY=NK`tnc;c@@@Y5ydjk-T{T0dE?Y|N@4Mo|(?`*;=b z_M(bk`SO@6sNy{Tth=;gUEf2D=`e{EeV}d@(L*@=MTm5ePUEN)R=LO#t^R`I8qy9p z8_Uw2z~gzCj~nD1>~t(%z%)bJ*ub5dJunjL!n~iRO@npr51Z6qiT~WbS`|V#n9)d-gu(Y|Nfn zlgQzIj2FWs*7|N~sWw+yO-P-TJ+NYMIZT=k8rx~!F_(RrEWsTtI4`A{S=ng^Cx_<- zXodAFnC`w60J@6B=P*v!!G>c;bR@I6Q;JIatd%EX0>`C)?r+*hkk~JOuySr~yP~<3 z(8d-B{Nnu1{cfLcR3tWL(y3%S^_)K~C^%gLc#H8B$aeua*ros%80x}?E=y-tq|%6x zw*40Yb%sD(RD27)?G+ev6c=2Vu}QT+GxmT(-tO=Bk+PjXnGF|`@7-_K z+|G$xcB1B0`bx{8mr_avMr@4bK(0x3T_3WPUQ3x5MenzVr2QwdlU32dfp!H@uRtGa z8YG4iZ!d|0LEJO=C1DB*rOSPP;2|MJ9`G?sHS{6~E>pCM{_K@Ubvy+N$-?)4w)EJR z9j0Maz0e)_LhXIyKlC(0z)Xbs%?Zvg06_YK2Q~+Ggx>9B<+~!^HH-V&fU!Nv6tuB8 zK6;Ds$0@q1br)Lu8rtEAbBKYgzVm}pj12Ix53zSXdWcO=kAdA?*FpVxvk(mDT}9+On!k8 zJv&&%Vsbo+NQ0MKhR-s|e_%tZmA^_IdT=bVvX3o^fCr48HYm|zLE~-Ue^)5066{~^ zx6e}W6DX9TuPv~f>3AnirJOut&KMl9)2$D+o5r9ATUyr9Ma{mx-*m|fHmL?87Ee)d z3|jjRZ_SKK1yJe+^h~&gzMUwq>|ZzahJ2P(@_rD-(AYrS$BV@UNSM65kuLa?=$#7j zV6}8R=W3~WVKFNgl&sF+-=ni)RD+);RQ{V%nSYCjT&!q{Z@olq0+$E$Hzbnq%$*)i zq8(0l*2xoSKII;5ARM=3eha_bQOHoO2=1`(W(Zv`i{yD;`i-gqT-wmiV^5d zO#UNdC^Cvsh8qHWEl5Jf-OM0}sa*_v2L$xD09knF-7{7yEwIJ~e9li|SYA@o69k6+ zsZUsxMnL-pBF|SIoI!HQA&@%?1WM3~d_99`n|7>-0QqdK z2E}{9_FGmjc{D?-EM1AXuKob{90y*&O=SmNd)638rrbnJ`>!nk^vy#(vg6=?;vmUj z?Io}ED33R8R;A;YXvozJep!!3Juk`y5jdINlm$>u${o|7Gb5#Ac`=B<>(-yG6@&K9 z4t+hcc1etn&r!-36n|hh5*Lnld-75ZZ*Hk{zBCz>yj}RYTRa)SABH_J{0WPOn-62k zIW}o)^z7Wy3BvG*tNs^D!J`#IeZ) z?LxVv-TIET0xjQsuD$IDRBxQzB9#~DlXmnn^<-{mW+*`lY;vEbLK9Q(W9`E@<8mvElM6ZLf9R<*UZ8{TWg%@F05|yjx~T? z?f$X0RYEHyU&Y#)i2L=f^(3dRt$XFScmBL$C_=20JafU~HvT6pCWr@4uI^`B9r$Dq z9-_u*{bWAvGn|(2)C_b-NN2*8FgOu;2niOtA*#G5_)VGEf2~zd1O=wgtWw^U%BZE; z5uT3x_0cWY+-9zeXAy!+v48#6UoI5)P$pjN{kMF17UsVpS(^n(8#Q=XY{3~j{@OW! zl}F?C=cI;_O;^vFa9o(8rx7{@cxQHt#I=x{T|IT=6P9pJ!gad(ydIr9L(=D!@3ohz zZ|FSh)o6~3gMX$t^U|*H8w6{DJGr*XO2h$$UE&j#*f3mGEo3B6mk4fe!Cx0QIc?dg zFO+L$`!KYb!Gd8ShULlR+}dNbv63WkcH0~A2@C0Y#NC;*!;{<*x!jqSb5JOO5vq6i zhv$idaNK*S}MQ53x)l92>e zINZ(Fm&4vSfs_G|wT+@hEyoqzA6@aDH;w4pnHuGlX#viEY$uzv{T;xZ#m0wBS(aTD zqHz&J$Y@@6LZBBe7gqp^yt<7m522}M``KEtXy1%qbzRgi$uVO@K+%cm^J?iz1k9HU zC;$axKT%ETK=&PfPE@4BEzd$~zViAftU#TFg~EBRmQt8=Vj?FGN(2*=U?KR-F!Ib>%mRkl2eTH7WQftp2<2$QM{HSpJlKmaIE1%+zS4rxUNQ2GYh4hOdbb zmHOee8X_2~EF!K;7h17Lq@S=_-0m)~kaD$e;LUU^+B~8##A-ua-n#pDBLJh3*V-4m z){&|*WYjnfp5pQ=Y)sw{SW_H1-lkE|rSlnvA0EM@Zb&)z)7CaK17ykpZDG68Tp~Xc zJyDjm;rwktXR?i+QVm@=+Jhhna_GDS~R9c-x4bI zm#C@R2$4e@Zji`7G|P0CpRxe~J!fLLQ>go0Ct|GY9_r~cuI@Lj^su!f)>y>ye}JSK z+kpPrMC1FuuJ2ZOO&q-lf~E>~Mi&ui>!lct@w|!z4=LxH^D%2h>c?73{Oda@c&y8( z*b20Z1acvp9V73(K4qj!|4e5ObBJ^l8s|&{3YkqoI(z2D=5O^dbI~|nL+}4ygTuKD zS*(?@N0+aUfXTvmTAKWy3|{C6^CLMj)QLcwoop9&O=nzer5q8L@=e{(apk5drQ!BP?sCmJoU#kmI^;j`SBgCn&8*x_cb|#4nF` z@j{H{GLmGv*sTc=3L;NxpotU0kXG5raCa5Y8kYAz+0sDEi@={V zXU!`Pc7^zQMHsph9QAf3@J;iKToDZ6zuae#t)6zeI$S&b^O-8t-x9;*Y<~LW=8YXr z@y&6siVMTHCE{P{r~^aA^V5Yam4Ac?r*eLqEs)UAnO!Ly9Qe8E8>ax6(%)MIbK86} z4auvYG8E6x#UpZSvQO^EXuX%1RMzr2ncBubRj+~@%MVQTi~W`k zNXJ|ocuFFp7jX4(JpKXx6+XRZjR~r%vLvlKgsws6owUHbIdV1vMJ{A-<5KHTJwnt% z?FuVKdQJ%m^8)Ng0|tB8+AS0``&`fzK-D3NVG_U`g_8j|B{N9Mw}|-pR@YVPOf>3Y zO1N}TS`93Ga_9YkR@QRAEQ$d=WTcg2dhlhx&&sDYb9NxG0_IP)Pan|#MSZvkOhnRmONiTj*hGx znQ|C}u$qMCs(nHZIrpft#WRI05%Hz3-~u+rgNOA?A*44$VtJbkXbymcoBsQZ7m}-0 z#xoke)uj}Hi9|*nb@vZ2_*TqIj;8kmS_O!L%HHFu9R5FyB%9}dY!v*=!Pb%gLYX&o zt+I~_B7(1RbtyI$>6}wWi=$X?bpa8b1f*jk{H^6{g_U6^CBVe>s3xtm-WQwc{O02_ zc<*CchoTm(0*OCOeGYoJKS@RauSU{O}!chaA1GP}7>BJPcxyVf~DRN6Fy zD;d)}LJb6%KKvR*XW6N%&Q|%rOO%J;8&R6L>F0npGLd9fvvU_5!iff}$BD|9kl_cY zM1D{+61{nWj-eM4v?iJGW*TaERWkjmtr~Vn2ka6-_+FU4? zV44EZM=06- z!_@>(g5+o(YSt(3ui|T*h{{?Ww=wzc7sCt0lF0GngGm@Du$};apgu02nu6yGcXs~+ zk-n1wF|s8Z6Af@XchQcjz1(+FAKN5aA5ao)JSF#Qsw&4Q$^~M?0U529>J54Eg2-5z zIE|kLo3ZH5^#}o?cvXLx0Eu-^YiH85_jmjGCHs!AjjEfv3Gx=3%Oe8qnOX23zWz#| ze-2Ez9(zYDhK&6wKZ=_)cD(G_waRCj{W0qd>;7(Z`vWW)0a&&g@wwh$+DL$OoKpy& z0vc+F?v9{(T#UUQE6X@nBIqrtTC5qDnvVmT&uretfKZP{N;<#iWAZ@xDYKY%5F1=M zz4<9j89d66G=GE-mlksSeBxkXBu$eEK#t5XXLli-(UalY;+&lG-mJysHTg;F?7-r3 zY$W!>h1}%evQZ>x>`Rksb?Y3R(D$IDU$FBBe=%Uk6!QA~hNq=}%WDvam){FnaY`i$ zAr+vedTx0^US!3i$Gl)1>tMmdTd=I3hwTcX{MP}Jspn%%Z=Yvu4t9(F}KV z$H8>OeEa1o;bOr)CMWI(ummmnyW6s@Ab>)LCC`Erc$KBb z10Rhu9V?BlmwrP1PMZ2}k$oqJBtRN}HrW~|_2(H&I@J$n=#ql27oCldI0ujANbz%xqS+ zt<6?`mV{EZd?twexyKs&fl>@G-P&2r{*xEZc|+X0T%^jemo|YbTgXf;4Y18VxiNw;IkuJ7ukX>hGlW;eSHD?6c_`-f3Yt|06)p^-D7W z-hV}9lk#J7y%zk9{Y`g6z_yv2m7Ln+r(M1@;BQ?$7?Cr*{JC^Aa$Z?qr0@Mu*sNU| zLCIk2>046QJ89WPxf5T$jSm)?*`=91qqhtzX8KHf4|LjkE^}{U;Hr-Ajt;wN zpL~&px+cIODxsipDl{8NeHhZ_%$^oo)|ie+W{T!go51i(fR%n6L(N*KC1^i zEr#Ycd6h|l$C z)iaOc05UFn!Cc|ibY+R&5O8uOB<#6R3D-R$b?ZWCbI2T;p7gaRSC(`E0MmpM{dRzd zc`^>#(QBdu2#?)nlrThqS7I6Mu0{Cqz57K`5?DZ0VROuTPlbHMJ{yPGAOtEM zs2h{eh}bPJKf*;vy1why98?tW6+8g?5SLFO^_ZI6*zA0;N<4<9A0{AxW&6++HXmDicKS4PRlBa_^8AIh> z3?PYrv8*?EF0HzEA??IHuFapyY7jZWrv15(#MxwQ`MyNs;n~Klq^)#n@V*+U8C3^M zh}=0O$essmW;T0^Rb>6O;@Z58t+HhilLg~Ln>hw}CjJ>?#{b>xC1pJ1ZbxACcOnjE zrErO(d+!XWp=ttQ9d=zdP>mU?a=N%F@=GxRZjPV^Dh zE>VWXS7)RIx!@}4gAHFeuO9I~b{P)_?_=7W#9ApQlUBF8yn=ijJFr4(2|9<9NTJwi z2dBAQ*N9dN%-4$TJL&CsC)7L@3F!eyy`==ZTu0j$M$Q1yJ=tYxoJ_(mu62%%IT_`& zGyL$OMr)cgC9~VW+`S+K+Mb~CZ!=1WHQmSq^K-{VxCAa0|J!Voku2XDSGAH-b=;2e z1+1)MH2B@OuGrTz&oi4R&c*-!E}|GpCWBzaOngK1;YEuh$7PtafBlmTX+DOb%%r|V zuai89Z(MnTtL)~>&ReS2m?{eM1q{a@=A^XpmSvdn~C2lU{Cmse1(qR0u zYo0^G{7Bc>ubGd_!~6q9#PSA+_pAdaG|Jj(s- zpd($dk6aX$@_=CDqYgwr=Y4otLUdJtrr#s)BL8J!xmHFr({TFulU$*3v?mpP&Ye$ZL& zYLlsD+@hH9t*K?yd5%Wtp3+BvOSp-jtpq7Df!*6hM{$#*@)u=4BjXZrSAteVF;O>S zNr=LQszrJ&m!T#G-@Y)yJV52QUo>u6m_cZP0BUK^ z+f;1RS36H(vRub(WPJXejRRB}i!T7l?_+Jp@1!Lht`fQRQ_Br$$<&mKY@U>n9yr=c z54e@TI#X0Ayo0Rm)k*(QW*FSF(Z8t+2q25x^DD8rX( zRenFuB_Vv(?3JP@=ZWuV0Aszg0>?G-M-m z!iAEt2ZX31BGtOSiGu{k7)a(pTSoF%*>(FfoY<0%{n-^wcqeV>OuLiMg*Ovx?JrRF z@q-Zho1kDnA*!;-iH0hYJk|8q{5#M^WbLb-)A>kfL$p2sUxa|`kLL!0miPjLuZc4{ zhln`k<8}8-+L~911Y;yMQVD;>`oRM+M4{9kMi4Nr4 zz7#6FE}ExDW&NUOTYw5EVvPan)IwK*qGgt{@3%tPV4c+QDZ*?+VMqXrs&~@bm6IRb zoW)isSMn`sb{)>b&~>*I!wlt&)a2M5z?c?XD z9NsOBOhl&q=G*{GufNy{ZN-A&w&N#lK65!wZq}kt7maX?`in<%<%_^jrARA!b>WC9 zpogJpKgR_F>-T-%(v9Yy<)qHDd_;4y`RR7b7q8l;chV9is%qBrl9E7nV41VNq1pK4 zpmpF)TuVf?LeKnPYlF3Tzt&if=PT~H7tU)vs7e4>H^Fn`qY&f}+pOi0A^PkCEL~HC zh2huCf!$kj(;rvIekzIC$cT;oouh6@$!AbklO0O?2K; zu&Bv+mZ>26D(|^@*uXhwA&BW^=m&aJnwMzqG4MP3wtbKXEy!=9znG9s9D&6RTJ5Qm8(tlV|K$*u-lhP&=M{v&G ztDfcu%|s4#ITORHGq4h_$%tVbPXrWBG+X`C13goB1CPrz^18U~-9wInq(JFYITA<1X zAY3fD+Nq0@s%8g?&n~|k?C@Jk*q@qcpn_iuA)fwY;~4~@_vas$R+^g-t4<|-aLGzF z3Gb2p>IlubM5mJx1H`R)svI#JZcH{>`OTBJD$!T8i#4X#hr`3ox8PkHhQ@d`9L%zgB0 zd{)KRY>`KBcYS}QQn#P8+{8A)wl1z^!kDZY(Fq^yrs6QNL^i}LyYjGJo`y#}QA<73 zy$5PJ+>Nhn0U{hsUz>b|wP90Yu&3)2?!Leq!UjiJ>)+d;u%unJ*}1+|+{FbtS8FC+ zh3QC}Syt?0jJ*N9W4E8xrca}urFj>0-hFc+U@LcT~6q&(mbYdn;! z>g!B@Jb@y$n=8eG)&v7lL4rU*T4a`;$o0EuJmBre2Lix#0DDufOduVFgV#hB!Sm}d zUgcL%IvgUo`)=xv$Ikbxt+4Zk(@MkqIziZhfx~Thg`=FUnA!hUqj=6O zv+$9N)SjG+PN8EkUzO>e9szy}smhe#r@kAcpMNAt4JMF|Rg)t*wft^HJ|&qu{p&J} zQ=|Ytw%tHil{CD+-*`hl(iuh?l!%122L1JDR!dlFN!o(iU0tNIQ<04MZ#Am%ud?&- zMUYRM$(nBQb@j3T_W z^&(&U;%EZ@rW~td=E&y3_=jAqau7YcPJ{BhqT$TTIem@cB9lK780iz{>*}|54FR}{ zFuYeHfh|P-?M9f{i39)*Km37((<0f~5pY}z9t`BwHqHepCR_dAovRO4(vf+H<#NBZ zsfbs{+Bs4kSsONVp8rM{RIembDm+#L`y2-AnUSZFh#vtJO^6y6QQef5IA1Ho#QKQF0lfQYVc4 zaLq5zSa_&ji1M~#sR_%dMpGHfl}RY~e88G=@Uws5WH6Sj{_s=U3Lb*;dp7r*MC?Tk zFEc!+IE^z2f(3O)uO|t*cqUdr9dvym1z#lXEE$TMAcOeD2YoWD*gHgS|Fsx>H36Yp ze625tB{rd%+hINl-C)f;&z zxa{f4kUpc=)BD+L6*z4TJM~{YMZj9Cxyk{6g^71!X5|KqKfRK8l-jS@BVUm%6iZC< zmVzDAp5bCH(6vD)>mL9F=d-n@0pmW$y8CHq0lCgc1H{Y+!HVZjkJmXh0R{0N>_q!7 zt@Onk zJW&OVT_$&eFYRK6yZ;A!6Yo}OAy+b8a@r}N1aYIQpE+pI#p2zgx%Ir~-o8$~i`8Sh z_i(L_w3d59aoLFyDMR@GX5P;QgRct)01)bd=}dfe19fAoX|fZ@8#T=)O8XiTovaid zm$^JEic5;e;APX3h3wA*ft5h`O^UmqgnIhbui+}Bx>@iv(oWroFe z^o}xWY1WtL)xdKWqo-Hrh6A3MN(3X>`W%Fs8E#l4WypKRFSg<8CbB(ti0w4aWs}&l zi>cxAL3sZxgN0t)C5;|fpw+uAAAJLDIB8S#Q8(}< z+J0&sYI9u?^Us?Wby=7T_H7Z`~{#TAMcR(X%czxjPoX6P}@%Y%bV^aZ@AivOH$WPAT znW{fl6nS)TZ%VqV>YNLYZo0Lt9@-qy&O;AJ>fF#-tTNM%UiEjKW1tZ~e19~L^Lr(B z*1#7Ngb)Gdnbj&g4S^A|&Q-g%{=u1oZuIbRzXlWou0y8Es$T!MiBsu9g`OK|{%hJL zmx$@h4xpJKLG%7Dw>p1OGRKrMF;E~upOhCHGwGvjs1}ah@wVUiF5JpEn_Waj#>Y>t z=eTZnPh8IPyuUfZU(Jb@zVi8$gXG>sdJA{qRxTjc?&iD{y5)nY`I@@Gw_!!75=pG7 z*CWxmn0fWzQphnyM&?lLxs?e!P5?H`^@ton%v+U7LX&8w!YfhqLP4-yLqe5j@Qh>1 zs_$F5yhAbOjYM;Qi;TshHaV#A?!;gOzk8 z0JSO<`1`uR9O9dGF7z^qtWuKqREZXaf-(AcOsm30+N> znyAF6C%<`u(DB%evYx&tp>qQnH)$85(M7OHeG38H%1sZsc4=^Z=|z^CZ#B#8^9Gm5 zSO|jx^MpR^8J>UN%H_vB4o)d~#3F=h(;uoNDiha)7fZ*dVM;fBxl3K~FqVm26V-gN ztm`0h@*oMaQvonBgQ8ix|gDcj^x=A zrgelkloN^IhS*%-q@0eyH0C%{Mgh*P!!^hEGcxCz z9~ba%6AOS~*AT)ui#V*nBL=MDvlTz3KZE&R?2`G6_ArjYR`HJ-#{HqtpIT#k5c#mQ z&Nqc$wHHjlsnNH-VO=lht4v5RTS)+krUmO_>STS33^Eg*LPtdWVV{Fy)$i|s8@fU% z*^rBcUr>COV{fyrE!-vYp(F7wfi>x}GuX%dL0Mwao`ec)2$VTZY#mhVbWvxWI$h(n zQnvB19T?5*cstYxL8%%=evXME{fnXU4j_FAA{UM?qwL2@$tD?)7tW+e;<~_SBt>%8 zq#nK5$1P{GbYRXBkFGV*Iu)@--;o2b72Jxp3|L{EEQ?aKHHv(WcWexNr@WCko&N7J zWrjmQF6_{FI5_E9TH{g&^}O!Mx4ooovkT~RvXVK<)+@F5?gs)Uh;A>?t`*Ifh1_Py z86}BH7G=zI8qVWj3iIkPM8~}Rm{6*VbEL0P?aKM_i~znUt5o?N7n@|S!qIR9FLmYo zzCSp(7@A{QVj>)WbG?&BE}Z0tY%)HI3zKztCLXne{9Epa*&;c+V)(8Ut>~$BgRu-UDR@Swqv8A~G z0A?lVhD(#qFf51f@~i$x-6Fq+U;VqKH4$H9WlQ4nchZm%a%hEQSsjwxx8m)tSxlbFFN4J|>wkS0fu;38HKU!XF06|NJmioy zMm=a8nU?^s=~5|pHu+E*3-H;0ebc7wj(N_2PQ348ZwF*tx}D!iDcHGZ>?|Jg4l{E!?U3 zP*h#!N%cwKpPCpOr0GHZn5F9G9g5VsjF0$qW3h|pf7nQI?#lDAPy}$RV^t}zC&fs` zNuq&YExD!>*1JIK$SeSie<{JlB?Vl`rKjh?6%K6URD%wbnH5p|ajBZS<{* zq3aaDc~z~)k}4yQr;`7>R1R6W7sLG$n)Cz>drWN}8DPP7+_XYm7OdP{4q)tW2ggGj zyV(NIRrI5NWTL3Ny`1$4IX`^fjpNVrdM6F!XObOJH`?$3Zq@YMF_Auw94Yi#&H$t0 zz^#b0d>O;(y8^vV()G3QOUoq+lw1Xz3pS-JN!4tr#4sM&S}pwDx>j%j)Oq`WTk9Vt z%*VZx=BIqqUdyka&b$#KK;;$?Qu@)A)O9OhJfw`^X-=JSwK{=>b6Wm|#Jk|iYrx__ z4gf5QXJcA}M~NK3sBDFMWYS6|$26uF`cM`l2!+PE!%a zDpyYNTN?k&1nNxZ*(YpbPSTL%c&1g4yztdv!HcQ?;wK|PJXI(5Q5JC*u7w$oUfR(( zNPtPqLK)bd9`^@CZL&K}tNj$om!VPX#~d-Wnh`#?C;^u)yxJT~rN_OQ)kdmFKH~P( zT=@qNrByV?-@+%rzex^!^>g|MX$Lp<7J9g1@!$Ef*bd`|)MieL__xj$prfbwo=|-$ z(BQ@=B6X$0@-;f1$M$bybeDX6!_u(jOwIQ?pRN5GT-&Wb7RYq&is-m7{i1>GuRis~ z4}m;f^A-YiIbAummh1qK=mu-HGto90AmQ{s*#9cQlyc!^hZ*4vbCeClSUGEBWh2oQ z4D0{RFXuZgjkjZ%U(xt2Tzj8%-ApM*W$l>%{|z%B>um=a@dPnk$J9?EP)*}gPa_kE zmixMzV*!jx(ZIVUQOqN%M%o|*v_Iu6@CoxRAy8L2sfmlHsuh1LTv;_{9Y!|O7#oIz zdME?dh$)uq80ut&^OG{G5iQp{x<&aD7P;CDb`PKyE|X}~r|n|M)|j)XRZ;cZFmVMc zV6G!Mr2X6O19Gm0w5{zX9v{lJ_zCmFC7-xhExCg|W8hS(MlAyk1e;>%6QQ0yqD_W_ z&mS*2azLC0^n9Ps4&{lWef0i>B{3$#8xdBOT$L`KG5?<9e|-#4iEN49_2h{XwWKiEL*m$1CTf7DP-UNL0kLc_ctyZpWwY)Hb>ACO>na18RM#(s> z6=RQHN(S3p#!py4e{9iU4Mu5#+&MdaWN8)Jo)iq$ulB0*=D(V_G)niZy@{_3fWr}u zCw1-U!HWM5L*c(KZ#-N$1Hx>4`_Wv7Rok0Prk8c_hPeKGmn}?AO11Ck=cION8%5yP zphj!$qyB6yf$+Gj)#WJlf(?833(hl$8L&q)J-t1Eoa&CtI7hEHuYH!xB@x#)lY&cm zZwk2U6PC>V3Z?RNMhXc_RxL7f~dsMh&-RL zm?LL(1C_8bq#Zv42{)t+@EB18cd&BIH_?_*AhrrVpf!(4miR=K<~$$9FSRY7G4D-b zUl~~)`^PdtY_svO|IwAA>SY`q|7eJMdX<`-bt;#b!Xs{5QH#3dL~Ch{1-kjT{3-vV z*?rV0PD^X-LvNr!X(dszW04}Jk8@@XW|&{V%_0WY#vFrqkJH)$JMyFJviWnm%WnxO zW^qZDyBfJ1yiG)9u%Y!PTgu}BS3>Lu-5buO>~zb$5+H z^sLqSAd5Jh4~mKJ^tr2@b5Zp!DtG{@{n!L6PB~wO&H^cYUZ=r#@Uyay0cnaeLcTWy z$|*zI&RW-2%H;z4rZdJ<Bj{3fB;PaW)rGekk z6vN%g2lnluD3dxA)~AuAQ3cI}5??&&(6_WLH|d#NLbp==G2m@gLn5*HgoRr#@NXcV zxG(EMR2vZ%5QCya>;>ChX|!p<3+GHX7(Kb&C(;}aT zERa+ZG+`7K+5+o$S&_6JF>L1c)+s#(TT4u51>*h1rydkTlRjWgNtFi<1?$vH3uszG z_2WsMT@7ye6uai=ob=rW=l3C!rua1|HSJ`^uN_M!?w2(mb)It`&K)|knpm(4138zA zRtZ#mPwweg&^l?x5qRaSA&keg*JFho5FqipNkuyfkl)J1zdyAIQKs&>7aF(A`4?-5 z?teB4Ihrj`W8V0e&`i(!)@wsl>l(@@Q6XWWZVg_YF4gbusJEPm_~9BhxdwHj*S9}0 z+p(wIHSBJ;Xavd_CJwi>An97+Su!(KqZ zO_H*Zxe>!|ua~CaAiTaIMi ziwEM88vX!Pc#Q5c`7A`=*U=gfAQl@>FcXL2f3_Ar<vOP>!R#P+f1~mw3Ui) zqr)RZSU5L0ERw7+g|ghG00w~3&`vD=Pgt@g=QVITpR)ef00is}eOH)AgU)#u-0y)P zrk=tWvph-C!23X6^B!{aI~W3-tw;S zK$bj0(jp&;fmj)XTC_N^YWk7>eZtCbMll?MuA&zn1zz zs4al?CSK;iN>1ewE5xfSy}SR<$n<_?>mPbm)-`@rh}_?ty8A7QN@+`Z_hd0srsuD; zgn>1GM7sB-%GiSH8-i7ce8K`fy>)%5GWPy`b7TOoQ&xf2j3(E_KEG-akc7cp_>INu zu|^Vu%FbaC9M{e;c^>j#-x}bNL3jNH6I4%x3vi4o;abCUas_j{;Om|>k31TV)=df^WEE;b3$(LPVPi50?wfsU8Jpx4D!{tP zp>aPdUCN2l{s%*KZHknxWHBa)Cw|Loy{g5=pyZ6FnO)#0`#5*;+kEYokLrT{ zNm(HI7_cU5{(AV?wG{Q@m>KaeB9{1Kth6KPO*{wXfTS>v3N^|Sp0wZGLa%m?dfkuq zg01?%K`ffdYM)(e&ok41=pD>sn$X&!u){M(ZP}&A(l!kb+`U@%6cIoKqDb&dJD6n4az1BLYd&p7-Ao~;{o+Klm!@;+!J-e3J?}QqvT5R1IX^_FpyZ}kC)|3AUtKpcCc7F z@Dv5i=Lsx1e4$r4iay5VTrSouyOJEU9V4a3#AGnm-)K~sToSd;IItx>K zjp8P*ht~nrtQI)cFib##PL-TW&^fiiP|d&@$c3zY)}7TKO9iOR5p#yuEvP(5qPJUX za&lr?5dkm%m&v#~iLE2hC_3z56gZyw0ZBY9_ak2r&ygEmD;XEEs7}0|7UWK~i^YhpT)|BeZGm+B-7ba;$lCXL3 zQx7HOE35BE{I<{E}bTQ*64GjoCg-`v?{;f_ZvgDsF zPGgm&lJn+KEP9lEHj%9{bi{{0dKotF+50BtUyYh5Ggh2gHR%0L8as39J1jypE0tyZ z-P?Y0jS|)i+)z(T-(1isH))PQP(2*1iKb{U_22#&+L`Pf1mM+xvDp84aFLK`luhQu zEcD5!DY7wD2iKqA%b4rQhxaQ5fsQcYp1^`l0_qCP2YEMq;Y50`R>knhe;fPP#G2ND z*FlNhoOLKdL>xf=9ybbboqkh~q0rS@&x&-u#%)vJzEr{1SA*~DXS3gu2zLH%X~^w9 z6X=W)DB)eD-*yr_lS*>JvXT!iNF~#DYP=ykDl)Wc9}%j2E-;t8(DzW?J^+3q3brJ= zgAkFQtP(lkYGxT(2Q12GO^1drb7irk=AE<_%xrVLtD_>NXQ(;l$}#j>!p}Xy`3G>D zKfDGosX&dGF>R$Hv|8HC^cgXqY26)wZ=cMSun4=`6EWW|Uxh~pm%7TUEAOv&yms@8 zgp>U{X#))|rCqW3S*x@)Lii?KE_8@CqH%LPIvfosF$1N{1FP}IfE6%UiZa6-yoYeJ z3IIAyZo$lw(3XRP9es<15Qu##pifA^=8GFB?e!{h+dFCV->afTe>BJ&-JBGbi?6l* zz$qvMbGfPP?5t=6#(u0UytgSx5(eY#hVS!#&(ZfWAV%o9{@&Zg5f`VgBtw#C}~4l`b`ZO3T~YsVMD z7^R2jS1b;qU(8>A4p|3*OY;J%C)g?2E?0A(N)o-0c4LoG;NywQi&KQG2o;2-@VDPd z%R|n`{O%+Vj}X};(P@$9+c*<$7#-idxkS90qu@w zarC~dY&H08Hpvwnab&hM7V1(a>e&YS3AptinMf&?**=PLlo1UkM5pCpU{lE!kW#A zw));I?F@AR0q+oV0t*qGCp!8n`RE+4?>__kvJ9lR{r%DId6(6EN%ikQd&|#JYjA0q z^_C<(GPg}PTWaS$F3P?(G&MIjxgbs%!_exg6Wz+-n{&>Tv6b-1IX2UN zwiaeGhLuLPF@i%gQ!A^bFt=kgjC#F`lYL)K4ka)k@^klp%AIR<=l?_#CKqF9;ZSST49m-t(ja*m$;CoFdveGzy! zz6`hg2V3dkI)di7wyWGz@6H^lLo)E-Q;H9hJ-{SXeS8@8_n6LQzSbwqUuan`ViUw~ zKz(nuBU=!n1%=IZr4O&Olx*z7_g1l zr1Ohw6)8V$Ux|fDTJ{x&|1kZA0`!;QZ!SgNE0KHKT#zv!04y>6=*q-zT!(cSaW%24Vh|!)nD@Y=>6bR z)eZw!59T{M@dU5HVJ)Dv3j%aTvDq>WQTs*%)$^8lJlg74ftFdi2R%0}3oHTaR z7*Buc^}XLdf52KZvp#d?oU`}ZdxrAHyypYlP%g?UzJ9r0wn780EHJinY@;%7{DkpP zz+Q?*@yo#80On5g>4g;@iBmVoY}~wK_x{qP07=3*$0bCZHV_tVi~dX8ua$!=7KNm{ zrHVyJn{R-GjQe4e5tpVK977VIw#-I0nA>Uz2 zwWv>#$*xlCx1<=n#iJ83Vkp~PF^@GPlB*&Z5(?8o5fBz|)e(^5hnsr=mv0>_eZc55 z{gp|d{0+6IOEKcR_suDiK)V7Wi2sg8EM&ER~anBZ)VOFGit9c?TfOKCM5I z8b7$V4UM-h*1rN)UT2Z$Zp|Y_#C`F8goPRLUrBbQEQH?~5m@A;S^G7z8l%?z3r`%a ziPiP&lnYUsD;l=2@lXqHwhY-9zOpAd+r|H^Cuz&}#O>ss4$AGHY9U~dy6WU?81KEV zr`azc!xmt%u9Mop3~s*fARbmCb9&$SDgq}Nzq8nzW@{qrw-q@i^Z?L;A;0^9;Zw~_ zs<;GpnTwvA60NemnPE7mtnZYKtiU-Agk`=}z&R#^M`eaD`bIyF54`H*a2nhA4(j_| zyG1M$4$}{HO3wv$4lOAn*;1l{Dgj|twp%Z^Y0&mM@;((vQ%85-z3xH|>D%F0j5L4d z^Ef8;k86AaW27(B@2cA?+yC)j46h)Xz^O{(X(&nKG&uUK=5+?A^On@=nCT>ItAjFsmDraI6nH zXyA_9ggVub9W2)V!LAe%jG|P_78xOHjT^~RtJs-w)4p4cAm4U&fB7L5N3uNh)P)+m ztDm&j?jsJ%y69#LNNr)lpsN3Kpy)kL>!9HK&34|5baXdog#U3w08?cD!-x`lLthc2 z{M6hHQN*M56hTbXTw(aOVkLrUqVCep$7L!P*gUmx2MI9-%@?kEWy%J)CsbEre>x%u zAa)m)wt9T6^yj@nJ78zec&AW$ocs4OE=(e;lxBH8xN5b&-Y>4CY|+BKa=HRJHWc=~ zg_X&s*Yb17&r45BiOgCLxDAo(25?K&j9T^?JLvhaJZ2~dkc76FLFSN^*T!p~MuUvA ze7xb)f{s|jsl7_%xS8>%OY8C>hHqmVa0B5Me3{Dp&~)q@nOGGqYNJkQP1m&uw9?-xH3>zdNI|y7a}u zPUep9B1^kz)L;g(Of$r$nj{NKJ>J@9wRX4um;nryWU25+Fu7}3x5t%bL_5b^Cdyk% zP##7f3~W`VxqXlpWIgdkh&?BEKK6Zfh*!r>!ce33B(xb_ zme{dEseU_CqHwx_m!m<^M9Y>IJ}6zov&x>&1Eo}4skzBSZUYSZA%G@WM2Y>FTzvfL zA{c@7%tB#eTFf0%x8YHhW%Ezd)!|IE}$r}D=BIheklJs1epPCFgyIX+y=-Ar-6ua_CtlV1&>&osn$CA)t&K9BgJv3f|rcZ5_P+ zpt$rOGYt_Hn4lK+(c}`8nJemyq^ZrEW=TZYa(_LK$rdCmJt`+U@v)P_ZVAG*}kfu+r=8@S#qR^nxC7_2}Bi5?`7l?oXEwF2`+qtNGZ~lHXd8TD8N#)zFt~y6OmvjBm~(wZ|rAf*}I|}KTjOuDW4Qw168{bUgh9{9$ zjx;hs9Yg81HT>|QhAD>~H>i#whLLYlHIc-S{!9QTC~GzbAXhUg5wR>?{@MJ?46MlEe|>8SScoFLmo8gI7pHSI<*Fzm6* z=|ZAyk&Ci1JPmNg!9m%dMB}P|br@zVt!bz?x1O zA|%!zP;l4Tfq!E4`>gv8P?>8M=?wD>ZvKskYs;s7z%0YAy(Yc%S>|F7uyV|a2)}bR zG}anyNGy1rLx2%hIaBqfpY{X$fmG&Sn}wFXPm${t*8FoDiCj3KVlS}d?Xg@$P3X57 zgT{A$n!j$4$i3!aF`wHA5gF0pzC!|Zn4=_bwhVh2QI{Bz>GNRTiY-NIjvJ0O=RUX04)`{qun~EqB)hf-|?s9l5@ZCUr z7*MnaLVeatmqOv{YnJWr%@xbc+r%>ge_yUO*`$1`^FbQjKY}y;_cBFOcmn?M7itB| z!-1UbOP|9gI;zjlr!dbjZIjOPxfWGX;<*_f-X$V{4NoS^!iw5dNL1nbRmtDN5Gk2k zKH~&j4J}KOc8+Nuq^S#-WSl>d4(WU(_MZx9QeTxGL|p5R;=rb5=XAp^-;Q%=@WrI! zu0!uo6j8bL1^^>JbHFgDM1k_cuPkrL<}fivL^wK!Zh2tlC1b zm#!TGwG7HV zP<~#4`mG~Pu)`N6rdnHEnL@w^X`y+cEA!F@iEZwxV5@X-o)l3_1EiW*%$KSy64gRi z2av)HSlHhz93V6*7p`R>Xn+($GeSwOKS$J6rc^DclBLj-f~8z8%^A2Q=(GMCmD3|2CGvI+*JfoL{yH^?OA4FXU{}>C-5}g<+%Q7wk9P3D? z`7~f1>4OabcFZcs8m{dlh8nRl^7%S@^HQ9DlDJ4t{a+(U64h#Ueq7Z5OOzJRhwK} z@qT?!+A$^tJ{_&@$NxmO)+#~z4*GAVNr{y?eCO_wZ*4`;AgW6)P5ZS^?`$&XT$Oh3 zeMzj$8x7>OD_V)2=P%+C+@RUCfLPM}UA-|JwaNmN;oe%SQVQmsLi41K;WC=++0%yq zgX?=NzqN>Sky^n6 zMWULuRIS@6BVpn7)p4sB0s%W3%~9O4uGynJjWj;%1JN*9#rh;Q8Nc3h(cn(ew?AeY ze?WsG`aEBwkm&0?$WyCiZ~oJJpb->RG*K~_ycd|gEuWq|IE6HFw}>!OOoRUW z`YOP_Ask@2R9>i?g?iv_F9U){6pz$t5UWi8Q#FjTj6*`;g!h9q&`+lv?YTHj-X<&Y zb0*Z#h03PAJ+m0t6coV7{IoykrPW9$@Ty#&$}3TWO%o;saDr{YB;$k-XCj+Oh6TnA zf;7kx%SsW{ScXp9oOJo=gET0xVqz~j(AGu-=BUEY6+VN;-oe|pbLh~Cu3R6rw zW9k=p4{Rh|7B1sUZgW8L?c9(6cUpr>Z+Rdk2w4%H#9?8$Gp(nzwk44*Rn7-#@<{rx z`htW4=Q&nqj@L8sb~Ak}4RnSL1w)rR)2eT(&*ZIM%no%I4ZnEqe~^p6%G|PmE;kefe2~_M^h`685?I(UhM^?+D83(4@#yFW(qX`x z?UONzCp&&UPT9DM4tMm!U;ki;vUgO-wbq!?IMneN{_ZoaD9 zPC5Oz{0gHa>>2`dlPoS~SM8c6k{n;g9{R4dl^!J45k;J2gP%c;{!9_zysGS*s--Mi z0M5<>_5fVxjM6e>KiMza=XhY5Va1h`Q9Nr6b!4;)|Es)Ep3Zh(F>^ODkq2CtPbi^V zzizfGXw{NpbQ~@6RqqSK9p?Ou6@eOiOU4{gSqf4G2&;b{fINdF1U%c2S6C_cTiRnt zdO=hPqnIn3O$GJ+uks@4LH%#Xx@#2?N`~#P_*W;}FPiBdVA7vM% zeA{^wP#FF=Bbs2lCL#RlVtYQR>-plbKXRq5)E)?zdq_J(53>^1UNk4T?Kr~$PCxTQ zo%4EATC+)t5jC?SGVDkfUPR!>Qlg(#tn+6`+yHJpDhJa4)LFyjvLvLR5}uG zmYiq{$omh{06BxpBl&xMx>roxDc!+EhWLVCs7GG$RQ73DFQl9i3tBL^nB7ma&1>6E z*U#lVfIYWVPp~{d=Gc=VelwY=s4aA2(VZ+wxG%A=9sH)q2WbLLAYdTKGgS~1cWDSM z79#TpKAU_hj!uFBH=OXWhaFY66GtUs*5|yL<10Do9|!=RSNx?da#r*r<@`2S9%>rX zjm`Hu;X=x3n@#NfDbx?rFd@wiKl{gkTjgG7qsi;LUwh=r2;bX!S5n1}qy{9EneJ8C zG$wTrf4nluX}{>X0$y`n^;e>9{c-)P<XVPqWCh-hPVAK#dt~tOYAE^rrS6B_#Tg5 zsbjYi`-u=ME(g8u?1B9Zl}yZ#b>@Gq1^b$hwPzrQs5~&&-Lq%HE?80JHzWZ7KArWI zlzNumkLmjB>KheLaY9`p50 zNyunhjt2zp)&0S^p>2&CqQ8Gb{~S|wc;$!C`4Od%JOx3d2`QRm9*cCAb3O?}7wF;) zEn0!_5af$ok(CDX(qw{owgEsZUSH%9?|^KM%5s$fAL4sEhR7GnAMPcS;6mp}WCjbI z4TYOsIQ$n+9(IdM5YYxm;~(+3{~4O?YUpmMl&(QSsh@0;-1QgqPr3x5;6c-L)Fbq- zFV@2hkXtX%sTxvQ=s_jPZV&!{G6TMnL-wU)q`3Q7{%xF;dnEWyDQUuODi$Y`+qDx- z+*Oi~F94=tgwLzh_@)L^OlGk4koVVO^WmsUBa8)8+p&SI2>d;>Z4-p-oXg{oiR%p- zubARJ?aZ@*KRw`OMW<$&JOdN)`t$O?3lUTFd7$njCWEzLa^8m9S8cvU3ajaDn5!^= zdL8Yz5EmZ}yads{#8 zH@Lnu_od_oa1V%-c8n{M1VzET1~aqR>ZHtk-8S@Y*AKwCpUprGbzFn){G42M9~C)Ud6SQDM`k*?%EZ;K{qgN7CdmaIk&sU%yyKO>1kV zn&9L2K#a|VB;&a>O!zOR8_8I4PU>m4b{e4$2j~>BxalxabI?7sp?2@34in1InVoVS zWA7yk(!b&2F!T*>0ge{frDp*vgOYs_WxUCFp?>DKR#midBI-_XOy3HsZDKLusY&u% zSi(M{Qa=w`5BjeY?xVP{rV8CMF9x;9uXL@NBdANP#DCiQ>C*1Se)K>?V^zap0v&U8 z$x{}oN3TaWg*54dNhrud-U9mp1@TbwOSyKa?7o z;r^?DC=gaRK+Hcqe$6o61rZRT;6Mf8@ecmN6v0aJoMz?jpSYIwpc?bCF3|7jgl0Q? z%3%bAh5O3s4#g_?-S&9xYIO)qzfO@jC1Zu|49Cd9JDWajXN$@(f+h~(?0I=r2_&W- z17Ve4*Hxz;Fkhr*(8r}`vW2tMunEV5{W9sge5QUBg}c>`^S!Ie5w*`8;$s$cYIXx* ziLGObX0gH6hDveFUl1-Y{$8f%EUAbqeE4agjia3SX_#+h1}TtSWBwVVV(2Jg9SEz? zhOMDe97v^z@o|Q(4ihc;UM^!x%<5T#>n^O;J1;43$=zVc*W2ri#8-i~ZT?^Cu|_I; zWt6kcU=I@3|dP&1z5Puc={%JU!?yFvy$OD_NfnfD5ck873#*Ahi{ctF(mUS~wklL>F3}HF5M`TOetji)?@bWCM!{(PCA)S_gL-Bt^Ix8`$g5|q{?pTq zpV(&&jhO9EXj^Mwgx?dn@vHIq!rcL0bsh((ak+lG9&`NJd?)M6KtaMFm_6bJ%%Bgd zLqTumJm%R!2def*#_t$u8rBUKh0+h!GRb?eN+9uStVR*czOn+v`fIWiD* z=fgPGrt0gOYqwLD|BH$G>`Ea17s$*f-9>W{2qFwHlE5P%tkJ}((5i1ec@Twq8D}eU zUe{k+IkYYxVUWQLBWkF)L%}rjtZArfpibWdX`|lmKeJvEUSvl3JF+ZGFjwF?u_mAU z57w<2)V&S)<*q!tl{5*F%F%D)m6=a+Ile>7c6^_KqZOrp>d6p{G06xO$T(jTXt$bL zIH#K)M11*HmBJVg$3yjlBtFunbxo9mnUx1k=|9(Fy937Jm)p09n35Et3$4@r)n4tzP6_h-ij&!0K0a|xz)cta)!j# z?zW*5mY+qu{2n)?V1HeC|yWDHxh@)linBGE&-1cjLA(`p;r1L<2y}}#urU2%t&{y;_x0zEXB(V1^hEe50 zWO|5(+V4Od|6VWP?Ecb@fg<)0>}t^;cA0d=U*5`dAqn_vUS!_y%SY&`v|uLL+P3$d zx%#p1&?T+kNdR-gl9uwEaMyno^^{Z{gPG~D`Cu!c2XReR{7?J#*0MCVAJ@by$j|LV zbJ$wzGu6H7J{xFGp~m)bx#kH}6c+A^?I6$H-V#H(Ct4CQ-Ou&kR z-+!p73P8Dyp^w9^p3id@2uF!zd5zO~agfb{mqh7(OTuz!U-bs={bCfBSjPl8_Phbp zIEUkm_LPp|X;@}I!`9<@m-pcwh?IjfGZh0vg6A<2nhA%tSm6Fhy|ja5$&^eut4k0x zVYl{^3&4C1kf`M!q=y#we>M4B$SKNrxt!KYtmUjU^9y?f2#Z8ciS_26dl~P&OEt^; zjr>NF+Mp`C++L!ss=*z$H<`3tgFKW0p1=5@CZCq|dkhGR-xW3v&u0#dET^{H+5X$> zukcgcX%T*ZjysaCW`avc#ZfOh7=s&aF0N~ut}X9>WmzdT5b1_yzg?|SoG|W8)WQnx zf2~o@5R8C`fGaOMSRzw&5;MOng-*%4#@=J(zWnE?Y2fgfaC8%cfrj4nO1&w7`U3jd z6MAjM?|0NZap8lu;@G#fpPoZMy?dEG5V$%8{!3_=xEQxfoGw$AjSP!9YImG$6%3;Y z(bbsdgLa(52y!9UoE6&mlCbLRY)(Df4NY1C*A{`B7`iF*&`ZvaZdHKgf-eWo3|-)pXm+UWNqmAqM} zUOr!yNi$r?%Cyw6{GQ#UZ`AwGWYGpuX%bHph9)HHtW3DwXMMJKm;s@Mf82NKr&Ss7 z8`Z&YOwUM97DQRlL#BM0&l)&dA$qzKHEZr?D`b?j3lu0xhny40&UP&$^7hi6QSh6F z?)NCZG`yryryIKzW>1$-`1@%_+6tjU zUW2h>?h6NJu?#w70AbO#Fs)lCWQancJkqmLVnIEA7$i&R34`xJE0H6}N}7g2LfbkX zuR?|2WTUZFup)u5+QJhAr|(>Koh+dwUP@h`rYqMU4~ILFYbJ4IzMKih5;->zD^q;K zUFOl6%@AgC1;W}^dsf^AnlI6w;9`%h@Ki?oBLU+-|eE=`$D^lK3WavB};cHc)Zm4ECPR$rDrJ^Zcyta>Du@6 z5Bu}PAaJxOFwh9gGoBMXs8@J3_zfzh9M#54(w3>7cQXdh3T0Q`*#v?T45z5zi^hO2 zOcwt+*xGfL8Dh0^&O1^FWf5wu%F%x(q|PDYJAk}_K=3|bcgXq&e^dEmPDTOS*lrEC z7XuuvX#*vLWv+w!Zv%OKGjIU9*64gqSoO(M_0IJfi0%V-8ppgJR2;FifqKuo$J8l4 z5Eg)~5uLnzepTW#H=*t*Ic5%MCb(`@QFE#b-B1=40XfTkW1YWUoSBGM%d#(SJ z4CF2$-gc8=Xhr76|9o|g-TH(zpe=ml>G*jcJENbdbU|eLNR`&^(yFOgQmpAe-$@~g zeK%tHB^++Nak$cvD95=!swX4N5xeOnO5d0w!76vsGXHa7q z^hDw4Fj{Q|85&jWH8Ak$=hUI@h#uH0SUl!b$;fW{>UDSfG}1PT|36rJDq^q9MLYkh z{B*$VSl0EAy>rfV0@BsKG>;dK01J!e{;JAHdZ8mN$(PH-!{yw!OeBg-q`pYWCbiBE z$Hjh6x?5v6C#aaxB&ItcrIPHxE#;vE4 z;raW=3x0llx{aiNSY~N8t~rDSW+7{IJ;;{+h86eAr0V~)7;LT6bG-e)qxgZ>7upzv z*TMc~rg>?6YTykS20sHT7vt1O-#9an?()?FS5P~jf%u{hn&T^!W(35qKft$J%mpA> zkozJZ|Ix$lm@}~iOtnD-b8_W6blRhQ<LThppGE`$N{-!5++}8 z1Y=UiM;Kj5TK4l9$PgrgDvWsa3*jUbp2q6}s;{&&nH=QBD>6VGqfP1bWG6@;;~_=( z%$6Mu+zmOI9jk;mEs|8hr8LEccvi9ayV@SXuuf6Ds^@V2elx9p?Ta&;YfEP6BG0A9uJAc{oA*C&%~r1ukwgcK-aftAo!#E7vPf*@m^ zv(#irEZB8APcxgbKGpxOk5Cx=0zxa8m` zVvi~%`KeTllVXil?7WtCEm_!RQ^eI1?ydXFKY7--0H zyjo&>Wq4V?F!k3=U_9}6cZ8cSQwVJ@;51RKEfcbKr!jG|I{%wvu8z|ri1H?mnJNmg zrn%-`*%yx4fu8YIDURm6@wH70*KJ#;Z{d(DRIU_e;#)@(C zmRsNGKMg6*(rCStopBO*1!!(kabxK4sXW2UQy61ob^&)t++nthD#kD>NWI{MGV8Hj zi6@OOZg^O7$8bYHE+H32_?>?(?k4LHni$TCA=M!;?A4yQd^j`c-}B3<96UX7sq8Db z>n+&lS9PiTM>Un)4QVp3bXhU$!a-YlI~FU}3ryhVuSt5bkmfF1`xdgOkhMa95LXZ< z(?Eq>8r!ddbR4(X_bxd$C~Tn)kTbLsZF4DQ0`8Eup-N8LWE?x!X)Pi=8sk@s-2=7` z2j6dcV~>9uFLc<-#4>M)?Ph*$Fo#13O0xvsa6@b2YRgelEUV{%jrudx9j*q%q9$Dv z`NH11v3ia)gNX$kX1@{YMRUvsM|Q3jSmMWlbi(7BB0 z5FERCRzEywNbX1xTv2*pjQYg7%vj&O>Eco7;`JrYS`~&3IEi`hX9T`UA5xWNSz13W z^qF-x#<8Rnwa6T2MGMQZvSt%6+=3F?|9Jwu*?=(Hw5NA&wIu1NN|+R|Iaau9AKb*N zrWy+rlh>g|?Fy44{i(h(BtV}?6l)Dye>j2fd+Q*e=pg88tZ>|%!)mI_v*6gEFk@9MHA)(}_{!x#ViS^W_lY|yvsZ!d05_20)_&>Jv5 z3#0uF&7;vM;}G@7XD!cXzRCQ)dUv7LM0Cv+(!A)37${>Ayr;bmd{a9CTUn;DJ(q_e zxv&Lt@*tq_cA`5u=qF+4GS1BcJ}&6`3*76{d;fbHGi|Rd{GW_{k@w}sg;5$tUJOa1ZbsGd z(or7uvJ!u4kklC=2`bdp(X#v04sud`aUXF?vanC_|%_PB`fGD?ta!#G=lsUXa)LNRtf+Pj_cvdJbOyfPSw|djS`~WjQEG0oS zGY(DkfVjStP$my5qKBc@4m@q}bY%I>5nX017X^eRNdAaOY8ot2_oz{7%;|mV#zdJO z{5FabOV%(R&u@hTckq;guCZGu_D5u0S*v*qD1Qou$x8x&tcP+SG)tLr#!N00k4sr> zb%Svk3hwD_AY-ES{=LNlYv%jDXRW4v#M?Cv#WhY}f_mB4FeiCP?S`BI>&;m^w?$QQ zdBhD{uW<8(0gEx>jjvz7t#Ea@EgeZ9Q?=r50JliKew?s;Q*`DPjP6-B{2AqSM;gfn zr~+7>Rxo(imHWt8Pz<>tt)R{#?PI4`C7(2KX<mW?cyl39!#7_%kzA@1E7UQ8tA&c-a_ z1cR8aE8C;$UOV*!Mp*K{rMImm11p>RV&*mMvM5#hc8P2z6`1HwceX&Yqha`_@sC$0 zU67)D)V1VWTV^FPA-FxmjSAPYf%;dAbM`Ab%+0P>@LQ@GEs7CPW{Xu7i@m=*wY4<3 zL?2W~S#h^XRlG}bW!)A>cf5U}qxeGCUP7)7vn%S`&AHSiC%y-wSZVz)A%49`v@Nw7P=z7qXt`VOR1`PwATm}OZ^ zN4@DNO9Md2*hM9ZioEgTZIzy4mA<`z-$bw@jx4iSP8ZUDKb2=P_IqMW8C>zGBEFU_ z^4`XI<(tI)w^)dtpu$$g;vE!RX37RQNPJL;%)t)cLAY63F*} zcAi>gQ_3lfmNrC@-metF@8y~hZ#kbSaz6L93`dn&{_zH|z8Q2aJ0bjNq+L+6Mc0TY zHzswi|BVLAZ&B`ylY~6a!F-7{iGN=P48#;lgy;-l92dW{?e1)UGHXayO$i(d=rlHN zKF@5Ld~mMjxyAF9GP|%vfw&6D+GGUot0240%DOqU5w0F8W~0}>`qWeOXAl_^&wiaP zYP;h$S@xSkPf~Dp>(sYTUR`53fAa)?+atsTeVVGHuUhg$*H4PJI6C;__}7xHchWu) zX99iNi5qI6fHfvCa{ab} ztw#t>Aep|)a0e1(1GQHqZi~0ktVf6gJVVOZb4gOFbE>^aIZQ+9`WU9I9zS1z7%KRV zxL@*uohz$I+p+cvE%_=vyAK$T#Cia?RTHwkvBU*7_R)&?SM777g_)ip=Eko3j$R|u za`~b)8=Tc_?bg^EQvT_%Lo7yn5g;t}hY~;Q@`%96DCiohi^hfCoDQBL2VBL_DD2Ps zOXxK-nh{N5SAC^~@!wp=8fS(;_3K12rwqW8b={(6$dsuna<`m%A6&O=N9Xx5q#3t0 zw>}~8BfhD8htL2ig_lVsdb47uuww74^Ox$@UV#3k8TYtC<^$GKA0zs+!Vr&yxgiZ_ za;%5OMmOd=uA@o3ytot`l|01`P?5s==?tW`wvaWRLbgLT{KwtTX<~%7<<(`DPa|W$ zHJVM#o>Z40c}-58vSD7a*(-oci#JSOdI%vNr0(|@jX?NDba~Xt_v@A^a7N)Ph0>uJ z#?o_BQrWtBwzBaeMMagk1rU}QqqLK{-SXfZFHig=KGfoe?S^0F-bG%N5CEhq_us&d+5)1dmg)LLIN@> zmrgY;n9*^S*F~qLnq^kthOBahIFq~Vrg+~75NfzGbb9aXwrUEnQti%97Dvvhhl_2N zo9}U7ld?`s=6Khmd&{7v$e`}46XsE=5ztsH>%^9 z6Kdn0FN}Yfxu{~8B=^wp z;{i)f@pyv9VeSFSA5)6QnN>;hD8jRtih>|p%(_pT z^@ZLrx`b7W3J7caNqFHywKX2strf+7YG)2vR|d#02OymLco=g~UBfwsI>#4`25y^B zuvtyAnNtH{fdnnx5K)@$r_8Ps@q)}r^oHh(wW^>_85-+oL@*hf?9+v-Flp@UtXs3@ zvW?{~Kv?Lpb79SIyr^6`5S5ll!(%FiiJoT8NkKNkVT=0%W6D^`(jYG5ZSQ`tyFs}k zpIaa-PRBC43o0vZ#nKp8Z`FC^$$$1XnhLsk6_6}{*+h$l!JK<$C3B z1K*GAW|^dm>Z85B&-~^usk<6LwW1-3Y4ahemhMK`j=N2N6J6z4!EJuj=be0+(xfl* zpZ>wx%N4b%y3ULWnBS!aT##ccn=dDat$ATX_IHFP#Vg7}`9uz?P%QA=sfajlej#ap zoRIBl%1)6f5!w20XU*+1h~Vt?gks{^SXykE*{NxhN0lmP>QDTW;RjdxFDuQ8Y$tEY zEELHsec>bwF?}vm?xE1XiiI=$MIMaojzP|dhGn8TIsD*7?Cly*(ZkWcg{hcJ_fsl}ebH%%_n3 zKs{QU1LQ1jMrY>7tDrS^`Y`RFblPNJ(*&d-)Lt5MIZwH?ujBiBNOt&S@_ks5Jyn95sCe>YIDn8CnjMs^a{*6h6*yXi z-6akD>A703F*79@S%Bs2YAfrKNJi>Rf3Xg+>S5KZ_xeS4JzVCHb;VE;RD}dk{kV;R z^Jo+D^7cK5`c2Hzo6RrFBZY{QmCnjht#gMQjpI(wMOls9$uh_WoSJ}Hui6cB6QY#j2;1pzp}oI?4N3xMImeGdI|uSR$n95 z@D$M8?6lmSW6ApaS+K9RK|FtH@YoqM^XAtEF+Hs#QN|khufO3c3KwRDeIP8IrAsi4 z5dqBetP6qC-RVSfe_+gZEs_8-5%YHX2l;&Q$d^n^1U=~j*CpQl6I2wSB6VmAHzV!= zDLj9h-o=0lm~Njm`tc%FX9+frx<%a5rp0#&DVD1^11@s*(Ld4Ny@j$;gtGQkJt%7n zz*bqyMreA$qe4ibu}(rp!EvGY=<6E=&|RB;#e`vqz>@JPw1M$!;8ErTo{*V8+I{6@ z(MV;$lT-G}B|5@%6gQ-X7s-6OvCd>nYFLg9uV|8+`0v7aa6f%gt-gpOV8{CnxvDJmlF{OJmYkAy;tb}K=CyZVjm0N*)`@5x(JW&1?`mcKqvg-8i zrCVF+0|Cmhvf=ObYjty`QQ~k+If_V4q3t5lI@-h7{49*u--vvGf)x7qN48oHzEx5W zTqtUNpLUNp`m?-czKJMGQa$x)cj}wvMva!7(Mrlo5!#pwhO~^N{>Nhho3Ny04M0uRZVZFsaks9ejf)YN+$#S?pbuI)a#qUxqBh0FHSm*);iIFv6Ls4GJ zOxUxK5> +t!gV%W@~V|4m``>5xSJ`NsGkYd+mJ*kt6 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�g5J2$u6Ir~x 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 literal 0 HcmV?d00001 diff --git a/beacon-chain/state/stategen/BUILD.bazel b/beacon-chain/state-proto/stategen/BUILD.bazel similarity index 93% rename from beacon-chain/state/stategen/BUILD.bazel rename to beacon-chain/state-proto/stategen/BUILD.bazel index 9a4252acf7..7a0d106f29 100644 --- a/beacon-chain/state/stategen/BUILD.bazel +++ b/beacon-chain/state-proto/stategen/BUILD.bazel @@ -15,7 +15,7 @@ go_library( "service.go", "setter.go", ], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen", visibility = [ "//beacon-chain:__subpackages__", "//testing/endtoend:__subpackages__", @@ -29,7 +29,7 @@ go_library( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/filters:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//cache/lru:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", @@ -65,8 +65,8 @@ go_test( "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/db:go_default_library", "//beacon-chain/db/testing:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/beacon-chain/state-proto/stategen/epoch_boundary_state_cache.go b/beacon-chain/state-proto/stategen/epoch_boundary_state_cache.go new file mode 100644 index 0000000000..8d198090d5 --- /dev/null +++ b/beacon-chain/state-proto/stategen/epoch_boundary_state_cache.go @@ -0,0 +1,155 @@ +package stategen + +import ( + "errors" + "strconv" + "sync" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "k8s.io/client-go/tools/cache" +) + +var ( + // maxCacheSize is 8. That means 8 epochs and roughly an hour + // of no finality can be endured. + maxCacheSize = uint64(8) + errNotSlotRootInfo = errors.New("not slot root info type") + errNotRootStateInfo = errors.New("not root state info type") +) + +// slotRootInfo specifies the slot root info in the epoch boundary state cache. +type slotRootInfo struct { + slot types.Slot + root [32]byte +} + +// slotKeyFn takes the string representation of the slot to be used as key +// to retrieve root. +func slotKeyFn(obj interface{}) (string, error) { + s, ok := obj.(*slotRootInfo) + if !ok { + return "", errNotSlotRootInfo + } + return slotToString(s.slot), nil +} + +// rootStateInfo specifies the root state info in the epoch boundary state cache. +type rootStateInfo struct { + root [32]byte + state state.BeaconState +} + +// rootKeyFn takes the string representation of the block root to be used as key +// to retrieve epoch boundary state. +func rootKeyFn(obj interface{}) (string, error) { + s, ok := obj.(*rootStateInfo) + if !ok { + return "", errNotRootStateInfo + } + return string(s.root[:]), nil +} + +// epochBoundaryState struct with two queues by looking up beacon state by slot or root. +type epochBoundaryState struct { + rootStateCache *cache.FIFO + slotRootCache *cache.FIFO + lock sync.RWMutex +} + +// newBoundaryStateCache creates a new block newBoundaryStateCache for storing and accessing epoch boundary states from +// memory. +func newBoundaryStateCache() *epochBoundaryState { + return &epochBoundaryState{ + rootStateCache: cache.NewFIFO(rootKeyFn), + slotRootCache: cache.NewFIFO(slotKeyFn), + } +} + +// get epoch boundary state by its block root. Returns copied state in state info object if exists. Otherwise returns nil. +func (e *epochBoundaryState) getByRoot(r [32]byte) (*rootStateInfo, bool, error) { + e.lock.RLock() + defer e.lock.RUnlock() + + obj, exists, err := e.rootStateCache.GetByKey(string(r[:])) + if err != nil { + return nil, false, err + } + if !exists { + return nil, false, nil + } + s, ok := obj.(*rootStateInfo) + if !ok { + return nil, false, errNotRootStateInfo + } + + return &rootStateInfo{ + root: r, + state: s.state.Copy(), + }, true, nil +} + +// get epoch boundary state by its slot. Returns copied state in state info object if exists. Otherwise returns nil. +func (e *epochBoundaryState) getBySlot(s types.Slot) (*rootStateInfo, bool, error) { + e.lock.RLock() + defer e.lock.RUnlock() + + obj, exists, err := e.slotRootCache.GetByKey(slotToString(s)) + if err != nil { + return nil, false, err + } + if !exists { + return nil, false, nil + } + info, ok := obj.(*slotRootInfo) + if !ok { + return nil, false, errNotSlotRootInfo + } + + return e.getByRoot(info.root) +} + +// put adds a state to the epoch boundary state cache. This method also trims the +// least recently added state info if the cache size has reached the max cache +// size limit. +func (e *epochBoundaryState) put(r [32]byte, s state.BeaconState) error { + e.lock.Lock() + defer e.lock.Unlock() + + if err := e.slotRootCache.AddIfNotPresent(&slotRootInfo{ + slot: s.Slot(), + root: r, + }); err != nil { + return err + } + if err := e.rootStateCache.AddIfNotPresent(&rootStateInfo{ + root: r, + state: s.Copy(), + }); err != nil { + return err + } + + trim(e.rootStateCache, maxCacheSize) + trim(e.slotRootCache, maxCacheSize) + + return nil +} + +// trim the FIFO queue to the maxSize. +func trim(queue *cache.FIFO, maxSize uint64) { + for s := uint64(len(queue.ListKeys())); s > maxSize; s-- { + if _, err := queue.Pop(popProcessNoopFunc); err != nil { // This never returns an error, but we'll handle anyway for sanity. + panic(err) + } + } +} + +// popProcessNoopFunc is a no-op function that never returns an error. +func popProcessNoopFunc(_ interface{}) error { + return nil +} + +// Converts input uint64 to string. To be used as key for slot to get root. +func slotToString(s types.Slot) string { + return strconv.FormatUint(uint64(s), 10) +} diff --git a/beacon-chain/state-proto/stategen/epoch_boundary_state_cache_test.go b/beacon-chain/state-proto/stategen/epoch_boundary_state_cache_test.go new file mode 100644 index 0000000000..eefb84e715 --- /dev/null +++ b/beacon-chain/state-proto/stategen/epoch_boundary_state_cache_test.go @@ -0,0 +1,71 @@ +package stategen + +import ( + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestEpochBoundaryStateCache_BadSlotKey(t *testing.T) { + _, err := slotKeyFn("sushi") + assert.ErrorContains(t, errNotSlotRootInfo.Error(), err, "Did not get wanted error") +} + +func TestEpochBoundaryStateCache_BadRootKey(t *testing.T) { + _, err := rootKeyFn("noodle") + assert.ErrorContains(t, errNotRootStateInfo.Error(), err, "Did not get wanted error") +} + +func TestEpochBoundaryStateCache_CanSave(t *testing.T) { + e := newBoundaryStateCache() + s, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, s.SetSlot(1)) + r := [32]byte{'a'} + require.NoError(t, e.put(r, s)) + + got, exists, err := e.getByRoot([32]byte{'b'}) + require.NoError(t, err) + assert.Equal(t, false, exists, "Should not exist") + assert.Equal(t, (*rootStateInfo)(nil), got, "Should not exist") + + got, exists, err = e.getByRoot([32]byte{'a'}) + require.NoError(t, err) + assert.Equal(t, true, exists, "Should exist") + assert.DeepSSZEqual(t, s.InnerStateUnsafe(), got.state.InnerStateUnsafe(), "Should have the same state") + + got, exists, err = e.getBySlot(2) + require.NoError(t, err) + assert.Equal(t, false, exists, "Should not exist") + assert.Equal(t, (*rootStateInfo)(nil), got, "Should not exist") + + got, exists, err = e.getBySlot(1) + require.NoError(t, err) + assert.Equal(t, true, exists, "Should exist") + assert.DeepSSZEqual(t, s.InnerStateUnsafe(), got.state.InnerStateUnsafe(), "Should have the same state") +} + +func TestEpochBoundaryStateCache_CanTrim(t *testing.T) { + e := newBoundaryStateCache() + offSet := types.Slot(10) + for i := types.Slot(0); i < offSet.Add(maxCacheSize); i++ { + s, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, s.SetSlot(i)) + r := [32]byte{byte(i)} + require.NoError(t, e.put(r, s)) + } + + assert.Equal(t, int(maxCacheSize), len(e.rootStateCache.ListKeys()), "Did not trim to the correct amount") + assert.Equal(t, int(maxCacheSize), len(e.slotRootCache.ListKeys()), "Did not trim to the correct amount") + for _, l := range e.rootStateCache.List() { + i, ok := l.(*rootStateInfo) + require.Equal(t, true, ok, "Bad type assertion") + if i.state.Slot() < offSet { + t.Error("Did not trim the correct state") + } + } +} diff --git a/beacon-chain/state-proto/stategen/errors.go b/beacon-chain/state-proto/stategen/errors.go new file mode 100644 index 0000000000..2d5049cd54 --- /dev/null +++ b/beacon-chain/state-proto/stategen/errors.go @@ -0,0 +1,7 @@ +package stategen + +import "errors" + +var errUnknownBoundaryState = errors.New("unknown boundary state") +var errUnknownState = errors.New("unknown state") +var errUnknownBlock = errors.New("unknown block") diff --git a/beacon-chain/state-proto/stategen/getter.go b/beacon-chain/state-proto/stategen/getter.go new file mode 100644 index 0000000000..057bc244ff --- /dev/null +++ b/beacon-chain/state-proto/stategen/getter.go @@ -0,0 +1,306 @@ +package stategen + +import ( + "context" + + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "go.opencensus.io/trace" +) + +// HasState returns true if the state exists in cache or in DB. +func (s *State) HasState(ctx context.Context, blockRoot [32]byte) (bool, error) { + has, err := s.HasStateInCache(ctx, blockRoot) + if err != nil { + return false, err + } + if has { + return true, nil + } + return s.beaconDB.HasState(ctx, blockRoot), nil +} + +// HasStateInCache returns true if the state exists in cache. +func (s *State) HasStateInCache(ctx context.Context, blockRoot [32]byte) (bool, error) { + if s.hotStateCache.has(blockRoot) { + return true, nil + } + _, has, err := s.epochBoundaryStateCache.getByRoot(blockRoot) + if err != nil { + return false, err + } + return has, nil +} + +// StateByRootIfCached retrieves a state using the input block root only if the state is already in the cache +func (s *State) StateByRootIfCachedNoCopy(blockRoot [32]byte) state.BeaconState { + if !s.hotStateCache.has(blockRoot) { + return nil + } + state := s.hotStateCache.getWithoutCopy(blockRoot) + return state +} + +// StateByRoot retrieves the state using input block root. +func (s *State) StateByRoot(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.StateByRoot") + defer span.End() + + // Genesis case. If block root is zero hash, short circuit to use genesis cachedState stored in DB. + if blockRoot == params.BeaconConfig().ZeroHash { + return s.beaconDB.GenesisState(ctx) + } + return s.loadStateByRoot(ctx, blockRoot) +} + +// StateByRootInitialSync retrieves the state from the DB for the initial syncing phase. +// It assumes initial syncing using a block list rather than a block tree hence the returned +// state is not copied. +// It invalidates cache for parent root because pre state will get mutated. +// Do not use this method for anything other than initial syncing purpose or block tree is applied. +func (s *State) StateByRootInitialSync(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) { + // Genesis case. If block root is zero hash, short circuit to use genesis state stored in DB. + if blockRoot == params.BeaconConfig().ZeroHash { + return s.beaconDB.GenesisState(ctx) + } + + // To invalidate cache for parent root because pre state will get mutated. + defer s.hotStateCache.delete(blockRoot) + + if s.hotStateCache.has(blockRoot) { + return s.hotStateCache.getWithoutCopy(blockRoot), nil + } + + cachedInfo, ok, err := s.epochBoundaryStateCache.getByRoot(blockRoot) + if err != nil { + return nil, err + } + if ok { + return cachedInfo.state, nil + } + + startState, err := s.lastAncestorState(ctx, blockRoot) + if err != nil { + return nil, errors.Wrap(err, "could not get ancestor state") + } + if startState == nil || startState.IsNil() { + return nil, errUnknownState + } + summary, err := s.stateSummary(ctx, blockRoot) + if err != nil { + return nil, errors.Wrap(err, "could not get state summary") + } + if startState.Slot() == summary.Slot { + return startState, nil + } + + blks, err := s.LoadBlocks(ctx, startState.Slot()+1, summary.Slot, bytesutil.ToBytes32(summary.Root)) + if err != nil { + return nil, errors.Wrap(err, "could not load blocks") + } + startState, err = s.ReplayBlocks(ctx, startState, blks, summary.Slot) + if err != nil { + return nil, errors.Wrap(err, "could not replay blocks") + } + + return startState, nil +} + +// StateBySlot retrieves the state using input slot. +func (s *State) StateBySlot(ctx context.Context, slot types.Slot) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.StateBySlot") + defer span.End() + + return s.loadStateBySlot(ctx, slot) +} + +// This returns the state summary object of a given block root, it first checks the cache +// then checks the DB. An error is returned if state summary object is nil. +func (s *State) stateSummary(ctx context.Context, blockRoot [32]byte) (*ethpb.StateSummary, error) { + var summary *ethpb.StateSummary + var err error + + summary, err = s.beaconDB.StateSummary(ctx, blockRoot) + if err != nil { + return nil, err + } + + if summary == nil { + return s.RecoverStateSummary(ctx, blockRoot) + } + return summary, nil +} + +// RecoverStateSummary recovers state summary object of a given block root by using the saved block in DB. +func (s *State) RecoverStateSummary(ctx context.Context, blockRoot [32]byte) (*ethpb.StateSummary, error) { + if s.beaconDB.HasBlock(ctx, blockRoot) { + b, err := s.beaconDB.Block(ctx, blockRoot) + if err != nil { + return nil, err + } + summary := ðpb.StateSummary{Slot: b.Block().Slot(), Root: blockRoot[:]} + if err := s.beaconDB.SaveStateSummary(ctx, summary); err != nil { + return nil, err + } + return summary, nil + } + return nil, errors.New("could not find block in DB") +} + +// This loads a beacon state from either the cache or DB then replay blocks up the requested block root. +func (s *State) loadStateByRoot(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.loadStateByRoot") + defer span.End() + + // First, it checks if the state exists in hot state cache. + cachedState := s.hotStateCache.get(blockRoot) + if cachedState != nil && !cachedState.IsNil() { + return cachedState, nil + } + + // Second, it checks if the state exits in epoch boundary state cache. + cachedInfo, ok, err := s.epochBoundaryStateCache.getByRoot(blockRoot) + if err != nil { + return nil, err + } + if ok { + return cachedInfo.state, nil + } + + // Short cut if the cachedState is already in the DB. + if s.beaconDB.HasState(ctx, blockRoot) { + return s.beaconDB.State(ctx, blockRoot) + } + + summary, err := s.stateSummary(ctx, blockRoot) + if err != nil { + return nil, errors.Wrap(err, "could not get state summary") + } + targetSlot := summary.Slot + + // Since the requested state is not in caches, start replaying using the last available ancestor state which is + // retrieved using input block's parent root. + startState, err := s.lastAncestorState(ctx, blockRoot) + if err != nil { + return nil, errors.Wrap(err, "could not get ancestor state") + } + if startState == nil || startState.IsNil() { + return nil, errUnknownBoundaryState + } + + // Return state early if we are retrieving it from our finalized state cache. + if startState.Slot() == targetSlot { + return startState, nil + } + + blks, err := s.LoadBlocks(ctx, startState.Slot()+1, targetSlot, bytesutil.ToBytes32(summary.Root)) + if err != nil { + return nil, errors.Wrap(err, "could not load blocks for hot state using root") + } + + replayBlockCount.Observe(float64(len(blks))) + + return s.ReplayBlocks(ctx, startState, blks, targetSlot) +} + +// This loads a state by slot. +func (s *State) loadStateBySlot(ctx context.Context, slot types.Slot) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.loadStateBySlot") + defer span.End() + + // Return genesis state if slot is 0. + if slot == 0 { + return s.beaconDB.GenesisState(ctx) + } + + // Gather the last saved block root and the slot number. + lastValidRoot, lastValidSlot, err := s.lastSavedBlock(ctx, slot) + if err != nil { + return nil, errors.Wrap(err, "could not get last valid block for hot state using slot") + } + + replayStartState, err := s.loadStateByRoot(ctx, lastValidRoot) + if err != nil { + return nil, err + } + + if lastValidSlot < slot { + replayStartState, err = processSlotsStateGen(ctx, replayStartState, slot) + if err != nil { + return nil, err + } + } + return replayStartState, nil +} + +// This returns the highest available ancestor state of the input block root. +// It recursively look up block's parent until a corresponding state of the block root +// is found in the caches or DB. +// +// There's three ways to derive block parent state: +// 1.) block parent state is the last finalized state +// 2.) block parent state is the epoch boundary state and exists in epoch boundary cache. +// 3.) block parent state is in DB. +func (s *State) lastAncestorState(ctx context.Context, root [32]byte) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.lastAncestorState") + defer span.End() + + if s.isFinalizedRoot(root) && s.finalizedState() != nil { + return s.finalizedState(), nil + } + + b, err := s.beaconDB.Block(ctx, root) + if err != nil { + return nil, err + } + if err := helpers.BeaconBlockIsNil(b); err != nil { + return nil, err + } + + for { + if ctx.Err() != nil { + return nil, ctx.Err() + } + // Is the state a genesis state. + parentRoot := bytesutil.ToBytes32(b.Block().ParentRoot()) + if parentRoot == params.BeaconConfig().ZeroHash { + return s.beaconDB.GenesisState(ctx) + } + + // Does the state exist in the hot state cache. + if s.hotStateCache.has(parentRoot) { + return s.hotStateCache.get(parentRoot), nil + } + + // Does the state exist in finalized info cache. + if s.isFinalizedRoot(parentRoot) { + return s.finalizedState(), nil + } + + // Does the state exist in epoch boundary cache. + cachedInfo, ok, err := s.epochBoundaryStateCache.getByRoot(parentRoot) + if err != nil { + return nil, err + } + if ok { + return cachedInfo.state, nil + } + + // Does the state exists in DB. + if s.beaconDB.HasState(ctx, parentRoot) { + return s.beaconDB.State(ctx, parentRoot) + } + b, err = s.beaconDB.Block(ctx, parentRoot) + if err != nil { + return nil, err + } + if b == nil || b.IsNil() { + return nil, errUnknownBlock + } + } +} diff --git a/beacon-chain/state-proto/stategen/getter_test.go b/beacon-chain/state-proto/stategen/getter_test.go new file mode 100644 index 0000000000..6e49dcf391 --- /dev/null +++ b/beacon-chain/state-proto/stategen/getter_test.go @@ -0,0 +1,596 @@ +package stategen + +import ( + "context" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" + testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestStateByRoot_GenesisState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + b := util.NewBeaconBlock() + bRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, bRoot)) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) + loadedState, err := service.StateByRoot(ctx, params.BeaconConfig().ZeroHash) // Zero hash is genesis state root. + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestStateByRoot_ColdState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.finalizedInfo.slot = 2 + service.slotsPerArchivedPoint = 1 + + b := util.NewBeaconBlock() + b.Block.Slot = 1 + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + bRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(1)) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, bRoot)) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) + loadedState, err := service.StateByRoot(ctx, bRoot) + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestStateByRootIfCachedNoCopy_HotState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + r := [32]byte{'A'} + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: r[:]})) + service.hotStateCache.put(r, beaconState) + + loadedState := service.StateByRootIfCachedNoCopy(r) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestStateByRootIfCachedNoCopy_ColdState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.finalizedInfo.slot = 2 + service.slotsPerArchivedPoint = 1 + + b := util.NewBeaconBlock() + b.Block.Slot = 1 + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + bRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(1)) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, bRoot)) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) + loadedState := service.StateByRootIfCachedNoCopy(bRoot) + require.NoError(t, err) + require.Equal(t, loadedState, nil) +} + +func TestStateByRoot_HotStateUsingEpochBoundaryCacheNoReplay(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(10)) + blk := util.NewBeaconBlock() + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: blkRoot[:]})) + require.NoError(t, service.epochBoundaryStateCache.put(blkRoot, beaconState)) + loadedState, err := service.StateByRoot(ctx, blkRoot) + require.NoError(t, err) + assert.Equal(t, types.Slot(10), loadedState.Slot(), "Did not correctly load state") +} + +func TestStateByRoot_HotStateUsingEpochBoundaryCacheWithReplay(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + blk := util.NewBeaconBlock() + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.epochBoundaryStateCache.put(blkRoot, beaconState)) + targetSlot := types.Slot(10) + targetBlock := util.NewBeaconBlock() + targetBlock.Block.Slot = 11 + targetBlock.Block.ParentRoot = blkRoot[:] + targetBlock.Block.ProposerIndex = 8 + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(targetBlock))) + targetRoot, err := targetBlock.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: targetSlot, Root: targetRoot[:]})) + loadedState, err := service.StateByRoot(ctx, targetRoot) + require.NoError(t, err) + assert.Equal(t, targetSlot, loadedState.Slot(), "Did not correctly load state") +} + +func TestStateByRoot_HotStateCached(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + r := [32]byte{'A'} + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: r[:]})) + service.hotStateCache.put(r, beaconState) + + loadedState, err := service.StateByRoot(ctx, r) + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestStateByRoot_StateByRootInitialSync(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + b := util.NewBeaconBlock() + bRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, bRoot)) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) + loadedState, err := service.StateByRootInitialSync(ctx, params.BeaconConfig().ZeroHash) // Zero hash is genesis state root. + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestStateByRootInitialSync_UseEpochStateCache(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + targetSlot := types.Slot(10) + require.NoError(t, beaconState.SetSlot(targetSlot)) + blk := util.NewBeaconBlock() + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.epochBoundaryStateCache.put(blkRoot, beaconState)) + loadedState, err := service.StateByRootInitialSync(ctx, blkRoot) + require.NoError(t, err) + assert.Equal(t, targetSlot, loadedState.Slot(), "Did not correctly load state") +} + +func TestStateByRootInitialSync_UseCache(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + r := [32]byte{'A'} + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: r[:]})) + service.hotStateCache.put(r, beaconState) + + loadedState, err := service.StateByRootInitialSync(ctx, r) + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) + if service.hotStateCache.has(r) { + t.Error("Hot state cache was not invalidated") + } +} + +func TestStateByRootInitialSync_CanProcessUpTo(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + blk := util.NewBeaconBlock() + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.epochBoundaryStateCache.put(blkRoot, beaconState)) + targetSlot := types.Slot(10) + targetBlk := util.NewBeaconBlock() + targetBlk.Block.Slot = 11 + targetBlk.Block.ParentRoot = blkRoot[:] + targetRoot, err := targetBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(targetBlk))) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: targetSlot, Root: targetRoot[:]})) + + loadedState, err := service.StateByRootInitialSync(ctx, targetRoot) + require.NoError(t, err) + assert.Equal(t, targetSlot, loadedState.Slot(), "Did not correctly load state") +} + +func TestStateBySlot_ColdState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = params.BeaconConfig().SlotsPerEpoch * 2 + service.finalizedInfo.slot = service.slotsPerArchivedPoint + 1 + + beaconState, pks := util.DeterministicGenesisState(t, 32) + genesisStateRoot, err := beaconState.HashTreeRoot(ctx) + require.NoError(t, err) + genesis := blocks.NewGenesisBlock(genesisStateRoot[:]) + assert.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesis))) + gRoot, err := genesis.Block.HashTreeRoot() + require.NoError(t, err) + assert.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) + assert.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + + b, err := util.GenerateFullBlock(beaconState, pks, util.DefaultBlockGenConfig(), 1) + require.NoError(t, err) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + bRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, beaconDB.SaveState(ctx, beaconState, bRoot)) + require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, bRoot)) + + r := [32]byte{} + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: service.slotsPerArchivedPoint, Root: r[:]})) + + slot := types.Slot(20) + loadedState, err := service.StateBySlot(ctx, slot) + require.NoError(t, err) + assert.Equal(t, slot, loadedState.Slot(), "Did not correctly save state") +} + +func TestStateBySlot_HotStateDB(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + genesisStateRoot, err := beaconState.HashTreeRoot(ctx) + require.NoError(t, err) + genesis := blocks.NewGenesisBlock(genesisStateRoot[:]) + assert.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesis))) + gRoot, err := genesis.Block.HashTreeRoot() + require.NoError(t, err) + assert.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) + assert.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + + slot := types.Slot(10) + loadedState, err := service.StateBySlot(ctx, slot) + require.NoError(t, err) + assert.Equal(t, slot, loadedState.Slot(), "Did not correctly load state") +} + +func TestLoadeStateByRoot_Cached(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + r := [32]byte{'A'} + service.hotStateCache.put(r, beaconState) + + // This tests where hot state was already cached. + loadedState, err := service.loadStateByRoot(ctx, r) + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestLoadeStateByRoot_FinalizedState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + genesisStateRoot, err := beaconState.HashTreeRoot(ctx) + require.NoError(t, err) + genesis := blocks.NewGenesisBlock(genesisStateRoot[:]) + assert.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesis))) + gRoot, err := genesis.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 0, Root: gRoot[:]})) + + service.finalizedInfo.state = beaconState + service.finalizedInfo.slot = beaconState.Slot() + service.finalizedInfo.root = gRoot + + // This tests where hot state was already cached. + loadedState, err := service.loadStateByRoot(ctx, gRoot) + require.NoError(t, err) + require.DeepSSZEqual(t, loadedState.InnerStateUnsafe(), beaconState.InnerStateUnsafe()) +} + +func TestLoadeStateByRoot_EpochBoundaryStateCanProcess(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + gBlk := util.NewBeaconBlock() + gBlkRoot, err := gBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.epochBoundaryStateCache.put(gBlkRoot, beaconState)) + + blk := util.NewBeaconBlock() + blk.Block.Slot = 11 + blk.Block.ProposerIndex = 8 + blk.Block.ParentRoot = gBlkRoot[:] + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(blk))) + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 10, Root: blkRoot[:]})) + + // This tests where hot state was not cached and needs processing. + loadedState, err := service.loadStateByRoot(ctx, blkRoot) + require.NoError(t, err) + assert.Equal(t, types.Slot(10), loadedState.Slot(), "Did not correctly load state") +} + +func TestLoadeStateByRoot_FromDBBoundaryCase(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + gBlk := util.NewBeaconBlock() + gBlkRoot, err := gBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.epochBoundaryStateCache.put(gBlkRoot, beaconState)) + + blk := util.NewBeaconBlock() + blk.Block.Slot = 11 + blk.Block.ProposerIndex = 8 + blk.Block.ParentRoot = gBlkRoot[:] + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(blk))) + blkRoot, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 10, Root: blkRoot[:]})) + + // This tests where hot state was not cached and needs processing. + loadedState, err := service.loadStateByRoot(ctx, blkRoot) + require.NoError(t, err) + assert.Equal(t, types.Slot(10), loadedState.Slot(), "Did not correctly load state") +} + +func TestLoadeStateBySlot_CanAdvanceSlotUsingDB(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + beaconState, _ := util.DeterministicGenesisState(t, 32) + b := util.NewBeaconBlock() + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + gRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, gRoot)) + + slot := types.Slot(10) + loadedState, err := service.loadStateBySlot(ctx, slot) + require.NoError(t, err) + assert.Equal(t, slot, loadedState.Slot(), "Did not correctly load state") +} + +func TestLoadeStateBySlot_CanReplayBlock(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + genesis, keys := util.DeterministicGenesisState(t, 64) + genesisBlockRoot := bytesutil.ToBytes32(nil) + require.NoError(t, beaconDB.SaveState(ctx, genesis, genesisBlockRoot)) + stateRoot, err := genesis.HashTreeRoot(ctx) + require.NoError(t, err) + genesisBlk := blocks.NewGenesisBlock(stateRoot[:]) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesisBlk))) + genesisBlkRoot, err := genesisBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, genesisBlkRoot)) + + b1, err := util.GenerateFullBlock(genesis, keys, util.DefaultBlockGenConfig(), 1) + assert.NoError(t, err) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + r1, err := b1.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 1, Root: r1[:]})) + service.hotStateCache.put(bytesutil.ToBytes32(b1.Block.ParentRoot), genesis) + + loadedState, err := service.loadStateBySlot(ctx, 2) + require.NoError(t, err) + assert.Equal(t, types.Slot(2), loadedState.Slot(), "Did not correctly load state") +} + +func TestLoadeStateBySlot_DoesntReplayBlockOnRequestedSlot(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + genesis, keys := util.DeterministicGenesisState(t, 64) + genesisBlockRoot := bytesutil.ToBytes32(nil) + require.NoError(t, beaconDB.SaveState(ctx, genesis, genesisBlockRoot)) + stateRoot, err := genesis.HashTreeRoot(ctx) + require.NoError(t, err) + genesisBlk := blocks.NewGenesisBlock(stateRoot[:]) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesisBlk))) + genesisBlkRoot, err := genesisBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, genesisBlkRoot)) + + b1, err := util.GenerateFullBlock(genesis, keys, util.DefaultBlockGenConfig(), 1) + assert.NoError(t, err) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + r1, err := b1.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 1, Root: r1[:]})) + service.hotStateCache.put(bytesutil.ToBytes32(b1.Block.ParentRoot), genesis) + + loadedState, err := service.loadStateBySlot(ctx, 1) + require.NoError(t, err) + assert.Equal(t, types.Slot(1), loadedState.Slot(), "Did not correctly load state") + + // Latest block header's state root should not be zero. Zero means the current slot's block has been processed. + require.NotEqual(t, params.BeaconConfig().ZeroHash, bytesutil.ToBytes32(loadedState.LatestBlockHeader().StateRoot)) +} + +func TestLastAncestorState_CanGetUsingDB(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + b0 := util.NewBeaconBlock() + b0.Block.ParentRoot = bytesutil.PadTo([]byte{'a'}, 32) + r0, err := b0.Block.HashTreeRoot() + require.NoError(t, err) + b1 := util.NewBeaconBlock() + b1.Block.Slot = 1 + b1.Block.ParentRoot = bytesutil.PadTo(r0[:], 32) + r1, err := b1.Block.HashTreeRoot() + require.NoError(t, err) + b2 := util.NewBeaconBlock() + b2.Block.Slot = 2 + b2.Block.ParentRoot = bytesutil.PadTo(r1[:], 32) + r2, err := b2.Block.HashTreeRoot() + require.NoError(t, err) + b3 := util.NewBeaconBlock() + b3.Block.Slot = 3 + b3.Block.ParentRoot = bytesutil.PadTo(r2[:], 32) + r3, err := b3.Block.HashTreeRoot() + require.NoError(t, err) + + b1State, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, b1State.SetSlot(1)) + + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b0))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b2))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b3))) + require.NoError(t, service.beaconDB.SaveState(ctx, b1State, r1)) + + lastState, err := service.lastAncestorState(ctx, r3) + require.NoError(t, err) + assert.Equal(t, b1State.Slot(), lastState.Slot(), "Did not get wanted state") +} + +func TestLastAncestorState_CanGetUsingCache(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + b0 := util.NewBeaconBlock() + b0.Block.ParentRoot = bytesutil.PadTo([]byte{'a'}, 32) + r0, err := b0.Block.HashTreeRoot() + require.NoError(t, err) + b1 := util.NewBeaconBlock() + b1.Block.Slot = 1 + b1.Block.ParentRoot = bytesutil.PadTo(r0[:], 32) + r1, err := b1.Block.HashTreeRoot() + require.NoError(t, err) + b2 := util.NewBeaconBlock() + b2.Block.Slot = 2 + b2.Block.ParentRoot = bytesutil.PadTo(r1[:], 32) + r2, err := b2.Block.HashTreeRoot() + require.NoError(t, err) + b3 := util.NewBeaconBlock() + b3.Block.Slot = 3 + b3.Block.ParentRoot = bytesutil.PadTo(r2[:], 32) + r3, err := b3.Block.HashTreeRoot() + require.NoError(t, err) + + b1State, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, b1State.SetSlot(1)) + + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b0))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b2))) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b3))) + service.hotStateCache.put(r1, b1State) + + lastState, err := service.lastAncestorState(ctx, r3) + require.NoError(t, err) + assert.Equal(t, b1State.Slot(), lastState.Slot(), "Did not get wanted state") +} + +func TestState_HasState(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + s, err := util.NewBeaconState() + require.NoError(t, err) + rHit1 := [32]byte{1} + rHit2 := [32]byte{2} + rMiss := [32]byte{3} + service.hotStateCache.put(rHit1, s) + require.NoError(t, service.epochBoundaryStateCache.put(rHit2, s)) + + b := util.NewBeaconBlock() + rHit3, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveState(ctx, s, rHit3)) + tt := []struct { + root [32]byte + want bool + }{ + {rHit1, true}, + {rHit2, true}, + {rMiss, false}, + {rHit3, true}, + } + for _, tc := range tt { + got, err := service.HasState(ctx, tc.root) + require.NoError(t, err) + require.Equal(t, tc.want, got) + } +} + +func TestState_HasStateInCache(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + s, err := util.NewBeaconState() + require.NoError(t, err) + rHit1 := [32]byte{1} + rHit2 := [32]byte{2} + rMiss := [32]byte{3} + service.hotStateCache.put(rHit1, s) + require.NoError(t, service.epochBoundaryStateCache.put(rHit2, s)) + + tt := []struct { + root [32]byte + want bool + }{ + {rHit1, true}, + {rHit2, true}, + {rMiss, false}, + } + for _, tc := range tt { + got, err := service.HasStateInCache(ctx, tc.root) + require.NoError(t, err) + require.Equal(t, tc.want, got) + } +} diff --git a/beacon-chain/state-proto/stategen/hot_state_cache.go b/beacon-chain/state-proto/stategen/hot_state_cache.go new file mode 100644 index 0000000000..97fdbed10e --- /dev/null +++ b/beacon-chain/state-proto/stategen/hot_state_cache.go @@ -0,0 +1,87 @@ +package stategen + +import ( + "sync" + + lru "github.com/hashicorp/golang-lru" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" +) + +var ( + // hotStateCacheSize defines the max number of hot state this can cache. + hotStateCacheSize = 32 + // Metrics + hotStateCacheHit = promauto.NewCounter(prometheus.CounterOpts{ + Name: "hot_state_cache_hit", + Help: "The total number of cache hits on the hot state cache.", + }) + hotStateCacheMiss = promauto.NewCounter(prometheus.CounterOpts{ + Name: "hot_state_cache_miss", + Help: "The total number of cache misses on the hot state cache.", + }) +) + +// hotStateCache is used to store the processed beacon state after finalized check point.. +type hotStateCache struct { + cache *lru.Cache + lock sync.RWMutex +} + +// newHotStateCache initializes the map and underlying cache. +func newHotStateCache() *hotStateCache { + return &hotStateCache{ + cache: lruwrpr.New(hotStateCacheSize), + } +} + +// Get returns a cached response via input block root, if any. +// The response is copied by default. +func (c *hotStateCache) get(root [32]byte) state.BeaconState { + c.lock.RLock() + defer c.lock.RUnlock() + item, exists := c.cache.Get(root) + + if exists && item != nil { + hotStateCacheHit.Inc() + return item.(state.BeaconState).Copy() + } + hotStateCacheMiss.Inc() + return nil +} + +// GetWithoutCopy returns a non-copied cached response via input block root. +func (c *hotStateCache) getWithoutCopy(root [32]byte) state.BeaconState { + c.lock.RLock() + defer c.lock.RUnlock() + item, exists := c.cache.Get(root) + if exists && item != nil { + hotStateCacheHit.Inc() + return item.(state.BeaconState) + } + hotStateCacheMiss.Inc() + return nil +} + +// put the response in the cache. +func (c *hotStateCache) put(root [32]byte, state state.BeaconState) { + c.lock.Lock() + defer c.lock.Unlock() + c.cache.Add(root, state) +} + +// has returns true if the key exists in the cache. +func (c *hotStateCache) has(root [32]byte) bool { + c.lock.RLock() + defer c.lock.RUnlock() + return c.cache.Contains(root) +} + +// delete deletes the key exists in the cache. +func (c *hotStateCache) delete(root [32]byte) bool { + c.lock.Lock() + defer c.lock.Unlock() + return c.cache.Remove(root) +} diff --git a/beacon-chain/state/stategen/hot_state_cache_test.go b/beacon-chain/state-proto/stategen/hot_state_cache_test.go similarity index 76% rename from beacon-chain/state/stategen/hot_state_cache_test.go rename to beacon-chain/state-proto/stategen/hot_state_cache_test.go index 6ad61de847..ac56fc61dd 100644 --- a/beacon-chain/state/stategen/hot_state_cache_test.go +++ b/beacon-chain/state-proto/stategen/hot_state_cache_test.go @@ -3,8 +3,8 @@ package stategen import ( "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" @@ -27,7 +27,7 @@ func TestHotStateCache_RoundTrip(t *testing.T) { res := c.get(root) assert.NotNil(t, s) - assert.DeepEqual(t, res.ToProto(), s.ToProto(), "Expected equal protos to return from cache") + assert.DeepEqual(t, res.CloneInnerState(), s.CloneInnerState(), "Expected equal protos to return from cache") c.delete(root) assert.Equal(t, false, c.has(root), "Cache not supposed to have the object") diff --git a/beacon-chain/state-proto/stategen/init_test.go b/beacon-chain/state-proto/stategen/init_test.go new file mode 100644 index 0000000000..4eb1a29b5a --- /dev/null +++ b/beacon-chain/state-proto/stategen/init_test.go @@ -0,0 +1,12 @@ +package stategen + +import ( + "github.com/prysmaticlabs/prysm/config/params" +) + +func init() { + // Override network name so that hardcoded genesis files are not loaded. + cfg := params.BeaconConfig() + cfg.ConfigName = "test" + params.OverrideBeaconConfig(cfg) +} diff --git a/beacon-chain/state-proto/stategen/log.go b/beacon-chain/state-proto/stategen/log.go new file mode 100644 index 0000000000..b3414dc6cf --- /dev/null +++ b/beacon-chain/state-proto/stategen/log.go @@ -0,0 +1,5 @@ +package stategen + +import "github.com/sirupsen/logrus" + +var log = logrus.WithField("prefix", "state-gen") diff --git a/beacon-chain/state-proto/stategen/metrics.go b/beacon-chain/state-proto/stategen/metrics.go new file mode 100644 index 0000000000..143b251794 --- /dev/null +++ b/beacon-chain/state-proto/stategen/metrics.go @@ -0,0 +1,16 @@ +package stategen + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + replayBlockCount = promauto.NewHistogram( + prometheus.HistogramOpts{ + Name: "replay_blocks_count", + Help: "The number of blocks to replay to generate a state", + Buckets: []float64{64, 256, 1024, 2048, 4096}, + }, + ) +) diff --git a/beacon-chain/state-proto/stategen/migrate.go b/beacon-chain/state-proto/stategen/migrate.go new file mode 100644 index 0000000000..388c0e18d9 --- /dev/null +++ b/beacon-chain/state-proto/stategen/migrate.go @@ -0,0 +1,119 @@ +package stategen + +import ( + "context" + "encoding/hex" + "fmt" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" +) + +// MigrateToCold advances the finalized info in between the cold and hot state sections. +// It moves the recent finalized states from the hot section to the cold section and +// only preserve the ones that's on archived point. +func (s *State) MigrateToCold(ctx context.Context, fRoot [32]byte) error { + ctx, span := trace.StartSpan(ctx, "stateGen.MigrateToCold") + defer span.End() + + s.finalizedInfo.lock.RLock() + oldFSlot := s.finalizedInfo.slot + s.finalizedInfo.lock.RUnlock() + + fBlock, err := s.beaconDB.Block(ctx, fRoot) + if err != nil { + return err + } + fSlot := fBlock.Block().Slot() + if oldFSlot > fSlot { + return nil + } + + // Start at previous finalized slot, stop at current finalized slot. + // If the slot is on archived point, save the state of that slot to the DB. + for slot := oldFSlot; slot < fSlot; slot++ { + if ctx.Err() != nil { + return ctx.Err() + } + + if slot%s.slotsPerArchivedPoint == 0 && slot != 0 { + cached, exists, err := s.epochBoundaryStateCache.getBySlot(slot) + if err != nil { + return fmt.Errorf("could not get epoch boundary state for slot %d", slot) + } + + var aRoot [32]byte + var aState state.BeaconState + + // When the epoch boundary state is not in cache due to skip slot scenario, + // we have to regenerate the state which will represent epoch boundary. + // By finding the highest available block below epoch boundary slot, we + // generate the state for that block root. + if exists { + aRoot = cached.root + aState = cached.state + } else { + blks, err := s.beaconDB.HighestSlotBlocksBelow(ctx, slot) + if err != nil { + return err + } + // Given the block has been finalized, the db should not have more than one block in a given slot. + // We should error out when this happens. + if len(blks) != 1 { + return errUnknownBlock + } + missingRoot, err := blks[0].Block().HashTreeRoot() + if err != nil { + return err + } + aRoot = missingRoot + // There's no need to generate the state if the state already exists on the DB. + // We can skip saving the state. + if !s.beaconDB.HasState(ctx, aRoot) { + aState, err = s.StateByRoot(ctx, missingRoot) + if err != nil { + return err + } + } + } + + if s.beaconDB.HasState(ctx, aRoot) { + // Remove hot state DB root to prevent it gets deleted later when we turn hot state save DB mode off. + s.saveHotStateDB.lock.Lock() + roots := s.saveHotStateDB.savedStateRoots + for i := 0; i < len(roots); i++ { + if aRoot == roots[i] { + s.saveHotStateDB.savedStateRoots = append(roots[:i], roots[i+1:]...) + // There shouldn't be duplicated roots in `savedStateRoots`. + // Break here is ok. + break + } + } + s.saveHotStateDB.lock.Unlock() + continue + } + + if err := s.beaconDB.SaveState(ctx, aState, aRoot); err != nil { + return err + } + log.WithFields( + logrus.Fields{ + "slot": aState.Slot(), + "root": hex.EncodeToString(bytesutil.Trunc(aRoot[:])), + }).Info("Saved state in DB") + } + } + + // Update finalized info in memory. + fInfo, ok, err := s.epochBoundaryStateCache.getByRoot(fRoot) + if err != nil { + return err + } + if ok { + s.SaveFinalizedState(fSlot, fRoot, fInfo.state) + } + + return nil +} diff --git a/beacon-chain/state-proto/stategen/migrate_test.go b/beacon-chain/state-proto/stategen/migrate_test.go new file mode 100644 index 0000000000..ec2c5d8cc6 --- /dev/null +++ b/beacon-chain/state-proto/stategen/migrate_test.go @@ -0,0 +1,137 @@ +package stategen + +import ( + "context" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" + testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" + logTest "github.com/sirupsen/logrus/hooks/test" +) + +func TestMigrateToCold_CanSaveFinalizedInfo(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + beaconState, _ := util.DeterministicGenesisState(t, 32) + b := util.NewBeaconBlock() + b.Block.Slot = 1 + br, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.epochBoundaryStateCache.put(br, beaconState)) + require.NoError(t, service.MigrateToCold(ctx, br)) + + wanted := &finalizedInfo{state: beaconState, root: br, slot: 1} + assert.DeepEqual(t, wanted, service.finalizedInfo, "Incorrect finalized info") +} + +func TestMigrateToCold_HappyPath(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = 1 + beaconState, _ := util.DeterministicGenesisState(t, 32) + stateSlot := types.Slot(1) + require.NoError(t, beaconState.SetSlot(stateSlot)) + b := util.NewBeaconBlock() + b.Block.Slot = 2 + fRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.epochBoundaryStateCache.put(fRoot, beaconState)) + require.NoError(t, service.MigrateToCold(ctx, fRoot)) + + gotState, err := service.beaconDB.State(ctx, fRoot) + require.NoError(t, err) + assert.DeepSSZEqual(t, beaconState.InnerStateUnsafe(), gotState.InnerStateUnsafe(), "Did not save state") + gotRoot := service.beaconDB.ArchivedPointRoot(ctx, stateSlot/service.slotsPerArchivedPoint) + assert.Equal(t, fRoot, gotRoot, "Did not save archived root") + lastIndex, err := service.beaconDB.LastArchivedSlot(ctx) + require.NoError(t, err) + assert.Equal(t, types.Slot(1), lastIndex, "Did not save last archived index") + + require.LogsContain(t, hook, "Saved state in DB") +} + +func TestMigrateToCold_RegeneratePath(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = 1 + beaconState, pks := util.DeterministicGenesisState(t, 32) + genesisStateRoot, err := beaconState.HashTreeRoot(ctx) + require.NoError(t, err) + genesis := blocks.NewGenesisBlock(genesisStateRoot[:]) + assert.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesis))) + gRoot, err := genesis.Block.HashTreeRoot() + require.NoError(t, err) + assert.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot)) + assert.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + + b1, err := util.GenerateFullBlock(beaconState, pks, util.DefaultBlockGenConfig(), 1) + require.NoError(t, err) + r1, err := b1.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 1, Root: r1[:]})) + + b4, err := util.GenerateFullBlock(beaconState, pks, util.DefaultBlockGenConfig(), 4) + require.NoError(t, err) + r4, err := b4.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b4))) + require.NoError(t, service.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Slot: 4, Root: r4[:]})) + service.finalizedInfo = &finalizedInfo{ + slot: 0, + root: genesisStateRoot, + state: beaconState, + } + + require.NoError(t, service.MigrateToCold(ctx, r4)) + + s1, err := service.beaconDB.State(ctx, r1) + require.NoError(t, err) + assert.Equal(t, s1.Slot(), types.Slot(1), "Did not save state") + gotRoot := service.beaconDB.ArchivedPointRoot(ctx, 1/service.slotsPerArchivedPoint) + assert.Equal(t, r1, gotRoot, "Did not save archived root") + lastIndex, err := service.beaconDB.LastArchivedSlot(ctx) + require.NoError(t, err) + assert.Equal(t, types.Slot(1), lastIndex, "Did not save last archived index") + + require.LogsContain(t, hook, "Saved state in DB") +} + +func TestMigrateToCold_StateExistsInDB(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = 1 + beaconState, _ := util.DeterministicGenesisState(t, 32) + stateSlot := types.Slot(1) + require.NoError(t, beaconState.SetSlot(stateSlot)) + b := util.NewBeaconBlock() + b.Block.Slot = 2 + fRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + require.NoError(t, service.epochBoundaryStateCache.put(fRoot, beaconState)) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, fRoot)) + + service.saveHotStateDB.savedStateRoots = [][32]byte{{1}, {2}, {3}, {4}, fRoot} + require.NoError(t, service.MigrateToCold(ctx, fRoot)) + assert.DeepEqual(t, [][32]byte{{1}, {2}, {3}, {4}}, service.saveHotStateDB.savedStateRoots) + assert.LogsDoNotContain(t, hook, "Saved state in DB") +} diff --git a/beacon-chain/state-proto/stategen/mock.go b/beacon-chain/state-proto/stategen/mock.go new file mode 100644 index 0000000000..8dbde0369a --- /dev/null +++ b/beacon-chain/state-proto/stategen/mock.go @@ -0,0 +1,126 @@ +package stategen + +import ( + "context" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" +) + +// MockStateManager is a fake implementation of StateManager. +type MockStateManager struct { + StatesByRoot map[[32]byte]state.BeaconState + StatesBySlot map[types.Slot]state.BeaconState +} + +// NewMockService -- +func NewMockService() *MockStateManager { + return &MockStateManager{ + StatesByRoot: make(map[[32]byte]state.BeaconState), + StatesBySlot: make(map[types.Slot]state.BeaconState), + } +} + +// StateByRootIfCached +func (_ *MockStateManager) StateByRootIfCachedNoCopy(_ [32]byte) state.BeaconState { + panic("implement me") +} + +// Resume -- +func (_ *MockStateManager) Resume(_ context.Context, _ state.BeaconState) (state.BeaconState, error) { + panic("implement me") +} + +// SaveFinalizedState -- +func (_ *MockStateManager) SaveFinalizedState(_ types.Slot, _ [32]byte, _ state.BeaconState) { + panic("implement me") +} + +// MigrateToCold -- +func (_ *MockStateManager) MigrateToCold(_ context.Context, _ [32]byte) error { + panic("implement me") +} + +// ReplayBlocks -- +func (_ *MockStateManager) ReplayBlocks( + _ context.Context, + _ state.BeaconState, + _ []block.SignedBeaconBlock, + _ types.Slot, +) (state.BeaconState, error) { + panic("implement me") +} + +// LoadBlocks -- +func (_ *MockStateManager) LoadBlocks( + _ context.Context, + _, _ types.Slot, + _ [32]byte, +) ([]block.SignedBeaconBlock, error) { + panic("implement me") +} + +// HasState -- +func (_ *MockStateManager) HasState(_ context.Context, _ [32]byte) (bool, error) { + panic("implement me") +} + +// HasStateInCache -- +func (_ *MockStateManager) HasStateInCache(_ context.Context, _ [32]byte) (bool, error) { + panic("implement me") +} + +// StateByRoot -- +func (m *MockStateManager) StateByRoot(_ context.Context, blockRoot [32]byte) (state.BeaconState, error) { + return m.StatesByRoot[blockRoot], nil +} + +// StateByRootInitialSync -- +func (_ *MockStateManager) StateByRootInitialSync(_ context.Context, _ [32]byte) (state.BeaconState, error) { + panic("implement me") +} + +// StateBySlot -- +func (m *MockStateManager) StateBySlot(_ context.Context, slot types.Slot) (state.BeaconState, error) { + return m.StatesBySlot[slot], nil +} + +// RecoverStateSummary -- +func (_ *MockStateManager) RecoverStateSummary( + _ context.Context, + _ [32]byte, +) (*ethpb.StateSummary, error) { + panic("implement me") +} + +// SaveState -- +func (_ *MockStateManager) SaveState(_ context.Context, _ [32]byte, _ state.BeaconState) error { + panic("implement me") +} + +// ForceCheckpoint -- +func (_ *MockStateManager) ForceCheckpoint(_ context.Context, _ []byte) error { + panic("implement me") +} + +// EnableSaveHotStateToDB -- +func (_ *MockStateManager) EnableSaveHotStateToDB(_ context.Context) { + panic("implement me") +} + +// DisableSaveHotStateToDB -- +func (_ *MockStateManager) DisableSaveHotStateToDB(_ context.Context) error { + panic("implement me") +} + +// AddStateForRoot -- +func (m *MockStateManager) AddStateForRoot(state state.BeaconState, blockRoot [32]byte) { + m.StatesByRoot[blockRoot] = state +} + +// AddStateForSlot -- +func (m *MockStateManager) AddStateForSlot(state state.BeaconState, slot types.Slot) { + m.StatesBySlot[slot] = state +} diff --git a/beacon-chain/state-proto/stategen/replay.go b/beacon-chain/state-proto/stategen/replay.go new file mode 100644 index 0000000000..6d4e336bfb --- /dev/null +++ b/beacon-chain/state-proto/stategen/replay.go @@ -0,0 +1,326 @@ +package stategen + +import ( + "context" + "fmt" + "time" + + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" + "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + prysmTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" + "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" + "github.com/prysmaticlabs/prysm/beacon-chain/db/filters" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" + "github.com/prysmaticlabs/prysm/runtime/version" + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" +) + +// ReplayBlocks replays the input blocks on the input state until the target slot is reached. +func (_ *State) ReplayBlocks( + ctx context.Context, + state state.BeaconState, + signed []block.SignedBeaconBlock, + targetSlot types.Slot, +) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.ReplayBlocks") + defer span.End() + var err error + + start := time.Now() + log.WithFields(logrus.Fields{ + "startSlot": state.Slot(), + "endSlot": targetSlot, + "diff": targetSlot - state.Slot(), + }).Debug("Replaying state") + // The input block list is sorted in decreasing slots order. + if len(signed) > 0 { + for i := len(signed) - 1; i >= 0; i-- { + if ctx.Err() != nil { + return nil, ctx.Err() + } + if state.Slot() >= targetSlot { + break + } + // A node shouldn't process the block if the block slot is lower than the state slot. + if state.Slot() >= signed[i].Block().Slot() { + continue + } + state, err = executeStateTransitionStateGen(ctx, state, signed[i]) + if err != nil { + return nil, err + } + } + } + + // If there is skip slots at the end. + if targetSlot > state.Slot() { + state, err = processSlotsStateGen(ctx, state, targetSlot) + if err != nil { + return nil, err + } + } + + duration := time.Since(start) + log.WithFields(logrus.Fields{ + "duration": duration, + }).Debug("Replayed state") + + return state, nil +} + +// LoadBlocks loads the blocks between start slot and end slot by recursively fetching from end block root. +// The Blocks are returned in slot-descending order. +func (s *State) LoadBlocks(ctx context.Context, startSlot, endSlot types.Slot, endBlockRoot [32]byte) ([]block.SignedBeaconBlock, error) { + // Nothing to load for invalid range. + if endSlot < startSlot { + return nil, fmt.Errorf("start slot %d >= end slot %d", startSlot, endSlot) + } + filter := filters.NewFilter().SetStartSlot(startSlot).SetEndSlot(endSlot) + blocks, blockRoots, err := s.beaconDB.Blocks(ctx, filter) + if err != nil { + return nil, err + } + // The retrieved blocks and block roots have to be in the same length given same filter. + if len(blocks) != len(blockRoots) { + return nil, errors.New("length of blocks and roots don't match") + } + // Return early if there's no block given the input. + length := len(blocks) + if length == 0 { + return nil, nil + } + + // The last retrieved block root has to match input end block root. + // Covers the edge case if there's multiple blocks on the same end slot, + // the end root may not be the last index in `blockRoots`. + for length >= 3 && blocks[length-1].Block().Slot() == blocks[length-2].Block().Slot() && blockRoots[length-1] != endBlockRoot { + if ctx.Err() != nil { + return nil, ctx.Err() + } + length-- + if blockRoots[length-2] == endBlockRoot { + length-- + break + } + } + + if blockRoots[length-1] != endBlockRoot { + return nil, errors.New("end block roots don't match") + } + + filteredBlocks := []block.SignedBeaconBlock{blocks[length-1]} + // Starting from second to last index because the last block is already in the filtered block list. + for i := length - 2; i >= 0; i-- { + if ctx.Err() != nil { + return nil, ctx.Err() + } + b := filteredBlocks[len(filteredBlocks)-1] + if bytesutil.ToBytes32(b.Block().ParentRoot()) != blockRoots[i] { + continue + } + filteredBlocks = append(filteredBlocks, blocks[i]) + } + + return filteredBlocks, nil +} + +// executeStateTransitionStateGen applies state transition on input historical state and block for state gen usages. +// There's no signature verification involved given state gen only works with stored block and state in DB. +// If the objects are already in stored in DB, one can omit redundant signature checks and ssz hashing calculations. +// WARNING: This method should not be used on an unverified new block. +func executeStateTransitionStateGen( + ctx context.Context, + state state.BeaconState, + signed block.SignedBeaconBlock, +) (state.BeaconState, error) { + if ctx.Err() != nil { + return nil, ctx.Err() + } + if err := helpers.BeaconBlockIsNil(signed); err != nil { + return nil, err + } + ctx, span := trace.StartSpan(ctx, "stategen.ExecuteStateTransitionStateGen") + defer span.End() + var err error + + // Execute per slots transition. + // Given this is for state gen, a node uses the version process slots without skip slots cache. + state, err = processSlotsStateGen(ctx, state, signed.Block().Slot()) + if err != nil { + return nil, errors.Wrap(err, "could not process slot") + } + + // Execute per block transition. + // Given this is for state gen, a node only cares about the post state without proposer + // and randao signature verifications. + state, err = transition.ProcessBlockForStateRoot(ctx, state, signed) + if err != nil { + return nil, errors.Wrap(err, "could not process block") + } + if signed.Version() == version.Altair { + sa, err := signed.Block().Body().SyncAggregate() + if err != nil { + return nil, err + } + state, err = altair.ProcessSyncAggregate(ctx, state, sa) + if err != nil { + return nil, err + } + } + + return state, nil +} + +// processSlotsStateGen to process old slots for state gen usages. +// There's no skip slot cache involved given state gen only works with already stored block and state in DB. +// WARNING: This method should not be used for future slot. +func processSlotsStateGen(ctx context.Context, state state.BeaconState, slot types.Slot) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stategen.ProcessSlotsStateGen") + defer span.End() + if state == nil || state.IsNil() { + return nil, errUnknownState + } + + if state.Slot() > slot { + err := fmt.Errorf("expected state.slot %d < slot %d", state.Slot(), slot) + return nil, err + } + + if state.Slot() == slot { + return state, nil + } + + var err error + for state.Slot() < slot { + state, err = transition.ProcessSlot(ctx, state) + if err != nil { + return nil, errors.Wrap(err, "could not process slot") + } + if prysmTime.CanProcessEpoch(state) { + switch state.Version() { + case version.Phase0: + state, err = transition.ProcessEpochPrecompute(ctx, state) + if err != nil { + return nil, errors.Wrap(err, "could not process epoch with optimizations") + } + case version.Altair: + state, err = altair.ProcessEpoch(ctx, state) + if err != nil { + return nil, errors.Wrap(err, "could not process epoch with optimization") + } + default: + return nil, errors.New("beacon state should have a version") + } + } + if err := state.SetSlot(state.Slot() + 1); err != nil { + return nil, err + } + + if prysmTime.CanUpgradeToAltair(state.Slot()) { + state, err = altair.UpgradeToAltair(ctx, state) + if err != nil { + return nil, err + } + } + } + + return state, nil +} + +// This finds the last saved block in DB from searching backwards from input slot, +// it returns the block root and the slot of the block. +// This is used by both hot and cold state management. +func (s *State) lastSavedBlock(ctx context.Context, slot types.Slot) ([32]byte, types.Slot, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.lastSavedBlock") + defer span.End() + + // Handle the genesis case where the input slot is 0. + if slot == 0 { + gRoot, err := s.genesisRoot(ctx) + if err != nil { + return [32]byte{}, 0, err + } + return gRoot, 0, nil + } + + lastSaved, err := s.beaconDB.HighestSlotBlocksBelow(ctx, slot) + if err != nil { + return [32]byte{}, 0, err + } + + // Given this is used to query canonical block. There should only be one saved canonical block of a given slot. + if len(lastSaved) != 1 { + return [32]byte{}, 0, fmt.Errorf("highest saved block does not equal to 1, it equals to %d", len(lastSaved)) + } + if lastSaved[0] == nil || lastSaved[0].IsNil() || lastSaved[0].Block().IsNil() { + return [32]byte{}, 0, nil + } + r, err := lastSaved[0].Block().HashTreeRoot() + if err != nil { + return [32]byte{}, 0, err + } + + return r, lastSaved[0].Block().Slot(), nil +} + +// This finds the last saved state in DB from searching backwards from input slot, +// it returns the block root of the block which was used to produce the state. +// This is used by both hot and cold state management. +func (s *State) lastSavedState(ctx context.Context, slot types.Slot) (state.ReadOnlyBeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.lastSavedState") + defer span.End() + + // Handle the genesis case where the input slot is 0. + if slot == 0 { + return s.beaconDB.GenesisState(ctx) + } + + lastSaved, err := s.beaconDB.HighestSlotStatesBelow(ctx, slot+1) + if err != nil { + return nil, err + } + + // Given this is used to query canonical state. There should only be one saved canonical block of a given slot. + if len(lastSaved) != 1 { + return nil, fmt.Errorf("highest saved state does not equal to 1, it equals to %d", len(lastSaved)) + } + if lastSaved[0] == nil { + return nil, errUnknownState + } + + return lastSaved[0], nil +} + +// This returns the genesis root. +func (s *State) genesisRoot(ctx context.Context) ([32]byte, error) { + b, err := s.beaconDB.GenesisBlock(ctx) + if err != nil { + return [32]byte{}, err + } + return b.Block().HashTreeRoot() +} + +// Given the start slot and the end slot, this returns the finalized beacon blocks in between. +// Since hot states don't have finalized blocks, this should ONLY be used for replaying cold state. +func (s *State) loadFinalizedBlocks(ctx context.Context, startSlot, endSlot types.Slot) ([]block.SignedBeaconBlock, error) { + f := filters.NewFilter().SetStartSlot(startSlot).SetEndSlot(endSlot) + bs, bRoots, err := s.beaconDB.Blocks(ctx, f) + if err != nil { + return nil, err + } + if len(bs) != len(bRoots) { + return nil, errors.New("length of blocks and roots don't match") + } + fbs := make([]block.SignedBeaconBlock, 0, len(bs)) + for i := len(bs) - 1; i >= 0; i-- { + if s.beaconDB.IsFinalizedBlock(ctx, bRoots[i]) { + fbs = append(fbs, bs[i]) + } + } + return fbs, nil +} diff --git a/beacon-chain/state-proto/stategen/replay_test.go b/beacon-chain/state-proto/stategen/replay_test.go new file mode 100644 index 0000000000..72846a162c --- /dev/null +++ b/beacon-chain/state-proto/stategen/replay_test.go @@ -0,0 +1,777 @@ +package stategen + +import ( + "context" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" + "github.com/prysmaticlabs/prysm/beacon-chain/db" + testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/runtime/version" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" + "google.golang.org/protobuf/proto" +) + +func TestReplayBlocks_AllSkipSlots(t *testing.T) { + beaconDB := testDB.SetupDB(t) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + genesisBlock := blocks.NewGenesisBlock([]byte{}) + bodyRoot, err := genesisBlock.Block.HashTreeRoot() + require.NoError(t, err) + err = beaconState.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ + Slot: genesisBlock.Block.Slot, + ParentRoot: genesisBlock.Block.ParentRoot, + StateRoot: params.BeaconConfig().ZeroHash[:], + BodyRoot: bodyRoot[:], + }) + require.NoError(t, err) + require.NoError(t, beaconState.SetSlashings(make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector))) + cp := beaconState.CurrentJustifiedCheckpoint() + mockRoot := [32]byte{} + copy(mockRoot[:], "hello-world") + cp.Root = mockRoot[:] + require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) + require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) + + service := New(beaconDB) + targetSlot := params.BeaconConfig().SlotsPerEpoch - 1 + newState, err := service.ReplayBlocks(context.Background(), beaconState, []block.SignedBeaconBlock{}, targetSlot) + require.NoError(t, err) + assert.Equal(t, targetSlot, newState.Slot(), "Did not advance slots") +} + +func TestReplayBlocks_SameSlot(t *testing.T) { + beaconDB := testDB.SetupDB(t) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + genesisBlock := blocks.NewGenesisBlock([]byte{}) + bodyRoot, err := genesisBlock.Block.HashTreeRoot() + require.NoError(t, err) + err = beaconState.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ + Slot: genesisBlock.Block.Slot, + ParentRoot: genesisBlock.Block.ParentRoot, + StateRoot: params.BeaconConfig().ZeroHash[:], + BodyRoot: bodyRoot[:], + }) + require.NoError(t, err) + require.NoError(t, beaconState.SetSlashings(make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector))) + cp := beaconState.CurrentJustifiedCheckpoint() + mockRoot := [32]byte{} + copy(mockRoot[:], "hello-world") + cp.Root = mockRoot[:] + require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) + require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) + + service := New(beaconDB) + targetSlot := beaconState.Slot() + newState, err := service.ReplayBlocks(context.Background(), beaconState, []block.SignedBeaconBlock{}, targetSlot) + require.NoError(t, err) + assert.Equal(t, targetSlot, newState.Slot(), "Did not advance slots") +} + +func TestReplayBlocks_LowerSlotBlock(t *testing.T) { + beaconDB := testDB.SetupDB(t) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(1)) + genesisBlock := blocks.NewGenesisBlock([]byte{}) + bodyRoot, err := genesisBlock.Block.HashTreeRoot() + require.NoError(t, err) + err = beaconState.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ + Slot: genesisBlock.Block.Slot, + ParentRoot: genesisBlock.Block.ParentRoot, + StateRoot: params.BeaconConfig().ZeroHash[:], + BodyRoot: bodyRoot[:], + }) + require.NoError(t, err) + require.NoError(t, beaconState.SetSlashings(make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector))) + cp := beaconState.CurrentJustifiedCheckpoint() + mockRoot := [32]byte{} + copy(mockRoot[:], "hello-world") + cp.Root = mockRoot[:] + require.NoError(t, beaconState.SetCurrentJustifiedCheckpoint(cp)) + require.NoError(t, beaconState.AppendCurrentEpochAttestations(ðpb.PendingAttestation{})) + + service := New(beaconDB) + targetSlot := beaconState.Slot() + b := util.NewBeaconBlock() + b.Block.Slot = beaconState.Slot() - 1 + newState, err := service.ReplayBlocks(context.Background(), beaconState, []block.SignedBeaconBlock{wrapper.WrappedPhase0SignedBeaconBlock(b)}, targetSlot) + require.NoError(t, err) + assert.Equal(t, targetSlot, newState.Slot(), "Did not advance slots") +} + +func TestReplayBlocks_ThroughForkBoundary(t *testing.T) { + params.SetupTestConfigCleanup(t) + bCfg := params.BeaconConfig() + bCfg.AltairForkEpoch = 1 + bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.AltairForkVersion)] = 1 + params.OverrideBeaconConfig(bCfg) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + genesisBlock := blocks.NewGenesisBlock([]byte{}) + bodyRoot, err := genesisBlock.Block.HashTreeRoot() + require.NoError(t, err) + err = beaconState.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ + Slot: genesisBlock.Block.Slot, + ParentRoot: genesisBlock.Block.ParentRoot, + StateRoot: params.BeaconConfig().ZeroHash[:], + BodyRoot: bodyRoot[:], + }) + require.NoError(t, err) + + service := New(testDB.SetupDB(t)) + targetSlot := params.BeaconConfig().SlotsPerEpoch + newState, err := service.ReplayBlocks(context.Background(), beaconState, []block.SignedBeaconBlock{}, targetSlot) + require.NoError(t, err) + + // Verify state is version Altair. + assert.Equal(t, version.Altair, newState.Version()) +} + +func TestLoadBlocks_FirstBranch(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree1(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 8, roots[len(roots)-1]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[8], + savedBlocks[6], + savedBlocks[4], + savedBlocks[2], + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_SecondBranch(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree1(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 5, roots[5]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[5], + savedBlocks[3], + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_ThirdBranch(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree1(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 7, roots[7]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[7], + savedBlocks[6], + savedBlocks[4], + savedBlocks[2], + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_SameSlots(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree2(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 3, roots[6]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[6], + savedBlocks[5], + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_SameEndSlots(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree3(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 2, roots[2]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[2], + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_SameEndSlotsWith2blocks(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, savedBlocks, err := tree4(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + + filteredBlocks, err := s.LoadBlocks(ctx, 0, 2, roots[1]) + require.NoError(t, err) + + wanted := []*ethpb.SignedBeaconBlock{ + savedBlocks[1], + savedBlocks[0], + } + + for i, block := range wanted { + if !proto.Equal(block, filteredBlocks[i].Proto()) { + t.Error("Did not get wanted blocks") + } + } +} + +func TestLoadBlocks_BadStart(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + + roots, _, err := tree1(t, beaconDB, bytesutil.PadTo([]byte{'A'}, 32)) + require.NoError(t, err) + _, err = s.LoadBlocks(ctx, 0, 5, roots[8]) + assert.ErrorContains(t, "end block roots don't match", err) +} + +func TestLastSavedBlock_Genesis(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + gBlk := util.NewBeaconBlock() + gRoot, err := gBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(gBlk))) + require.NoError(t, s.beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + + savedRoot, savedSlot, err := s.lastSavedBlock(ctx, 0) + require.NoError(t, err) + assert.Equal(t, types.Slot(0), savedSlot, "Did not save genesis slot") + assert.Equal(t, savedRoot, savedRoot, "Did not save genesis root") +} + +func TestLastSavedBlock_CanGet(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + b1 := util.NewBeaconBlock() + b1.Block.Slot = s.finalizedInfo.slot + 5 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + b2 := util.NewBeaconBlock() + b2.Block.Slot = s.finalizedInfo.slot + 10 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b2))) + b3 := util.NewBeaconBlock() + b3.Block.Slot = s.finalizedInfo.slot + 20 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b3))) + + savedRoot, savedSlot, err := s.lastSavedBlock(ctx, s.finalizedInfo.slot+100) + require.NoError(t, err) + assert.Equal(t, s.finalizedInfo.slot+20, savedSlot) + wantedRoot, err := b3.Block.HashTreeRoot() + require.NoError(t, err) + assert.Equal(t, wantedRoot, savedRoot, "Did not save correct root") +} + +func TestLastSavedBlock_NoSavedBlock(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + root, slot, err := s.lastSavedBlock(ctx, s.finalizedInfo.slot+1) + require.NoError(t, err) + if slot != 0 && root != [32]byte{} { + t.Error("Did not get wanted block") + } +} + +func TestLastSavedState_Genesis(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + gBlk := util.NewBeaconBlock() + gState, err := util.NewBeaconState() + require.NoError(t, err) + gRoot, err := gBlk.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(gBlk))) + require.NoError(t, s.beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + require.NoError(t, s.beaconDB.SaveState(ctx, gState, gRoot)) + + savedState, err := s.lastSavedState(ctx, 0) + require.NoError(t, err) + require.DeepSSZEqual(t, gState.InnerStateUnsafe(), savedState.InnerStateUnsafe()) +} + +func TestLastSavedState_CanGet(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + b1 := util.NewBeaconBlock() + b1.Block.Slot = s.finalizedInfo.slot + 5 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + b2 := util.NewBeaconBlock() + b2.Block.Slot = s.finalizedInfo.slot + 10 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b2))) + b2Root, err := b2.Block.HashTreeRoot() + require.NoError(t, err) + st, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, st.SetSlot(s.finalizedInfo.slot+10)) + + require.NoError(t, s.beaconDB.SaveState(ctx, st, b2Root)) + b3 := util.NewBeaconBlock() + b3.Block.Slot = s.finalizedInfo.slot + 20 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b3))) + + savedState, err := s.lastSavedState(ctx, s.finalizedInfo.slot+100) + require.NoError(t, err) + require.DeepSSZEqual(t, st.InnerStateUnsafe(), savedState.InnerStateUnsafe()) +} + +func TestLastSavedState_NoSavedBlockState(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + finalizedInfo: &finalizedInfo{slot: 128}, + } + + b1 := util.NewBeaconBlock() + b1.Block.Slot = 127 + require.NoError(t, s.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1))) + + _, err := s.lastSavedState(ctx, s.finalizedInfo.slot+1) + assert.ErrorContains(t, errUnknownState.Error(), err) +} + +// tree1 constructs the following tree: +// B0 - B1 - - B3 -- B5 +// \- B2 -- B4 -- B6 ----- B8 +// \- B7 +func tree1(t *testing.T, beaconDB db.Database, genesisRoot []byte) ([][32]byte, []*ethpb.SignedBeaconBlock, error) { + b0 := util.NewBeaconBlock() + b0.Block.Slot = 0 + b0.Block.ParentRoot = genesisRoot + r0, err := b0.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b1 := util.NewBeaconBlock() + b1.Block.Slot = 1 + b1.Block.ParentRoot = r0[:] + r1, err := b1.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b2 := util.NewBeaconBlock() + b2.Block.Slot = 2 + b2.Block.ParentRoot = r1[:] + r2, err := b2.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b3 := util.NewBeaconBlock() + b3.Block.Slot = 3 + b3.Block.ParentRoot = r1[:] + r3, err := b3.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b4 := util.NewBeaconBlock() + b4.Block.Slot = 4 + b4.Block.ParentRoot = r2[:] + r4, err := b4.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b5 := util.NewBeaconBlock() + b5.Block.Slot = 5 + b5.Block.ParentRoot = r3[:] + r5, err := b5.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b6 := util.NewBeaconBlock() + b6.Block.Slot = 6 + b6.Block.ParentRoot = r4[:] + r6, err := b6.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b7 := util.NewBeaconBlock() + b7.Block.Slot = 7 + b7.Block.ParentRoot = r6[:] + r7, err := b7.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b8 := util.NewBeaconBlock() + b8.Block.Slot = 8 + b8.Block.ParentRoot = r6[:] + r8, err := b8.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + st, err := util.NewBeaconState() + require.NoError(t, err) + + returnedBlocks := make([]*ethpb.SignedBeaconBlock, 0) + for _, b := range []*ethpb.SignedBeaconBlock{b0, b1, b2, b3, b4, b5, b6, b7, b8} { + beaconBlock := util.NewBeaconBlock() + beaconBlock.Block.Slot = b.Block.Slot + beaconBlock.Block.ParentRoot = bytesutil.PadTo(b.Block.ParentRoot, 32) + if err := beaconDB.SaveBlock(context.Background(), wrapper.WrappedPhase0SignedBeaconBlock(beaconBlock)); err != nil { + return nil, nil, err + } + if err := beaconDB.SaveState(context.Background(), st.Copy(), bytesutil.ToBytes32(beaconBlock.Block.ParentRoot)); err != nil { + return nil, nil, err + } + returnedBlocks = append(returnedBlocks, beaconBlock) + } + return [][32]byte{r0, r1, r2, r3, r4, r5, r6, r7, r8}, returnedBlocks, nil +} + +// tree2 constructs the following tree: +// B0 - B1 +// \- B2 +// \- B2 +// \- B2 +// \- B2 -- B3 +func tree2(t *testing.T, beaconDB db.Database, genesisRoot []byte) ([][32]byte, []*ethpb.SignedBeaconBlock, error) { + b0 := util.NewBeaconBlock() + b0.Block.Slot = 0 + b0.Block.ParentRoot = genesisRoot + r0, err := b0.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b1 := util.NewBeaconBlock() + b1.Block.Slot = 1 + b1.Block.ParentRoot = r0[:] + r1, err := b1.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b21 := util.NewBeaconBlock() + b21.Block.Slot = 2 + b21.Block.ParentRoot = r1[:] + b21.Block.StateRoot = bytesutil.PadTo([]byte{'A'}, 32) + r21, err := b21.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b22 := util.NewBeaconBlock() + b22.Block.Slot = 2 + b22.Block.ParentRoot = r1[:] + b22.Block.StateRoot = bytesutil.PadTo([]byte{'B'}, 32) + r22, err := b22.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b23 := util.NewBeaconBlock() + b23.Block.Slot = 2 + b23.Block.ParentRoot = r1[:] + b23.Block.StateRoot = bytesutil.PadTo([]byte{'C'}, 32) + r23, err := b23.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b24 := util.NewBeaconBlock() + b24.Block.Slot = 2 + b24.Block.ParentRoot = r1[:] + b24.Block.StateRoot = bytesutil.PadTo([]byte{'D'}, 32) + r24, err := b24.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b3 := util.NewBeaconBlock() + b3.Block.Slot = 3 + b3.Block.ParentRoot = r24[:] + r3, err := b3.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + st, err := util.NewBeaconState() + require.NoError(t, err) + + returnedBlocks := make([]*ethpb.SignedBeaconBlock, 0) + for _, b := range []*ethpb.SignedBeaconBlock{b0, b1, b21, b22, b23, b24, b3} { + beaconBlock := util.NewBeaconBlock() + beaconBlock.Block.Slot = b.Block.Slot + beaconBlock.Block.ParentRoot = bytesutil.PadTo(b.Block.ParentRoot, 32) + beaconBlock.Block.StateRoot = bytesutil.PadTo(b.Block.StateRoot, 32) + if err := beaconDB.SaveBlock(context.Background(), wrapper.WrappedPhase0SignedBeaconBlock(beaconBlock)); err != nil { + return nil, nil, err + } + if err := beaconDB.SaveState(context.Background(), st.Copy(), bytesutil.ToBytes32(beaconBlock.Block.ParentRoot)); err != nil { + return nil, nil, err + } + returnedBlocks = append(returnedBlocks, beaconBlock) + } + return [][32]byte{r0, r1, r21, r22, r23, r24, r3}, returnedBlocks, nil +} + +// tree3 constructs the following tree: +// B0 - B1 +// \- B2 +// \- B2 +// \- B2 +// \- B2 +func tree3(t *testing.T, beaconDB db.Database, genesisRoot []byte) ([][32]byte, []*ethpb.SignedBeaconBlock, error) { + b0 := util.NewBeaconBlock() + b0.Block.Slot = 0 + b0.Block.ParentRoot = genesisRoot + r0, err := b0.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b1 := util.NewBeaconBlock() + b1.Block.Slot = 1 + b1.Block.ParentRoot = r0[:] + r1, err := b1.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b21 := util.NewBeaconBlock() + b21.Block.Slot = 2 + b21.Block.ParentRoot = r1[:] + b21.Block.StateRoot = bytesutil.PadTo([]byte{'A'}, 32) + r21, err := b21.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b22 := util.NewBeaconBlock() + b22.Block.Slot = 2 + b22.Block.ParentRoot = r1[:] + b22.Block.StateRoot = bytesutil.PadTo([]byte{'B'}, 32) + r22, err := b22.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b23 := util.NewBeaconBlock() + b23.Block.Slot = 2 + b23.Block.ParentRoot = r1[:] + b23.Block.StateRoot = bytesutil.PadTo([]byte{'C'}, 32) + r23, err := b23.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b24 := util.NewBeaconBlock() + b24.Block.Slot = 2 + b24.Block.ParentRoot = r1[:] + b24.Block.StateRoot = bytesutil.PadTo([]byte{'D'}, 32) + r24, err := b24.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + st, err := util.NewBeaconState() + require.NoError(t, err) + + returnedBlocks := make([]*ethpb.SignedBeaconBlock, 0) + for _, b := range []*ethpb.SignedBeaconBlock{b0, b1, b21, b22, b23, b24} { + beaconBlock := util.NewBeaconBlock() + beaconBlock.Block.Slot = b.Block.Slot + beaconBlock.Block.ParentRoot = bytesutil.PadTo(b.Block.ParentRoot, 32) + beaconBlock.Block.StateRoot = bytesutil.PadTo(b.Block.StateRoot, 32) + if err := beaconDB.SaveBlock(context.Background(), wrapper.WrappedPhase0SignedBeaconBlock(beaconBlock)); err != nil { + return nil, nil, err + } + if err := beaconDB.SaveState(context.Background(), st.Copy(), bytesutil.ToBytes32(beaconBlock.Block.ParentRoot)); err != nil { + return nil, nil, err + } + returnedBlocks = append(returnedBlocks, beaconBlock) + } + + return [][32]byte{r0, r1, r21, r22, r23, r24}, returnedBlocks, nil +} + +// tree4 constructs the following tree: +// B0 +// \- B2 +// \- B2 +// \- B2 +// \- B2 +func tree4(t *testing.T, beaconDB db.Database, genesisRoot []byte) ([][32]byte, []*ethpb.SignedBeaconBlock, error) { + b0 := util.NewBeaconBlock() + b0.Block.Slot = 0 + b0.Block.ParentRoot = genesisRoot + r0, err := b0.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b21 := util.NewBeaconBlock() + b21.Block.Slot = 2 + b21.Block.ParentRoot = r0[:] + b21.Block.StateRoot = bytesutil.PadTo([]byte{'A'}, 32) + r21, err := b21.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b22 := util.NewBeaconBlock() + b22.Block.Slot = 2 + b22.Block.ParentRoot = r0[:] + b22.Block.StateRoot = bytesutil.PadTo([]byte{'B'}, 32) + r22, err := b22.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b23 := util.NewBeaconBlock() + b23.Block.Slot = 2 + b23.Block.ParentRoot = r0[:] + b23.Block.StateRoot = bytesutil.PadTo([]byte{'C'}, 32) + r23, err := b23.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + b24 := util.NewBeaconBlock() + b24.Block.Slot = 2 + b24.Block.ParentRoot = r0[:] + b24.Block.StateRoot = bytesutil.PadTo([]byte{'D'}, 32) + r24, err := b24.Block.HashTreeRoot() + if err != nil { + return nil, nil, err + } + st, err := util.NewBeaconState() + require.NoError(t, err) + + returnedBlocks := make([]*ethpb.SignedBeaconBlock, 0) + for _, b := range []*ethpb.SignedBeaconBlock{b0, b21, b22, b23, b24} { + beaconBlock := util.NewBeaconBlock() + beaconBlock.Block.Slot = b.Block.Slot + beaconBlock.Block.ParentRoot = bytesutil.PadTo(b.Block.ParentRoot, 32) + beaconBlock.Block.StateRoot = bytesutil.PadTo(b.Block.StateRoot, 32) + if err := beaconDB.SaveBlock(context.Background(), wrapper.WrappedPhase0SignedBeaconBlock(beaconBlock)); err != nil { + return nil, nil, err + } + if err := beaconDB.SaveState(context.Background(), st.Copy(), bytesutil.ToBytes32(beaconBlock.Block.ParentRoot)); err != nil { + return nil, nil, err + } + returnedBlocks = append(returnedBlocks, beaconBlock) + } + + return [][32]byte{r0, r21, r22, r23, r24}, returnedBlocks, nil +} + +func TestLoadFinalizedBlocks(t *testing.T) { + beaconDB := testDB.SetupDB(t) + ctx := context.Background() + s := &State{ + beaconDB: beaconDB, + } + gBlock := util.NewBeaconBlock() + gRoot, err := gBlock.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(gBlock))) + require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, [32]byte{})) + roots, _, err := tree1(t, beaconDB, gRoot[:]) + require.NoError(t, err) + + filteredBlocks, err := s.loadFinalizedBlocks(ctx, 0, 8) + require.NoError(t, err) + require.Equal(t, 0, len(filteredBlocks)) + require.NoError(t, beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: roots[8][:]})) + + require.NoError(t, s.beaconDB.SaveFinalizedCheckpoint(ctx, ðpb.Checkpoint{Root: roots[8][:]})) + filteredBlocks, err = s.loadFinalizedBlocks(ctx, 0, 8) + require.NoError(t, err) + require.Equal(t, 10, len(filteredBlocks)) +} diff --git a/beacon-chain/state-proto/stategen/service.go b/beacon-chain/state-proto/stategen/service.go new file mode 100644 index 0000000000..95cf97ac1d --- /dev/null +++ b/beacon-chain/state-proto/stategen/service.go @@ -0,0 +1,140 @@ +// Package stategen defines functions to regenerate beacon chain states +// by replaying blocks from a stored state checkpoint, useful for +// optimization and reducing a beacon node's resource consumption. +package stategen + +import ( + "context" + "errors" + "sync" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/db" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" + "go.opencensus.io/trace" +) + +var defaultHotStateDBInterval types.Slot = 128 + +// StateManager represents a management object that handles the internal +// logic of maintaining both hot and cold states in DB. +type StateManager interface { + Resume(ctx context.Context, fState state.BeaconState) (state.BeaconState, error) + SaveFinalizedState(fSlot types.Slot, fRoot [32]byte, fState state.BeaconState) + MigrateToCold(ctx context.Context, fRoot [32]byte) error + ReplayBlocks(ctx context.Context, state state.BeaconState, signed []block.SignedBeaconBlock, targetSlot types.Slot) (state.BeaconState, error) + LoadBlocks(ctx context.Context, startSlot, endSlot types.Slot, endBlockRoot [32]byte) ([]block.SignedBeaconBlock, error) + HasState(ctx context.Context, blockRoot [32]byte) (bool, error) + HasStateInCache(ctx context.Context, blockRoot [32]byte) (bool, error) + StateByRoot(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) + StateByRootIfCachedNoCopy(blockRoot [32]byte) state.BeaconState + StateByRootInitialSync(ctx context.Context, blockRoot [32]byte) (state.BeaconState, error) + StateBySlot(ctx context.Context, slot types.Slot) (state.BeaconState, error) + RecoverStateSummary(ctx context.Context, blockRoot [32]byte) (*ethpb.StateSummary, error) + SaveState(ctx context.Context, root [32]byte, st state.BeaconState) error + ForceCheckpoint(ctx context.Context, root []byte) error + EnableSaveHotStateToDB(_ context.Context) + DisableSaveHotStateToDB(ctx context.Context) error +} + +// State is a concrete implementation of StateManager. +type State struct { + beaconDB db.NoHeadAccessDatabase + slotsPerArchivedPoint types.Slot + hotStateCache *hotStateCache + finalizedInfo *finalizedInfo + epochBoundaryStateCache *epochBoundaryState + saveHotStateDB *saveHotStateDbConfig +} + +// This tracks the config in the event of long non-finality, +// how often does the node save hot states to db? what are +// the saved hot states in db?... etc +type saveHotStateDbConfig struct { + enabled bool + lock sync.Mutex + duration types.Slot + savedStateRoots [][32]byte +} + +// This tracks the finalized point. It's also the point where slot and the block root of +// cold and hot sections of the DB splits. +type finalizedInfo struct { + slot types.Slot + root [32]byte + state state.BeaconState + lock sync.RWMutex +} + +// New returns a new state management object. +func New(beaconDB db.NoHeadAccessDatabase) *State { + return &State{ + beaconDB: beaconDB, + hotStateCache: newHotStateCache(), + finalizedInfo: &finalizedInfo{slot: 0, root: params.BeaconConfig().ZeroHash}, + slotsPerArchivedPoint: params.BeaconConfig().SlotsPerArchivedPoint, + epochBoundaryStateCache: newBoundaryStateCache(), + saveHotStateDB: &saveHotStateDbConfig{ + duration: defaultHotStateDBInterval, + }, + } +} + +// Resume resumes a new state management object from previously saved finalized check point in DB. +func (s *State) Resume(ctx context.Context, fState state.BeaconState) (state.BeaconState, error) { + ctx, span := trace.StartSpan(ctx, "stateGen.Resume") + defer span.End() + + c, err := s.beaconDB.FinalizedCheckpoint(ctx) + if err != nil { + return nil, err + } + fRoot := bytesutil.ToBytes32(c.Root) + // Resume as genesis state if last finalized root is zero hashes. + if fRoot == params.BeaconConfig().ZeroHash { + return s.beaconDB.GenesisState(ctx) + } + + if fState == nil || fState.IsNil() { + return nil, errors.New("finalized state is nil") + } + + go func() { + if err := s.beaconDB.CleanUpDirtyStates(ctx, s.slotsPerArchivedPoint); err != nil { + log.WithError(err).Error("Could not clean up dirty states") + } + }() + + s.finalizedInfo = &finalizedInfo{slot: fState.Slot(), root: fRoot, state: fState.Copy()} + + return fState, nil +} + +// SaveFinalizedState saves the finalized slot, root and state into memory to be used by state gen service. +// This used for migration at the correct start slot and used for hot state play back to ensure +// lower bound to start is always at the last finalized state. +func (s *State) SaveFinalizedState(fSlot types.Slot, fRoot [32]byte, fState state.BeaconState) { + s.finalizedInfo.lock.Lock() + defer s.finalizedInfo.lock.Unlock() + s.finalizedInfo.root = fRoot + s.finalizedInfo.state = fState.Copy() + s.finalizedInfo.slot = fSlot +} + +// Returns true if input root equals to cached finalized root. +func (s *State) isFinalizedRoot(r [32]byte) bool { + s.finalizedInfo.lock.RLock() + defer s.finalizedInfo.lock.RUnlock() + return r == s.finalizedInfo.root +} + +// Returns the cached and copied finalized state. +func (s *State) finalizedState() state.BeaconState { + s.finalizedInfo.lock.RLock() + defer s.finalizedInfo.lock.RUnlock() + return s.finalizedInfo.state.Copy() +} diff --git a/beacon-chain/state-proto/stategen/service_test.go b/beacon-chain/state-proto/stategen/service_test.go new file mode 100644 index 0000000000..e839cca80b --- /dev/null +++ b/beacon-chain/state-proto/stategen/service_test.go @@ -0,0 +1,37 @@ +package stategen + +import ( + "context" + "testing" + + testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestResume(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + b := util.NewBeaconBlock() + require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + root, err := b.Block.HashTreeRoot() + require.NoError(t, err) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, root)) + require.NoError(t, service.beaconDB.SaveGenesisBlockRoot(ctx, root)) + require.NoError(t, service.beaconDB.SaveFinalizedCheckpoint(ctx, ðpb.Checkpoint{Root: root[:]})) + + resumeState, err := service.Resume(ctx, beaconState) + require.NoError(t, err) + require.DeepSSZEqual(t, beaconState.InnerStateUnsafe(), resumeState.InnerStateUnsafe()) + assert.Equal(t, params.BeaconConfig().SlotsPerEpoch, service.finalizedInfo.slot, "Did not get watned slot") + assert.Equal(t, service.finalizedInfo.root, root, "Did not get wanted root") + assert.NotNil(t, service.finalizedState(), "Wanted a non nil finalized state") +} diff --git a/beacon-chain/state-proto/stategen/setter.go b/beacon-chain/state-proto/stategen/setter.go new file mode 100644 index 0000000000..06e349eb2f --- /dev/null +++ b/beacon-chain/state-proto/stategen/setter.go @@ -0,0 +1,135 @@ +package stategen + +import ( + "context" + "math" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/time/slots" + "github.com/sirupsen/logrus" + "go.opencensus.io/trace" +) + +// SaveState saves the state in the cache and/or DB. +func (s *State) SaveState(ctx context.Context, root [32]byte, st state.BeaconState) error { + ctx, span := trace.StartSpan(ctx, "stateGen.SaveState") + defer span.End() + + return s.saveStateByRoot(ctx, root, st) +} + +// ForceCheckpoint initiates a cold state save of the given state. This method does not update the +// "last archived state" but simply saves the specified state from the root argument into the DB. +func (s *State) ForceCheckpoint(ctx context.Context, root []byte) error { + ctx, span := trace.StartSpan(ctx, "stateGen.ForceCheckpoint") + defer span.End() + + root32 := bytesutil.ToBytes32(root) + // Before the first finalized check point, the finalized root is zero hash. + // Return early if there hasn't been a finalized check point. + if root32 == params.BeaconConfig().ZeroHash { + return nil + } + + fs, err := s.loadStateByRoot(ctx, root32) + if err != nil { + return err + } + + return s.beaconDB.SaveState(ctx, fs, root32) +} + +// This saves a post beacon state. On the epoch boundary, +// it saves a full state. On an intermediate slot, it saves a back pointer to the +// nearest epoch boundary state. +func (s *State) saveStateByRoot(ctx context.Context, blockRoot [32]byte, st state.BeaconState) error { + ctx, span := trace.StartSpan(ctx, "stateGen.saveStateByRoot") + defer span.End() + + // Duration can't be 0 to prevent panic for division. + duration := uint64(math.Max(float64(s.saveHotStateDB.duration), 1)) + + s.saveHotStateDB.lock.Lock() + if s.saveHotStateDB.enabled && st.Slot().Mod(duration) == 0 { + if err := s.beaconDB.SaveState(ctx, st, blockRoot); err != nil { + s.saveHotStateDB.lock.Unlock() + return err + } + s.saveHotStateDB.savedStateRoots = append(s.saveHotStateDB.savedStateRoots, blockRoot) + + log.WithFields(logrus.Fields{ + "slot": st.Slot(), + "totalHotStateSavedInDB": len(s.saveHotStateDB.savedStateRoots), + }).Info("Saving hot state to DB") + } + s.saveHotStateDB.lock.Unlock() + + // If the hot state is already in cache, one can be sure the state was processed and in the DB. + if s.hotStateCache.has(blockRoot) { + return nil + } + + // Only on an epoch boundary slot, saves epoch boundary state in epoch boundary root state cache. + if slots.IsEpochStart(st.Slot()) { + if err := s.epochBoundaryStateCache.put(blockRoot, st); err != nil { + return err + } + } + + // On an intermediate slots, save state summary. + if err := s.beaconDB.SaveStateSummary(ctx, ðpb.StateSummary{ + Slot: st.Slot(), + Root: blockRoot[:], + }); err != nil { + return err + } + + // Store the copied state in the hot state cache. + s.hotStateCache.put(blockRoot, st) + + return nil +} + +// EnableSaveHotStateToDB enters the mode that saves hot beacon state to the DB. +// This usually gets triggered when there's long duration since finality. +func (s *State) EnableSaveHotStateToDB(_ context.Context) { + s.saveHotStateDB.lock.Lock() + defer s.saveHotStateDB.lock.Unlock() + if s.saveHotStateDB.enabled { + return + } + + s.saveHotStateDB.enabled = true + + log.WithFields(logrus.Fields{ + "enabled": s.saveHotStateDB.enabled, + "slotsInterval": s.saveHotStateDB.duration, + }).Warn("Entering mode to save hot states in DB") +} + +// DisableSaveHotStateToDB exits the mode that saves beacon state to DB for the hot states. +// This usually gets triggered once there's finality after long duration since finality. +func (s *State) DisableSaveHotStateToDB(ctx context.Context) error { + s.saveHotStateDB.lock.Lock() + defer s.saveHotStateDB.lock.Unlock() + if !s.saveHotStateDB.enabled { + return nil + } + + log.WithFields(logrus.Fields{ + "enabled": s.saveHotStateDB.enabled, + "deletedHotStates": len(s.saveHotStateDB.savedStateRoots), + }).Warn("Exiting mode to save hot states in DB") + + // Delete previous saved states in DB as we are turning this mode off. + s.saveHotStateDB.enabled = false + if err := s.beaconDB.DeleteStates(ctx, s.saveHotStateDB.savedStateRoots); err != nil { + return err + } + s.saveHotStateDB.savedStateRoots = nil + + return nil +} diff --git a/beacon-chain/state-proto/stategen/setter_test.go b/beacon-chain/state-proto/stategen/setter_test.go new file mode 100644 index 0000000000..f0dc9ce205 --- /dev/null +++ b/beacon-chain/state-proto/stategen/setter_test.go @@ -0,0 +1,204 @@ +package stategen + +import ( + "context" + "testing" + + testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" + logTest "github.com/sirupsen/logrus/hooks/test" +) + +func TestSaveState_HotStateCanBeSaved(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = 1 + beaconState, _ := util.DeterministicGenesisState(t, 32) + // This goes to hot section, verify it can save on epoch boundary. + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + + r := [32]byte{'a'} + require.NoError(t, service.SaveState(ctx, r, beaconState)) + + // Should save both state and state summary. + _, ok, err := service.epochBoundaryStateCache.getByRoot(r) + require.NoError(t, err) + assert.Equal(t, true, ok, "Should have saved the state") + assert.Equal(t, true, service.beaconDB.HasStateSummary(ctx, r), "Should have saved the state summary") +} + +func TestSaveState_HotStateCached(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + service := New(beaconDB) + service.slotsPerArchivedPoint = 1 + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + + // Cache the state prior. + r := [32]byte{'a'} + service.hotStateCache.put(r, beaconState) + require.NoError(t, service.SaveState(ctx, r, beaconState)) + + // Should not save the state and state summary. + assert.Equal(t, false, service.beaconDB.HasState(ctx, r), "Should not have saved the state") + assert.Equal(t, false, service.beaconDB.HasStateSummary(ctx, r), "Should have saved the state summary") + require.LogsDoNotContain(t, hook, "Saved full state on epoch boundary") +} + +func TestState_ForceCheckpoint_SavesStateToDatabase(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + + svc := New(beaconDB) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + + r := [32]byte{'a'} + svc.hotStateCache.put(r, beaconState) + + require.Equal(t, false, beaconDB.HasState(ctx, r), "Database has state stored already") + assert.NoError(t, svc.ForceCheckpoint(ctx, r[:])) + assert.Equal(t, true, beaconDB.HasState(ctx, r), "Did not save checkpoint to database") + + // Should not panic with genesis finalized root. + assert.NoError(t, svc.ForceCheckpoint(ctx, params.BeaconConfig().ZeroHash[:])) +} + +func TestSaveState_Alreadyhas(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + r := [32]byte{'A'} + + // Pre cache the hot state. + service.hotStateCache.put(r, beaconState) + require.NoError(t, service.saveStateByRoot(ctx, r, beaconState)) + + // Should not save the state and state summary. + assert.Equal(t, false, service.beaconDB.HasState(ctx, r), "Should not have saved the state") + assert.Equal(t, false, service.beaconDB.HasStateSummary(ctx, r), "Should have saved the state summary") + require.LogsDoNotContain(t, hook, "Saved full state on epoch boundary") +} + +func TestSaveState_CanSaveOnEpochBoundary(t *testing.T) { + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch)) + r := [32]byte{'A'} + + require.NoError(t, service.saveStateByRoot(ctx, r, beaconState)) + + // Should save both state and state summary. + _, ok, err := service.epochBoundaryStateCache.getByRoot(r) + require.NoError(t, err) + require.Equal(t, true, ok, "Did not save epoch boundary state") + assert.Equal(t, true, service.beaconDB.HasStateSummary(ctx, r), "Should have saved the state summary") + // Should have not been saved in DB. + require.Equal(t, false, beaconDB.HasState(ctx, r)) +} + +func TestSaveState_NoSaveNotEpochBoundary(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch-1)) + r := [32]byte{'A'} + b := util.NewBeaconBlock() + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + gRoot, err := b.Block.HashTreeRoot() + require.NoError(t, err) + require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot)) + require.NoError(t, service.SaveState(ctx, r, beaconState)) + + // Should only save state summary. + assert.Equal(t, false, service.beaconDB.HasState(ctx, r), "Should not have saved the state") + assert.Equal(t, true, service.beaconDB.HasStateSummary(ctx, r), "Should have saved the state summary") + require.LogsDoNotContain(t, hook, "Saved full state on epoch boundary") + // Should have not been saved in DB. + require.Equal(t, false, beaconDB.HasState(ctx, r)) +} + +func TestSaveState_CanSaveHotStateToDB(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + service.EnableSaveHotStateToDB(ctx) + beaconState, _ := util.DeterministicGenesisState(t, 32) + require.NoError(t, beaconState.SetSlot(defaultHotStateDBInterval)) + + r := [32]byte{'A'} + require.NoError(t, service.saveStateByRoot(ctx, r, beaconState)) + + require.LogsContain(t, hook, "Saving hot state to DB") + // Should have saved in DB. + require.Equal(t, true, beaconDB.HasState(ctx, r)) +} + +func TestEnableSaveHotStateToDB_Enabled(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + + service.EnableSaveHotStateToDB(ctx) + require.LogsContain(t, hook, "Entering mode to save hot states in DB") + require.Equal(t, true, service.saveHotStateDB.enabled) +} + +func TestEnableSaveHotStateToDB_AlreadyEnabled(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + service.saveHotStateDB.enabled = true + service.EnableSaveHotStateToDB(ctx) + require.LogsDoNotContain(t, hook, "Entering mode to save hot states in DB") + require.Equal(t, true, service.saveHotStateDB.enabled) +} + +func TestEnableSaveHotStateToDB_Disabled(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + service.saveHotStateDB.enabled = true + b := util.NewBeaconBlock() + require.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b))) + r, err := b.Block.HashTreeRoot() + require.NoError(t, err) + service.saveHotStateDB.savedStateRoots = [][32]byte{r} + require.NoError(t, service.DisableSaveHotStateToDB(ctx)) + require.LogsContain(t, hook, "Exiting mode to save hot states in DB") + require.Equal(t, false, service.saveHotStateDB.enabled) + require.Equal(t, 0, len(service.saveHotStateDB.savedStateRoots)) +} + +func TestEnableSaveHotStateToDB_AlreadyDisabled(t *testing.T) { + hook := logTest.NewGlobal() + ctx := context.Background() + beaconDB := testDB.SetupDB(t) + service := New(beaconDB) + require.NoError(t, service.DisableSaveHotStateToDB(ctx)) + require.LogsDoNotContain(t, hook, "Exiting mode to save hot states in DB") + require.Equal(t, false, service.saveHotStateDB.enabled) +} diff --git a/beacon-chain/state-proto/stateutil/BUILD.bazel b/beacon-chain/state-proto/stateutil/BUILD.bazel new file mode 100644 index 0000000000..ebf3950f37 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/BUILD.bazel @@ -0,0 +1,101 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "block_header_root.go", + "eth1_root.go", + "field_root_attestation.go", + "field_root_eth1.go", + "field_root_validator.go", + "field_root_vector.go", + "participation_bit_root.go", + "pending_attestation_root.go", + "reference.go", + "state_hasher.go", + "sync_committee.root.go", + "trie_helpers.go", + "validator_map_handler.go", + "validator_root.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil", + visibility = [ + "//beacon-chain:__subpackages__", + "//proto/migration:__subpackages__", + "//proto/prysm/v1alpha1:__subpackages__", + "//proto/testing:__subpackages__", + "//slasher:__subpackages__", + "//testing:__subpackages__", + "//testing/fuzz:__pkg__", + "//tools/blocktree:__pkg__", + "//tools/pcli:__pkg__", + "//validator/client:__pkg__", + ], + deps = [ + "//beacon-chain/core/transition/stateutils:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/trie:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//math:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "@com_github_dgraph_io_ristretto//:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@io_opencensus_go//trace:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "benchmark_test.go", + "field_root_test.go", + "reference_bench_test.go", + "state_root_test.go", + "stateutil_test.go", + "trie_helpers_test.go", + "validator_root_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//config/features:go_default_library", + "//config/params:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/interop:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + ], +) + +go_test( + name = "go_benchmark_test", + size = "medium", + srcs = ["benchmark_test.go"], + args = [ + "-test.bench=.", + "-test.benchmem", + "-test.v", + ], + local = True, + tags = [ + "benchmark", + "no-cache", + ], + deps = [ + "//beacon-chain/state-proto/stateutil:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + ], +) diff --git a/beacon-chain/state-proto/stateutil/benchmark_test.go b/beacon-chain/state-proto/stateutil/benchmark_test.go new file mode 100644 index 0000000000..90a187d08c --- /dev/null +++ b/beacon-chain/state-proto/stateutil/benchmark_test.go @@ -0,0 +1,30 @@ +package stateutil_test + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func BenchmarkMerkleize_Buffered(b *testing.B) { + roots := make([][32]byte, 8192) + for i := 0; i < 8192; i++ { + roots[0] = [32]byte{byte(i)} + } + + newMerkleize := func(chunks [][32]byte, count uint64, limit uint64) ([32]byte, error) { + leafIndexer := func(i uint64) []byte { + return chunks[i][:] + } + return ssz.Merkleize(ssz.NewHasherFunc(hash.CustomSHA256Hasher()), count, limit, leafIndexer), nil + } + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + _, err := newMerkleize(roots, 8192, 8192) + require.NoError(b, err) + } +} diff --git a/beacon-chain/state-proto/stateutil/block_header_root.go b/beacon-chain/state-proto/stateutil/block_header_root.go new file mode 100644 index 0000000000..4f23c3131a --- /dev/null +++ b/beacon-chain/state-proto/stateutil/block_header_root.go @@ -0,0 +1,34 @@ +package stateutil + +import ( + "encoding/binary" + + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// BlockHeaderRoot computes the HashTreeRoot Merkleization of +// a BeaconBlockHeader struct according to the Ethereum +// Simple Serialize specification. +func BlockHeaderRoot(header *ethpb.BeaconBlockHeader) ([32]byte, error) { + fieldRoots := make([][]byte, 5) + if header != nil { + headerSlotBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(headerSlotBuf, uint64(header.Slot)) + headerSlotRoot := bytesutil.ToBytes32(headerSlotBuf) + fieldRoots[0] = headerSlotRoot[:] + proposerIdxBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(proposerIdxBuf, uint64(header.ProposerIndex)) + proposerIndexRoot := bytesutil.ToBytes32(proposerIdxBuf) + fieldRoots[1] = proposerIndexRoot[:] + parentRoot := bytesutil.ToBytes32(header.ParentRoot) + fieldRoots[2] = parentRoot[:] + stateRoot := bytesutil.ToBytes32(header.StateRoot) + fieldRoots[3] = stateRoot[:] + bodyRoot := bytesutil.ToBytes32(header.BodyRoot) + fieldRoots[4] = bodyRoot[:] + } + return ssz.BitwiseMerkleize(hash.CustomSHA256Hasher(), fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) +} diff --git a/beacon-chain/state-proto/stateutil/eth1_root.go b/beacon-chain/state-proto/stateutil/eth1_root.go new file mode 100644 index 0000000000..9a0c015abd --- /dev/null +++ b/beacon-chain/state-proto/stateutil/eth1_root.go @@ -0,0 +1,116 @@ +package stateutil + +import ( + "bytes" + "encoding/binary" + + "github.com/pkg/errors" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// eth1DataEncKey returns the encoded key in bytes of input `eth1Data`, +// the returned key bytes can be used for caching purposes. +func eth1DataEncKey(eth1Data *ethpb.Eth1Data) []byte { + enc := make([]byte, 0, 96) + if eth1Data != nil { + if len(eth1Data.DepositRoot) > 0 { + depRoot := bytesutil.ToBytes32(eth1Data.DepositRoot) + enc = append(enc, depRoot[:]...) + } + eth1DataCountBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(eth1DataCountBuf, eth1Data.DepositCount) + eth1CountRoot := bytesutil.ToBytes32(eth1DataCountBuf) + enc = append(enc, eth1CountRoot[:]...) + if len(eth1Data.BlockHash) > 0 { + blockHash := bytesutil.ToBytes32(eth1Data.BlockHash) + enc = append(enc, blockHash[:]...) + } + } + return enc +} + +// Eth1DataRootWithHasher returns the hash tree root of input `eth1Data`. +func Eth1DataRootWithHasher(hasher ssz.HashFn, eth1Data *ethpb.Eth1Data) ([32]byte, error) { + if eth1Data == nil { + return [32]byte{}, errors.New("nil eth1 data") + } + + fieldRoots := make([][]byte, 3) + for i := 0; i < len(fieldRoots); i++ { + fieldRoots[i] = make([]byte, 32) + } + if len(eth1Data.DepositRoot) > 0 { + depRoot := bytesutil.ToBytes32(eth1Data.DepositRoot) + fieldRoots[0] = depRoot[:] + } + eth1DataCountBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(eth1DataCountBuf, eth1Data.DepositCount) + eth1CountRoot := bytesutil.ToBytes32(eth1DataCountBuf) + fieldRoots[1] = eth1CountRoot[:] + if len(eth1Data.BlockHash) > 0 { + blockHash := bytesutil.ToBytes32(eth1Data.BlockHash) + fieldRoots[2] = blockHash[:] + } + root, err := ssz.BitwiseMerkleize(hasher, fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) + if err != nil { + return [32]byte{}, err + } + return root, nil +} + +// Eth1DatasEncKey returns the encoded key in bytes of input `eth1Data`s, +// the returned key bytes can be used for caching purposes. +func Eth1DatasEncKey(eth1Datas []*ethpb.Eth1Data) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + enc := make([]byte, len(eth1Datas)*32) + for i := 0; i < len(eth1Datas); i++ { + eth1, err := Eth1DataRootWithHasher(hasher, eth1Datas[i]) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute eth1data merkleization") + } + copy(enc[(i*32):(i+1)*32], eth1[:]) + } + hashKey := hash.FastSum256(enc) + return hashKey, nil +} + +// Eth1DatasRoot returns the hash tree root of input `eth1Datas`. +func Eth1DatasRoot(eth1Datas []*ethpb.Eth1Data) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + eth1VotesRoots := make([][]byte, 0) + for i := 0; i < len(eth1Datas); i++ { + eth1, err := Eth1DataRootWithHasher(hasher, eth1Datas[i]) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute eth1data merkleization") + } + eth1VotesRoots = append(eth1VotesRoots, eth1[:]) + } + eth1Chunks, err := ssz.Pack(eth1VotesRoots) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not chunk eth1 votes roots") + } + + eth1VotesRootsRoot, err := ssz.BitwiseMerkleize( + hasher, + eth1Chunks, + uint64(len(eth1Chunks)), + fieldparams.Eth1DataVotesLength, + ) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute eth1data votes merkleization") + } + eth1VotesRootBuf := new(bytes.Buffer) + if err := binary.Write(eth1VotesRootBuf, binary.LittleEndian, uint64(len(eth1Datas))); err != nil { + return [32]byte{}, errors.Wrap(err, "could not marshal eth1data votes length") + } + // We need to mix in the length of the slice. + eth1VotesRootBufRoot := make([]byte, 32) + copy(eth1VotesRootBufRoot, eth1VotesRootBuf.Bytes()) + root := ssz.MixInLength(eth1VotesRootsRoot, eth1VotesRootBufRoot) + + return root, nil +} diff --git a/beacon-chain/state-proto/stateutil/field_root_attestation.go b/beacon-chain/state-proto/stateutil/field_root_attestation.go new file mode 100644 index 0000000000..b6dbb6f136 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/field_root_attestation.go @@ -0,0 +1,83 @@ +package stateutil + +import ( + "bytes" + "encoding/binary" + "fmt" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/config/features" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// RootsArrayHashTreeRoot computes the Merkle root of arrays of 32-byte hashes, such as [64][32]byte +// according to the Simple Serialize specification of Ethereum. +func RootsArrayHashTreeRoot(vals [][]byte, length uint64, fieldName string) ([32]byte, error) { + if features.Get().EnableSSZCache { + return CachedHasher.arraysRoot(vals, length, fieldName) + } + return NocachedHasher.arraysRoot(vals, length, fieldName) +} + +func (h *stateRootHasher) epochAttestationsRoot(atts []*ethpb.PendingAttestation) ([32]byte, error) { + max := uint64(fieldparams.CurrentEpochAttestationsLength) + if uint64(len(atts)) > max { + return [32]byte{}, fmt.Errorf("epoch attestation exceeds max length %d", max) + } + + hasher := hash.CustomSHA256Hasher() + roots := make([][]byte, len(atts)) + for i := 0; i < len(atts); i++ { + pendingRoot, err := h.pendingAttestationRoot(hasher, atts[i]) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not attestation merkleization") + } + roots[i] = pendingRoot[:] + } + + attsRootsRoot, err := ssz.BitwiseMerkleize( + hasher, + roots, + uint64(len(roots)), + fieldparams.CurrentEpochAttestationsLength, + ) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute epoch attestations merkleization") + } + attsLenBuf := new(bytes.Buffer) + if err := binary.Write(attsLenBuf, binary.LittleEndian, uint64(len(atts))); err != nil { + return [32]byte{}, errors.Wrap(err, "could not marshal epoch attestations length") + } + // We need to mix in the length of the slice. + attsLenRoot := make([]byte, 32) + copy(attsLenRoot, attsLenBuf.Bytes()) + res := ssz.MixInLength(attsRootsRoot, attsLenRoot) + return res, nil +} + +func (h *stateRootHasher) pendingAttestationRoot(hasher ssz.HashFn, att *ethpb.PendingAttestation) ([32]byte, error) { + if att == nil { + return [32]byte{}, errors.New("nil pending attestation") + } + // Marshal attestation to determine if it exists in the cache. + enc := pendingAttEncKey(att) + + // Check if it exists in cache: + if h.rootsCache != nil { + if found, ok := h.rootsCache.Get(string(enc)); found != nil && ok { + return found.([32]byte), nil + } + } + + res, err := PendingAttRootWithHasher(hasher, att) + if err != nil { + return [32]byte{}, err + } + if h.rootsCache != nil { + h.rootsCache.Set(string(enc), res, 32) + } + return res, nil +} diff --git a/beacon-chain/state-proto/stateutil/field_root_eth1.go b/beacon-chain/state-proto/stateutil/field_root_eth1.go new file mode 100644 index 0000000000..de536fb23e --- /dev/null +++ b/beacon-chain/state-proto/stateutil/field_root_eth1.go @@ -0,0 +1,58 @@ +package stateutil + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// Eth1Root computes the HashTreeRoot Merkleization of +// a BeaconBlockHeader struct according to the eth2 +// Simple Serialize specification. +func Eth1Root(hasher ssz.HashFn, eth1Data *ethpb.Eth1Data) ([32]byte, error) { + if eth1Data == nil { + return [32]byte{}, errors.New("nil eth1 data") + } + + enc := eth1DataEncKey(eth1Data) + if features.Get().EnableSSZCache { + if found, ok := CachedHasher.rootsCache.Get(string(enc)); ok && found != nil { + return found.([32]byte), nil + } + } + + root, err := Eth1DataRootWithHasher(hasher, eth1Data) + if err != nil { + return [32]byte{}, err + } + + if features.Get().EnableSSZCache { + CachedHasher.rootsCache.Set(string(enc), root, 32) + } + return root, nil +} + +// eth1DataVotesRoot computes the HashTreeRoot Merkleization of +// a list of Eth1Data structs according to the eth2 +// Simple Serialize specification. +func eth1DataVotesRoot(eth1DataVotes []*ethpb.Eth1Data) ([32]byte, error) { + hashKey, err := Eth1DatasEncKey(eth1DataVotes) + if err != nil { + return [32]byte{}, err + } + + if features.Get().EnableSSZCache { + if found, ok := CachedHasher.rootsCache.Get(string(hashKey[:])); ok && found != nil { + return found.([32]byte), nil + } + } + root, err := Eth1DatasRoot(eth1DataVotes) + if err != nil { + return [32]byte{}, err + } + if features.Get().EnableSSZCache { + CachedHasher.rootsCache.Set(string(hashKey[:]), root, 32) + } + return root, nil +} diff --git a/beacon-chain/state-proto/stateutil/field_root_test.go b/beacon-chain/state-proto/stateutil/field_root_test.go new file mode 100644 index 0000000000..3d74deb89e --- /dev/null +++ b/beacon-chain/state-proto/stateutil/field_root_test.go @@ -0,0 +1,23 @@ +package stateutil + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/assert" +) + +func TestArraysTreeRoot_OnlyPowerOf2(t *testing.T) { + _, err := NocachedHasher.arraysRoot([][]byte{}, 1, "testing") + assert.NoError(t, err) + _, err = NocachedHasher.arraysRoot([][]byte{}, 4, "testing") + assert.NoError(t, err) + _, err = NocachedHasher.arraysRoot([][]byte{}, 8, "testing") + assert.NoError(t, err) + _, err = NocachedHasher.arraysRoot([][]byte{}, 10, "testing") + assert.ErrorContains(t, "hash layer is a non power of 2", err) +} + +func TestArraysTreeRoot_ZeroLength(t *testing.T) { + _, err := NocachedHasher.arraysRoot([][]byte{}, 0, "testing") + assert.ErrorContains(t, "zero leaves provided", err) +} diff --git a/beacon-chain/state-proto/stateutil/field_root_validator.go b/beacon-chain/state-proto/stateutil/field_root_validator.go new file mode 100644 index 0000000000..a2283ebbde --- /dev/null +++ b/beacon-chain/state-proto/stateutil/field_root_validator.go @@ -0,0 +1,88 @@ +package stateutil + +import ( + "bytes" + "encoding/binary" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/config/features" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorRegistryRoot computes the HashTreeRoot Merkleization of +// a list of validator structs according to the Ethereum +// Simple Serialize specification. +func ValidatorRegistryRoot(vals []*ethpb.Validator) ([32]byte, error) { + if features.Get().EnableSSZCache { + return CachedHasher.validatorRegistryRoot(vals) + } + return NocachedHasher.validatorRegistryRoot(vals) +} + +func (h *stateRootHasher) validatorRegistryRoot(validators []*ethpb.Validator) ([32]byte, error) { + hashKeyElements := make([]byte, len(validators)*32) + roots := make([][32]byte, len(validators)) + emptyKey := hash.FastSum256(hashKeyElements) + hasher := hash.CustomSHA256Hasher() + bytesProcessed := 0 + for i := 0; i < len(validators); i++ { + val, err := h.validatorRoot(hasher, validators[i]) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute validators merkleization") + } + copy(hashKeyElements[bytesProcessed:bytesProcessed+32], val[:]) + roots[i] = val + bytesProcessed += 32 + } + + hashKey := hash.FastSum256(hashKeyElements) + if hashKey != emptyKey && h.rootsCache != nil { + if found, ok := h.rootsCache.Get(string(hashKey[:])); found != nil && ok { + return found.([32]byte), nil + } + } + + validatorsRootsRoot, err := ssz.BitwiseMerkleizeArrays(hasher, roots, uint64(len(roots)), fieldparams.ValidatorRegistryLimit) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute validator registry merkleization") + } + validatorsRootsBuf := new(bytes.Buffer) + if err := binary.Write(validatorsRootsBuf, binary.LittleEndian, uint64(len(validators))); err != nil { + return [32]byte{}, errors.Wrap(err, "could not marshal validator registry length") + } + // We need to mix in the length of the slice. + var validatorsRootsBufRoot [32]byte + copy(validatorsRootsBufRoot[:], validatorsRootsBuf.Bytes()) + res := ssz.MixInLength(validatorsRootsRoot, validatorsRootsBufRoot[:]) + if hashKey != emptyKey && h.rootsCache != nil { + h.rootsCache.Set(string(hashKey[:]), res, 32) + } + return res, nil +} + +func (h *stateRootHasher) validatorRoot(hasher ssz.HashFn, validator *ethpb.Validator) ([32]byte, error) { + if validator == nil { + return [32]byte{}, errors.New("nil validator") + } + + enc := validatorEncKey(validator) + // Check if it exists in cache: + if h.rootsCache != nil { + if found, ok := h.rootsCache.Get(string(enc)); found != nil && ok { + return found.([32]byte), nil + } + } + + valRoot, err := ValidatorRootWithHasher(hasher, validator) + if err != nil { + return [32]byte{}, err + } + + if h.rootsCache != nil { + h.rootsCache.Set(string(enc), valRoot, 32) + } + return valRoot, nil +} diff --git a/beacon-chain/state-proto/stateutil/field_root_vector.go b/beacon-chain/state-proto/stateutil/field_root_vector.go new file mode 100644 index 0000000000..1e9df49d2c --- /dev/null +++ b/beacon-chain/state-proto/stateutil/field_root_vector.go @@ -0,0 +1,156 @@ +package stateutil + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" +) + +func (h *stateRootHasher) arraysRoot(input [][]byte, length uint64, fieldName string) ([32]byte, error) { + lock.Lock() + defer lock.Unlock() + hashFunc := hash.CustomSHA256Hasher() + if _, ok := layersCache[fieldName]; !ok && h.rootsCache != nil { + depth := ssz.Depth(length) + layersCache[fieldName] = make([][][32]byte, depth+1) + } + + leaves := make([][32]byte, length) + for i, chunk := range input { + copy(leaves[i][:], chunk) + } + bytesProcessed := 0 + changedIndices := make([]int, 0) + prevLeaves, ok := leavesCache[fieldName] + if len(prevLeaves) == 0 || h.rootsCache == nil { + prevLeaves = leaves + } + // Exit early if our previous leaves length don't match with the current set. + // This should never happen but better to be defensive here. + if len(prevLeaves) != len(leaves) { + res, err := h.merkleizeWithCache(leaves, length, fieldName, hashFunc) + if err != nil { + return [32]byte{}, err + } + if h.rootsCache != nil { + leavesCache[fieldName] = leaves + } + return res, nil + } + for i := 0; i < len(leaves); i++ { + // We check if any items changed since the roots were last recomputed. + notEqual := leaves[i] != prevLeaves[i] + if ok && h.rootsCache != nil && notEqual { + changedIndices = append(changedIndices, i) + } + bytesProcessed += 32 + } + if len(changedIndices) > 0 && h.rootsCache != nil { + var rt [32]byte + var err error + // If indices did change since last computation, we only recompute + // the modified branches in the cached Merkle tree for this state field. + chunks := leaves + + // We need to ensure we recompute indices of the Merkle tree which + // changed in-between calls to this function. This check adds an offset + // to the recomputed indices to ensure we do so evenly. + maxChangedIndex := changedIndices[len(changedIndices)-1] + if maxChangedIndex+2 == len(chunks) && maxChangedIndex%2 != 0 { + changedIndices = append(changedIndices, maxChangedIndex+1) + } + for i := 0; i < len(changedIndices); i++ { + rt, err = recomputeRoot(changedIndices[i], chunks, fieldName, hashFunc) + if err != nil { + return [32]byte{}, err + } + } + leavesCache[fieldName] = chunks + return rt, nil + } + + res, err := h.merkleizeWithCache(leaves, length, fieldName, hashFunc) + if err != nil { + return [32]byte{}, err + } + if h.rootsCache != nil { + leavesCache[fieldName] = leaves + } + return res, nil +} + +func recomputeRoot(idx int, chunks [][32]byte, fieldName string, hasher func([]byte) [32]byte) ([32]byte, error) { + items, ok := layersCache[fieldName] + if !ok { + return [32]byte{}, errors.New("could not recompute root as there was no cache found") + } + if items == nil { + return [32]byte{}, errors.New("could not recompute root as there were no items found in the layers cache") + } + layers := items + root := chunks[idx] + layers[0] = chunks + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + // Using information about the index which changed, idx, we recompute + // only its branch up the tree. + currentIndex := idx + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := [32]byte{} + if layers[i] != nil && len(layers[i]) != 0 && neighborIdx < len(layers[i]) { + neighbor = layers[i][neighborIdx] + } + if isLeft { + parentHash := hasher(append(root[:], neighbor[:]...)) + root = parentHash + } else { + parentHash := hasher(append(neighbor[:], root[:]...)) + root = parentHash + } + parentIdx := currentIndex / 2 + // Update the cached layers at the parent index. + if len(layers[i+1]) == 0 { + layers[i+1] = append(layers[i+1], root) + } else { + layers[i+1][parentIdx] = root + } + currentIndex = parentIdx + } + layersCache[fieldName] = layers + // If there is only a single leaf, we return it (the identity element). + if len(layers[0]) == 1 { + return layers[0][0], nil + } + return root, nil +} + +func (h *stateRootHasher) merkleizeWithCache(leaves [][32]byte, length uint64, + fieldName string, hasher func([]byte) [32]byte) ([32]byte, error) { + if len(leaves) == 0 { + return [32]byte{}, errors.New("zero leaves provided") + } + if len(leaves) == 1 { + return leaves[0], nil + } + hashLayer := leaves + layers := make([][][32]byte, ssz.Depth(length)+1) + if items, ok := layersCache[fieldName]; ok && h.rootsCache != nil { + if len(items[0]) == len(leaves) { + layers = items + } + } + layers[0] = hashLayer + var err error + layers, hashLayer, err = MerkleizeTrieLeaves(layers, hashLayer, hasher) + if err != nil { + return [32]byte{}, err + } + root := hashLayer[0] + if h.rootsCache != nil { + layersCache[fieldName] = layers + } + return root, nil +} diff --git a/beacon-chain/state-proto/stateutil/participation_bit_root.go b/beacon-chain/state-proto/stateutil/participation_bit_root.go new file mode 100644 index 0000000000..4849dbf300 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/participation_bit_root.go @@ -0,0 +1,69 @@ +package stateutil + +import ( + "encoding/binary" + + "github.com/pkg/errors" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" +) + +// ParticipationBitsRoot computes the HashTreeRoot merkleization of +// participation roots. +func ParticipationBitsRoot(bits []byte) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + chunkedRoots, err := packParticipationBits(bits) + if err != nil { + return [32]byte{}, err + } + + limit := (uint64(fieldparams.ValidatorRegistryLimit + 31)) / 32 + if limit == 0 { + if len(bits) == 0 { + limit = 1 + } else { + limit = uint64(len(bits)) + } + } + + bytesRoot, err := ssz.BitwiseMerkleize(hasher, chunkedRoots, uint64(len(chunkedRoots)), limit) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute merkleization") + } + + bytesRootBufRoot := make([]byte, 32) + binary.LittleEndian.PutUint64(bytesRootBufRoot[:8], uint64(len(bits))) + return ssz.MixInLength(bytesRoot, bytesRootBufRoot), nil +} + +// packParticipationBits into chunks. It'll pad the last chunk with zero bytes if +// it does not have length bytes per chunk. +func packParticipationBits(bytes []byte) ([][]byte, error) { + numItems := len(bytes) + var chunks [][]byte + for i := 0; i < numItems; i += 32 { + j := i + 32 + // We create our upper bound index of the chunk, if it is greater than numItems, + // we set it as numItems itself. + if j > numItems { + j = numItems + } + // We create chunks from the list of items based on the + // indices determined above. + chunks = append(chunks, bytes[i:j]) + } + + if len(chunks) == 0 { + return chunks, nil + } + + // Right-pad the last chunk with zero bytes if it does not + // have length bytes. + lastChunk := chunks[len(chunks)-1] + for len(lastChunk) < 32 { + lastChunk = append(lastChunk, 0) + } + chunks[len(chunks)-1] = lastChunk + return chunks, nil +} diff --git a/beacon-chain/state-proto/stateutil/pending_attestation_root.go b/beacon-chain/state-proto/stateutil/pending_attestation_root.go new file mode 100644 index 0000000000..8503be51fc --- /dev/null +++ b/beacon-chain/state-proto/stateutil/pending_attestation_root.go @@ -0,0 +1,138 @@ +package stateutil + +import ( + "encoding/binary" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// PendingAttRootWithHasher describes a method from which the hash tree root +// of a pending attestation is returned. +func PendingAttRootWithHasher(hasher ssz.HashFn, att *ethpb.PendingAttestation) ([32]byte, error) { + var fieldRoots [][32]byte + + // Bitfield. + aggregationRoot, err := ssz.BitlistRoot(hasher, att.AggregationBits, params.BeaconConfig().MaxValidatorsPerCommittee) + if err != nil { + return [32]byte{}, err + } + // Attestation data. + attDataRoot, err := attDataRootWithHasher(hasher, att.Data) + if err != nil { + return [32]byte{}, err + } + inclusionBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(inclusionBuf, uint64(att.InclusionDelay)) + // Inclusion delay. + inclusionRoot := bytesutil.ToBytes32(inclusionBuf) + + proposerBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(proposerBuf, uint64(att.ProposerIndex)) + // Proposer index. + proposerRoot := bytesutil.ToBytes32(proposerBuf) + + fieldRoots = [][32]byte{aggregationRoot, attDataRoot, inclusionRoot, proposerRoot} + + return ssz.BitwiseMerkleizeArrays(hasher, fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) +} + +// pendingAttEncKey returns the encoded key in bytes of input `pendingAttestation`, +// the returned key bytes can be used for caching purposes. +func pendingAttEncKey(att *ethpb.PendingAttestation) []byte { + enc := make([]byte, 2192) + + if att != nil { + copy(enc[0:2048], att.AggregationBits) + + inclusionBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(inclusionBuf, uint64(att.InclusionDelay)) + copy(enc[2048:2056], inclusionBuf) + + attDataBuf := marshalAttData(att.Data) + copy(enc[2056:2184], attDataBuf) + + proposerBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(proposerBuf, uint64(att.ProposerIndex)) + copy(enc[2184:2192], proposerBuf) + } + + return enc +} + +func attDataRootWithHasher(hasher ssz.HashFn, data *ethpb.AttestationData) ([32]byte, error) { + fieldRoots := make([][]byte, 5) + + if data != nil { + // Slot. + slotBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(slotBuf, uint64(data.Slot)) + slotRoot := bytesutil.ToBytes32(slotBuf) + fieldRoots[0] = slotRoot[:] + + // CommitteeIndex. + indexBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(indexBuf, uint64(data.CommitteeIndex)) + interRoot := bytesutil.ToBytes32(indexBuf) + fieldRoots[1] = interRoot[:] + + // Beacon block root. + blockRoot := bytesutil.ToBytes32(data.BeaconBlockRoot) + fieldRoots[2] = blockRoot[:] + + // Source + sourceRoot, err := ssz.CheckpointRoot(hasher, data.Source) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute source checkpoint merkleization") + } + fieldRoots[3] = sourceRoot[:] + + // Target + targetRoot, err := ssz.CheckpointRoot(hasher, data.Target) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute target checkpoint merkleization") + } + fieldRoots[4] = targetRoot[:] + } + + return ssz.BitwiseMerkleize(hasher, fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) +} + +func marshalAttData(data *ethpb.AttestationData) []byte { + enc := make([]byte, 128) + + if data != nil { + // Slot. + slotBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(slotBuf, uint64(data.Slot)) + copy(enc[0:8], slotBuf) + + // Committee index. + indexBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(indexBuf, uint64(data.CommitteeIndex)) + copy(enc[8:16], indexBuf) + + copy(enc[16:48], data.BeaconBlockRoot) + + // Source epoch and root. + if data.Source != nil { + sourceEpochBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(sourceEpochBuf, uint64(data.Source.Epoch)) + copy(enc[48:56], sourceEpochBuf) + copy(enc[56:88], data.Source.Root) + } + + // Target. + if data.Target != nil { + targetEpochBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(targetEpochBuf, uint64(data.Target.Epoch)) + copy(enc[88:96], targetEpochBuf) + copy(enc[96:128], data.Target.Root) + } + } + + return enc +} diff --git a/beacon-chain/state-proto/stateutil/reference.go b/beacon-chain/state-proto/stateutil/reference.go new file mode 100644 index 0000000000..984efb5c8b --- /dev/null +++ b/beacon-chain/state-proto/stateutil/reference.go @@ -0,0 +1,45 @@ +package stateutil + +import "sync" + +// Reference structs are shared across BeaconState copies to understand when the state must use +// copy-on-write for shared fields or may modify a field in place when it holds the only reference +// to the field value. References are tracked in a map of fieldIndex -> *reference. Whenever a state +// releases their reference to the field value, they must decrement the refs. Likewise whenever a +// copy is performed then the state must increment the refs counter. +type Reference struct { + refs uint + lock sync.RWMutex +} + +// NewRef initializes the Reference struct. +func NewRef(refs uint) *Reference { + return &Reference{ + refs: refs, + } +} + +// Refs returns the reference number. +func (r *Reference) Refs() uint { + r.lock.RLock() + defer r.lock.RUnlock() + return r.refs +} + +// AddRef adds 1 to the reference number. +func (r *Reference) AddRef() { + r.lock.Lock() + r.refs++ + r.lock.Unlock() +} + +// MinusRef subtracts 1 to the reference number. +func (r *Reference) MinusRef() { + r.lock.Lock() + // Do not reduce further if object + // already has 0 reference to prevent underflow. + if r.refs > 0 { + r.refs-- + } + r.lock.Unlock() +} diff --git a/beacon-chain/state-proto/stateutil/reference_bench_test.go b/beacon-chain/state-proto/stateutil/reference_bench_test.go new file mode 100644 index 0000000000..1dcad8e012 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/reference_bench_test.go @@ -0,0 +1,15 @@ +package stateutil + +import ( + "math" + "testing" +) + +func BenchmarkReference_MinusRef(b *testing.B) { + ref := &Reference{ + refs: math.MaxUint64, + } + for i := 0; i < b.N; i++ { + ref.MinusRef() + } +} diff --git a/beacon-chain/state-proto/stateutil/state_hasher.go b/beacon-chain/state-proto/stateutil/state_hasher.go new file mode 100644 index 0000000000..8c901069d6 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/state_hasher.go @@ -0,0 +1,548 @@ +package stateutil + +import ( + "context" + "encoding/binary" + "sync" + + "github.com/dgraph-io/ristretto" + "github.com/pkg/errors" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "go.opencensus.io/trace" +) + +var ( + // Set the map size as equal to that of the latest state field count. + leavesCache = make(map[string][][32]byte, params.BeaconConfig().BeaconStateMergeFieldCount) + layersCache = make(map[string][][][32]byte, params.BeaconConfig().BeaconStateMergeFieldCount) + lock sync.RWMutex +) + +const cacheSize = 100000 + +// NocachedHasher references a hasher that will not utilize a cache. +var NocachedHasher *stateRootHasher + +// CachedHasher references a hasher that will utilize a roots cache. +var CachedHasher *stateRootHasher + +func init() { + rootsCache, err := ristretto.NewCache(&ristretto.Config{ + NumCounters: cacheSize, // number of keys to track frequency of (1M). + MaxCost: 1 << 22, // maximum cost of cache (3MB). + // 100,000 roots will take up approximately 3 MB in memory. + BufferItems: 64, // number of keys per Get buffer. + }) + if err != nil { + panic(err) + } + // Temporarily disable roots cache until cache issues can be resolved. + CachedHasher = &stateRootHasher{rootsCache: rootsCache} + NocachedHasher = &stateRootHasher{} +} + +// stateRootHasher defines an object through which we can +// hash the different fields in the state with a few cached layers. +type stateRootHasher struct { + rootsCache *ristretto.Cache +} + +// ComputeFieldRootsWithHasherPhase0 hashes the provided phase 0 state and returns its respective field roots. +func (h *stateRootHasher) ComputeFieldRootsWithHasherPhase0(ctx context.Context, state *ethpb.BeaconState) ([][]byte, error) { + _, span := trace.StartSpan(ctx, "hasher.ComputeFieldRootsWithHasherPhase0") + defer span.End() + + if state == nil { + return nil, errors.New("nil state") + } + hasher := hash.CustomSHA256Hasher() + fieldRoots := make([][]byte, params.BeaconConfig().BeaconStateFieldCount) + + // Genesis time root. + genesisRoot := ssz.Uint64Root(state.GenesisTime) + fieldRoots[0] = genesisRoot[:] + + // Genesis validator root. + r := [32]byte{} + copy(r[:], state.GenesisValidatorsRoot) + fieldRoots[1] = r[:] + + // Slot root. + slotRoot := ssz.Uint64Root(uint64(state.Slot)) + fieldRoots[2] = slotRoot[:] + + // Fork data structure root. + forkHashTreeRoot, err := ssz.ForkRoot(state.Fork) + if err != nil { + return nil, errors.Wrap(err, "could not compute fork merkleization") + } + fieldRoots[3] = forkHashTreeRoot[:] + + // BeaconBlockHeader data structure root. + headerHashTreeRoot, err := BlockHeaderRoot(state.LatestBlockHeader) + if err != nil { + return nil, errors.Wrap(err, "could not compute block header merkleization") + } + fieldRoots[4] = headerHashTreeRoot[:] + + // BlockRoots array root. + blockRootsRoot, err := h.arraysRoot(state.BlockRoots, fieldparams.BlockRootsLength, "BlockRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute block roots merkleization") + } + fieldRoots[5] = blockRootsRoot[:] + + // StateRoots array root. + stateRootsRoot, err := h.arraysRoot(state.StateRoots, fieldparams.StateRootsLength, "StateRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute state roots merkleization") + } + fieldRoots[6] = stateRootsRoot[:] + + // HistoricalRoots slice root. + historicalRootsRt, err := ssz.ByteArrayRootWithLimit(state.HistoricalRoots, fieldparams.HistoricalRootsLength) + if err != nil { + return nil, errors.Wrap(err, "could not compute historical roots merkleization") + } + fieldRoots[7] = historicalRootsRt[:] + + // Eth1Data data structure root. + eth1HashTreeRoot, err := Eth1Root(hasher, state.Eth1Data) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data merkleization") + } + fieldRoots[8] = eth1HashTreeRoot[:] + + // Eth1DataVotes slice root. + eth1VotesRoot, err := eth1DataVotesRoot(state.Eth1DataVotes) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data votes merkleization") + } + fieldRoots[9] = eth1VotesRoot[:] + + // Eth1DepositIndex root. + eth1DepositIndexBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(eth1DepositIndexBuf, state.Eth1DepositIndex) + eth1DepositBuf := bytesutil.ToBytes32(eth1DepositIndexBuf) + fieldRoots[10] = eth1DepositBuf[:] + + // Validators slice root. + validatorsRoot, err := h.validatorRegistryRoot(state.Validators) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator registry merkleization") + } + fieldRoots[11] = validatorsRoot[:] + + // Balances slice root. + balancesRoot, err := Uint64ListRootWithRegistryLimit(state.Balances) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator balances merkleization") + } + fieldRoots[12] = balancesRoot[:] + + // RandaoMixes array root. + randaoRootsRoot, err := h.arraysRoot(state.RandaoMixes, fieldparams.RandaoMixesLength, "RandaoMixes") + if err != nil { + return nil, errors.Wrap(err, "could not compute randao roots merkleization") + } + fieldRoots[13] = randaoRootsRoot[:] + + // Slashings array root. + slashingsRootsRoot, err := ssz.SlashingsRoot(state.Slashings) + if err != nil { + return nil, errors.Wrap(err, "could not compute slashings merkleization") + } + fieldRoots[14] = slashingsRootsRoot[:] + + // PreviousEpochAttestations slice root. + prevAttsRoot, err := h.epochAttestationsRoot(state.PreviousEpochAttestations) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous epoch attestations merkleization") + } + fieldRoots[15] = prevAttsRoot[:] + + // CurrentEpochAttestations slice root. + currAttsRoot, err := h.epochAttestationsRoot(state.CurrentEpochAttestations) + if err != nil { + return nil, errors.Wrap(err, "could not compute current epoch attestations merkleization") + } + fieldRoots[16] = currAttsRoot[:] + + // JustificationBits root. + justifiedBitsRoot := bytesutil.ToBytes32(state.JustificationBits) + fieldRoots[17] = justifiedBitsRoot[:] + + // PreviousJustifiedCheckpoint data structure root. + prevCheckRoot, err := ssz.CheckpointRoot(hasher, state.PreviousJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous justified checkpoint merkleization") + } + fieldRoots[18] = prevCheckRoot[:] + + // CurrentJustifiedCheckpoint data structure root. + currJustRoot, err := ssz.CheckpointRoot(hasher, state.CurrentJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute current justified checkpoint merkleization") + } + fieldRoots[19] = currJustRoot[:] + + // FinalizedCheckpoint data structure root. + finalRoot, err := ssz.CheckpointRoot(hasher, state.FinalizedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute finalized checkpoint merkleization") + } + fieldRoots[20] = finalRoot[:] + return fieldRoots, nil +} + +// ComputeFieldRootsWithHasherAltair hashes the provided altair state and returns its respective field roots. +func (h *stateRootHasher) ComputeFieldRootsWithHasherAltair(ctx context.Context, state *ethpb.BeaconStateAltair) ([][]byte, error) { + _, span := trace.StartSpan(ctx, "hasher.ComputeFieldRootsWithHasherAltair") + defer span.End() + + if state == nil { + return nil, errors.New("nil state") + } + hasher := hash.CustomSHA256Hasher() + fieldRoots := make([][]byte, params.BeaconConfig().BeaconStateAltairFieldCount) + + // Genesis time root. + genesisRoot := ssz.Uint64Root(state.GenesisTime) + fieldRoots[0] = genesisRoot[:] + + // Genesis validator root. + r := [32]byte{} + copy(r[:], state.GenesisValidatorsRoot) + fieldRoots[1] = r[:] + + // Slot root. + slotRoot := ssz.Uint64Root(uint64(state.Slot)) + fieldRoots[2] = slotRoot[:] + + // Fork data structure root. + forkHashTreeRoot, err := ssz.ForkRoot(state.Fork) + if err != nil { + return nil, errors.Wrap(err, "could not compute fork merkleization") + } + fieldRoots[3] = forkHashTreeRoot[:] + + // BeaconBlockHeader data structure root. + headerHashTreeRoot, err := BlockHeaderRoot(state.LatestBlockHeader) + if err != nil { + return nil, errors.Wrap(err, "could not compute block header merkleization") + } + fieldRoots[4] = headerHashTreeRoot[:] + + // BlockRoots array root. + blockRootsRoot, err := h.arraysRoot(state.BlockRoots, fieldparams.BlockRootsLength, "BlockRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute block roots merkleization") + } + fieldRoots[5] = blockRootsRoot[:] + + // StateRoots array root. + stateRootsRoot, err := h.arraysRoot(state.StateRoots, fieldparams.StateRootsLength, "StateRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute state roots merkleization") + } + fieldRoots[6] = stateRootsRoot[:] + + // HistoricalRoots slice root. + historicalRootsRt, err := ssz.ByteArrayRootWithLimit(state.HistoricalRoots, fieldparams.HistoricalRootsLength) + if err != nil { + return nil, errors.Wrap(err, "could not compute historical roots merkleization") + } + fieldRoots[7] = historicalRootsRt[:] + + // Eth1Data data structure root. + eth1HashTreeRoot, err := Eth1Root(hasher, state.Eth1Data) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data merkleization") + } + fieldRoots[8] = eth1HashTreeRoot[:] + + // Eth1DataVotes slice root. + eth1VotesRoot, err := eth1DataVotesRoot(state.Eth1DataVotes) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data votes merkleization") + } + fieldRoots[9] = eth1VotesRoot[:] + + // Eth1DepositIndex root. + eth1DepositIndexBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(eth1DepositIndexBuf, state.Eth1DepositIndex) + eth1DepositBuf := bytesutil.ToBytes32(eth1DepositIndexBuf) + fieldRoots[10] = eth1DepositBuf[:] + + // Validators slice root. + validatorsRoot, err := h.validatorRegistryRoot(state.Validators) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator registry merkleization") + } + fieldRoots[11] = validatorsRoot[:] + + // Balances slice root. + balancesRoot, err := Uint64ListRootWithRegistryLimit(state.Balances) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator balances merkleization") + } + fieldRoots[12] = balancesRoot[:] + + // RandaoMixes array root. + randaoRootsRoot, err := h.arraysRoot(state.RandaoMixes, fieldparams.RandaoMixesLength, "RandaoMixes") + if err != nil { + return nil, errors.Wrap(err, "could not compute randao roots merkleization") + } + fieldRoots[13] = randaoRootsRoot[:] + + // Slashings array root. + slashingsRootsRoot, err := ssz.SlashingsRoot(state.Slashings) + if err != nil { + return nil, errors.Wrap(err, "could not compute slashings merkleization") + } + fieldRoots[14] = slashingsRootsRoot[:] + + // PreviousEpochParticipation slice root. + prevParticipationRoot, err := ParticipationBitsRoot(state.PreviousEpochParticipation) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous epoch participation merkleization") + } + fieldRoots[15] = prevParticipationRoot[:] + + // CurrentEpochParticipation slice root. + currParticipationRoot, err := ParticipationBitsRoot(state.CurrentEpochParticipation) + if err != nil { + return nil, errors.Wrap(err, "could not compute current epoch participation merkleization") + } + fieldRoots[16] = currParticipationRoot[:] + + // JustificationBits root. + justifiedBitsRoot := bytesutil.ToBytes32(state.JustificationBits) + fieldRoots[17] = justifiedBitsRoot[:] + + // PreviousJustifiedCheckpoint data structure root. + prevCheckRoot, err := ssz.CheckpointRoot(hasher, state.PreviousJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous justified checkpoint merkleization") + } + fieldRoots[18] = prevCheckRoot[:] + + // CurrentJustifiedCheckpoint data structure root. + currJustRoot, err := ssz.CheckpointRoot(hasher, state.CurrentJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute current justified checkpoint merkleization") + } + fieldRoots[19] = currJustRoot[:] + + // FinalizedCheckpoint data structure root. + finalRoot, err := ssz.CheckpointRoot(hasher, state.FinalizedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute finalized checkpoint merkleization") + } + fieldRoots[20] = finalRoot[:] + + // Inactivity scores root. + inactivityScoresRoot, err := Uint64ListRootWithRegistryLimit(state.InactivityScores) + if err != nil { + return nil, errors.Wrap(err, "could not compute inactivityScoreRoot") + } + fieldRoots[21] = inactivityScoresRoot[:] + + // Current sync committee root. + currentSyncCommitteeRoot, err := SyncCommitteeRoot(state.CurrentSyncCommittee) + if err != nil { + return nil, errors.Wrap(err, "could not compute sync committee merkleization") + } + fieldRoots[22] = currentSyncCommitteeRoot[:] + + // Next sync committee root. + nextSyncCommitteeRoot, err := SyncCommitteeRoot(state.NextSyncCommittee) + if err != nil { + return nil, errors.Wrap(err, "could not compute sync committee merkleization") + } + fieldRoots[23] = nextSyncCommitteeRoot[:] + + return fieldRoots, nil +} + +// ComputeFieldRootsWithHasherMerge hashes the provided merge state and returns its respective field roots. +func (h *stateRootHasher) ComputeFieldRootsWithHasherMerge(ctx context.Context, state *ethpb.BeaconStateMerge) ([][]byte, error) { + _, span := trace.StartSpan(ctx, "hasher.ComputeFieldRootsWithHasherMerge") + defer span.End() + + if state == nil { + return nil, errors.New("nil state") + } + hasher := hash.CustomSHA256Hasher() + fieldRoots := make([][]byte, params.BeaconConfig().BeaconStateMergeFieldCount) + + // Genesis time root. + genesisRoot := ssz.Uint64Root(state.GenesisTime) + fieldRoots[0] = genesisRoot[:] + + // Genesis validator root. + r := [32]byte{} + copy(r[:], state.GenesisValidatorsRoot) + fieldRoots[1] = r[:] + + // Slot root. + slotRoot := ssz.Uint64Root(uint64(state.Slot)) + fieldRoots[2] = slotRoot[:] + + // Fork data structure root. + forkHashTreeRoot, err := ssz.ForkRoot(state.Fork) + if err != nil { + return nil, errors.Wrap(err, "could not compute fork merkleization") + } + fieldRoots[3] = forkHashTreeRoot[:] + + // BeaconBlockHeader data structure root. + headerHashTreeRoot, err := BlockHeaderRoot(state.LatestBlockHeader) + if err != nil { + return nil, errors.Wrap(err, "could not compute block header merkleization") + } + fieldRoots[4] = headerHashTreeRoot[:] + + // BlockRoots array root. + blockRootsRoot, err := h.arraysRoot(state.BlockRoots, fieldparams.BlockRootsLength, "BlockRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute block roots merkleization") + } + fieldRoots[5] = blockRootsRoot[:] + + // StateRoots array root. + stateRootsRoot, err := h.arraysRoot(state.StateRoots, fieldparams.StateRootsLength, "StateRoots") + if err != nil { + return nil, errors.Wrap(err, "could not compute state roots merkleization") + } + fieldRoots[6] = stateRootsRoot[:] + + // HistoricalRoots slice root. + historicalRootsRt, err := ssz.ByteArrayRootWithLimit(state.HistoricalRoots, fieldparams.HistoricalRootsLength) + if err != nil { + return nil, errors.Wrap(err, "could not compute historical roots merkleization") + } + fieldRoots[7] = historicalRootsRt[:] + + // Eth1Data data structure root. + eth1HashTreeRoot, err := Eth1Root(hasher, state.Eth1Data) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data merkleization") + } + fieldRoots[8] = eth1HashTreeRoot[:] + + // Eth1DataVotes slice root. + eth1VotesRoot, err := eth1DataVotesRoot(state.Eth1DataVotes) + if err != nil { + return nil, errors.Wrap(err, "could not compute eth1data votes merkleization") + } + fieldRoots[9] = eth1VotesRoot[:] + + // Eth1DepositIndex root. + eth1DepositIndexBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(eth1DepositIndexBuf, state.Eth1DepositIndex) + eth1DepositBuf := bytesutil.ToBytes32(eth1DepositIndexBuf) + fieldRoots[10] = eth1DepositBuf[:] + + // Validators slice root. + validatorsRoot, err := h.validatorRegistryRoot(state.Validators) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator registry merkleization") + } + fieldRoots[11] = validatorsRoot[:] + + // Balances slice root. + balancesRoot, err := Uint64ListRootWithRegistryLimit(state.Balances) + if err != nil { + return nil, errors.Wrap(err, "could not compute validator balances merkleization") + } + fieldRoots[12] = balancesRoot[:] + + // RandaoMixes array root. + randaoRootsRoot, err := h.arraysRoot(state.RandaoMixes, fieldparams.RandaoMixesLength, "RandaoMixes") + if err != nil { + return nil, errors.Wrap(err, "could not compute randao roots merkleization") + } + fieldRoots[13] = randaoRootsRoot[:] + + // Slashings array root. + slashingsRootsRoot, err := ssz.SlashingsRoot(state.Slashings) + if err != nil { + return nil, errors.Wrap(err, "could not compute slashings merkleization") + } + fieldRoots[14] = slashingsRootsRoot[:] + + // PreviousEpochParticipation slice root. + prevParticipationRoot, err := ParticipationBitsRoot(state.PreviousEpochParticipation) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous epoch participation merkleization") + } + fieldRoots[15] = prevParticipationRoot[:] + + // CurrentEpochParticipation slice root. + currParticipationRoot, err := ParticipationBitsRoot(state.CurrentEpochParticipation) + if err != nil { + return nil, errors.Wrap(err, "could not compute current epoch participation merkleization") + } + fieldRoots[16] = currParticipationRoot[:] + + // JustificationBits root. + justifiedBitsRoot := bytesutil.ToBytes32(state.JustificationBits) + fieldRoots[17] = justifiedBitsRoot[:] + + // PreviousJustifiedCheckpoint data structure root. + prevCheckRoot, err := ssz.CheckpointRoot(hasher, state.PreviousJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute previous justified checkpoint merkleization") + } + fieldRoots[18] = prevCheckRoot[:] + + // CurrentJustifiedCheckpoint data structure root. + currJustRoot, err := ssz.CheckpointRoot(hasher, state.CurrentJustifiedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute current justified checkpoint merkleization") + } + fieldRoots[19] = currJustRoot[:] + + // FinalizedCheckpoint data structure root. + finalRoot, err := ssz.CheckpointRoot(hasher, state.FinalizedCheckpoint) + if err != nil { + return nil, errors.Wrap(err, "could not compute finalized checkpoint merkleization") + } + fieldRoots[20] = finalRoot[:] + + // Inactivity scores root. + inactivityScoresRoot, err := Uint64ListRootWithRegistryLimit(state.InactivityScores) + if err != nil { + return nil, errors.Wrap(err, "could not compute inactivityScoreRoot") + } + fieldRoots[21] = inactivityScoresRoot[:] + + // Current sync committee root. + currentSyncCommitteeRoot, err := SyncCommitteeRoot(state.CurrentSyncCommittee) + if err != nil { + return nil, errors.Wrap(err, "could not compute sync committee merkleization") + } + fieldRoots[22] = currentSyncCommitteeRoot[:] + + // Next sync committee root. + nextSyncCommitteeRoot, err := SyncCommitteeRoot(state.NextSyncCommittee) + if err != nil { + return nil, errors.Wrap(err, "could not compute sync committee merkleization") + } + fieldRoots[23] = nextSyncCommitteeRoot[:] + + // Execution payload root. + executionPayloadRoot, err := state.LatestExecutionPayloadHeader.HashTreeRoot() + if err != nil { + return nil, err + } + fieldRoots[24] = executionPayloadRoot[:] + + return fieldRoots, nil +} diff --git a/beacon-chain/state-proto/stateutil/state_root_test.go b/beacon-chain/state-proto/stateutil/state_root_test.go new file mode 100644 index 0000000000..32fa72640c --- /dev/null +++ b/beacon-chain/state-proto/stateutil/state_root_test.go @@ -0,0 +1,82 @@ +package stateutil_test + +import ( + "context" + "reflect" + "strconv" + "testing" + + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/interop" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestState_FieldCount(t *testing.T) { + count := params.BeaconConfig().BeaconStateFieldCount + typ := reflect.TypeOf(ethpb.BeaconState{}) + numFields := 0 + for i := 0; i < typ.NumField(); i++ { + if typ.Field(i).Name == "state" || + typ.Field(i).Name == "sizeCache" || + typ.Field(i).Name == "unknownFields" { + continue + } + numFields++ + } + assert.Equal(t, count, numFields) +} + +func BenchmarkHashTreeRoot_Generic_512(b *testing.B) { + b.StopTimer() + genesisState := setupGenesisState(b, 512) + b.StartTimer() + for i := 0; i < b.N; i++ { + _, err := genesisState.HashTreeRoot() + require.NoError(b, err) + } +} + +func BenchmarkHashTreeRoot_Generic_16384(b *testing.B) { + b.StopTimer() + genesisState := setupGenesisState(b, 16384) + b.StartTimer() + for i := 0; i < b.N; i++ { + _, err := genesisState.HashTreeRoot() + require.NoError(b, err) + } +} + +func BenchmarkHashTreeRoot_Generic_300000(b *testing.B) { + b.StopTimer() + genesisState := setupGenesisState(b, 300000) + b.StartTimer() + for i := 0; i < b.N; i++ { + _, err := genesisState.HashTreeRoot() + require.NoError(b, err) + } +} + +func setupGenesisState(tb testing.TB, count uint64) *ethpb.BeaconState { + genesisState, _, err := interop.GenerateGenesisState(context.Background(), 0, 1) + require.NoError(tb, err, "Could not generate genesis beacon state") + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + genesisState.Validators = append(genesisState.Validators, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + genesisState.Balances = append(genesisState.Balances, params.BeaconConfig().MaxEffectiveBalance) + } + return genesisState +} diff --git a/beacon-chain/state-proto/stateutil/stateutil_test.go b/beacon-chain/state-proto/stateutil/stateutil_test.go new file mode 100644 index 0000000000..821de425c7 --- /dev/null +++ b/beacon-chain/state-proto/stateutil/stateutil_test.go @@ -0,0 +1,13 @@ +package stateutil_test + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/config/features" +) + +func TestMain(m *testing.M) { + resetCfg := features.InitWithReset(&features.Flags{EnableSSZCache: true}) + defer resetCfg() + m.Run() +} diff --git a/beacon-chain/state-proto/stateutil/sync_committee.root.go b/beacon-chain/state-proto/stateutil/sync_committee.root.go new file mode 100644 index 0000000000..492818a6ff --- /dev/null +++ b/beacon-chain/state-proto/stateutil/sync_committee.root.go @@ -0,0 +1,49 @@ +package stateutil + +import ( + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SyncCommitteeRoot computes the HashTreeRoot Merkleization of a commitee root. +// a SyncCommitteeRoot struct according to the eth2 +// Simple Serialize specification. +func SyncCommitteeRoot(committee *ethpb.SyncCommittee) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + var fieldRoots [][32]byte + if committee == nil { + return [32]byte{}, nil + } + + // Field 1: Vector[BLSPubkey, SYNC_COMMITTEE_SIZE] + pubKeyRoots := make([][32]byte, 0) + for _, pubkey := range committee.Pubkeys { + r, err := merkleizePubkey(hasher, pubkey) + if err != nil { + return [32]byte{}, err + } + pubKeyRoots = append(pubKeyRoots, r) + } + pubkeyRoot, err := ssz.BitwiseMerkleizeArrays(hasher, pubKeyRoots, uint64(len(pubKeyRoots)), uint64(len(pubKeyRoots))) + if err != nil { + return [32]byte{}, err + } + + // Field 2: BLSPubkey + aggregateKeyRoot, err := merkleizePubkey(hasher, committee.AggregatePubkey) + if err != nil { + return [32]byte{}, err + } + fieldRoots = [][32]byte{pubkeyRoot, aggregateKeyRoot} + + return ssz.BitwiseMerkleizeArrays(hasher, fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) +} + +func merkleizePubkey(hasher ssz.HashFn, pubkey []byte) ([32]byte, error) { + chunks, err := ssz.Pack([][]byte{pubkey}) + if err != nil { + return [32]byte{}, err + } + return ssz.BitwiseMerkleize(hasher, chunks, uint64(len(chunks)), uint64(len(chunks))) +} diff --git a/beacon-chain/state-proto/stateutil/trie_helpers.go b/beacon-chain/state-proto/stateutil/trie_helpers.go new file mode 100644 index 0000000000..e0c0cdf5eb --- /dev/null +++ b/beacon-chain/state-proto/stateutil/trie_helpers.go @@ -0,0 +1,296 @@ +package stateutil + +import ( + "bytes" + "encoding/binary" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/container/trie" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/ssz" + "github.com/prysmaticlabs/prysm/math" +) + +// ReturnTrieLayer returns the representation of a merkle trie when +// provided with the elements of a fixed sized trie and the corresponding depth of +// it. +func ReturnTrieLayer(elements [][32]byte, length uint64) ([][]*[32]byte, error) { + hasher := hash.CustomSHA256Hasher() + leaves := elements + + if len(leaves) == 1 { + return [][]*[32]byte{{&leaves[0]}}, nil + } + hashLayer := leaves + layers := make([][][32]byte, ssz.Depth(length)+1) + layers[0] = hashLayer + var err error + layers, _, err = MerkleizeTrieLeaves(layers, hashLayer, hasher) + if err != nil { + return nil, err + } + refLayers := make([][]*[32]byte, len(layers)) + for i, val := range layers { + refLayers[i] = make([]*[32]byte, len(val)) + for j, innerVal := range val { + newVal := innerVal + refLayers[i][j] = &newVal + } + } + return refLayers, nil +} + +// ReturnTrieLayerVariable returns the representation of a merkle trie when +// provided with the elements of a variable sized trie and the corresponding depth of +// it. +func ReturnTrieLayerVariable(elements [][32]byte, length uint64) [][]*[32]byte { + hasher := hash.CustomSHA256Hasher() + depth := ssz.Depth(length) + layers := make([][]*[32]byte, depth+1) + // Return zerohash at depth + if len(elements) == 0 { + zerohash := trie.ZeroHashes[depth] + layers[len(layers)-1] = []*[32]byte{&zerohash} + return layers + } + transformedLeaves := make([]*[32]byte, len(elements)) + for i := range elements { + arr := elements[i] + transformedLeaves[i] = &arr + } + layers[0] = transformedLeaves + buffer := bytes.NewBuffer([]byte{}) + buffer.Grow(64) + for i := 0; i < int(depth); i++ { + oddNodeLength := len(layers[i])%2 == 1 + if oddNodeLength { + zerohash := trie.ZeroHashes[i] + layers[i] = append(layers[i], &zerohash) + } + updatedValues := make([]*[32]byte, 0, len(layers[i])/2) + for j := 0; j < len(layers[i]); j += 2 { + buffer.Write(layers[i][j][:]) + buffer.Write(layers[i][j+1][:]) + concat := hasher(buffer.Bytes()) + updatedValues = append(updatedValues, &concat) + buffer.Reset() + } + // remove zerohash node from tree + if oddNodeLength { + layers[i] = layers[i][:len(layers[i])-1] + } + layers[i+1] = updatedValues + } + return layers +} + +// RecomputeFromLayer recomputes specific branches of a fixed sized trie depending on the provided changed indexes. +func RecomputeFromLayer(changedLeaves [][32]byte, changedIdx []uint64, layer [][]*[32]byte) ([32]byte, [][]*[32]byte, error) { + hasher := hash.CustomSHA256Hasher() + for i, idx := range changedIdx { + layer[0][idx] = &changedLeaves[i] + } + + if len(changedIdx) == 0 { + return *layer[0][0], layer, nil + } + + leaves := layer[0] + + // We need to ensure we recompute indices of the Merkle tree which + // changed in-between calls to this function. This check adds an offset + // to the recomputed indices to ensure we do so evenly. + maxChangedIndex := changedIdx[len(changedIdx)-1] + if int(maxChangedIndex+2) == len(leaves) && maxChangedIndex%2 != 0 { + changedIdx = append(changedIdx, maxChangedIndex+1) + } + + root := *layer[0][0] + var err error + + for _, idx := range changedIdx { + root, layer, err = recomputeRootFromLayer(int(idx), layer, leaves, hasher) + if err != nil { + return [32]byte{}, nil, err + } + } + return root, layer, nil +} + +// RecomputeFromLayerVariable recomputes specific branches of a variable sized trie depending on the provided changed indexes. +func RecomputeFromLayerVariable(changedLeaves [][32]byte, changedIdx []uint64, layer [][]*[32]byte) ([32]byte, [][]*[32]byte, error) { + hasher := hash.CustomSHA256Hasher() + if len(changedIdx) == 0 { + return *layer[0][0], layer, nil + } + root := *layer[len(layer)-1][0] + var err error + + for i, idx := range changedIdx { + root, layer, err = recomputeRootFromLayerVariable(int(idx), changedLeaves[i], layer, hasher) + if err != nil { + return [32]byte{}, nil, err + } + } + return root, layer, nil +} + +// this method assumes that the provided trie already has all its elements included +// in the base depth. +func recomputeRootFromLayer(idx int, layers [][]*[32]byte, chunks []*[32]byte, + hasher func([]byte) [32]byte) ([32]byte, [][]*[32]byte, error) { + root := *chunks[idx] + layers[0] = chunks + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + // Using information about the index which changed, idx, we recompute + // only its branch up the tree. + currentIndex := idx + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := [32]byte{} + if layers[i] != nil && len(layers[i]) != 0 && neighborIdx < len(layers[i]) { + neighbor = *layers[i][neighborIdx] + } + if isLeft { + parentHash := hasher(append(root[:], neighbor[:]...)) + root = parentHash + } else { + parentHash := hasher(append(neighbor[:], root[:]...)) + root = parentHash + } + parentIdx := currentIndex / 2 + // Update the cached layers at the parent index. + rootVal := root + if len(layers[i+1]) == 0 { + layers[i+1] = append(layers[i+1], &rootVal) + } else { + layers[i+1][parentIdx] = &rootVal + } + currentIndex = parentIdx + } + // If there is only a single leaf, we return it (the identity element). + if len(layers[0]) == 1 { + return *layers[0][0], layers, nil + } + return root, layers, nil +} + +// this method assumes that the base branch does not consist of all leaves of the +// trie. Instead missing leaves are assumed to be zerohashes, following the structure +// of a sparse merkle trie. +func recomputeRootFromLayerVariable(idx int, item [32]byte, layers [][]*[32]byte, + hasher func([]byte) [32]byte) ([32]byte, [][]*[32]byte, error) { + for idx >= len(layers[0]) { + zerohash := trie.ZeroHashes[0] + layers[0] = append(layers[0], &zerohash) + } + layers[0][idx] = &item + + currentIndex := idx + root := item + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := [32]byte{} + if neighborIdx >= len(layers[i]) { + neighbor = trie.ZeroHashes[i] + } else { + neighbor = *layers[i][neighborIdx] + } + if isLeft { + parentHash := hasher(append(root[:], neighbor[:]...)) + root = parentHash + } else { + parentHash := hasher(append(neighbor[:], root[:]...)) + root = parentHash + } + parentIdx := currentIndex / 2 + if len(layers[i+1]) == 0 || parentIdx >= len(layers[i+1]) { + newItem := root + layers[i+1] = append(layers[i+1], &newItem) + } else { + newItem := root + layers[i+1][parentIdx] = &newItem + } + currentIndex = parentIdx + } + return root, layers, nil +} + +// AddInMixin describes a method from which a lenth mixin is added to the +// provided root. +func AddInMixin(root [32]byte, length uint64) ([32]byte, error) { + rootBuf := new(bytes.Buffer) + if err := binary.Write(rootBuf, binary.LittleEndian, length); err != nil { + return [32]byte{}, errors.Wrap(err, "could not marshal eth1data votes length") + } + // We need to mix in the length of the slice. + rootBufRoot := make([]byte, 32) + copy(rootBufRoot, rootBuf.Bytes()) + return ssz.MixInLength(root, rootBufRoot), nil +} + +// Merkleize 32-byte leaves into a Merkle trie for its adequate depth, returning +// the resulting layers of the trie based on the appropriate depth. This function +// pads the leaves to a length of 32. +func Merkleize(leaves [][]byte) [][][]byte { + hashFunc := hash.CustomSHA256Hasher() + layers := make([][][]byte, ssz.Depth(uint64(len(leaves)))+1) + for len(leaves) != 32 { + leaves = append(leaves, make([]byte, 32)) + } + currentLayer := leaves + layers[0] = currentLayer + + // We keep track of the hash layers of a Merkle trie until we reach + // the top layer of length 1, which contains the single root element. + // [Root] -> Top layer has length 1. + // [E] [F] -> This layer has length 2. + // [A] [B] [C] [D] -> The bottom layer has length 4 (needs to be a power of two). + i := 1 + for len(currentLayer) > 1 && i < len(layers) { + layer := make([][]byte, 0) + for i := 0; i < len(currentLayer); i += 2 { + hashedChunk := hashFunc(append(currentLayer[i], currentLayer[i+1]...)) + layer = append(layer, hashedChunk[:]) + } + currentLayer = layer + layers[i] = currentLayer + i++ + } + return layers +} + +// MerkleizeTrieLeaves merkleize the trie leaves. +func MerkleizeTrieLeaves(layers [][][32]byte, hashLayer [][32]byte, + hasher func([]byte) [32]byte) ([][][32]byte, [][32]byte, error) { + // We keep track of the hash layers of a Merkle trie until we reach + // the top layer of length 1, which contains the single root element. + // [Root] -> Top layer has length 1. + // [E] [F] -> This layer has length 2. + // [A] [B] [C] [D] -> The bottom layer has length 4 (needs to be a power of two). + i := 1 + chunkBuffer := bytes.NewBuffer([]byte{}) + chunkBuffer.Grow(64) + for len(hashLayer) > 1 && i < len(layers) { + layer := make([][32]byte, len(hashLayer)/2) + if !math.IsPowerOf2(uint64(len(hashLayer))) { + return nil, nil, errors.Errorf("hash layer is a non power of 2: %d", len(hashLayer)) + } + for j := 0; j < len(hashLayer); j += 2 { + chunkBuffer.Write(hashLayer[j][:]) + chunkBuffer.Write(hashLayer[j+1][:]) + hashedChunk := hasher(chunkBuffer.Bytes()) + layer[j/2] = hashedChunk + chunkBuffer.Reset() + } + hashLayer = layer + layers[i] = hashLayer + i++ + } + return layers, hashLayer, nil +} diff --git a/beacon-chain/state-proto/stateutil/trie_helpers_test.go b/beacon-chain/state-proto/stateutil/trie_helpers_test.go new file mode 100644 index 0000000000..a1bace93bd --- /dev/null +++ b/beacon-chain/state-proto/stateutil/trie_helpers_test.go @@ -0,0 +1,122 @@ +package stateutil_test + +import ( + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestReturnTrieLayer_OK(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + root, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") + require.NoError(t, err) + blockRts := newState.BlockRoots() + roots := make([][32]byte, 0, len(blockRts)) + for _, rt := range blockRts { + roots = append(roots, bytesutil.ToBytes32(rt)) + } + layers, err := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) + assert.NoError(t, err) + newRoot := *layers[len(layers)-1][0] + assert.Equal(t, root, newRoot) +} + +func TestReturnTrieLayerVariable_OK(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + root, err := stateutil.ValidatorRegistryRoot(newState.Validators()) + require.NoError(t, err) + hasher := hash.CustomSHA256Hasher() + validators := newState.Validators() + roots := make([][32]byte, 0, len(validators)) + for _, val := range validators { + rt, err := stateutil.ValidatorRootWithHasher(hasher, val) + require.NoError(t, err) + roots = append(roots, rt) + } + layers := stateutil.ReturnTrieLayerVariable(roots, params.BeaconConfig().ValidatorRegistryLimit) + newRoot := *layers[len(layers)-1][0] + newRoot, err = stateutil.AddInMixin(newRoot, uint64(len(validators))) + require.NoError(t, err) + assert.Equal(t, root, newRoot) +} + +func TestRecomputeFromLayer_FixedSizedArray(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + blockRts := newState.BlockRoots() + roots := make([][32]byte, 0, len(blockRts)) + for _, rt := range blockRts { + roots = append(roots, bytesutil.ToBytes32(rt)) + } + layers, err := stateutil.ReturnTrieLayer(roots, uint64(len(roots))) + require.NoError(t, err) + + changedIdx := []uint64{24, 41} + changedRoots := [][32]byte{{'A', 'B', 'C'}, {'D', 'E', 'F'}} + require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[0], changedRoots[0])) + require.NoError(t, newState.UpdateBlockRootAtIndex(changedIdx[1], changedRoots[1])) + + expectedRoot, err := stateutil.RootsArrayHashTreeRoot(newState.BlockRoots(), uint64(params.BeaconConfig().SlotsPerHistoricalRoot), "BlockRoots") + require.NoError(t, err) + root, _, err := stateutil.RecomputeFromLayer(changedRoots, changedIdx, layers) + require.NoError(t, err) + assert.Equal(t, expectedRoot, root) +} + +func TestRecomputeFromLayer_VariableSizedArray(t *testing.T) { + newState, _ := util.DeterministicGenesisState(t, 32) + validators := newState.Validators() + hasher := hash.CustomSHA256Hasher() + roots := make([][32]byte, 0, len(validators)) + for _, val := range validators { + rt, err := stateutil.ValidatorRootWithHasher(hasher, val) + require.NoError(t, err) + roots = append(roots, rt) + } + layers := stateutil.ReturnTrieLayerVariable(roots, params.BeaconConfig().ValidatorRegistryLimit) + + changedIdx := []uint64{2, 29} + val1, err := newState.ValidatorAtIndex(10) + require.NoError(t, err) + val2, err := newState.ValidatorAtIndex(11) + require.NoError(t, err) + val1.Slashed = true + val1.ExitEpoch = 20 + + val2.Slashed = true + val2.ExitEpoch = 40 + + changedVals := []*ethpb.Validator{val1, val2} + require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[0]), changedVals[0])) + require.NoError(t, newState.UpdateValidatorAtIndex(types.ValidatorIndex(changedIdx[1]), changedVals[1])) + + expectedRoot, err := stateutil.ValidatorRegistryRoot(newState.Validators()) + require.NoError(t, err) + roots = make([][32]byte, 0, len(changedVals)) + for _, val := range changedVals { + rt, err := stateutil.ValidatorRootWithHasher(hasher, val) + require.NoError(t, err) + roots = append(roots, rt) + } + root, _, err := stateutil.RecomputeFromLayerVariable(roots, changedIdx, layers) + require.NoError(t, err) + root, err = stateutil.AddInMixin(root, uint64(len(validators))) + require.NoError(t, err) + assert.Equal(t, expectedRoot, root) +} + +func TestMerkleizeTrieLeaves_BadHashLayer(t *testing.T) { + hashLayer := make([][32]byte, 12) + layers := make([][][32]byte, 20) + _, _, err := stateutil.MerkleizeTrieLeaves(layers, hashLayer, func(bytes []byte) [32]byte { + return [32]byte{} + }) + assert.ErrorContains(t, "hash layer is a non power of 2", err) +} diff --git a/beacon-chain/state-proto/stateutil/validator_map_handler.go b/beacon-chain/state-proto/stateutil/validator_map_handler.go new file mode 100644 index 0000000000..1a741b15dc --- /dev/null +++ b/beacon-chain/state-proto/stateutil/validator_map_handler.go @@ -0,0 +1,72 @@ +package stateutil + +import ( + "sync" + + types "github.com/prysmaticlabs/eth2-types" + coreutils "github.com/prysmaticlabs/prysm/beacon-chain/core/transition/stateutils" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorMapHandler is a container to hold the map and a reference tracker for how many +// states shared this. +type ValidatorMapHandler struct { + valIdxMap map[[48]byte]types.ValidatorIndex + mapRef *Reference + *sync.RWMutex +} + +// NewValMapHandler returns a new validator map handler. +func NewValMapHandler(vals []*ethpb.Validator) *ValidatorMapHandler { + return &ValidatorMapHandler{ + valIdxMap: coreutils.ValidatorIndexMap(vals), + mapRef: &Reference{refs: 1}, + RWMutex: new(sync.RWMutex), + } +} + +// AddRef copies the whole map and returns a map handler with the copied map. +func (v *ValidatorMapHandler) AddRef() { + v.mapRef.AddRef() +} + +// IsNil returns true if the underlying validator index map is nil. +func (v *ValidatorMapHandler) IsNil() bool { + return v.mapRef == nil || v.valIdxMap == nil +} + +// Copy the whole map and returns a map handler with the copied map. +func (v *ValidatorMapHandler) Copy() *ValidatorMapHandler { + if v == nil || v.valIdxMap == nil { + return &ValidatorMapHandler{valIdxMap: map[[48]byte]types.ValidatorIndex{}, mapRef: new(Reference), RWMutex: new(sync.RWMutex)} + } + v.RLock() + defer v.RUnlock() + m := make(map[[48]byte]types.ValidatorIndex, len(v.valIdxMap)) + for k, v := range v.valIdxMap { + m[k] = v + } + return &ValidatorMapHandler{ + valIdxMap: m, + mapRef: &Reference{refs: 1}, + RWMutex: new(sync.RWMutex), + } +} + +// Get the validator index using the corresponding public key. +func (v *ValidatorMapHandler) Get(key [48]byte) (types.ValidatorIndex, bool) { + v.RLock() + defer v.RUnlock() + idx, ok := v.valIdxMap[key] + if !ok { + return 0, false + } + return idx, true +} + +// Set the validator index using the corresponding public key. +func (v *ValidatorMapHandler) Set(key [48]byte, index types.ValidatorIndex) { + v.Lock() + defer v.Unlock() + v.valIdxMap[key] = index +} diff --git a/beacon-chain/state-proto/stateutil/validator_root.go b/beacon-chain/state-proto/stateutil/validator_root.go new file mode 100644 index 0000000000..5ad86a6d6d --- /dev/null +++ b/beacon-chain/state-proto/stateutil/validator_root.go @@ -0,0 +1,128 @@ +package stateutil + +import ( + "encoding/binary" + + "github.com/pkg/errors" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorRootWithHasher describes a method from which the hash tree root +// of a validator is returned. +func ValidatorRootWithHasher(hasher ssz.HashFn, validator *ethpb.Validator) ([32]byte, error) { + var fieldRoots [][32]byte + if validator != nil { + pubkey := bytesutil.ToBytes48(validator.PublicKey) + withdrawCreds := bytesutil.ToBytes32(validator.WithdrawalCredentials) + effectiveBalanceBuf := [32]byte{} + binary.LittleEndian.PutUint64(effectiveBalanceBuf[:8], validator.EffectiveBalance) + // Slashed. + slashBuf := [32]byte{} + if validator.Slashed { + slashBuf[0] = uint8(1) + } else { + slashBuf[0] = uint8(0) + } + activationEligibilityBuf := [32]byte{} + binary.LittleEndian.PutUint64(activationEligibilityBuf[:8], uint64(validator.ActivationEligibilityEpoch)) + + activationBuf := [32]byte{} + binary.LittleEndian.PutUint64(activationBuf[:8], uint64(validator.ActivationEpoch)) + + exitBuf := [32]byte{} + binary.LittleEndian.PutUint64(exitBuf[:8], uint64(validator.ExitEpoch)) + + withdrawalBuf := [32]byte{} + binary.LittleEndian.PutUint64(withdrawalBuf[:8], uint64(validator.WithdrawableEpoch)) + + // Public key. + pubKeyChunks, err := ssz.Pack([][]byte{pubkey[:]}) + if err != nil { + return [32]byte{}, err + } + pubKeyRoot, err := ssz.BitwiseMerkleize(hasher, pubKeyChunks, uint64(len(pubKeyChunks)), uint64(len(pubKeyChunks))) + if err != nil { + return [32]byte{}, err + } + fieldRoots = [][32]byte{pubKeyRoot, withdrawCreds, effectiveBalanceBuf, slashBuf, activationEligibilityBuf, + activationBuf, exitBuf, withdrawalBuf} + } + return ssz.BitwiseMerkleizeArrays(hasher, fieldRoots, uint64(len(fieldRoots)), uint64(len(fieldRoots))) +} + +// Uint64ListRootWithRegistryLimit computes the HashTreeRoot Merkleization of +// a list of uint64 and mixed with registry limit. +func Uint64ListRootWithRegistryLimit(balances []uint64) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + balancesMarshaling := make([][]byte, 0, len(balances)) + for i := 0; i < len(balances); i++ { + balanceBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(balanceBuf, balances[i]) + balancesMarshaling = append(balancesMarshaling, balanceBuf) + } + balancesChunks, err := ssz.Pack(balancesMarshaling) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not pack balances into chunks") + } + maxBalCap := uint64(fieldparams.ValidatorRegistryLimit) + elemSize := uint64(8) + balLimit := (maxBalCap*elemSize + 31) / 32 + if balLimit == 0 { + if len(balances) == 0 { + balLimit = 1 + } else { + balLimit = uint64(len(balances)) + } + } + balancesRootsRoot, err := ssz.BitwiseMerkleize(hasher, balancesChunks, uint64(len(balancesChunks)), balLimit) + if err != nil { + return [32]byte{}, errors.Wrap(err, "could not compute balances merkleization") + } + + balancesLengthRoot := make([]byte, 32) + binary.LittleEndian.PutUint64(balancesLengthRoot, uint64(len(balances))) + return ssz.MixInLength(balancesRootsRoot, balancesLengthRoot), nil +} + +// validatorEncKey returns the encoded key in bytes of input `validator`, +// the returned key bytes can be used for caching purposes. +func validatorEncKey(validator *ethpb.Validator) []byte { + if validator == nil { + return nil + } + + enc := make([]byte, 122) + pubkey := bytesutil.ToBytes48(validator.PublicKey) + copy(enc[0:48], pubkey[:]) + withdrawCreds := bytesutil.ToBytes32(validator.WithdrawalCredentials) + copy(enc[48:80], withdrawCreds[:]) + effectiveBalanceBuf := [32]byte{} + binary.LittleEndian.PutUint64(effectiveBalanceBuf[:8], validator.EffectiveBalance) + copy(enc[80:88], effectiveBalanceBuf[:8]) + if validator.Slashed { + enc[88] = uint8(1) + } else { + enc[88] = uint8(0) + } + activationEligibilityBuf := [32]byte{} + binary.LittleEndian.PutUint64(activationEligibilityBuf[:8], uint64(validator.ActivationEligibilityEpoch)) + copy(enc[89:97], activationEligibilityBuf[:8]) + + activationBuf := [32]byte{} + binary.LittleEndian.PutUint64(activationBuf[:8], uint64(validator.ActivationEpoch)) + copy(enc[97:105], activationBuf[:8]) + + exitBuf := [32]byte{} + binary.LittleEndian.PutUint64(exitBuf[:8], uint64(validator.ExitEpoch)) + copy(enc[105:113], exitBuf[:8]) + + withdrawalBuf := [32]byte{} + binary.LittleEndian.PutUint64(withdrawalBuf[:8], uint64(validator.WithdrawableEpoch)) + copy(enc[113:121], withdrawalBuf[:8]) + + return enc +} diff --git a/beacon-chain/state/stateutil/validator_root_test.go b/beacon-chain/state-proto/stateutil/validator_root_test.go similarity index 85% rename from beacon-chain/state/stateutil/validator_root_test.go rename to beacon-chain/state-proto/stateutil/validator_root_test.go index 7fc05e26e2..0b6e7dc4e0 100644 --- a/beacon-chain/state/stateutil/validator_root_test.go +++ b/beacon-chain/state-proto/stateutil/validator_root_test.go @@ -3,7 +3,7 @@ package stateutil_test import ( "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" ) func BenchmarkUint64ListRootWithRegistryLimit(b *testing.B) { diff --git a/beacon-chain/state/types/BUILD.bazel b/beacon-chain/state-proto/types/BUILD.bazel similarity index 96% rename from beacon-chain/state/types/BUILD.bazel rename to beacon-chain/state-proto/types/BUILD.bazel index 23a0642300..f8dc4adcc2 100644 --- a/beacon-chain/state/types/BUILD.bazel +++ b/beacon-chain/state-proto/types/BUILD.bazel @@ -3,7 +3,7 @@ load("@prysm//tools/go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["types.go"], - importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state/types", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types", visibility = ["//beacon-chain:__subpackages__"], deps = [ "//runtime/version:go_default_library", diff --git a/beacon-chain/state-proto/types/types.go b/beacon-chain/state-proto/types/types.go new file mode 100644 index 0000000000..53c0253471 --- /dev/null +++ b/beacon-chain/state-proto/types/types.go @@ -0,0 +1,144 @@ +package types + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/runtime/version" +) + +// FieldIndex represents the relevant field position in the +// state struct for a field. +type FieldIndex int + +// DataType signifies the data type of the field. +type DataType int + +// List of current data types the state supports. +const ( + // BasicArray represents a simple array type for a field. + BasicArray DataType = iota + // CompositeArray represents a variable length array with + // a non primitive type. + CompositeArray + // CompressedArray represents a variable length array which + // can pack multiple elements into a leaf of the underlying + // trie. + CompressedArray +) + +// String returns the name of the field index. +func (f FieldIndex) String(stateVersion int) string { + switch f { + case GenesisTime: + return "genesisTime" + case GenesisValidatorRoot: + return "genesisValidatorRoot" + case Slot: + return "slot" + case Fork: + return "fork" + case LatestBlockHeader: + return "latestBlockHeader" + case BlockRoots: + return "blockRoots" + case StateRoots: + return "stateRoots" + case HistoricalRoots: + return "historicalRoots" + case Eth1Data: + return "eth1Data" + case Eth1DataVotes: + return "eth1DataVotes" + case Eth1DepositIndex: + return "eth1DepositIndex" + case Validators: + return "validators" + case Balances: + return "balances" + case RandaoMixes: + return "randaoMixes" + case Slashings: + return "slashings" + case PreviousEpochAttestations: + if version.Altair == stateVersion || version.Merge == stateVersion { + return "previousEpochParticipationBits" + } + return "previousEpochAttestations" + case CurrentEpochAttestations: + if version.Altair == stateVersion || version.Merge == stateVersion { + return "currentEpochParticipationBits" + } + return "currentEpochAttestations" + case JustificationBits: + return "justificationBits" + case PreviousJustifiedCheckpoint: + return "previousJustifiedCheckpoint" + case CurrentJustifiedCheckpoint: + return "currentJustifiedCheckpoint" + case FinalizedCheckpoint: + return "finalizedCheckpoint" + case InactivityScores: + return "inactivityScores" + case CurrentSyncCommittee: + return "currentSyncCommittee" + case NextSyncCommittee: + return "nextSyncCommittee" + case LatestExecutionPayloadHeader: + return "latestExecutionPayloadHeader" + default: + return "" + } +} + +// ElemsInChunk returns the number of elements in the chunk (number of +// elements that are able to be packed). +func (f FieldIndex) ElemsInChunk() (uint64, error) { + switch f { + case Balances: + return 4, nil + default: + return 0, errors.Errorf("field %d doesn't support element compression", f) + } +} + +// Below we define a set of useful enum values for the field +// indices of the beacon state. For example, genesisTime is the +// 0th field of the beacon state. This is helpful when we are +// updating the Merkle branches up the trie representation +// of the beacon state. The below field indexes correspond +// to the v1 state. +const ( + GenesisTime FieldIndex = iota + GenesisValidatorRoot + Slot + Fork + LatestBlockHeader + BlockRoots + StateRoots + HistoricalRoots + Eth1Data + Eth1DataVotes + Eth1DepositIndex + Validators + Balances + RandaoMixes + Slashings + PreviousEpochAttestations + CurrentEpochAttestations + JustificationBits + PreviousJustifiedCheckpoint + CurrentJustifiedCheckpoint + FinalizedCheckpoint + // State Fields Added in Altair. + InactivityScores + CurrentSyncCommittee + NextSyncCommittee + // State fields added in Merge. + LatestExecutionPayloadHeader +) + +// Altair fields which replaced previous phase 0 fields. +const ( + // Epoch Attestations is switched with participation bits in Altair. + PreviousEpochParticipationBits = PreviousEpochAttestations + CurrentEpochParticipationBits = CurrentEpochAttestations +) diff --git a/beacon-chain/state-proto/types/types_test.go b/beacon-chain/state-proto/types/types_test.go new file mode 100644 index 0000000000..99394d2fd7 --- /dev/null +++ b/beacon-chain/state-proto/types/types_test.go @@ -0,0 +1,36 @@ +package types + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/assert" +) + +func TestStateFieldIndexes(t *testing.T) { + assert.Equal(t, FieldIndex(0), GenesisTime) + assert.Equal(t, FieldIndex(1), GenesisValidatorRoot) + assert.Equal(t, FieldIndex(2), Slot) + assert.Equal(t, FieldIndex(3), Fork) + assert.Equal(t, FieldIndex(4), LatestBlockHeader) + assert.Equal(t, FieldIndex(5), BlockRoots) + assert.Equal(t, FieldIndex(6), StateRoots) + assert.Equal(t, FieldIndex(7), HistoricalRoots) + assert.Equal(t, FieldIndex(8), Eth1Data) + assert.Equal(t, FieldIndex(9), Eth1DataVotes) + assert.Equal(t, FieldIndex(10), Eth1DepositIndex) + assert.Equal(t, FieldIndex(11), Validators) + assert.Equal(t, FieldIndex(12), Balances) + assert.Equal(t, FieldIndex(13), RandaoMixes) + assert.Equal(t, FieldIndex(14), Slashings) + assert.Equal(t, FieldIndex(15), PreviousEpochAttestations) + assert.Equal(t, FieldIndex(15), PreviousEpochParticipationBits) + assert.Equal(t, FieldIndex(16), CurrentEpochAttestations) + assert.Equal(t, FieldIndex(16), CurrentEpochParticipationBits) + assert.Equal(t, FieldIndex(17), JustificationBits) + assert.Equal(t, FieldIndex(18), PreviousJustifiedCheckpoint) + assert.Equal(t, FieldIndex(19), CurrentJustifiedCheckpoint) + assert.Equal(t, FieldIndex(20), FinalizedCheckpoint) + assert.Equal(t, FieldIndex(21), InactivityScores) + assert.Equal(t, FieldIndex(22), CurrentSyncCommittee) + assert.Equal(t, FieldIndex(23), NextSyncCommittee) +} diff --git a/beacon-chain/state-proto/v1/BUILD.bazel b/beacon-chain/state-proto/v1/BUILD.bazel new file mode 100644 index 0000000000..754f6ba529 --- /dev/null +++ b/beacon-chain/state-proto/v1/BUILD.bazel @@ -0,0 +1,106 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "field_roots.go", + "getters_attestation.go", + "getters_block.go", + "getters_checkpoint.go", + "getters_eth1.go", + "getters_misc.go", + "getters_randao.go", + "getters_state.go", + "getters_validator.go", + "proofs.go", + "readonly_validator.go", + "setters_attestation.go", + "setters_block.go", + "setters_checkpoint.go", + "setters_eth1.go", + "setters_misc.go", + "setters_randao.go", + "setters_state.go", + "setters_validator.go", + "state_trie.go", + "types.go", + "unsupported_getters.go", + "unsupported_setters.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1", + visibility = [ + "//beacon-chain:__subpackages__", + "//contracts/deposit:__subpackages__", + "//proto/migration:__subpackages__", + "//proto/prysm/v1alpha1:__subpackages__", + "//proto/testing:__subpackages__", + "//runtime/interop:__subpackages__", + "//slasher/rpc:__subpackages__", + "//testing/benchmark:__pkg__", + "//testing/fuzz:__pkg__", + "//testing/spectest:__subpackages__", + "//testing/util:__pkg__", + "//tools/benchmark-files-gen:__pkg__", + "//tools/pcli:__pkg__", + ], + deps = [ + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/fieldtrie:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/slice:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/version:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + "@io_opencensus_go//trace:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) + +# gazelle:exclude types_bench_test.go +go_test( + name = "go_default_test", + srcs = [ + "getters_attestation_test.go", + "getters_block_test.go", + "getters_test.go", + "getters_validator_test.go", + "proofs_test.go", + "readonly_validator_test.go", + "references_test.go", + "setters_attestation_test.go", + "state_test.go", + "state_trie_test.go", + "types_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/trie:go_default_library", + "//encoding/bytesutil:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/interop:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) diff --git a/beacon-chain/state-proto/v1/doc.go b/beacon-chain/state-proto/v1/doc.go new file mode 100644 index 0000000000..d47c3fb247 --- /dev/null +++ b/beacon-chain/state-proto/v1/doc.go @@ -0,0 +1,40 @@ +// Package v1 defines how the beacon chain state for Ethereum +// functions in the running beacon node, using an advanced, +// immutable implementation of the state data structure. +// +// BeaconState getters may be accessed from inside or outside the package. To +// avoid duplicating locks, we have internal and external versions of the +// getter The external function carries out the short-circuit conditions, +// obtains a read lock, then calls the internal function. The internal function +// carries out the short-circuit conditions and returns the required data +// without further locking, allowing it to be used by other package-level +// functions that already hold a lock. Hence the functions look something +// like this: +// +// func (b *BeaconState) Foo() uint64 { +// // Short-circuit conditions. +// if !b.hasInnerState() { +// return 0 +// } +// +// // Read lock. +// b.lock.RLock() +// defer b.lock.RUnlock() +// +// // Internal getter. +// return b.foo() +// } +// +// func (b *BeaconState) foo() uint64 { +// // Short-circuit conditions. +// if !b.hasInnerState() { +// return 0 +// } +// +// return b.state.foo +// } +// +// Although it is technically possible to remove the short-circuit conditions +// from the external function, that would require every read to obtain a lock +// even if the data was not present, leading to potential slowdowns. +package v1 diff --git a/beacon-chain/state-proto/v1/field_roots.go b/beacon-chain/state-proto/v1/field_roots.go new file mode 100644 index 0000000000..d7e335c08f --- /dev/null +++ b/beacon-chain/state-proto/v1/field_roots.go @@ -0,0 +1,18 @@ +package v1 + +import ( + "context" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/config/features" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// computeFieldRoots returns the hash tree root computations of every field in +// the beacon state as a list of 32 byte roots. +func computeFieldRoots(ctx context.Context, state *ethpb.BeaconState) ([][]byte, error) { + if features.Get().EnableSSZCache { + return stateutil.CachedHasher.ComputeFieldRootsWithHasherPhase0(ctx, state) + } + return stateutil.NocachedHasher.ComputeFieldRootsWithHasherPhase0(ctx, state) +} diff --git a/beacon-chain/state-proto/v1/getters_attestation.go b/beacon-chain/state-proto/v1/getters_attestation.go new file mode 100644 index 0000000000..e7e3bd6901 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_attestation.go @@ -0,0 +1,55 @@ +package v1 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// PreviousEpochAttestations corresponding to blocks on the beacon chain. +func (b *BeaconState) PreviousEpochAttestations() ([]*ethpb.PendingAttestation, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.PreviousEpochAttestations == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousEpochAttestations(), nil +} + +// previousEpochAttestations corresponding to blocks on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousEpochAttestations() []*ethpb.PendingAttestation { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyPendingAttestationSlice(b.state.PreviousEpochAttestations) +} + +// CurrentEpochAttestations corresponding to blocks on the beacon chain. +func (b *BeaconState) CurrentEpochAttestations() ([]*ethpb.PendingAttestation, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.CurrentEpochAttestations == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentEpochAttestations(), nil +} + +// currentEpochAttestations corresponding to blocks on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentEpochAttestations() []*ethpb.PendingAttestation { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyPendingAttestationSlice(b.state.CurrentEpochAttestations) +} diff --git a/beacon-chain/state-proto/v1/getters_attestation_test.go b/beacon-chain/state-proto/v1/getters_attestation_test.go new file mode 100644 index 0000000000..af85b2661a --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_attestation_test.go @@ -0,0 +1,46 @@ +package v1 + +import ( + "testing" + + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_PreviousEpochAttestations(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + atts, err := s.PreviousEpochAttestations() + require.NoError(t, err) + require.DeepEqual(t, []*ethpb.PendingAttestation(nil), atts) + + want := []*ethpb.PendingAttestation{{ProposerIndex: 100}} + s, err = InitializeFromProto(ðpb.BeaconState{PreviousEpochAttestations: want}) + require.NoError(t, err) + got, err := s.PreviousEpochAttestations() + require.NoError(t, err) + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got[0].ProposerIndex = 101 + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_CurrentEpochAttestations(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + atts, err := s.CurrentEpochAttestations() + require.NoError(t, err) + require.DeepEqual(t, []*ethpb.PendingAttestation(nil), atts) + + want := []*ethpb.PendingAttestation{{ProposerIndex: 101}} + s, err = InitializeFromProto(ðpb.BeaconState{CurrentEpochAttestations: want}) + require.NoError(t, err) + got, err := s.CurrentEpochAttestations() + require.NoError(t, err) + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got[0].ProposerIndex = 102 + require.DeepNotEqual(t, want, got) +} diff --git a/beacon-chain/state-proto/v1/getters_block.go b/beacon-chain/state-proto/v1/getters_block.go new file mode 100644 index 0000000000..64baa623cb --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_block.go @@ -0,0 +1,99 @@ +package v1 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// LatestBlockHeader stored within the beacon state. +func (b *BeaconState) LatestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.latestBlockHeader() +} + +// latestBlockHeader stored within the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) latestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + hdr := ðpb.BeaconBlockHeader{ + Slot: b.state.LatestBlockHeader.Slot, + ProposerIndex: b.state.LatestBlockHeader.ProposerIndex, + } + + parentRoot := make([]byte, len(b.state.LatestBlockHeader.ParentRoot)) + bodyRoot := make([]byte, len(b.state.LatestBlockHeader.BodyRoot)) + stateRoot := make([]byte, len(b.state.LatestBlockHeader.StateRoot)) + + copy(parentRoot, b.state.LatestBlockHeader.ParentRoot) + copy(bodyRoot, b.state.LatestBlockHeader.BodyRoot) + copy(stateRoot, b.state.LatestBlockHeader.StateRoot) + hdr.ParentRoot = parentRoot + hdr.BodyRoot = bodyRoot + hdr.StateRoot = stateRoot + return hdr +} + +// BlockRoots kept track of in the beacon state. +func (b *BeaconState) BlockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.BlockRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRoots() +} + +// blockRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.BlockRoots) +} + +// BlockRootAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.BlockRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRootAtIndex(idx) +} + +// blockRootAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.BlockRoots, idx) +} diff --git a/beacon-chain/state-proto/v1/getters_block_test.go b/beacon-chain/state-proto/v1/getters_block_test.go new file mode 100644 index 0000000000..aee36ec9b0 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_block_test.go @@ -0,0 +1,59 @@ +package v1 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_LatestBlockHeader(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + got := s.LatestBlockHeader() + require.DeepEqual(t, (*ethpb.BeaconBlockHeader)(nil), got) + + want := ðpb.BeaconBlockHeader{Slot: 100} + s, err = InitializeFromProto(ðpb.BeaconState{LatestBlockHeader: want}) + require.NoError(t, err) + got = s.LatestBlockHeader() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got.Slot = 101 + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRoots(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + got := s.BlockRoots() + require.DeepEqual(t, ([][]byte)(nil), got) + + want := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconState{BlockRoots: want}) + require.NoError(t, err) + got = s.BlockRoots() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got[0][0] = 'b' + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRootAtIndex(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + got, err := s.BlockRootAtIndex(0) + require.NoError(t, err) + require.DeepEqual(t, ([]byte)(nil), got) + + r := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconState{BlockRoots: r}) + require.NoError(t, err) + got, err = s.BlockRootAtIndex(0) + require.NoError(t, err) + want := bytesutil.PadTo([]byte{'a'}, 32) + require.DeepSSZEqual(t, want, got) +} diff --git a/beacon-chain/state-proto/v1/getters_checkpoint.go b/beacon-chain/state-proto/v1/getters_checkpoint.go new file mode 100644 index 0000000000..70f6237303 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_checkpoint.go @@ -0,0 +1,160 @@ +package v1 + +import ( + "bytes" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// JustificationBits marking which epochs have been justified in the beacon chain. +func (b *BeaconState) JustificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.justificationBits() +} + +// justificationBits marking which epochs have been justified in the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) justificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + res := make([]byte, len(b.state.JustificationBits.Bytes())) + copy(res, b.state.JustificationBits.Bytes()) + return res +} + +// PreviousJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) PreviousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.PreviousJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousJustifiedCheckpoint() +} + +// previousJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.PreviousJustifiedCheckpoint) +} + +// CurrentJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) CurrentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.CurrentJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentJustifiedCheckpoint() +} + +// currentJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.CurrentJustifiedCheckpoint) +} + +// MatchCurrentJustifiedCheckpoint returns true if input justified checkpoint matches +// the current justified checkpoint in state. +func (b *BeaconState) MatchCurrentJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.CurrentJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.CurrentJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.CurrentJustifiedCheckpoint.Root) +} + +// MatchPreviousJustifiedCheckpoint returns true if the input justified checkpoint matches +// the previous justified checkpoint in state. +func (b *BeaconState) MatchPreviousJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.PreviousJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.PreviousJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.PreviousJustifiedCheckpoint.Root) +} + +// FinalizedCheckpoint denoting an epoch and block root. +func (b *BeaconState) FinalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.FinalizedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.finalizedCheckpoint() +} + +// finalizedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) finalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.FinalizedCheckpoint) +} + +// FinalizedCheckpointEpoch returns the epoch value of the finalized checkpoint. +func (b *BeaconState) FinalizedCheckpointEpoch() types.Epoch { + if !b.hasInnerState() { + return 0 + } + if b.state.FinalizedCheckpoint == nil { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return b.state.FinalizedCheckpoint.Epoch +} diff --git a/beacon-chain/state-proto/v1/getters_eth1.go b/beacon-chain/state-proto/v1/getters_eth1.go new file mode 100644 index 0000000000..4f1ad84d12 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_eth1.go @@ -0,0 +1,91 @@ +package v1 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// Eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +func (b *BeaconState) Eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1Data() +} + +// eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + return ethpb.CopyETH1Data(b.state.Eth1Data) +} + +// Eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +func (b *BeaconState) Eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DataVotes() +} + +// eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + res := make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + for i := 0; i < len(res); i++ { + res[i] = ethpb.CopyETH1Data(b.state.Eth1DataVotes[i]) + } + return res +} + +// Eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +func (b *BeaconState) Eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DepositIndex() +} + +// eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.Eth1DepositIndex +} diff --git a/beacon-chain/state-proto/v1/getters_misc.go b/beacon-chain/state-proto/v1/getters_misc.go new file mode 100644 index 0000000000..b7c9cec335 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_misc.go @@ -0,0 +1,163 @@ +package v1 + +import ( + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/version" +) + +// GenesisTime of the beacon state as a uint64. +func (b *BeaconState) GenesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisTime() +} + +// genesisTime of the beacon state as a uint64. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.GenesisTime +} + +// GenesisValidatorRoot of the beacon state. +func (b *BeaconState) GenesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisValidatorRoot() +} + +// genesisValidatorRoot of the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + root := make([]byte, 32) + copy(root, b.state.GenesisValidatorsRoot) + return root +} + +// Version of the beacon state. This method +// is strictly meant to be used without a lock +// internally. +func (_ *BeaconState) Version() int { + return version.Phase0 +} + +// Slot of the current beacon chain state. +func (b *BeaconState) Slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slot() +} + +// slot of the current beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + return b.state.Slot +} + +// Fork version of the beacon chain. +func (b *BeaconState) Fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.fork() +} + +// fork version of the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + prevVersion := make([]byte, len(b.state.Fork.PreviousVersion)) + copy(prevVersion, b.state.Fork.PreviousVersion) + currVersion := make([]byte, len(b.state.Fork.CurrentVersion)) + copy(currVersion, b.state.Fork.CurrentVersion) + return ðpb.Fork{ + PreviousVersion: prevVersion, + CurrentVersion: currVersion, + Epoch: b.state.Fork.Epoch, + } +} + +// HistoricalRoots based on epochs stored in the beacon state. +func (b *BeaconState) HistoricalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.HistoricalRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.historicalRoots() +} + +// historicalRoots based on epochs stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) historicalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.HistoricalRoots) +} + +// balancesLength returns the length of the balances slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + return len(b.state.Balances) +} diff --git a/beacon-chain/state-proto/v1/getters_randao.go b/beacon-chain/state-proto/v1/getters_randao.go new file mode 100644 index 0000000000..b222ceb36b --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_randao.go @@ -0,0 +1,85 @@ +package v1 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +// RandaoMixes of block proposers on the beacon chain. +func (b *BeaconState) RandaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.RandaoMixes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixes() +} + +// randaoMixes of block proposers on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + + return bytesutil.SafeCopy2dBytes(b.state.RandaoMixes) +} + +// RandaoMixAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.RandaoMixes == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixAtIndex(idx) +} + +// randaoMixAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + + return bytesutil.SafeCopyRootAtIndex(b.state.RandaoMixes, idx) +} + +// RandaoMixesLength returns the length of the randao mixes slice. +func (b *BeaconState) RandaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixesLength() +} + +// randaoMixesLength returns the length of the randao mixes slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + return len(b.state.RandaoMixes) +} diff --git a/beacon-chain/state-proto/v1/getters_state.go b/beacon-chain/state-proto/v1/getters_state.go new file mode 100644 index 0000000000..20c435480a --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_state.go @@ -0,0 +1,123 @@ +package v1 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + if b == nil { + return nil + } + return b.state +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + if b == nil || b.state == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + return ðpb.BeaconState{ + GenesisTime: b.genesisTime(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + Slot: b.slot(), + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + BlockRoots: b.blockRoots(), + StateRoots: b.stateRoots(), + HistoricalRoots: b.historicalRoots(), + Eth1Data: b.eth1Data(), + Eth1DataVotes: b.eth1DataVotes(), + Eth1DepositIndex: b.eth1DepositIndex(), + Validators: b.validators(), + Balances: b.balances(), + RandaoMixes: b.randaoMixes(), + Slashings: b.slashings(), + PreviousEpochAttestations: b.previousEpochAttestations(), + CurrentEpochAttestations: b.currentEpochAttestations(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + } +} + +// hasInnerState detects if the internal reference to the state data structure +// is populated correctly. Returns false if nil. +func (b *BeaconState) hasInnerState() bool { + return b != nil && b.state != nil +} + +// StateRoots kept track of in the beacon state. +func (b *BeaconState) StateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.StateRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRoots() +} + +// StateRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.StateRoots) +} + +// StateRootAtIndex retrieves a specific state root based on an +// input index value. +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.StateRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRootAtIndex(idx) +} + +// stateRootAtIndex retrieves a specific state root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.StateRoots, idx) +} + +// MarshalSSZ marshals the underlying beacon state to bytes. +func (b *BeaconState) MarshalSSZ() ([]byte, error) { + if !b.hasInnerState() { + return nil, errors.New("nil beacon state") + } + return b.state.MarshalSSZ() +} + +// ProtobufBeaconState transforms an input into beacon state in the form of protobuf. +// Error is returned if the input is not type protobuf beacon state. +func ProtobufBeaconState(s interface{}) (*ethpb.BeaconState, error) { + pbState, ok := s.(*ethpb.BeaconState) + if !ok { + return nil, errors.New("input is not type ethpb.BeaconState") + } + return pbState, nil +} diff --git a/beacon-chain/state-proto/v1/getters_test.go b/beacon-chain/state-proto/v1/getters_test.go new file mode 100644 index 0000000000..976bed6a77 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_test.go @@ -0,0 +1,215 @@ +package v1 + +import ( + "runtime/debug" + "sync" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_SlotDataRace(t *testing.T) { + headState, err := InitializeFromProto(ðpb.BeaconState{Slot: 1}) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(2) + go func() { + require.NoError(t, headState.SetSlot(0)) + wg.Done() + }() + go func() { + headState.Slot() + wg.Done() + }() + + wg.Wait() +} + +func TestNilState_NoPanic(t *testing.T) { + var st *BeaconState + defer func() { + if r := recover(); r != nil { + t.Errorf("Method panicked when it was not supposed to: %v\n%v\n", r, string(debug.Stack())) + } + }() + // retrieve elements from nil state + _ = st.GenesisTime() + _ = st.GenesisValidatorRoot() + _ = st.GenesisValidatorRoot() + _ = st.Slot() + _ = st.Fork() + _ = st.LatestBlockHeader() + _ = st.BlockRoots() + _, err := st.BlockRootAtIndex(0) + _ = err + _ = st.StateRoots() + _ = st.HistoricalRoots() + _ = st.Eth1Data() + _ = st.Eth1DataVotes() + _ = st.Eth1DepositIndex() + _, err = st.ValidatorAtIndex(0) + _ = err + _, err = st.ValidatorAtIndexReadOnly(0) + _ = err + _, _ = st.ValidatorIndexByPubkey([48]byte{}) + _ = st.PubkeyAtIndex(0) + _ = st.NumValidators() + _ = st.Balances() + _, err = st.BalanceAtIndex(0) + _ = err + _ = st.BalancesLength() + _ = st.RandaoMixes() + _, err = st.RandaoMixAtIndex(0) + _ = err + _ = st.RandaoMixesLength() + _ = st.Slashings() + _, err = st.PreviousEpochAttestations() + require.NoError(t, err) + _, err = st.CurrentEpochAttestations() + require.NoError(t, err) + _ = st.JustificationBits() + _ = st.PreviousJustifiedCheckpoint() + _ = st.CurrentJustifiedCheckpoint() + _ = st.FinalizedCheckpoint() +} + +func TestBeaconState_MatchCurrentJustifiedCheckpt(t *testing.T) { + c1 := ðpb.Checkpoint{Epoch: 1} + c2 := ðpb.Checkpoint{Epoch: 2} + beaconState, err := InitializeFromProto(ðpb.BeaconState{CurrentJustifiedCheckpoint: c1}) + require.NoError(t, err) + require.Equal(t, true, beaconState.MatchCurrentJustifiedCheckpoint(c1)) + require.Equal(t, false, beaconState.MatchCurrentJustifiedCheckpoint(c2)) + require.Equal(t, false, beaconState.MatchPreviousJustifiedCheckpoint(c1)) + require.Equal(t, false, beaconState.MatchPreviousJustifiedCheckpoint(c2)) + beaconState.state = nil + require.Equal(t, false, beaconState.MatchCurrentJustifiedCheckpoint(c1)) +} + +func TestBeaconState_MatchPreviousJustifiedCheckpt(t *testing.T) { + c1 := ðpb.Checkpoint{Epoch: 1} + c2 := ðpb.Checkpoint{Epoch: 2} + beaconState, err := InitializeFromProto(ðpb.BeaconState{PreviousJustifiedCheckpoint: c1}) + require.NoError(t, err) + require.NoError(t, err) + require.Equal(t, false, beaconState.MatchCurrentJustifiedCheckpoint(c1)) + require.Equal(t, false, beaconState.MatchCurrentJustifiedCheckpoint(c2)) + require.Equal(t, true, beaconState.MatchPreviousJustifiedCheckpoint(c1)) + require.Equal(t, false, beaconState.MatchPreviousJustifiedCheckpoint(c2)) + beaconState.state = nil + require.Equal(t, false, beaconState.MatchPreviousJustifiedCheckpoint(c1)) +} + +func TestBeaconState_MarshalSSZ_NilState(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + s.state = nil + _, err = s.MarshalSSZ() + require.ErrorContains(t, "nil beacon state", err) +} + +func TestBeaconState_ValidatorByPubkey(t *testing.T) { + keyCreator := func(input []byte) [48]byte { + nKey := [48]byte{} + copy(nKey[:1], input) + return nKey + } + + tests := []struct { + name string + modifyFunc func(b *BeaconState, k [48]byte) + exists bool + expectedIdx types.ValidatorIndex + largestIdxInSet types.ValidatorIndex + }{ + { + name: "retrieve validator", + modifyFunc: func(b *BeaconState, key [48]byte) { + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators from the start", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 2, + }, + { + name: "retrieve validator with multiple validators from the start with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + _ = b.Copy() + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state at boundary", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconState{}) + require.NoError(t, err) + nKey := keyCreator([]byte{'A'}) + tt.modifyFunc(s, nKey) + idx, ok := s.ValidatorIndexByPubkey(nKey) + assert.Equal(t, tt.exists, ok) + assert.Equal(t, tt.expectedIdx, idx) + }) + } +} diff --git a/beacon-chain/state-proto/v1/getters_validator.go b/beacon-chain/state-proto/v1/getters_validator.go new file mode 100644 index 0000000000..6d833c1789 --- /dev/null +++ b/beacon-chain/state-proto/v1/getters_validator.go @@ -0,0 +1,297 @@ +package v1 + +import ( + "fmt" + + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorIndexOutOfRangeError represents an error scenario where a validator does not exist +// at a given index in the validator's array. +type ValidatorIndexOutOfRangeError struct { + message string +} + +var ( + // ErrNilValidatorsInState returns when accessing validators in the state while the state has a + // nil slice for the validators field. + ErrNilValidatorsInState = errors.New("state has nil validator slice") +) + +// NewValidatorIndexOutOfRangeError creates a new error instance. +func NewValidatorIndexOutOfRangeError(index types.ValidatorIndex) ValidatorIndexOutOfRangeError { + return ValidatorIndexOutOfRangeError{ + message: fmt.Sprintf("index %d out of range", index), + } +} + +// Error returns the underlying error message. +func (e *ValidatorIndexOutOfRangeError) Error() string { + return e.message +} + +// Validators participating in consensus on the beacon chain. +func (b *BeaconState) Validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.validators() +} + +// validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + val := b.state.Validators[i] + if val == nil { + continue + } + res[i] = ethpb.CopyValidator(val) + } + return res +} + +// references of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. This does not +// copy fully and instead just copies the reference. +func (b *BeaconState) validatorsReferences() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + validator := b.state.Validators[i] + if validator == nil { + continue + } + // copy validator reference instead. + res[i] = validator + } + return res +} + +// ValidatorAtIndex is the validator at the provided index. +func (b *BeaconState) ValidatorAtIndex(idx types.ValidatorIndex) (*ethpb.Validator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return ðpb.Validator{}, nil + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + val := b.state.Validators[idx] + return ethpb.CopyValidator(val), nil +} + +// ValidatorAtIndexReadOnly is the validator at the provided index. This method +// doesn't clone the validator. +func (b *BeaconState) ValidatorAtIndexReadOnly(idx types.ValidatorIndex) (state.ReadOnlyValidator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return nil, ErrNilValidatorsInState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return NewValidator(b.state.Validators[idx]) +} + +// ValidatorIndexByPubkey returns a given validator by its 48-byte public key. +func (b *BeaconState) ValidatorIndexByPubkey(key [48]byte) (types.ValidatorIndex, bool) { + if b == nil || b.valMapHandler == nil || b.valMapHandler.IsNil() { + return 0, false + } + b.lock.RLock() + defer b.lock.RUnlock() + numOfVals := len(b.state.Validators) + + idx, ok := b.valMapHandler.Get(key) + if ok && numOfVals <= int(idx) { + return types.ValidatorIndex(0), false + } + return idx, ok +} + +// PubkeyAtIndex returns the pubkey at the given +// validator index. +func (b *BeaconState) PubkeyAtIndex(idx types.ValidatorIndex) [48]byte { + if !b.hasInnerState() { + return [48]byte{} + } + if uint64(idx) >= uint64(len(b.state.Validators)) { + return [48]byte{} + } + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.Validators[idx] == nil { + return [48]byte{} + } + return bytesutil.ToBytes48(b.state.Validators[idx].PublicKey) +} + +// NumValidators returns the size of the validator registry. +func (b *BeaconState) NumValidators() int { + if !b.hasInnerState() { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return len(b.state.Validators) +} + +// ReadFromEveryValidator reads values from every validator and applies it to the provided function. +// Warning: This method is potentially unsafe, as it exposes the actual validator registry. +func (b *BeaconState) ReadFromEveryValidator(f func(idx int, val state.ReadOnlyValidator) error) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if b.state.Validators == nil { + return errors.New("nil validators in state") + } + b.lock.RLock() + validators := b.state.Validators + b.lock.RUnlock() + + for i, v := range validators { + v, err := NewValidator(v) + if err != nil { + return err + } + if err := f(i, v); err != nil { + return err + } + } + return nil +} + +// Balances of validators participating in consensus on the beacon chain. +func (b *BeaconState) Balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balances() +} + +// balances of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + res := make([]uint64, len(b.state.Balances)) + copy(res, b.state.Balances) + return res +} + +// BalanceAtIndex of validator with the provided index. +func (b *BeaconState) BalanceAtIndex(idx types.ValidatorIndex) (uint64, error) { + if !b.hasInnerState() { + return 0, ErrNilInnerState + } + if b.state.Balances == nil { + return 0, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if uint64(len(b.state.Balances)) <= uint64(idx) { + return 0, fmt.Errorf("index of %d does not exist", idx) + } + return b.state.Balances[idx], nil +} + +// BalancesLength returns the length of the balances slice. +func (b *BeaconState) BalancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balancesLength() +} + +// Slashings of validators on the beacon chain. +func (b *BeaconState) Slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slashings() +} + +// slashings of validators on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + res := make([]uint64, len(b.state.Slashings)) + copy(res, b.state.Slashings) + return res +} diff --git a/beacon-chain/state/v1/getters_validator_test.go b/beacon-chain/state-proto/v1/getters_validator_test.go similarity index 88% rename from beacon-chain/state/v1/getters_validator_test.go rename to beacon-chain/state-proto/v1/getters_validator_test.go index cb2834976a..552ba816f4 100644 --- a/beacon-chain/state/v1/getters_validator_test.go +++ b/beacon-chain/state-proto/v1/getters_validator_test.go @@ -3,7 +3,7 @@ package v1_test import ( "testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/state-proto/v1/proofs.go b/beacon-chain/state-proto/v1/proofs.go new file mode 100644 index 0000000000..1efbc0dba0 --- /dev/null +++ b/beacon-chain/state-proto/v1/proofs.go @@ -0,0 +1,47 @@ +package v1 + +import ( + "encoding/binary" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +const ( + finalizedRootIndex = uint64(105) // Precomputed value. +) + +// FinalizedRootGeneralizedIndex for the beacon state. +func FinalizedRootGeneralizedIndex() uint64 { + return finalizedRootIndex +} + +// CurrentSyncCommitteeProof from the state's Merkle trie representation. +func (*BeaconState) CurrentSyncCommitteeProof() ([][]byte, error) { + return nil, errors.New("CurrentSyncCommitteeProof() unsupported for v1 beacon state") +} + +// NextSyncCommitteeProof from the state's Merkle trie representation. +func (*BeaconState) NextSyncCommitteeProof() ([][]byte, error) { + return nil, errors.New("NextSyncCommitteeProof() unsupported for v1 beacon state") +} + +// FinalizedRootProof crafts a Merkle proof for the finalized root +// contained within the finalized checkpoint of a beacon state. +func (b *BeaconState) FinalizedRootProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + cpt := b.state.FinalizedCheckpoint + // The epoch field of a finalized checkpoint is the neighbor + // index of the finalized root field in its Merkle tree representation + // of the checkpoint. This neighbor is the first element added to the proof. + epochBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(epochBuf, uint64(cpt.Epoch)) + epochRoot := bytesutil.ToBytes32(epochBuf) + proof := make([][]byte, 0) + proof = append(proof, epochRoot[:]) + branch := fieldtrie.ProofFromMerkleLayers(b.merkleLayers, finalizedCheckpoint) + proof = append(proof, branch...) + return proof, nil +} diff --git a/beacon-chain/state/v1/proofs_test.go b/beacon-chain/state-proto/v1/proofs_test.go similarity index 93% rename from beacon-chain/state/v1/proofs_test.go rename to beacon-chain/state-proto/v1/proofs_test.go index 15ab78185a..0632977d89 100644 --- a/beacon-chain/state/v1/proofs_test.go +++ b/beacon-chain/state-proto/v1/proofs_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" diff --git a/beacon-chain/state-proto/v1/readonly_validator.go b/beacon-chain/state-proto/v1/readonly_validator.go new file mode 100644 index 0000000000..e60fd5d1d3 --- /dev/null +++ b/beacon-chain/state-proto/v1/readonly_validator.go @@ -0,0 +1,88 @@ +package v1 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +var ( + // ErrNilWrappedValidator returns when caller attempts to wrap a nil pointer validator. + ErrNilWrappedValidator = errors.New("nil validator cannot be wrapped as readonly") +) + +// readOnlyValidator returns a wrapper that only allows fields from a validator +// to be read, and prevents any modification of internal validator fields. +type readOnlyValidator struct { + validator *ethpb.Validator +} + +var _ = state.ReadOnlyValidator(readOnlyValidator{}) + +// NewValidator initializes the read only wrapper for validator. +func NewValidator(v *ethpb.Validator) (state.ReadOnlyValidator, error) { + rov := readOnlyValidator{ + validator: v, + } + if rov.IsNil() { + return nil, ErrNilWrappedValidator + } + return rov, nil +} + +// EffectiveBalance returns the effective balance of the +// read only validator. +func (v readOnlyValidator) EffectiveBalance() uint64 { + return v.validator.EffectiveBalance +} + +// ActivationEligibilityEpoch returns the activation eligibility epoch of the +// read only validator. +func (v readOnlyValidator) ActivationEligibilityEpoch() types.Epoch { + return v.validator.ActivationEligibilityEpoch +} + +// ActivationEpoch returns the activation epoch of the +// read only validator. +func (v readOnlyValidator) ActivationEpoch() types.Epoch { + return v.validator.ActivationEpoch +} + +// WithdrawableEpoch returns the withdrawable epoch of the +// read only validator. +func (v readOnlyValidator) WithdrawableEpoch() types.Epoch { + return v.validator.WithdrawableEpoch +} + +// ExitEpoch returns the exit epoch of the +// read only validator. +func (v readOnlyValidator) ExitEpoch() types.Epoch { + return v.validator.ExitEpoch +} + +// PublicKey returns the public key of the +// read only validator. +func (v readOnlyValidator) PublicKey() [48]byte { + var pubkey [48]byte + copy(pubkey[:], v.validator.PublicKey) + return pubkey +} + +// WithdrawalCredentials returns the withdrawal credentials of the +// read only validator. +func (v readOnlyValidator) WithdrawalCredentials() []byte { + creds := make([]byte, len(v.validator.WithdrawalCredentials)) + copy(creds, v.validator.WithdrawalCredentials) + return creds +} + +// Slashed returns the read only validator is slashed. +func (v readOnlyValidator) Slashed() bool { + return v.validator.Slashed +} + +// IsNil returns true if the validator is nil. +func (v readOnlyValidator) IsNil() bool { + return v.validator == nil +} diff --git a/beacon-chain/state/v1/readonly_validator_test.go b/beacon-chain/state-proto/v1/readonly_validator_test.go similarity index 97% rename from beacon-chain/state/v1/readonly_validator_test.go rename to beacon-chain/state-proto/v1/readonly_validator_test.go index 6c7cd3c5a0..da6ad9e128 100644 --- a/beacon-chain/state/v1/readonly_validator_test.go +++ b/beacon-chain/state-proto/v1/readonly_validator_test.go @@ -4,7 +4,7 @@ import ( "testing" types "github.com/prysmaticlabs/eth2-types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" diff --git a/beacon-chain/state-proto/v1/references_test.go b/beacon-chain/state-proto/v1/references_test.go new file mode 100644 index 0000000000..0562d499ff --- /dev/null +++ b/beacon-chain/state-proto/v1/references_test.go @@ -0,0 +1,354 @@ +package v1 + +import ( + "reflect" + "runtime" + "runtime/debug" + "testing" + + "github.com/prysmaticlabs/go-bitfield" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestStateReferenceSharing_Finalizer(t *testing.T) { + // This test showcases the logic on a the RandaoMixes field with the GC finalizer. + + a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{RandaoMixes: [][]byte{[]byte("foo")}}) + require.NoError(t, err) + assert.Equal(t, uint(1), a.sharedFieldReferences[randaoMixes].Refs(), "Expected a single reference for RANDAO mixes") + + func() { + // Create object in a different scope for GC + b := a.Copy() + assert.Equal(t, uint(2), a.sharedFieldReferences[randaoMixes].Refs(), "Expected 2 references to RANDAO mixes") + _ = b + }() + + runtime.GC() // Should run finalizer on object b + assert.Equal(t, uint(1), a.sharedFieldReferences[randaoMixes].Refs(), "Expected 1 shared reference to RANDAO mixes!") + + copied := a.Copy() + b, ok := copied.(*BeaconState) + require.Equal(t, true, ok) + assert.Equal(t, uint(2), b.sharedFieldReferences[randaoMixes].Refs(), "Expected 2 shared references to RANDAO mixes") + require.NoError(t, b.UpdateRandaoMixesAtIndex(0, []byte("bar"))) + if b.sharedFieldReferences[randaoMixes].Refs() != 1 || a.sharedFieldReferences[randaoMixes].Refs() != 1 { + t.Error("Expected 1 shared reference to RANDAO mix for both a and b") + } +} + +func TestStateReferenceCopy_NoUnexpectedRootsMutation(t *testing.T) { + root1, root2 := bytesutil.ToBytes32([]byte("foo")), bytesutil.ToBytes32([]byte("bar")) + a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{ + BlockRoots: [][]byte{ + root1[:], + }, + StateRoots: [][]byte{ + root1[:], + }, + }) + require.NoError(t, err) + assertRefCount(t, a, blockRoots, 1) + assertRefCount(t, a, stateRoots, 1) + + // Copy, increases reference count. + copied := a.Copy() + b, ok := copied.(*BeaconState) + require.Equal(t, true, ok) + assertRefCount(t, a, blockRoots, 2) + assertRefCount(t, a, stateRoots, 2) + assertRefCount(t, b, blockRoots, 2) + assertRefCount(t, b, stateRoots, 2) + assert.Equal(t, 1, len(b.state.GetBlockRoots()), "No block roots found") + assert.Equal(t, 1, len(b.state.GetStateRoots()), "No state roots found") + + // Assert shared state. + blockRootsA := a.state.GetBlockRoots() + stateRootsA := a.state.GetStateRoots() + blockRootsB := b.state.GetBlockRoots() + stateRootsB := b.state.GetStateRoots() + if len(blockRootsA) != len(blockRootsB) || len(blockRootsA) < 1 { + t.Errorf("Unexpected number of block roots, want: %v", 1) + } + if len(stateRootsA) != len(stateRootsB) || len(stateRootsA) < 1 { + t.Errorf("Unexpected number of state roots, want: %v", 1) + } + assertValFound(t, blockRootsA, root1[:]) + assertValFound(t, blockRootsB, root1[:]) + assertValFound(t, stateRootsA, root1[:]) + assertValFound(t, stateRootsB, root1[:]) + + // Mutator should only affect calling state: a. + require.NoError(t, a.UpdateBlockRootAtIndex(0, root2)) + require.NoError(t, a.UpdateStateRootAtIndex(0, root2)) + + // Assert no shared state mutation occurred only on state a (copy on write). + assertValNotFound(t, a.state.GetBlockRoots(), root1[:]) + assertValNotFound(t, a.state.GetStateRoots(), root1[:]) + assertValFound(t, a.state.GetBlockRoots(), root2[:]) + assertValFound(t, a.state.GetStateRoots(), root2[:]) + assertValFound(t, b.state.GetBlockRoots(), root1[:]) + assertValFound(t, b.state.GetStateRoots(), root1[:]) + if len(blockRootsA) != len(blockRootsB) || len(blockRootsA) < 1 { + t.Errorf("Unexpected number of block roots, want: %v", 1) + } + if len(stateRootsA) != len(stateRootsB) || len(stateRootsA) < 1 { + t.Errorf("Unexpected number of state roots, want: %v", 1) + } + assert.DeepEqual(t, root2[:], a.state.GetBlockRoots()[0], "Expected mutation not found") + assert.DeepEqual(t, root2[:], a.state.GetStateRoots()[0], "Expected mutation not found") + assert.DeepEqual(t, root1[:], blockRootsB[0], "Unexpected mutation found") + assert.DeepEqual(t, root1[:], stateRootsB[0], "Unexpected mutation found") + + // Copy on write happened, reference counters are reset. + assertRefCount(t, a, blockRoots, 1) + assertRefCount(t, a, stateRoots, 1) + assertRefCount(t, b, blockRoots, 1) + assertRefCount(t, b, stateRoots, 1) +} + +func TestStateReferenceCopy_NoUnexpectedRandaoMutation(t *testing.T) { + + val1, val2 := []byte("foo"), []byte("bar") + a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{ + RandaoMixes: [][]byte{ + val1, + }, + }) + require.NoError(t, err) + assertRefCount(t, a, randaoMixes, 1) + + // Copy, increases reference count. + copied := a.Copy() + b, ok := copied.(*BeaconState) + require.Equal(t, true, ok) + assertRefCount(t, a, randaoMixes, 2) + assertRefCount(t, b, randaoMixes, 2) + assert.Equal(t, 1, len(b.state.GetRandaoMixes()), "No randao mixes found") + + // Assert shared state. + mixesA := a.state.GetRandaoMixes() + mixesB := b.state.GetRandaoMixes() + if len(mixesA) != len(mixesB) || len(mixesA) < 1 { + t.Errorf("Unexpected number of mix values, want: %v", 1) + } + assertValFound(t, mixesA, val1) + assertValFound(t, mixesB, val1) + + // Mutator should only affect calling state: a. + require.NoError(t, a.UpdateRandaoMixesAtIndex(0, val2)) + + // Assert no shared state mutation occurred only on state a (copy on write). + if len(mixesA) != len(mixesB) || len(mixesA) < 1 { + t.Errorf("Unexpected number of mix values, want: %v", 1) + } + assertValFound(t, a.state.GetRandaoMixes(), val2) + assertValNotFound(t, a.state.GetRandaoMixes(), val1) + assertValFound(t, b.state.GetRandaoMixes(), val1) + assertValNotFound(t, b.state.GetRandaoMixes(), val2) + assertValFound(t, mixesB, val1) + assertValNotFound(t, mixesB, val2) + assert.DeepEqual(t, val2, a.state.GetRandaoMixes()[0], "Expected mutation not found") + assert.DeepEqual(t, val1, mixesB[0], "Unexpected mutation found") + + // Copy on write happened, reference counters are reset. + assertRefCount(t, a, randaoMixes, 1) + assertRefCount(t, b, randaoMixes, 1) +} + +func TestStateReferenceCopy_NoUnexpectedAttestationsMutation(t *testing.T) { + assertAttFound := func(vals []*ethpb.PendingAttestation, val uint64) { + for i := range vals { + if reflect.DeepEqual(vals[i].AggregationBits, bitfield.NewBitlist(val)) { + return + } + } + t.Log(string(debug.Stack())) + t.Fatalf("Expected attestation not found (%v), want: %v", vals, val) + } + assertAttNotFound := func(vals []*ethpb.PendingAttestation, val uint64) { + for i := range vals { + if reflect.DeepEqual(vals[i].AggregationBits, bitfield.NewBitlist(val)) { + t.Log(string(debug.Stack())) + t.Fatalf("Unexpected attestation found (%v): %v", vals, val) + return + } + } + } + + a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{}) + require.NoError(t, err) + assertRefCount(t, a, previousEpochAttestations, 1) + assertRefCount(t, a, currentEpochAttestations, 1) + + // Update initial state. + atts := []*ethpb.PendingAttestation{ + {AggregationBits: bitfield.NewBitlist(1)}, + {AggregationBits: bitfield.NewBitlist(2)}, + } + a.setPreviousEpochAttestations(atts[:1]) + a.setCurrentEpochAttestations(atts[:1]) + curAtt, err := a.CurrentEpochAttestations() + require.NoError(t, err) + assert.Equal(t, 1, len(curAtt), "Unexpected number of attestations") + preAtt, err := a.PreviousEpochAttestations() + require.NoError(t, err) + assert.Equal(t, 1, len(preAtt), "Unexpected number of attestations") + + // Copy, increases reference count. + copied := a.Copy() + b, ok := copied.(*BeaconState) + require.Equal(t, true, ok) + assertRefCount(t, a, previousEpochAttestations, 2) + assertRefCount(t, a, currentEpochAttestations, 2) + assertRefCount(t, b, previousEpochAttestations, 2) + assertRefCount(t, b, currentEpochAttestations, 2) + assert.Equal(t, 1, len(b.state.GetPreviousEpochAttestations()), "Unexpected number of attestations") + assert.Equal(t, 1, len(b.state.GetCurrentEpochAttestations()), "Unexpected number of attestations") + + // Assert shared state. + curAttsA := a.state.GetCurrentEpochAttestations() + prevAttsA := a.state.GetPreviousEpochAttestations() + curAttsB := b.state.GetCurrentEpochAttestations() + prevAttsB := b.state.GetPreviousEpochAttestations() + if len(curAttsA) != len(curAttsB) || len(curAttsA) < 1 { + t.Errorf("Unexpected number of attestations, want: %v", 1) + } + if len(prevAttsA) != len(prevAttsB) || len(prevAttsA) < 1 { + t.Errorf("Unexpected number of attestations, want: %v", 1) + } + assertAttFound(curAttsA, 1) + assertAttFound(prevAttsA, 1) + assertAttFound(curAttsB, 1) + assertAttFound(prevAttsB, 1) + + // Extends state a attestations. + require.NoError(t, a.AppendCurrentEpochAttestations(atts[1])) + require.NoError(t, a.AppendPreviousEpochAttestations(atts[1])) + curAtt, err = a.CurrentEpochAttestations() + require.NoError(t, err) + assert.Equal(t, 2, len(curAtt), "Unexpected number of attestations") + preAtt, err = a.PreviousEpochAttestations() + require.NoError(t, err) + assert.Equal(t, 2, len(preAtt), "Unexpected number of attestations") + assertAttFound(a.state.GetCurrentEpochAttestations(), 1) + assertAttFound(a.state.GetPreviousEpochAttestations(), 1) + assertAttFound(a.state.GetCurrentEpochAttestations(), 2) + assertAttFound(a.state.GetPreviousEpochAttestations(), 2) + assertAttFound(b.state.GetCurrentEpochAttestations(), 1) + assertAttFound(b.state.GetPreviousEpochAttestations(), 1) + assertAttNotFound(b.state.GetCurrentEpochAttestations(), 2) + assertAttNotFound(b.state.GetPreviousEpochAttestations(), 2) + + // Mutator should only affect calling state: a. + applyToEveryAttestation := func(state *ethpb.BeaconState) { + // One MUST copy on write. + atts = make([]*ethpb.PendingAttestation, len(state.CurrentEpochAttestations)) + copy(atts, state.CurrentEpochAttestations) + state.CurrentEpochAttestations = atts + for i := range state.GetCurrentEpochAttestations() { + att := ethpb.CopyPendingAttestation(state.CurrentEpochAttestations[i]) + att.AggregationBits = bitfield.NewBitlist(3) + state.CurrentEpochAttestations[i] = att + } + + atts = make([]*ethpb.PendingAttestation, len(state.PreviousEpochAttestations)) + copy(atts, state.PreviousEpochAttestations) + state.PreviousEpochAttestations = atts + for i := range state.GetPreviousEpochAttestations() { + att := ethpb.CopyPendingAttestation(state.PreviousEpochAttestations[i]) + att.AggregationBits = bitfield.NewBitlist(3) + state.PreviousEpochAttestations[i] = att + } + } + applyToEveryAttestation(a.state) + + // Assert no shared state mutation occurred only on state a (copy on write). + assertAttFound(a.state.GetCurrentEpochAttestations(), 3) + assertAttFound(a.state.GetPreviousEpochAttestations(), 3) + assertAttNotFound(a.state.GetCurrentEpochAttestations(), 1) + assertAttNotFound(a.state.GetPreviousEpochAttestations(), 1) + assertAttNotFound(a.state.GetCurrentEpochAttestations(), 2) + assertAttNotFound(a.state.GetPreviousEpochAttestations(), 2) + // State b must be unaffected. + assertAttNotFound(b.state.GetCurrentEpochAttestations(), 3) + assertAttNotFound(b.state.GetPreviousEpochAttestations(), 3) + assertAttFound(b.state.GetCurrentEpochAttestations(), 1) + assertAttFound(b.state.GetPreviousEpochAttestations(), 1) + assertAttNotFound(b.state.GetCurrentEpochAttestations(), 2) + assertAttNotFound(b.state.GetPreviousEpochAttestations(), 2) + + // Copy on write happened, reference counters are reset. + assertRefCount(t, a, currentEpochAttestations, 1) + assertRefCount(t, b, currentEpochAttestations, 1) + assertRefCount(t, a, previousEpochAttestations, 1) + assertRefCount(t, b, previousEpochAttestations, 1) +} + +func TestValidatorReferences_RemainsConsistent(t *testing.T) { + a, err := InitializeFromProtoUnsafe(ðpb.BeaconState{ + Validators: []*ethpb.Validator{ + {PublicKey: []byte{'A'}}, + {PublicKey: []byte{'B'}}, + {PublicKey: []byte{'C'}}, + {PublicKey: []byte{'D'}}, + {PublicKey: []byte{'E'}}, + }, + }) + require.NoError(t, err) + + // Create a second state. + copied := a.Copy() + b, ok := copied.(*BeaconState) + require.Equal(t, true, ok) + + // Update First Validator. + assert.NoError(t, a.UpdateValidatorAtIndex(0, ðpb.Validator{PublicKey: []byte{'Z'}})) + + assert.DeepNotEqual(t, a.state.Validators[0], b.state.Validators[0], "validators are equal when they are supposed to be different") + // Modify all validators from copied state. + assert.NoError(t, b.ApplyToEveryValidator(func(idx int, val *ethpb.Validator) (bool, *ethpb.Validator, error) { + return true, ðpb.Validator{PublicKey: []byte{'V'}}, nil + })) + + // Ensure reference is properly accounted for. + assert.NoError(t, a.ReadFromEveryValidator(func(idx int, val state.ReadOnlyValidator) error { + assert.NotEqual(t, bytesutil.ToBytes48([]byte{'V'}), val.PublicKey()) + return nil + })) +} + +// assertRefCount checks whether reference count for a given state +// at a given index is equal to expected amount. +func assertRefCount(t *testing.T, b *BeaconState, idx types.FieldIndex, want uint) { + if cnt := b.sharedFieldReferences[idx].Refs(); cnt != want { + t.Errorf("Unexpected count of references for index %d, want: %v, got: %v", idx, want, cnt) + } +} + +// assertValFound checks whether item with a given value exists in list. +func assertValFound(t *testing.T, vals [][]byte, val []byte) { + for i := range vals { + if reflect.DeepEqual(vals[i], val) { + return + } + } + t.Log(string(debug.Stack())) + t.Fatalf("Expected value not found (%v), want: %v", vals, val) +} + +// assertValNotFound checks whether item with a given value doesn't exist in list. +func assertValNotFound(t *testing.T, vals [][]byte, val []byte) { + for i := range vals { + if reflect.DeepEqual(vals[i], val) { + t.Log(string(debug.Stack())) + t.Errorf("Unexpected value found (%v),: %v", vals, val) + return + } + } +} diff --git a/beacon-chain/state-proto/v1/setters_attestation.go b/beacon-chain/state-proto/v1/setters_attestation.go new file mode 100644 index 0000000000..26de75b54e --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_attestation.go @@ -0,0 +1,98 @@ +package v1 + +import ( + "fmt" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// RotateAttestations sets the previous epoch attestations to the current epoch attestations and +// then clears the current epoch attestations. +func (b *BeaconState) RotateAttestations() error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.setPreviousEpochAttestations(b.currentEpochAttestations()) + b.setCurrentEpochAttestations([]*ethpb.PendingAttestation{}) + return nil +} + +func (b *BeaconState) setPreviousEpochAttestations(val []*ethpb.PendingAttestation) { + b.sharedFieldReferences[previousEpochAttestations].MinusRef() + b.sharedFieldReferences[previousEpochAttestations] = stateutil.NewRef(1) + + b.state.PreviousEpochAttestations = val + b.markFieldAsDirty(previousEpochAttestations) + b.rebuildTrie[previousEpochAttestations] = true +} + +func (b *BeaconState) setCurrentEpochAttestations(val []*ethpb.PendingAttestation) { + b.sharedFieldReferences[currentEpochAttestations].MinusRef() + b.sharedFieldReferences[currentEpochAttestations] = stateutil.NewRef(1) + + b.state.CurrentEpochAttestations = val + b.markFieldAsDirty(currentEpochAttestations) + b.rebuildTrie[currentEpochAttestations] = true +} + +// AppendCurrentEpochAttestations for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendCurrentEpochAttestations(val *ethpb.PendingAttestation) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + atts := b.state.CurrentEpochAttestations + max := uint64(fieldparams.CurrentEpochAttestationsLength) + if uint64(len(atts)) >= max { + return fmt.Errorf("current pending attestation exceeds max length %d", max) + } + + if b.sharedFieldReferences[currentEpochAttestations].Refs() > 1 { + // Copy elements in underlying array by reference. + atts = make([]*ethpb.PendingAttestation, len(b.state.CurrentEpochAttestations)) + copy(atts, b.state.CurrentEpochAttestations) + b.sharedFieldReferences[currentEpochAttestations].MinusRef() + b.sharedFieldReferences[currentEpochAttestations] = stateutil.NewRef(1) + } + + b.state.CurrentEpochAttestations = append(atts, val) + b.markFieldAsDirty(currentEpochAttestations) + b.addDirtyIndices(currentEpochAttestations, []uint64{uint64(len(b.state.CurrentEpochAttestations) - 1)}) + return nil +} + +// AppendPreviousEpochAttestations for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendPreviousEpochAttestations(val *ethpb.PendingAttestation) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + atts := b.state.PreviousEpochAttestations + max := uint64(fieldparams.PreviousEpochAttestationsLength) + if uint64(len(atts)) >= max { + return fmt.Errorf("previous pending attestation exceeds max length %d", max) + } + + if b.sharedFieldReferences[previousEpochAttestations].Refs() > 1 { + atts = make([]*ethpb.PendingAttestation, len(b.state.PreviousEpochAttestations)) + copy(atts, b.state.PreviousEpochAttestations) + b.sharedFieldReferences[previousEpochAttestations].MinusRef() + b.sharedFieldReferences[previousEpochAttestations] = stateutil.NewRef(1) + } + + b.state.PreviousEpochAttestations = append(atts, val) + b.markFieldAsDirty(previousEpochAttestations) + b.addDirtyIndices(previousEpochAttestations, []uint64{uint64(len(b.state.PreviousEpochAttestations) - 1)}) + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_attestation_test.go b/beacon-chain/state-proto/v1/setters_attestation_test.go new file mode 100644 index 0000000000..45494e7a17 --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_attestation_test.go @@ -0,0 +1,72 @@ +package v1 + +import ( + "context" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_RotateAttestations(t *testing.T) { + st, err := InitializeFromProto(ðpb.BeaconState{ + Slot: 1, + CurrentEpochAttestations: []*ethpb.PendingAttestation{{Data: ðpb.AttestationData{Slot: 456}}}, + PreviousEpochAttestations: []*ethpb.PendingAttestation{{Data: ðpb.AttestationData{Slot: 123}}}, + }) + require.NoError(t, err) + + require.NoError(t, st.RotateAttestations()) + require.Equal(t, 0, len(st.currentEpochAttestations())) + require.Equal(t, types.Slot(456), st.previousEpochAttestations()[0].Data.Slot) +} + +func TestAppendBeyondIndicesLimit(t *testing.T) { + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + st, err := InitializeFromProto(ðpb.BeaconState{ + Slot: 1, + CurrentEpochAttestations: []*ethpb.PendingAttestation{{Data: ðpb.AttestationData{Slot: 456}}}, + PreviousEpochAttestations: []*ethpb.PendingAttestation{{Data: ðpb.AttestationData{Slot: 123}}}, + Validators: []*ethpb.Validator{}, + Eth1Data: ðpb.Eth1Data{}, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + }) + require.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := stateTypes.FieldIndex(0); i < stateTypes.FieldIndex(params.BeaconConfig().BeaconStateFieldCount); i++ { + st.dirtyFields[i] = true + } + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := 0; i < 10; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, false, st.rebuildTrie[validators]) + assert.NotEqual(t, len(st.dirtyIndices[validators]), 0) + + for i := 0; i < indicesLimit; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, true, st.rebuildTrie[validators]) + assert.Equal(t, len(st.dirtyIndices[validators]), 0) +} diff --git a/beacon-chain/state-proto/v1/setters_block.go b/beacon-chain/state-proto/v1/setters_block.go new file mode 100644 index 0000000000..8e974331df --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_block.go @@ -0,0 +1,68 @@ +package v1 + +import ( + "fmt" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetLatestBlockHeader in the beacon state. +func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.LatestBlockHeader = ethpb.CopyBeaconBlockHeader(val) + b.markFieldAsDirty(latestBlockHeader) + return nil +} + +// SetBlockRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBlockRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[blockRoots].MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + + b.state.BlockRoots = val + b.markFieldAsDirty(blockRoots) + b.rebuildTrie[blockRoots] = true + return nil +} + +// UpdateBlockRootAtIndex for the beacon state. Updates the block root +// at a specific index to a new value. +func (b *BeaconState) UpdateBlockRootAtIndex(idx uint64, blockRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.BlockRoots)) <= idx { + return fmt.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + r := b.state.BlockRoots + if ref := b.sharedFieldReferences[blockRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.BlockRoots)) + copy(r, b.state.BlockRoots) + ref.MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + } + + r[idx] = blockRoot[:] + b.state.BlockRoots = r + + b.markFieldAsDirty(blockRoots) + b.addDirtyIndices(blockRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_checkpoint.go b/beacon-chain/state-proto/v1/setters_checkpoint.go new file mode 100644 index 0000000000..bf84053ee3 --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_checkpoint.go @@ -0,0 +1,58 @@ +package v1 + +import ( + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetJustificationBits for the beacon state. +func (b *BeaconState) SetJustificationBits(val bitfield.Bitvector4) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.JustificationBits = val + b.markFieldAsDirty(justificationBits) + return nil +} + +// SetPreviousJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetPreviousJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.PreviousJustifiedCheckpoint = val + b.markFieldAsDirty(previousJustifiedCheckpoint) + return nil +} + +// SetCurrentJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetCurrentJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.CurrentJustifiedCheckpoint = val + b.markFieldAsDirty(currentJustifiedCheckpoint) + return nil +} + +// SetFinalizedCheckpoint for the beacon state. +func (b *BeaconState) SetFinalizedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.FinalizedCheckpoint = val + b.markFieldAsDirty(finalizedCheckpoint) + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_eth1.go b/beacon-chain/state-proto/v1/setters_eth1.go new file mode 100644 index 0000000000..fb9ae92f5b --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_eth1.go @@ -0,0 +1,74 @@ +package v1 + +import ( + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetEth1Data for the beacon state. +func (b *BeaconState) SetEth1Data(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1Data = val + b.markFieldAsDirty(eth1Data) + return nil +} + +// SetEth1DataVotes for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetEth1DataVotes(val []*ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + + b.state.Eth1DataVotes = val + b.markFieldAsDirty(eth1DataVotes) + b.rebuildTrie[eth1DataVotes] = true + return nil +} + +// SetEth1DepositIndex for the beacon state. +func (b *BeaconState) SetEth1DepositIndex(val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1DepositIndex = val + b.markFieldAsDirty(eth1DepositIndex) + return nil +} + +// AppendEth1DataVotes for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendEth1DataVotes(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + votes := b.state.Eth1DataVotes + if b.sharedFieldReferences[eth1DataVotes].Refs() > 1 { + // Copy elements in underlying array by reference. + votes = make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + copy(votes, b.state.Eth1DataVotes) + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + } + + b.state.Eth1DataVotes = append(votes, val) + b.markFieldAsDirty(eth1DataVotes) + b.addDirtyIndices(eth1DataVotes, []uint64{uint64(len(b.state.Eth1DataVotes) - 1)}) + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_misc.go b/beacon-chain/state-proto/v1/setters_misc.go new file mode 100644 index 0000000000..c689ffdf82 --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_misc.go @@ -0,0 +1,187 @@ +package v1 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/crypto/hash" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "google.golang.org/protobuf/proto" +) + +// For our setters, we have a field reference counter through +// which we can track shared field references. This helps when +// performing state copies, as we simply copy the reference to the +// field. When we do need to modify these fields, we +// perform a full copy of the field. This is true of most of our +// fields except for the following below. +// 1) BlockRoots +// 2) StateRoots +// 3) Eth1DataVotes +// 4) RandaoMixes +// 5) HistoricalRoots +// 6) CurrentEpochAttestations +// 7) PreviousEpochAttestations +// 8) Validators +// +// The fields referred to above are instead copied by reference, where +// we simply copy the reference to the underlying object instead of the +// whole object. This is possible due to how we have structured our state +// as we copy the value on read, so as to ensure the underlying object is +// not mutated while it is being accessed during a state read. + +const ( + // This specifies the limit till which we process all dirty indices for a certain field. + // If we have more dirty indices than the threshold, then we rebuild the whole trie. This + // comes due to the fact that O(alogn) > O(n) beyond a certain value of a. + indicesLimit = 8000 +) + +// SetGenesisTime for the beacon state. +func (b *BeaconState) SetGenesisTime(val uint64) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisTime = val + b.markFieldAsDirty(genesisTime) + return nil +} + +// SetGenesisValidatorRoot for the beacon state. +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisValidatorsRoot = val + b.markFieldAsDirty(genesisValidatorRoot) + return nil +} + +// SetSlot for the beacon state. +func (b *BeaconState) SetSlot(val types.Slot) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Slot = val + b.markFieldAsDirty(slot) + return nil +} + +// SetFork version for the beacon chain. +func (b *BeaconState) SetFork(val *ethpb.Fork) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + fk, ok := proto.Clone(val).(*ethpb.Fork) + if !ok { + return errors.New("proto.Clone did not return a fork proto") + } + b.state.Fork = fk + b.markFieldAsDirty(fork) + return nil +} + +// SetHistoricalRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + + b.state.HistoricalRoots = val + b.markFieldAsDirty(historicalRoots) + return nil +} + +// AppendHistoricalRoots for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendHistoricalRoots(root [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + roots := b.state.HistoricalRoots + if b.sharedFieldReferences[historicalRoots].Refs() > 1 { + roots = make([][]byte, len(b.state.HistoricalRoots)) + copy(roots, b.state.HistoricalRoots) + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + } + + b.state.HistoricalRoots = append(roots, root[:]) + b.markFieldAsDirty(historicalRoots) + return nil +} + +// Recomputes the branch up the index in the Merkle trie representation +// of the beacon state. This method performs slice reads and the caller MUST +// hold the lock before calling this method. +func (b *BeaconState) recomputeRoot(idx int) { + hashFunc := hash.CustomSHA256Hasher() + layers := b.merkleLayers + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + // Using information about the index which changed, idx, we recompute + // only its branch up the tree. + currentIndex := idx + root := b.merkleLayers[0][idx] + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := make([]byte, 32) + if layers[i] != nil && len(layers[i]) != 0 && neighborIdx < len(layers[i]) { + neighbor = layers[i][neighborIdx] + } + if isLeft { + parentHash := hashFunc(append(root, neighbor...)) + root = parentHash[:] + } else { + parentHash := hashFunc(append(neighbor, root...)) + root = parentHash[:] + } + parentIdx := currentIndex / 2 + // Update the cached layers at the parent index. + layers[i+1][parentIdx] = root + currentIndex = parentIdx + } + b.merkleLayers = layers +} + +func (b *BeaconState) markFieldAsDirty(field stateTypes.FieldIndex) { + b.dirtyFields[field] = true +} + +// addDirtyIndices adds the relevant dirty field indices, so that they +// can be recomputed. +func (b *BeaconState) addDirtyIndices(index stateTypes.FieldIndex, indices []uint64) { + if b.rebuildTrie[index] { + return + } + // Exit early if balance trie computation isn't enabled. + if !features.Get().EnableBalanceTrieComputation && index == balances { + return + } + totalIndicesLen := len(b.dirtyIndices[index]) + len(indices) + if totalIndicesLen > indicesLimit { + b.rebuildTrie[index] = true + b.dirtyIndices[index] = []uint64{} + } else { + b.dirtyIndices[index] = append(b.dirtyIndices[index], indices...) + } +} diff --git a/beacon-chain/state-proto/v1/setters_randao.go b/beacon-chain/state-proto/v1/setters_randao.go new file mode 100644 index 0000000000..6fcd8b6fe9 --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_randao.go @@ -0,0 +1,53 @@ +package v1 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetRandaoMixes for the beacon state. Updates the entire +// randao mixes to a new value by overwriting the previous one. +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + + b.state.RandaoMixes = val + b.markFieldAsDirty(randaoMixes) + b.rebuildTrie[randaoMixes] = true + return nil +} + +// UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes +// at a specific index to a new value. +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.RandaoMixes)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + mixes := b.state.RandaoMixes + if refs := b.sharedFieldReferences[randaoMixes].Refs(); refs > 1 { + // Copy elements in underlying array by reference. + mixes = make([][]byte, len(b.state.RandaoMixes)) + copy(mixes, b.state.RandaoMixes) + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + } + + mixes[idx] = val + b.state.RandaoMixes = mixes + b.markFieldAsDirty(randaoMixes) + b.addDirtyIndices(randaoMixes, []uint64{idx}) + + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_state.go b/beacon-chain/state-proto/v1/setters_state.go new file mode 100644 index 0000000000..969333eebf --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_state.go @@ -0,0 +1,59 @@ +package v1 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetStateRoots for the beacon state. Updates the state roots +// to a new value by overwriting the previous value. +func (b *BeaconState) SetStateRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[stateRoots].MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + + b.state.StateRoots = val + b.markFieldAsDirty(stateRoots) + b.rebuildTrie[stateRoots] = true + return nil +} + +// UpdateStateRootAtIndex for the beacon state. Updates the state root +// at a specific index to a new value. +func (b *BeaconState) UpdateStateRootAtIndex(idx uint64, stateRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + + b.lock.RLock() + if uint64(len(b.state.StateRoots)) <= idx { + b.lock.RUnlock() + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.RUnlock() + + b.lock.Lock() + defer b.lock.Unlock() + + // Check if we hold the only reference to the shared state roots slice. + r := b.state.StateRoots + if ref := b.sharedFieldReferences[stateRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.StateRoots)) + copy(r, b.state.StateRoots) + ref.MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + } + + r[idx] = stateRoot[:] + b.state.StateRoots = r + + b.markFieldAsDirty(stateRoots) + b.addDirtyIndices(stateRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v1/setters_validator.go b/beacon-chain/state-proto/v1/setters_validator.go new file mode 100644 index 0000000000..0e987c2b10 --- /dev/null +++ b/beacon-chain/state-proto/v1/setters_validator.go @@ -0,0 +1,228 @@ +package v1 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetValidators for the beacon state. Updates the entire +// to a new value by overwriting the previous one. +func (b *BeaconState) SetValidators(val []*ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = val + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.markFieldAsDirty(validators) + b.rebuildTrie[validators] = true + b.valMapHandler = stateutil.NewValMapHandler(b.state.Validators) + return nil +} + +// ApplyToEveryValidator applies the provided callback function to each validator in the +// validator registry. +func (b *BeaconState) ApplyToEveryValidator(f func(idx int, val *ethpb.Validator) (bool, *ethpb.Validator, error)) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + b.lock.Unlock() + var changedVals []uint64 + for i, val := range v { + changed, newVal, err := f(i, val) + if err != nil { + return err + } + if changed { + changedVals = append(changedVals, uint64(i)) + v[i] = newVal + } + } + + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, changedVals) + + return nil +} + +// UpdateValidatorAtIndex for the beacon state. Updates the validator +// at a specific index to a new value. +func (b *BeaconState) UpdateValidatorAtIndex(idx types.ValidatorIndex, val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + v[idx] = val + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(idx)}) + + return nil +} + +// SetBalances for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBalances(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + + b.state.Balances = val + b.markFieldAsDirty(balances) + b.rebuildTrie[balances] = true + return nil +} + +// UpdateBalancesAtIndex for the beacon state. This method updates the balance +// at a specific index to a new value. +func (b *BeaconState) UpdateBalancesAtIndex(idx types.ValidatorIndex, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Balances)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + bals[idx] = val + b.state.Balances = bals + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(idx)}) + return nil +} + +// SetSlashings for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetSlashings(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + + b.state.Slashings = val + b.markFieldAsDirty(slashings) + return nil +} + +// UpdateSlashingsAtIndex for the beacon state. Updates the slashings +// at a specific index to a new value. +func (b *BeaconState) UpdateSlashingsAtIndex(idx, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Slashings)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + s := b.state.Slashings + if b.sharedFieldReferences[slashings].Refs() > 1 { + s = b.slashings() + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + } + + s[idx] = val + + b.state.Slashings = s + + b.markFieldAsDirty(slashings) + return nil +} + +// AppendValidator for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendValidator(val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + vals := b.state.Validators + if b.sharedFieldReferences[validators].Refs() > 1 { + vals = b.validatorsReferences() + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + // append validator to slice + b.state.Validators = append(vals, val) + valIdx := types.ValidatorIndex(len(b.state.Validators) - 1) + + b.valMapHandler.Set(bytesutil.ToBytes48(val.PublicKey), valIdx) + + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(valIdx)}) + return nil +} + +// AppendBalance for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendBalance(bal uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + b.state.Balances = append(bals, bal) + balIdx := len(b.state.Balances) - 1 + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(balIdx)}) + return nil +} diff --git a/beacon-chain/state-proto/v1/state_test.go b/beacon-chain/state-proto/v1/state_test.go new file mode 100644 index 0000000000..d73a4cd5e1 --- /dev/null +++ b/beacon-chain/state-proto/v1/state_test.go @@ -0,0 +1,193 @@ +package v1 + +import ( + "context" + "strconv" + "sync" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" +) + +func TestValidatorMap_DistinctCopy(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + handler := stateutil.NewValMapHandler(vals) + newHandler := handler.Copy() + wantedPubkey := strconv.Itoa(22) + handler.Set(bytesutil.ToBytes48([]byte(wantedPubkey)), 27) + val1, _ := handler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + val2, _ := newHandler.Get(bytesutil.ToBytes48([]byte(wantedPubkey))) + assert.NotEqual(t, val1, val2, "Values are supposed to be unequal due to copy") +} + +func TestBeaconState_NoDeadlock(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + } + st, err := InitializeFromProtoUnsafe(ðpb.BeaconState{ + Validators: vals, + }) + assert.NoError(t, err) + + wg := new(sync.WaitGroup) + + wg.Add(1) + go func() { + // Continuously lock and unlock the state + // by acquiring the lock. + for i := 0; i < 1000; i++ { + for _, f := range st.stateFieldLeaves { + f.Lock() + if f.Empty() { + f.InsertFieldLayer(make([][]*[32]byte, 10)) + } + f.Unlock() + f.FieldReference().AddRef() + } + } + wg.Done() + }() + // Constantly read from the offending portion + // of the code to ensure there is no possible + // recursive read locking. + for i := 0; i < 1000; i++ { + go func() { + _ = st.FieldReferencesCount() + }() + } + // Test will not terminate in the event of a deadlock. + wg.Wait() +} + +func TestStateTrie_IsNil(t *testing.T) { + var emptyState *BeaconState + assert.Equal(t, true, emptyState.IsNil()) + + emptyProto := &BeaconState{state: nil} + assert.Equal(t, true, emptyProto.IsNil()) + + nonNilState := &BeaconState{state: ðpb.BeaconState{}} + assert.Equal(t, false, nonNilState.IsNil()) +} + +func TestBeaconState_AppendBalanceWithTrie(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + bals := make([]uint64, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + bals = append(bals, params.BeaconConfig().MaxEffectiveBalance) + } + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + st, err := InitializeFromProto(ðpb.BeaconState{ + Slot: 1, + GenesisValidatorsRoot: make([]byte, 32), + Fork: ðpb.Fork{ + PreviousVersion: make([]byte, 4), + CurrentVersion: make([]byte, 4), + Epoch: 0, + }, + LatestBlockHeader: ðpb.BeaconBlockHeader{ + ParentRoot: make([]byte, fieldparams.RootLength), + StateRoot: make([]byte, fieldparams.RootLength), + BodyRoot: make([]byte, fieldparams.RootLength), + }, + Validators: vals, + Balances: bals, + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, 32), + BlockHash: make([]byte, 32), + }, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + JustificationBits: bitfield.NewBitvector4(), + PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + FinalizedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + Slashings: make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector), + }) + assert.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + + for i := 0; i < 100; i++ { + if i%2 == 0 { + assert.NoError(t, st.UpdateBalancesAtIndex(types.ValidatorIndex(i), 1000)) + } + if i%3 == 0 { + assert.NoError(t, st.AppendBalance(1000)) + } + } + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + newRt := bytesutil.ToBytes32(st.merkleLayers[0][balances]) + wantedRt, err := stateutil.Uint64ListRootWithRegistryLimit(st.state.Balances) + assert.NoError(t, err) + assert.Equal(t, wantedRt, newRt, "state roots are unequal") +} diff --git a/beacon-chain/state-proto/v1/state_trie.go b/beacon-chain/state-proto/v1/state_trie.go new file mode 100644 index 0000000000..b53fc99435 --- /dev/null +++ b/beacon-chain/state-proto/v1/state_trie.go @@ -0,0 +1,418 @@ +package v1 + +import ( + "context" + "runtime" + "sort" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/features" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/container/slice" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "go.opencensus.io/trace" + "google.golang.org/protobuf/proto" +) + +// InitializeFromProto the beacon state from a protobuf representation. +func InitializeFromProto(st *ethpb.BeaconState) (*BeaconState, error) { + return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconState)) +} + +// InitializeFromProtoUnsafe directly uses the beacon state protobuf pointer +// and sets it as the inner state of the BeaconState type. +func InitializeFromProtoUnsafe(st *ethpb.BeaconState) (*BeaconState, error) { + if st == nil { + return nil, errors.New("received nil state") + } + + fieldCount := params.BeaconConfig().BeaconStateFieldCount + b := &BeaconState{ + state: st, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 10), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + valMapHandler: stateutil.NewValMapHandler(st.Validators), + } + + var err error + for i := 0; i < fieldCount; i++ { + b.dirtyFields[types.FieldIndex(i)] = true + b.rebuildTrie[types.FieldIndex(i)] = true + b.dirtyIndices[types.FieldIndex(i)] = []uint64{} + b.stateFieldLeaves[types.FieldIndex(i)], err = fieldtrie.NewFieldTrie(types.FieldIndex(i), types.BasicArray, nil, 0) + if err != nil { + return nil, err + } + } + + // Initialize field reference tracking for shared data. + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[previousEpochAttestations] = stateutil.NewRef(1) + b.sharedFieldReferences[currentEpochAttestations] = stateutil.NewRef(1) + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + + sharedstate.StateCount.Inc() + return b, nil +} + +// Copy returns a deep copy of the beacon state. +func (b *BeaconState) Copy() state.BeaconState { + if !b.hasInnerState() { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + fieldCount := params.BeaconConfig().BeaconStateFieldCount + dst := &BeaconState{ + state: ðpb.BeaconState{ + // Primitive types, safe to copy. + GenesisTime: b.state.GenesisTime, + Slot: b.state.Slot, + Eth1DepositIndex: b.state.Eth1DepositIndex, + + // Large arrays, infrequently changed, constant size. + RandaoMixes: b.state.RandaoMixes, + StateRoots: b.state.StateRoots, + BlockRoots: b.state.BlockRoots, + PreviousEpochAttestations: b.state.PreviousEpochAttestations, + CurrentEpochAttestations: b.state.CurrentEpochAttestations, + Slashings: b.state.Slashings, + Eth1DataVotes: b.state.Eth1DataVotes, + + // Large arrays, increases over time. + Validators: b.state.Validators, + Balances: b.state.Balances, + HistoricalRoots: b.state.HistoricalRoots, + + // Everything else, too small to be concerned about, constant size. + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + Eth1Data: b.eth1Data(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + }, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 10), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + + // Share the reference to validator index map. + valMapHandler: b.valMapHandler, + } + + for field, ref := range b.sharedFieldReferences { + ref.AddRef() + dst.sharedFieldReferences[field] = ref + } + + // Increment ref for validator map + b.valMapHandler.AddRef() + + for i := range b.dirtyFields { + dst.dirtyFields[i] = true + } + + for i := range b.dirtyIndices { + indices := make([]uint64, len(b.dirtyIndices[i])) + copy(indices, b.dirtyIndices[i]) + dst.dirtyIndices[i] = indices + } + + for i := range b.rebuildTrie { + dst.rebuildTrie[i] = true + } + + for fldIdx, fieldTrie := range b.stateFieldLeaves { + dst.stateFieldLeaves[fldIdx] = fieldTrie + if fieldTrie.FieldReference() != nil { + fieldTrie.Lock() + fieldTrie.FieldReference().AddRef() + fieldTrie.Unlock() + } + } + + if b.merkleLayers != nil { + dst.merkleLayers = make([][][]byte, len(b.merkleLayers)) + for i, layer := range b.merkleLayers { + dst.merkleLayers[i] = make([][]byte, len(layer)) + for j, content := range layer { + dst.merkleLayers[i][j] = make([]byte, len(content)) + copy(dst.merkleLayers[i][j], content) + } + } + } + + sharedstate.StateCount.Inc() + // Finalizer runs when dst is being destroyed in garbage collection. + runtime.SetFinalizer(dst, func(b *BeaconState) { + for field, v := range b.sharedFieldReferences { + v.MinusRef() + if b.stateFieldLeaves[field].FieldReference() != nil { + b.stateFieldLeaves[field].FieldReference().MinusRef() + } + + } + for i := 0; i < fieldCount; i++ { + field := types.FieldIndex(i) + delete(b.stateFieldLeaves, field) + delete(b.dirtyIndices, field) + delete(b.dirtyFields, field) + delete(b.sharedFieldReferences, field) + delete(b.stateFieldLeaves, field) + } + sharedstate.StateCount.Sub(1) + }) + return dst +} + +// HashTreeRoot of the beacon state retrieves the Merkle root of the trie +// representation of the beacon state based on the Ethereum Simple Serialize specification. +func (b *BeaconState) HashTreeRoot(ctx context.Context) ([32]byte, error) { + ctx, span := trace.StartSpan(ctx, "beaconState.HashTreeRoot") + defer span.End() + + b.lock.Lock() + defer b.lock.Unlock() + + if b.merkleLayers == nil || len(b.merkleLayers) == 0 { + fieldRoots, err := computeFieldRoots(ctx, b.state) + if err != nil { + return [32]byte{}, err + } + layers := stateutil.Merkleize(fieldRoots) + b.merkleLayers = layers + b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateFieldCount) + } + + for field := range b.dirtyFields { + root, err := b.rootSelector(ctx, field) + if err != nil { + return [32]byte{}, err + } + b.merkleLayers[0][field] = root[:] + b.recomputeRoot(int(field)) + delete(b.dirtyFields, field) + } + return bytesutil.ToBytes32(b.merkleLayers[len(b.merkleLayers)-1][0]), nil +} + +// FieldReferencesCount returns the reference count held by each field. This +// also includes the field trie held by each field. +func (b *BeaconState) FieldReferencesCount() map[string]uint64 { + refMap := make(map[string]uint64) + b.lock.RLock() + defer b.lock.RUnlock() + for i, f := range b.sharedFieldReferences { + refMap[i.String(b.Version())] = uint64(f.Refs()) + } + for i, f := range b.stateFieldLeaves { + numOfRefs := uint64(f.FieldReference().Refs()) + f.RLock() + if !f.Empty() { + refMap[i.String(b.Version())+"_trie"] = numOfRefs + } + f.RUnlock() + } + return refMap +} + +// IsNil checks if the state and the underlying proto +// object are nil. +func (b *BeaconState) IsNil() bool { + return b == nil || b.state == nil +} + +func (b *BeaconState) rootSelector(ctx context.Context, field types.FieldIndex) ([32]byte, error) { + _, span := trace.StartSpan(ctx, "beaconState.rootSelector") + defer span.End() + span.AddAttributes(trace.StringAttribute("field", field.String(b.Version()))) + + hasher := hash.CustomSHA256Hasher() + switch field { + case genesisTime: + return ssz.Uint64Root(b.state.GenesisTime), nil + case genesisValidatorRoot: + return bytesutil.ToBytes32(b.state.GenesisValidatorsRoot), nil + case slot: + return ssz.Uint64Root(uint64(b.state.Slot)), nil + case eth1DepositIndex: + return ssz.Uint64Root(b.state.Eth1DepositIndex), nil + case fork: + return ssz.ForkRoot(b.state.Fork) + case latestBlockHeader: + return stateutil.BlockHeaderRoot(b.state.LatestBlockHeader) + case blockRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.BlockRoots, fieldparams.BlockRootsLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(blockRoots, b.state.BlockRoots) + case stateRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.StateRoots, fieldparams.StateRootsLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(stateRoots, b.state.StateRoots) + case historicalRoots: + return ssz.ByteArrayRootWithLimit(b.state.HistoricalRoots, fieldparams.HistoricalRootsLength) + case eth1Data: + return stateutil.Eth1Root(hasher, b.state.Eth1Data) + case eth1DataVotes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie( + field, + b.state.Eth1DataVotes, + fieldparams.Eth1DataVotesLength, + ) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(field, b.state.Eth1DataVotes) + case validators: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.Validators, fieldparams.ValidatorRegistryLimit) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, validators) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(validators, b.state.Validators) + case balances: + if features.Get().EnableBalanceTrieComputation { + if b.rebuildTrie[field] { + maxBalCap := uint64(fieldparams.ValidatorRegistryLimit) + elemSize := uint64(8) + balLimit := (maxBalCap*elemSize + 31) / 32 + err := b.resetFieldTrie(field, b.state.Balances, balLimit) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(balances, b.state.Balances) + } + return stateutil.Uint64ListRootWithRegistryLimit(b.state.Balances) + case randaoMixes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.RandaoMixes, fieldparams.RandaoMixesLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(randaoMixes, b.state.RandaoMixes) + case slashings: + return ssz.SlashingsRoot(b.state.Slashings) + case previousEpochAttestations: + if b.rebuildTrie[field] { + err := b.resetFieldTrie( + field, + b.state.PreviousEpochAttestations, + fieldparams.PreviousEpochAttestationsLength, + ) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(field, b.state.PreviousEpochAttestations) + case currentEpochAttestations: + if b.rebuildTrie[field] { + err := b.resetFieldTrie( + field, + b.state.CurrentEpochAttestations, + fieldparams.CurrentEpochAttestationsLength, + ) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(field, b.state.CurrentEpochAttestations) + case justificationBits: + return bytesutil.ToBytes32(b.state.JustificationBits), nil + case previousJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.PreviousJustifiedCheckpoint) + case currentJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.CurrentJustifiedCheckpoint) + case finalizedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.FinalizedCheckpoint) + } + return [32]byte{}, errors.New("invalid field index provided") +} + +func (b *BeaconState) recomputeFieldTrie(index types.FieldIndex, elements interface{}) ([32]byte, error) { + fTrie := b.stateFieldLeaves[index] + // We can't lock the trie directly because the trie's variable gets reassigned, + // and therefore we would call Unlock() on a different object. + fTrieMutex := fTrie.RWMutex + if fTrie.FieldReference().Refs() > 1 { + fTrieMutex.Lock() + fTrie.FieldReference().MinusRef() + newTrie := fTrie.CopyTrie() + b.stateFieldLeaves[index] = newTrie + fTrie = newTrie + fTrieMutex.Unlock() + } + // remove duplicate indexes + b.dirtyIndices[index] = slice.SetUint64(b.dirtyIndices[index]) + // sort indexes again + sort.Slice(b.dirtyIndices[index], func(i int, j int) bool { + return b.dirtyIndices[index][i] < b.dirtyIndices[index][j] + }) + root, err := fTrie.RecomputeTrie(b.dirtyIndices[index], elements) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[index] = []uint64{} + return root, nil +} + +func (b *BeaconState) resetFieldTrie(index types.FieldIndex, elements interface{}, length uint64) error { + fTrie, err := fieldtrie.NewFieldTrie(index, fieldMap[index], elements, length) + if err != nil { + return err + } + b.stateFieldLeaves[index] = fTrie + b.dirtyIndices[index] = []uint64{} + return nil +} diff --git a/beacon-chain/state-proto/v1/state_trie_test.go b/beacon-chain/state-proto/v1/state_trie_test.go new file mode 100644 index 0000000000..7c936c7013 --- /dev/null +++ b/beacon-chain/state-proto/v1/state_trie_test.go @@ -0,0 +1,260 @@ +package v1_test + +import ( + "bytes" + "context" + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestMain(m *testing.M) { + resetCfg := features.InitWithReset(&features.Flags{EnableBalanceTrieComputation: true}) + defer resetCfg() + m.Run() +} + +func TestInitializeFromProto(t *testing.T) { + testState, _ := util.DeterministicGenesisState(t, 64) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) + require.NoError(t, err) + type test struct { + name string + state *ethpb.BeaconState + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconState{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconState{}, + }, + { + name: "full state", + state: pbState, + }, + } + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + _, err := v1.InitializeFromProto(tt.state) + if tt.error != "" { + assert.ErrorContains(t, tt.error, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestInitializeFromProtoUnsafe(t *testing.T) { + testState, _ := util.DeterministicGenesisState(t, 64) + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) + require.NoError(t, err) + type test struct { + name string + state *ethpb.BeaconState + error string + } + initTests := []test{ + { + name: "nil state", + state: nil, + error: "received nil state", + }, + { + name: "nil validators", + state: ðpb.BeaconState{ + Slot: 4, + Validators: nil, + }, + }, + { + name: "empty state", + state: ðpb.BeaconState{}, + }, + { + name: "full state", + state: pbState, + }, + } + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + _, err := v1.InitializeFromProtoUnsafe(tt.state) + if tt.error != "" { + assert.ErrorContains(t, tt.error, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestBeaconState_HashTreeRoot(t *testing.T) { + testState, _ := util.DeterministicGenesisState(t, 64) + + type test struct { + name string + stateModify func(beaconState state.BeaconState) (state.BeaconState, error) + error string + } + initTests := []test{ + { + name: "unchanged state", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + return beaconState, nil + }, + error: "", + }, + { + name: "different slot", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + if err := beaconState.SetSlot(5); err != nil { + return nil, err + } + return beaconState, nil + }, + error: "", + }, + { + name: "different validator balance", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + val, err := beaconState.ValidatorAtIndex(5) + if err != nil { + return nil, err + } + val.EffectiveBalance = params.BeaconConfig().MaxEffectiveBalance - params.BeaconConfig().EffectiveBalanceIncrement + if err := beaconState.UpdateValidatorAtIndex(5, val); err != nil { + return nil, err + } + return beaconState, nil + }, + error: "", + }, + } + + var err error + var oldHTR []byte + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + testState, err = tt.stateModify(testState) + assert.NoError(t, err) + root, err := testState.HashTreeRoot(context.Background()) + if err == nil && tt.error != "" { + t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) + } + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) + require.NoError(t, err) + genericHTR, err := pbState.HashTreeRoot() + if err == nil && tt.error != "" { + t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) + } + assert.DeepNotEqual(t, []byte{}, root[:], "Received empty hash tree root") + assert.DeepEqual(t, genericHTR[:], root[:], "Expected hash tree root to match generic") + if len(oldHTR) != 0 && bytes.Equal(root[:], oldHTR) { + t.Errorf("Expected HTR to change, received %#x == old %#x", root, oldHTR) + } + oldHTR = root[:] + }) + } +} + +func TestBeaconState_HashTreeRoot_FieldTrie(t *testing.T) { + testState, _ := util.DeterministicGenesisState(t, 64) + + type test struct { + name string + stateModify func(state.BeaconState) (state.BeaconState, error) + error string + } + initTests := []test{ + { + name: "unchanged state", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + return beaconState, nil + }, + error: "", + }, + { + name: "different slot", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + if err := beaconState.SetSlot(5); err != nil { + return nil, err + } + return beaconState, nil + }, + error: "", + }, + { + name: "different validator balance", + stateModify: func(beaconState state.BeaconState) (state.BeaconState, error) { + val, err := beaconState.ValidatorAtIndex(5) + if err != nil { + return nil, err + } + val.EffectiveBalance = params.BeaconConfig().MaxEffectiveBalance - params.BeaconConfig().EffectiveBalanceIncrement + if err := beaconState.UpdateValidatorAtIndex(5, val); err != nil { + return nil, err + } + return beaconState, nil + }, + error: "", + }, + } + + var err error + var oldHTR []byte + for _, tt := range initTests { + t.Run(tt.name, func(t *testing.T) { + testState, err = tt.stateModify(testState) + assert.NoError(t, err) + root, err := testState.HashTreeRoot(context.Background()) + if err == nil && tt.error != "" { + t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) + } + pbState, err := v1.ProtobufBeaconState(testState.InnerStateUnsafe()) + require.NoError(t, err) + genericHTR, err := pbState.HashTreeRoot() + if err == nil && tt.error != "" { + t.Errorf("Expected error, expected %v, recevied %v", tt.error, err) + } + assert.DeepNotEqual(t, []byte{}, root[:], "Received empty hash tree root") + assert.DeepEqual(t, genericHTR[:], root[:], "Expected hash tree root to match generic") + if len(oldHTR) != 0 && bytes.Equal(root[:], oldHTR) { + t.Errorf("Expected HTR to change, received %#x == old %#x", root, oldHTR) + } + oldHTR = root[:] + }) + } +} + +func TestBeaconState_AppendValidator_DoesntMutateCopy(t *testing.T) { + st0, err := util.NewBeaconState() + require.NoError(t, err) + st1 := st0.Copy() + originalCount := st1.NumValidators() + + val := ðpb.Validator{Slashed: true} + assert.NoError(t, st0.AppendValidator(val)) + assert.Equal(t, originalCount, st1.NumValidators(), "st1 NumValidators mutated") + _, ok := st1.ValidatorIndexByPubkey(bytesutil.ToBytes48(val.PublicKey)) + assert.Equal(t, false, ok, "Expected no validator index to be present in st1 for the newly inserted pubkey") +} diff --git a/beacon-chain/state-proto/v1/types.go b/beacon-chain/state-proto/v1/types.go new file mode 100644 index 0000000000..08fc54b6e4 --- /dev/null +++ b/beacon-chain/state-proto/v1/types.go @@ -0,0 +1,78 @@ +package v1 + +import ( + "sync" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// Ensure type BeaconState below implements BeaconState interface. +var _ state.BeaconState = (*BeaconState)(nil) + +func init() { + fieldMap = make(map[types.FieldIndex]types.DataType, params.BeaconConfig().BeaconStateFieldCount) + // Initialize the fixed sized arrays. + fieldMap[types.BlockRoots] = types.BasicArray + fieldMap[types.StateRoots] = types.BasicArray + fieldMap[types.RandaoMixes] = types.BasicArray + + // Initialize the composite arrays. + fieldMap[types.Eth1DataVotes] = types.CompositeArray + fieldMap[types.Validators] = types.CompositeArray + fieldMap[types.PreviousEpochAttestations] = types.CompositeArray + fieldMap[types.CurrentEpochAttestations] = types.CompositeArray + fieldMap[types.Balances] = types.CompressedArray +} + +// fieldMap keeps track of each field +// to its corresponding data type. +var fieldMap map[types.FieldIndex]types.DataType + +// ErrNilInnerState returns when the inner state is nil and no copy set or get +// operations can be performed on state. +var ErrNilInnerState = errors.New("nil inner state") + +// BeaconState defines a struct containing utilities for the Ethereum Beacon Chain state, defining +// getters and setters for its respective values and helpful functions such as HashTreeRoot(). +type BeaconState struct { + state *ethpb.BeaconState + lock sync.RWMutex + dirtyFields map[types.FieldIndex]bool + dirtyIndices map[types.FieldIndex][]uint64 + stateFieldLeaves map[types.FieldIndex]*fieldtrie.FieldTrie + rebuildTrie map[types.FieldIndex]bool + valMapHandler *stateutil.ValidatorMapHandler + merkleLayers [][][]byte + sharedFieldReferences map[types.FieldIndex]*stateutil.Reference +} + +// Field Aliases for values from the types package. +const ( + genesisTime = types.GenesisTime + genesisValidatorRoot = types.GenesisValidatorRoot + slot = types.Slot + fork = types.Fork + latestBlockHeader = types.LatestBlockHeader + blockRoots = types.BlockRoots + stateRoots = types.StateRoots + historicalRoots = types.HistoricalRoots + eth1Data = types.Eth1Data + eth1DataVotes = types.Eth1DataVotes + eth1DepositIndex = types.Eth1DepositIndex + validators = types.Validators + balances = types.Balances + randaoMixes = types.RandaoMixes + slashings = types.Slashings + previousEpochAttestations = types.PreviousEpochAttestations + currentEpochAttestations = types.CurrentEpochAttestations + justificationBits = types.JustificationBits + previousJustifiedCheckpoint = types.PreviousJustifiedCheckpoint + currentJustifiedCheckpoint = types.CurrentJustifiedCheckpoint + finalizedCheckpoint = types.FinalizedCheckpoint +) diff --git a/beacon-chain/state-proto/v1/types_test.go b/beacon-chain/state-proto/v1/types_test.go new file mode 100644 index 0000000000..316c52a6b8 --- /dev/null +++ b/beacon-chain/state-proto/v1/types_test.go @@ -0,0 +1,231 @@ +package v1_test + +import ( + "context" + "reflect" + "strconv" + "testing" + + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/interop" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" + log "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" +) + +func TestBeaconState_ProtoBeaconStateCompatibility(t *testing.T) { + params.SetupTestConfigCleanup(t) + params.OverrideBeaconConfig(params.MinimalSpecConfig()) + ctx := context.Background() + genesis := setupGenesisState(t, 64) + customState, err := v1.InitializeFromProto(genesis) + require.NoError(t, err) + cloned, ok := proto.Clone(genesis).(*ethpb.BeaconState) + assert.Equal(t, true, ok, "Object is not of type *ethpb.BeaconState") + custom := customState.CloneInnerState() + assert.DeepSSZEqual(t, cloned, custom) + + r1, err := customState.HashTreeRoot(ctx) + require.NoError(t, err) + beaconState, err := v1.InitializeFromProto(genesis) + require.NoError(t, err) + r2, err := beaconState.HashTreeRoot(context.Background()) + require.NoError(t, err) + assert.Equal(t, r1, r2, "Mismatched roots") + + // We then write to the the state and compare hash tree roots again. + balances := genesis.Balances + balances[0] = 3823 + require.NoError(t, customState.SetBalances(balances)) + r1, err = customState.HashTreeRoot(ctx) + require.NoError(t, err) + genesis.Balances = balances + beaconState, err = v1.InitializeFromProto(genesis) + require.NoError(t, err) + r2, err = beaconState.HashTreeRoot(context.Background()) + require.NoError(t, err) + assert.Equal(t, r1, r2, "Mismatched roots") +} + +func setupGenesisState(tb testing.TB, count uint64) *ethpb.BeaconState { + genesisState, _, err := interop.GenerateGenesisState(context.Background(), 0, count) + require.NoError(tb, err, "Could not generate genesis beacon state") + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + genesisState.Validators = append(genesisState.Validators, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + genesisState.Balances = append(genesisState.Balances, params.BeaconConfig().MaxEffectiveBalance) + } + return genesisState +} + +func BenchmarkCloneValidators_Proto(b *testing.B) { + b.StopTimer() + validators := make([]*ethpb.Validator, 16384) + somePubKey := [48]byte{1, 2, 3} + someRoot := [32]byte{3, 4, 5} + for i := 0; i < len(validators); i++ { + validators[i] = ðpb.Validator{ + PublicKey: somePubKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: params.BeaconConfig().FarFutureEpoch, + ActivationEpoch: 3, + ExitEpoch: 4, + WithdrawableEpoch: 5, + } + } + b.StartTimer() + for i := 0; i < b.N; i++ { + cloneValidatorsWithProto(validators) + } +} + +func BenchmarkCloneValidators_Manual(b *testing.B) { + b.StopTimer() + validators := make([]*ethpb.Validator, 16384) + somePubKey := [48]byte{1, 2, 3} + someRoot := [32]byte{3, 4, 5} + for i := 0; i < len(validators); i++ { + validators[i] = ðpb.Validator{ + PublicKey: somePubKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: params.BeaconConfig().FarFutureEpoch, + ActivationEpoch: 3, + ExitEpoch: 4, + WithdrawableEpoch: 5, + } + } + b.StartTimer() + for i := 0; i < b.N; i++ { + cloneValidatorsManually(validators) + } +} + +func BenchmarkStateClone_Proto(b *testing.B) { + b.StopTimer() + params.SetupTestConfigCleanup(b) + params.OverrideBeaconConfig(params.MinimalSpecConfig()) + genesis := setupGenesisState(b, 64) + b.StartTimer() + for i := 0; i < b.N; i++ { + _, ok := proto.Clone(genesis).(*ethpb.BeaconState) + assert.Equal(b, true, ok, "Entity is not of type *ethpb.BeaconState") + } +} + +func BenchmarkStateClone_Manual(b *testing.B) { + b.StopTimer() + params.SetupTestConfigCleanup(b) + params.OverrideBeaconConfig(params.MinimalSpecConfig()) + genesis := setupGenesisState(b, 64) + st, err := v1.InitializeFromProto(genesis) + require.NoError(b, err) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = st.CloneInnerState() + } +} + +func cloneValidatorsWithProto(vals []*ethpb.Validator) []*ethpb.Validator { + var ok bool + res := make([]*ethpb.Validator, len(vals)) + for i := 0; i < len(res); i++ { + res[i], ok = proto.Clone(vals[i]).(*ethpb.Validator) + if !ok { + log.Debug("Entity is not of type *ethpb.Validator") + } + } + return res +} + +func cloneValidatorsManually(vals []*ethpb.Validator) []*ethpb.Validator { + res := make([]*ethpb.Validator, len(vals)) + for i := 0; i < len(res); i++ { + val := vals[i] + res[i] = ðpb.Validator{ + PublicKey: val.PublicKey, + WithdrawalCredentials: val.WithdrawalCredentials, + EffectiveBalance: val.EffectiveBalance, + Slashed: val.Slashed, + ActivationEligibilityEpoch: val.ActivationEligibilityEpoch, + ActivationEpoch: val.ActivationEpoch, + ExitEpoch: val.ExitEpoch, + WithdrawableEpoch: val.WithdrawableEpoch, + } + } + return res +} + +func TestBeaconState_ImmutabilityWithSharedResources(t *testing.T) { + params.SetupTestConfigCleanup(t) + params.OverrideBeaconConfig(params.MinimalSpecConfig()) + genesis := setupGenesisState(t, 64) + a, err := v1.InitializeFromProto(genesis) + require.NoError(t, err) + b := a.Copy() + + // Randao mixes + require.DeepEqual(t, a.RandaoMixes(), b.RandaoMixes(), "Test precondition failed, fields are not equal") + require.NoError(t, a.UpdateRandaoMixesAtIndex(1, []byte("foo"))) + if reflect.DeepEqual(a.RandaoMixes(), b.RandaoMixes()) { + t.Error("Expect a.RandaoMixes() to be different from b.RandaoMixes()") + } + + // Validators + require.DeepEqual(t, a.Validators(), b.Validators(), "Test precondition failed, fields are not equal") + require.NoError(t, a.UpdateValidatorAtIndex(1, ðpb.Validator{Slashed: true})) + if reflect.DeepEqual(a.Validators(), b.Validators()) { + t.Error("Expect a.Validators() to be different from b.Validators()") + } + + // State Roots + require.DeepEqual(t, a.StateRoots(), b.StateRoots(), "Test precondition failed, fields are not equal") + require.NoError(t, a.UpdateStateRootAtIndex(1, bytesutil.ToBytes32([]byte("foo")))) + if reflect.DeepEqual(a.StateRoots(), b.StateRoots()) { + t.Fatal("Expected a.StateRoots() to be different from b.StateRoots()") + } + + // Block Roots + require.DeepEqual(t, a.BlockRoots(), b.BlockRoots(), "Test precondition failed, fields are not equal") + require.NoError(t, a.UpdateBlockRootAtIndex(1, bytesutil.ToBytes32([]byte("foo")))) + if reflect.DeepEqual(a.BlockRoots(), b.BlockRoots()) { + t.Fatal("Expected a.BlockRoots() to be different from b.BlockRoots()") + } +} + +func TestForkManualCopy_OK(t *testing.T) { + params.SetupTestConfigCleanup(t) + params.OverrideBeaconConfig(params.MinimalSpecConfig()) + genesis := setupGenesisState(t, 64) + a, err := v1.InitializeFromProto(genesis) + require.NoError(t, err) + wantedFork := ðpb.Fork{ + PreviousVersion: []byte{'a', 'b', 'c'}, + CurrentVersion: []byte{'d', 'e', 'f'}, + Epoch: 0, + } + require.NoError(t, a.SetFork(wantedFork)) + + pbState, err := v1.ProtobufBeaconState(a.InnerStateUnsafe()) + require.NoError(t, err) + require.DeepEqual(t, pbState.Fork, wantedFork) +} diff --git a/beacon-chain/state-proto/v1/unsupported_getters.go b/beacon-chain/state-proto/v1/unsupported_getters.go new file mode 100644 index 0000000000..3717aab456 --- /dev/null +++ b/beacon-chain/state-proto/v1/unsupported_getters.go @@ -0,0 +1,36 @@ +package v1 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// CurrentEpochParticipation is not supported for phase 0 beacon state. +func (*BeaconState) CurrentEpochParticipation() ([]byte, error) { + return nil, errors.New("CurrentEpochParticipation is not supported for phase 0 beacon state") +} + +// PreviousEpochParticipation is not supported for phase 0 beacon state. +func (*BeaconState) PreviousEpochParticipation() ([]byte, error) { + return nil, errors.New("PreviousEpochParticipation is not supported for phase 0 beacon state") +} + +// InactivityScores is not supported for phase 0 beacon state. +func (*BeaconState) InactivityScores() ([]uint64, error) { + return nil, errors.New("InactivityScores is not supported for phase 0 beacon state") +} + +// CurrentSyncCommittee is not supported for phase 0 beacon state. +func (*BeaconState) CurrentSyncCommittee() (*ethpb.SyncCommittee, error) { + return nil, errors.New("CurrentSyncCommittee is not supported for phase 0 beacon state") +} + +// NextSyncCommittee is not supported for phase 0 beacon state. +func (*BeaconState) NextSyncCommittee() (*ethpb.SyncCommittee, error) { + return nil, errors.New("NextSyncCommittee is not supported for phase 0 beacon state") +} + +// LatestExecutionPayloadHeader is not supported for phase 0 beacon state. +func (*BeaconState) LatestExecutionPayloadHeader() (*ethpb.ExecutionPayloadHeader, error) { + return nil, errors.New("LatestExecutionPayloadHeader is not supported for phase 0 beacon state") +} diff --git a/beacon-chain/state-proto/v1/unsupported_setters.go b/beacon-chain/state-proto/v1/unsupported_setters.go new file mode 100644 index 0000000000..251253519a --- /dev/null +++ b/beacon-chain/state-proto/v1/unsupported_setters.go @@ -0,0 +1,51 @@ +package v1 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// AppendCurrentParticipationBits is not supported for phase 0 beacon state. +func (*BeaconState) AppendCurrentParticipationBits(_ byte) error { + return errors.New("AppendCurrentParticipationBits is not supported for phase 0 beacon state") +} + +// AppendPreviousParticipationBits is not supported for phase 0 beacon state. +func (*BeaconState) AppendPreviousParticipationBits(_ byte) error { + return errors.New("AppendPreviousParticipationBits is not supported for phase 0 beacon state") +} + +// AppendInactivityScore is not supported for phase 0 beacon state. +func (*BeaconState) AppendInactivityScore(_ uint64) error { + return errors.New("AppendInactivityScore is not supported for phase 0 beacon state") +} + +// SetCurrentSyncCommittee is not supported for phase 0 beacon state. +func (*BeaconState) SetCurrentSyncCommittee(_ *ethpb.SyncCommittee) error { + return errors.New("SetCurrentSyncCommittee is not supported for phase 0 beacon state") +} + +// SetNextSyncCommittee is not supported for phase 0 beacon state. +func (*BeaconState) SetNextSyncCommittee(_ *ethpb.SyncCommittee) error { + return errors.New("SetNextSyncCommittee is not supported for phase 0 beacon state") +} + +// SetPreviousParticipationBits is not supported for phase 0 beacon state. +func (*BeaconState) SetPreviousParticipationBits(_ []byte) error { + return errors.New("SetPreviousParticipationBits is not supported for phase 0 beacon state") +} + +// SetCurrentParticipationBits is not supported for phase 0 beacon state. +func (*BeaconState) SetCurrentParticipationBits(_ []byte) error { + return errors.New("SetCurrentParticipationBits is not supported for phase 0 beacon state") +} + +// SetInactivityScores is not supported for phase 0 beacon state. +func (*BeaconState) SetInactivityScores(_ []uint64) error { + return errors.New("SetInactivityScores is not supported for phase 0 beacon state") +} + +// SetLatestExecutionPayloadHeader is not supported for phase 0 beacon state. +func (*BeaconState) SetLatestExecutionPayloadHeader(val *ethpb.ExecutionPayloadHeader) error { + return errors.New("SetLatestExecutionPayloadHeader is not supported for phase 0 beacon state") +} diff --git a/beacon-chain/state-proto/v2/BUILD.bazel b/beacon-chain/state-proto/v2/BUILD.bazel new file mode 100644 index 0000000000..80437bbcb2 --- /dev/null +++ b/beacon-chain/state-proto/v2/BUILD.bazel @@ -0,0 +1,92 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "deprecated_getters.go", + "deprecated_setters.go", + "field_roots.go", + "getters_block.go", + "getters_checkpoint.go", + "getters_eth1.go", + "getters_misc.go", + "getters_participation.go", + "getters_randao.go", + "getters_state.go", + "getters_sync_committee.go", + "getters_validator.go", + "proofs.go", + "setters_block.go", + "setters_checkpoint.go", + "setters_eth1.go", + "setters_misc.go", + "setters_participation.go", + "setters_randao.go", + "setters_state.go", + "setters_sync_committee.go", + "setters_validator.go", + "state_trie.go", + "types.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2", + visibility = [ + "//beacon-chain:__subpackages__", + "//proto/migration:__subpackages__", + "//testing/spectest:__subpackages__", + "//testing/util:__pkg__", + ], + deps = [ + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/fieldtrie:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/slice:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/version:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + "@io_opencensus_go//trace:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "deprecated_getters_test.go", + "deprecated_setters_test.go", + "getters_block_test.go", + "getters_test.go", + "getters_validator_test.go", + "proofs_test.go", + "setters_test.go", + "state_trie_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/trie:go_default_library", + "//crypto/bls:go_default_library", + "//encoding/bytesutil:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + ], +) diff --git a/beacon-chain/state-proto/v2/deprecated_getters.go b/beacon-chain/state-proto/v2/deprecated_getters.go new file mode 100644 index 0000000000..2257b577e8 --- /dev/null +++ b/beacon-chain/state-proto/v2/deprecated_getters.go @@ -0,0 +1,21 @@ +package v2 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// PreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) PreviousEpochAttestations() ([]*ethpb.PendingAttestation, error) { + return nil, errors.New("PreviousEpochAttestations is not supported for hard fork 1 beacon state") +} + +// CurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) CurrentEpochAttestations() ([]*ethpb.PendingAttestation, error) { + return nil, errors.New("CurrentEpochAttestations is not supported for hard fork 1 beacon state") +} + +// LatestExecutionPayloadHeader is not supported for hard fork 1 beacon state. +func (*BeaconState) LatestExecutionPayloadHeader() (*ethpb.ExecutionPayloadHeader, error) { + return nil, errors.New("LatestExecutionPayloadHeader is not supported for hard fork 1 beacon state") +} diff --git a/beacon-chain/state-proto/v2/deprecated_getters_test.go b/beacon-chain/state-proto/v2/deprecated_getters_test.go new file mode 100644 index 0000000000..6e4aafe62d --- /dev/null +++ b/beacon-chain/state-proto/v2/deprecated_getters_test.go @@ -0,0 +1,19 @@ +package v2 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_CurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + _, err := s.CurrentEpochAttestations() + require.ErrorContains(t, "CurrentEpochAttestations is not supported for hard fork 1 beacon state", err) +} + +func TestBeaconState_PreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + _, err := s.PreviousEpochAttestations() + require.ErrorContains(t, "PreviousEpochAttestations is not supported for hard fork 1 beacon state", err) +} diff --git a/beacon-chain/state-proto/v2/deprecated_setters.go b/beacon-chain/state-proto/v2/deprecated_setters.go new file mode 100644 index 0000000000..449bb82098 --- /dev/null +++ b/beacon-chain/state-proto/v2/deprecated_setters.go @@ -0,0 +1,36 @@ +package v2 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetPreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) SetPreviousEpochAttestations(_ []*ethpb.PendingAttestation) error { + return errors.New("SetPreviousEpochAttestations is not supported for hard fork 1 beacon state") +} + +// SetCurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) SetCurrentEpochAttestations(_ []*ethpb.PendingAttestation) error { + return errors.New("SetCurrentEpochAttestations is not supported for hard fork 1 beacon state") +} + +// AppendCurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) AppendCurrentEpochAttestations(_ *ethpb.PendingAttestation) error { + return errors.New("AppendCurrentEpochAttestations is not supported for hard fork 1 beacon state") +} + +// AppendPreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) AppendPreviousEpochAttestations(_ *ethpb.PendingAttestation) error { + return errors.New("AppendPreviousEpochAttestations is not supported for hard fork 1 beacon state") +} + +// RotateAttestations is not supported for HF1 beacon state. +func (*BeaconState) RotateAttestations() error { + return errors.New("RotateAttestations is not supported for hard fork 1 beacon state") +} + +// SetLatestExecutionPayloadHeader is not supported for hard fork 1 beacon state. +func (*BeaconState) SetLatestExecutionPayloadHeader(_ *ethpb.ExecutionPayloadHeader) error { + return errors.New("SetLatestExecutionPayloadHeader is not supported for hard fork 1 beacon state") +} diff --git a/beacon-chain/state-proto/v2/deprecated_setters_test.go b/beacon-chain/state-proto/v2/deprecated_setters_test.go new file mode 100644 index 0000000000..718c4f07b1 --- /dev/null +++ b/beacon-chain/state-proto/v2/deprecated_setters_test.go @@ -0,0 +1,27 @@ +package v2 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_AppendCurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "AppendCurrentEpochAttestations is not supported for hard fork 1 beacon state", s.AppendCurrentEpochAttestations(nil)) +} + +func TestBeaconState_AppendPreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "AppendPreviousEpochAttestations is not supported for hard fork 1 beacon state", s.AppendPreviousEpochAttestations(nil)) +} + +func TestBeaconState_SetCurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "SetCurrentEpochAttestations is not supported for hard fork 1 beacon state", s.SetCurrentEpochAttestations(nil)) +} + +func TestBeaconState_SetPreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "SetPreviousEpochAttestations is not supported for hard fork 1 beacon state", s.SetPreviousEpochAttestations(nil)) +} diff --git a/beacon-chain/state-proto/v2/field_roots.go b/beacon-chain/state-proto/v2/field_roots.go new file mode 100644 index 0000000000..d0fe86f2f8 --- /dev/null +++ b/beacon-chain/state-proto/v2/field_roots.go @@ -0,0 +1,18 @@ +package v2 + +import ( + "context" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/config/features" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// computeFieldRoots returns the hash tree root computations of every field in +// the beacon state as a list of 32 byte roots. +func computeFieldRoots(ctx context.Context, state *ethpb.BeaconStateAltair) ([][]byte, error) { + if features.Get().EnableSSZCache { + return stateutil.CachedHasher.ComputeFieldRootsWithHasherAltair(ctx, state) + } + return stateutil.NocachedHasher.ComputeFieldRootsWithHasherAltair(ctx, state) +} diff --git a/beacon-chain/state-proto/v2/getters_block.go b/beacon-chain/state-proto/v2/getters_block.go new file mode 100644 index 0000000000..ad321824b5 --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_block.go @@ -0,0 +1,99 @@ +package v2 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// LatestBlockHeader stored within the beacon state. +func (b *BeaconState) LatestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.latestBlockHeader() +} + +// latestBlockHeader stored within the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) latestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + hdr := ðpb.BeaconBlockHeader{ + Slot: b.state.LatestBlockHeader.Slot, + ProposerIndex: b.state.LatestBlockHeader.ProposerIndex, + } + + parentRoot := make([]byte, len(b.state.LatestBlockHeader.ParentRoot)) + bodyRoot := make([]byte, len(b.state.LatestBlockHeader.BodyRoot)) + stateRoot := make([]byte, len(b.state.LatestBlockHeader.StateRoot)) + + copy(parentRoot, b.state.LatestBlockHeader.ParentRoot) + copy(bodyRoot, b.state.LatestBlockHeader.BodyRoot) + copy(stateRoot, b.state.LatestBlockHeader.StateRoot) + hdr.ParentRoot = parentRoot + hdr.BodyRoot = bodyRoot + hdr.StateRoot = stateRoot + return hdr +} + +// BlockRoots kept track of in the beacon state. +func (b *BeaconState) BlockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.BlockRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRoots() +} + +// blockRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.BlockRoots) +} + +// BlockRootAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.BlockRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRootAtIndex(idx) +} + +// blockRootAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.BlockRoots, idx) +} diff --git a/beacon-chain/state-proto/v2/getters_block_test.go b/beacon-chain/state-proto/v2/getters_block_test.go new file mode 100644 index 0000000000..923bd9b5ec --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_block_test.go @@ -0,0 +1,60 @@ +package v2 + +import ( + "testing" + + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_LatestBlockHeader(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateAltair{}) + require.NoError(t, err) + got := s.LatestBlockHeader() + require.DeepEqual(t, (*ethpb.BeaconBlockHeader)(nil), got) + + want := ðpb.BeaconBlockHeader{Slot: 100} + s, err = InitializeFromProto(ðpb.BeaconStateAltair{LatestBlockHeader: want}) + require.NoError(t, err) + got = s.LatestBlockHeader() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got.Slot = 101 + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRoots(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateAltair{}) + require.NoError(t, err) + got := s.BlockRoots() + require.DeepEqual(t, ([][]byte)(nil), got) + + want := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconStateAltair{BlockRoots: want}) + require.NoError(t, err) + got = s.BlockRoots() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got[0][0] = 'b' + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRootAtIndex(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateAltair{}) + require.NoError(t, err) + got, err := s.BlockRootAtIndex(0) + require.NoError(t, err) + require.DeepEqual(t, ([]byte)(nil), got) + + r := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconStateAltair{BlockRoots: r}) + require.NoError(t, err) + got, err = s.BlockRootAtIndex(0) + require.NoError(t, err) + want := bytesutil.PadTo([]byte{'a'}, fieldparams.RootLength) + require.DeepSSZEqual(t, want, got) +} diff --git a/beacon-chain/state-proto/v2/getters_checkpoint.go b/beacon-chain/state-proto/v2/getters_checkpoint.go new file mode 100644 index 0000000000..ebea57ec98 --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_checkpoint.go @@ -0,0 +1,160 @@ +package v2 + +import ( + "bytes" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// JustificationBits marking which epochs have been justified in the beacon chain. +func (b *BeaconState) JustificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.justificationBits() +} + +// justificationBits marking which epochs have been justified in the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) justificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + res := make([]byte, len(b.state.JustificationBits.Bytes())) + copy(res, b.state.JustificationBits.Bytes()) + return res +} + +// PreviousJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) PreviousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.PreviousJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousJustifiedCheckpoint() +} + +// previousJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.PreviousJustifiedCheckpoint) +} + +// CurrentJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) CurrentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.CurrentJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentJustifiedCheckpoint() +} + +// currentJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.CurrentJustifiedCheckpoint) +} + +// MatchCurrentJustifiedCheckpoint returns true if input justified checkpoint matches +// the current justified checkpoint in state. +func (b *BeaconState) MatchCurrentJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.CurrentJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.CurrentJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.CurrentJustifiedCheckpoint.Root) +} + +// MatchPreviousJustifiedCheckpoint returns true if the input justified checkpoint matches +// the previous justified checkpoint in state. +func (b *BeaconState) MatchPreviousJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.PreviousJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.PreviousJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.PreviousJustifiedCheckpoint.Root) +} + +// FinalizedCheckpoint denoting an epoch and block root. +func (b *BeaconState) FinalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.FinalizedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.finalizedCheckpoint() +} + +// finalizedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) finalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.FinalizedCheckpoint) +} + +// FinalizedCheckpointEpoch returns the epoch value of the finalized checkpoint. +func (b *BeaconState) FinalizedCheckpointEpoch() types.Epoch { + if !b.hasInnerState() { + return 0 + } + if b.state.FinalizedCheckpoint == nil { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return b.state.FinalizedCheckpoint.Epoch +} diff --git a/beacon-chain/state-proto/v2/getters_eth1.go b/beacon-chain/state-proto/v2/getters_eth1.go new file mode 100644 index 0000000000..2b35eed94d --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_eth1.go @@ -0,0 +1,91 @@ +package v2 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// Eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +func (b *BeaconState) Eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1Data() +} + +// eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + return ethpb.CopyETH1Data(b.state.Eth1Data) +} + +// Eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +func (b *BeaconState) Eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DataVotes() +} + +// eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + res := make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + for i := 0; i < len(res); i++ { + res[i] = ethpb.CopyETH1Data(b.state.Eth1DataVotes[i]) + } + return res +} + +// Eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +func (b *BeaconState) Eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DepositIndex() +} + +// eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.Eth1DepositIndex +} diff --git a/beacon-chain/state-proto/v2/getters_misc.go b/beacon-chain/state-proto/v2/getters_misc.go new file mode 100644 index 0000000000..20be2f386b --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_misc.go @@ -0,0 +1,212 @@ +package v2 + +import ( + "time" + + types "github.com/prysmaticlabs/eth2-types" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/version" +) + +// GenesisTime of the beacon state as a uint64. +func (b *BeaconState) GenesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisTime() +} + +// genesisTime of the beacon state as a uint64. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.GenesisTime +} + +// GenesisValidatorRoot of the beacon state. +func (b *BeaconState) GenesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisValidatorRoot() +} + +// genesisValidatorRoot of the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + root := make([]byte, fieldparams.RootLength) + copy(root, b.state.GenesisValidatorsRoot) + return root +} + +// GenesisUnixTime returns the genesis time as time.Time. +func (b *BeaconState) GenesisUnixTime() time.Time { + if !b.hasInnerState() { + return time.Unix(0, 0) + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisUnixTime() +} + +// genesisUnixTime returns the genesis time as time.Time. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisUnixTime() time.Time { + if !b.hasInnerState() { + return time.Unix(0, 0) + } + + return time.Unix(int64(b.state.GenesisTime), 0) +} + +// ParentRoot is a convenience method to access state.LatestBlockRoot.ParentRoot. +func (b *BeaconState) ParentRoot() [32]byte { + if !b.hasInnerState() { + return [32]byte{} + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.parentRoot() +} + +// parentRoot is a convenience method to access state.LatestBlockRoot.ParentRoot. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) parentRoot() [32]byte { + if !b.hasInnerState() { + return [32]byte{} + } + + parentRoot := [32]byte{} + copy(parentRoot[:], b.state.LatestBlockHeader.ParentRoot) + return parentRoot +} + +// Version of the beacon state. This method +// is strictly meant to be used without a lock +// internally. +func (_ *BeaconState) Version() int { + return version.Altair +} + +// Slot of the current beacon chain state. +func (b *BeaconState) Slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slot() +} + +// slot of the current beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + return b.state.Slot +} + +// Fork version of the beacon chain. +func (b *BeaconState) Fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.fork() +} + +// fork version of the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + prevVersion := make([]byte, len(b.state.Fork.PreviousVersion)) + copy(prevVersion, b.state.Fork.PreviousVersion) + currVersion := make([]byte, len(b.state.Fork.CurrentVersion)) + copy(currVersion, b.state.Fork.CurrentVersion) + return ðpb.Fork{ + PreviousVersion: prevVersion, + CurrentVersion: currVersion, + Epoch: b.state.Fork.Epoch, + } +} + +// HistoricalRoots based on epochs stored in the beacon state. +func (b *BeaconState) HistoricalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.HistoricalRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.historicalRoots() +} + +// historicalRoots based on epochs stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) historicalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.HistoricalRoots) +} + +// balancesLength returns the length of the balances slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + return len(b.state.Balances) +} diff --git a/beacon-chain/state-proto/v2/getters_participation.go b/beacon-chain/state-proto/v2/getters_participation.go new file mode 100644 index 0000000000..9d62b0f203 --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_participation.go @@ -0,0 +1,53 @@ +package v2 + +// CurrentEpochParticipation corresponding to participation bits on the beacon chain. +func (b *BeaconState) CurrentEpochParticipation() ([]byte, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.CurrentEpochParticipation == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentEpochParticipation(), nil +} + +// PreviousEpochParticipation corresponding to participation bits on the beacon chain. +func (b *BeaconState) PreviousEpochParticipation() ([]byte, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.PreviousEpochParticipation == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousEpochParticipation(), nil +} + +// currentEpochParticipation corresponding to participation bits on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentEpochParticipation() []byte { + if !b.hasInnerState() { + return nil + } + tmp := make([]byte, len(b.state.CurrentEpochParticipation)) + copy(tmp, b.state.CurrentEpochParticipation) + return tmp +} + +// previousEpochParticipation corresponding to participation bits on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousEpochParticipation() []byte { + if !b.hasInnerState() { + return nil + } + tmp := make([]byte, len(b.state.PreviousEpochParticipation)) + copy(tmp, b.state.PreviousEpochParticipation) + return tmp +} diff --git a/beacon-chain/state-proto/v2/getters_randao.go b/beacon-chain/state-proto/v2/getters_randao.go new file mode 100644 index 0000000000..8f74d0168d --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_randao.go @@ -0,0 +1,85 @@ +package v2 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +// RandaoMixes of block proposers on the beacon chain. +func (b *BeaconState) RandaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.RandaoMixes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixes() +} + +// randaoMixes of block proposers on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + + return bytesutil.SafeCopy2dBytes(b.state.RandaoMixes) +} + +// RandaoMixAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.RandaoMixes == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixAtIndex(idx) +} + +// randaoMixAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + + return bytesutil.SafeCopyRootAtIndex(b.state.RandaoMixes, idx) +} + +// RandaoMixesLength returns the length of the randao mixes slice. +func (b *BeaconState) RandaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixesLength() +} + +// randaoMixesLength returns the length of the randao mixes slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + return len(b.state.RandaoMixes) +} diff --git a/beacon-chain/state-proto/v2/getters_state.go b/beacon-chain/state-proto/v2/getters_state.go new file mode 100644 index 0000000000..f097a7962f --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_state.go @@ -0,0 +1,126 @@ +package v2 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + if b == nil { + return nil + } + return b.state +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + if b == nil || b.state == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + return ðpb.BeaconStateAltair{ + GenesisTime: b.genesisTime(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + Slot: b.slot(), + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + BlockRoots: b.blockRoots(), + StateRoots: b.stateRoots(), + HistoricalRoots: b.historicalRoots(), + Eth1Data: b.eth1Data(), + Eth1DataVotes: b.eth1DataVotes(), + Eth1DepositIndex: b.eth1DepositIndex(), + Validators: b.validators(), + Balances: b.balances(), + RandaoMixes: b.randaoMixes(), + Slashings: b.slashings(), + CurrentEpochParticipation: b.currentEpochParticipation(), + PreviousEpochParticipation: b.previousEpochParticipation(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + InactivityScores: b.inactivityScores(), + CurrentSyncCommittee: b.currentSyncCommittee(), + NextSyncCommittee: b.nextSyncCommittee(), + } +} + +// hasInnerState detects if the internal reference to the state data structure +// is populated correctly. Returns false if nil. +func (b *BeaconState) hasInnerState() bool { + return b != nil && b.state != nil +} + +// StateRoots kept track of in the beacon state. +func (b *BeaconState) StateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.StateRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRoots() +} + +// StateRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.StateRoots) +} + +// StateRootAtIndex retrieves a specific state root based on an +// input index value. +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.StateRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRootAtIndex(idx) +} + +// stateRootAtIndex retrieves a specific state root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.StateRoots, idx) +} + +// MarshalSSZ marshals the underlying beacon state to bytes. +func (b *BeaconState) MarshalSSZ() ([]byte, error) { + if !b.hasInnerState() { + return nil, errors.New("nil beacon state") + } + return b.state.MarshalSSZ() +} + +// ProtobufBeaconState transforms an input into beacon state hard fork 1 in the form of protobuf. +// Error is returned if the input is not type protobuf beacon state. +func ProtobufBeaconState(s interface{}) (*ethpb.BeaconStateAltair, error) { + pbState, ok := s.(*ethpb.BeaconStateAltair) + if !ok { + return nil, errors.New("input is not type pb.BeaconStateAltair") + } + return pbState, nil +} diff --git a/beacon-chain/state-proto/v2/getters_sync_committee.go b/beacon-chain/state-proto/v2/getters_sync_committee.go new file mode 100644 index 0000000000..7717cf2b2a --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_sync_committee.go @@ -0,0 +1,69 @@ +package v2 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// currentSyncCommittee of the current sync committee in beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentSyncCommittee() *ethpb.SyncCommittee { + if !b.hasInnerState() { + return nil + } + + return CopySyncCommittee(b.state.CurrentSyncCommittee) +} + +// nextSyncCommittee of the next sync committee in beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) nextSyncCommittee() *ethpb.SyncCommittee { + if !b.hasInnerState() { + return nil + } + + return CopySyncCommittee(b.state.NextSyncCommittee) +} + +// CurrentSyncCommittee of the current sync committee in beacon chain state. +func (b *BeaconState) CurrentSyncCommittee() (*ethpb.SyncCommittee, error) { + if !b.hasInnerState() { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.CurrentSyncCommittee == nil { + return nil, nil + } + + return b.currentSyncCommittee(), nil +} + +// NextSyncCommittee of the next sync committee in beacon chain state. +func (b *BeaconState) NextSyncCommittee() (*ethpb.SyncCommittee, error) { + if !b.hasInnerState() { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.NextSyncCommittee == nil { + return nil, nil + } + + return b.nextSyncCommittee(), nil +} + +// CopySyncCommittee copies the provided sync committee object. +func CopySyncCommittee(data *ethpb.SyncCommittee) *ethpb.SyncCommittee { + if data == nil { + return nil + } + return ðpb.SyncCommittee{ + Pubkeys: bytesutil.SafeCopy2dBytes(data.Pubkeys), + AggregatePubkey: bytesutil.SafeCopyBytes(data.AggregatePubkey), + } +} diff --git a/beacon-chain/state-proto/v2/getters_test.go b/beacon-chain/state-proto/v2/getters_test.go new file mode 100644 index 0000000000..e2849a0110 --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_test.go @@ -0,0 +1,192 @@ +package v2 + +import ( + "runtime/debug" + "sync" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_SlotDataRace(t *testing.T) { + headState, err := InitializeFromProto(ðpb.BeaconStateAltair{Slot: 1}) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(2) + go func() { + require.NoError(t, headState.SetSlot(0)) + wg.Done() + }() + go func() { + headState.Slot() + wg.Done() + }() + + wg.Wait() +} + +func TestNilState_NoPanic(t *testing.T) { + var st *BeaconState + defer func() { + if r := recover(); r != nil { + t.Errorf("Method panicked when it was not supposed to: %v\n%v\n", r, string(debug.Stack())) + } + }() + // retrieve elements from nil state + _ = st.GenesisTime() + _ = st.GenesisValidatorRoot() + _ = st.GenesisUnixTime() + _ = st.GenesisValidatorRoot() + _ = st.Slot() + _ = st.Fork() + _ = st.LatestBlockHeader() + _ = st.ParentRoot() + _ = st.BlockRoots() + _, err := st.BlockRootAtIndex(0) + _ = err + _ = st.StateRoots() + _ = st.HistoricalRoots() + _ = st.Eth1Data() + _ = st.Eth1DataVotes() + _ = st.Eth1DepositIndex() + _, err = st.ValidatorAtIndex(0) + _ = err + _, err = st.ValidatorAtIndexReadOnly(0) + _ = err + _, _ = st.ValidatorIndexByPubkey([48]byte{}) + _ = st.PubkeyAtIndex(0) + _ = st.NumValidators() + _ = st.Balances() + _, err = st.BalanceAtIndex(0) + _ = err + _ = st.BalancesLength() + _ = st.RandaoMixes() + _, err = st.RandaoMixAtIndex(0) + _ = err + _ = st.RandaoMixesLength() + _ = st.Slashings() + _, err = st.CurrentEpochParticipation() + _ = err + _, err = st.PreviousEpochParticipation() + _ = err + _ = st.JustificationBits() + _ = st.PreviousJustifiedCheckpoint() + _ = st.CurrentJustifiedCheckpoint() + _ = st.FinalizedCheckpoint() + _, err = st.CurrentEpochParticipation() + _ = err + _, err = st.PreviousEpochParticipation() + _ = err + _, err = st.InactivityScores() + _ = err + _, err = st.CurrentSyncCommittee() + _ = err + _, err = st.NextSyncCommittee() + _ = err +} + +func TestBeaconState_ValidatorByPubkey(t *testing.T) { + keyCreator := func(input []byte) [48]byte { + nKey := [48]byte{} + copy(nKey[:1], input) + return nKey + } + + tests := []struct { + name string + modifyFunc func(b *BeaconState, k [48]byte) + exists bool + expectedIdx types.ValidatorIndex + largestIdxInSet types.ValidatorIndex + }{ + { + name: "retrieve validator", + modifyFunc: func(b *BeaconState, key [48]byte) { + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators from the start", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 2, + }, + { + name: "retrieve validator with multiple validators from the start with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + _ = b.Copy() + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state at boundary", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateAltair{}) + require.NoError(t, err) + nKey := keyCreator([]byte{'A'}) + tt.modifyFunc(s, nKey) + idx, ok := s.ValidatorIndexByPubkey(nKey) + assert.Equal(t, tt.exists, ok) + assert.Equal(t, tt.expectedIdx, idx) + }) + } +} diff --git a/beacon-chain/state-proto/v2/getters_validator.go b/beacon-chain/state-proto/v2/getters_validator.go new file mode 100644 index 0000000000..c87ad6b4e5 --- /dev/null +++ b/beacon-chain/state-proto/v2/getters_validator.go @@ -0,0 +1,328 @@ +package v2 + +import ( + "fmt" + + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorIndexOutOfRangeError represents an error scenario where a validator does not exist +// at a given index in the validator's array. +type ValidatorIndexOutOfRangeError struct { + message string +} + +var ( + // ErrNilValidatorsInState returns when accessing validators in the state while the state has a + // nil slice for the validators field. + ErrNilValidatorsInState = errors.New("state has nil validator slice") +) + +// NewValidatorIndexOutOfRangeError creates a new error instance. +func NewValidatorIndexOutOfRangeError(index types.ValidatorIndex) ValidatorIndexOutOfRangeError { + return ValidatorIndexOutOfRangeError{ + message: fmt.Sprintf("index %d out of range", index), + } +} + +// Error returns the underlying error message. +func (e *ValidatorIndexOutOfRangeError) Error() string { + return e.message +} + +// Validators participating in consensus on the beacon chain. +func (b *BeaconState) Validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.validators() +} + +// validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + val := b.state.Validators[i] + if val == nil { + continue + } + res[i] = ethpb.CopyValidator(val) + } + return res +} + +// references of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. This does not +// copy fully and instead just copies the reference. +func (b *BeaconState) validatorsReferences() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + validator := b.state.Validators[i] + if validator == nil { + continue + } + // copy validator reference instead. + res[i] = validator + } + return res +} + +// ValidatorAtIndex is the validator at the provided index. +func (b *BeaconState) ValidatorAtIndex(idx types.ValidatorIndex) (*ethpb.Validator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return ðpb.Validator{}, nil + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + val := b.state.Validators[idx] + return ethpb.CopyValidator(val), nil +} + +// ValidatorAtIndexReadOnly is the validator at the provided index. This method +// doesn't clone the validator. +func (b *BeaconState) ValidatorAtIndexReadOnly(idx types.ValidatorIndex) (state.ReadOnlyValidator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return nil, ErrNilValidatorsInState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return v1.NewValidator(b.state.Validators[idx]) +} + +// ValidatorIndexByPubkey returns a given validator by its 48-byte public key. +func (b *BeaconState) ValidatorIndexByPubkey(key [48]byte) (types.ValidatorIndex, bool) { + if b == nil || b.valMapHandler == nil || b.valMapHandler.IsNil() { + return 0, false + } + b.lock.RLock() + defer b.lock.RUnlock() + numOfVals := len(b.state.Validators) + + idx, ok := b.valMapHandler.Get(key) + if ok && numOfVals <= int(idx) { + return types.ValidatorIndex(0), false + } + return idx, ok +} + +// PubkeyAtIndex returns the pubkey at the given +// validator index. +func (b *BeaconState) PubkeyAtIndex(idx types.ValidatorIndex) [48]byte { + if !b.hasInnerState() { + return [48]byte{} + } + if uint64(idx) >= uint64(len(b.state.Validators)) { + return [48]byte{} + } + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.Validators[idx] == nil { + return [48]byte{} + } + return bytesutil.ToBytes48(b.state.Validators[idx].PublicKey) +} + +// NumValidators returns the size of the validator registry. +func (b *BeaconState) NumValidators() int { + if !b.hasInnerState() { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return len(b.state.Validators) +} + +// ReadFromEveryValidator reads values from every validator and applies it to the provided function. +// Warning: This method is potentially unsafe, as it exposes the actual validator registry. +func (b *BeaconState) ReadFromEveryValidator(f func(idx int, val state.ReadOnlyValidator) error) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if b.state.Validators == nil { + return errors.New("nil validators in state") + } + b.lock.RLock() + validators := b.state.Validators + b.lock.RUnlock() + + for i, v := range validators { + v, err := v1.NewValidator(v) + if err != nil { + return err + } + if err := f(i, v); err != nil { + return err + } + } + return nil +} + +// Balances of validators participating in consensus on the beacon chain. +func (b *BeaconState) Balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balances() +} + +// balances of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + res := make([]uint64, len(b.state.Balances)) + copy(res, b.state.Balances) + return res +} + +// BalanceAtIndex of validator with the provided index. +func (b *BeaconState) BalanceAtIndex(idx types.ValidatorIndex) (uint64, error) { + if !b.hasInnerState() { + return 0, ErrNilInnerState + } + if b.state.Balances == nil { + return 0, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if uint64(len(b.state.Balances)) <= uint64(idx) { + return 0, fmt.Errorf("index of %d does not exist", idx) + } + return b.state.Balances[idx], nil +} + +// BalancesLength returns the length of the balances slice. +func (b *BeaconState) BalancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balancesLength() +} + +// Slashings of validators on the beacon chain. +func (b *BeaconState) Slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slashings() +} + +// slashings of validators on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + res := make([]uint64, len(b.state.Slashings)) + copy(res, b.state.Slashings) + return res +} + +// inactivityScores of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) inactivityScores() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.InactivityScores == nil { + return nil + } + + res := make([]uint64, len(b.state.InactivityScores)) + copy(res, b.state.InactivityScores) + return res +} + +// InactivityScores of validators participating in consensus on the beacon chain. +func (b *BeaconState) InactivityScores() ([]uint64, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.InactivityScores == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.inactivityScores(), nil +} diff --git a/beacon-chain/state/v2/getters_validator_test.go b/beacon-chain/state-proto/v2/getters_validator_test.go similarity index 88% rename from beacon-chain/state/v2/getters_validator_test.go rename to beacon-chain/state-proto/v2/getters_validator_test.go index 454a1bbf66..c0a179a4bb 100644 --- a/beacon-chain/state/v2/getters_validator_test.go +++ b/beacon-chain/state-proto/v2/getters_validator_test.go @@ -3,7 +3,7 @@ package v2_test import ( "testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/state-proto/v2/proofs.go b/beacon-chain/state-proto/v2/proofs.go new file mode 100644 index 0000000000..946989500f --- /dev/null +++ b/beacon-chain/state-proto/v2/proofs.go @@ -0,0 +1,60 @@ +package v2 + +import ( + "encoding/binary" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +const ( + finalizedRootIndex = uint64(105) // Precomputed value. +) + +// FinalizedRootGeneralizedIndex for the beacon state. +func FinalizedRootGeneralizedIndex() uint64 { + return finalizedRootIndex +} + +// CurrentSyncCommitteeGeneralizedIndex for the beacon state. +func CurrentSyncCommitteeGeneralizedIndex() uint64 { + return uint64(currentSyncCommittee) +} + +// NextSyncCommitteeGeneralizedIndex for the beacon state. +func NextSyncCommitteeGeneralizedIndex() uint64 { + return uint64(nextSyncCommittee) +} + +// CurrentSyncCommitteeProof from the state's Merkle trie representation. +func (b *BeaconState) CurrentSyncCommitteeProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, currentSyncCommittee), nil +} + +// NextSyncCommitteeProof from the state's Merkle trie representation. +func (b *BeaconState) NextSyncCommitteeProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, nextSyncCommittee), nil +} + +// FinalizedRootProof crafts a Merkle proof for the finalized root +// contained within the finalized checkpoint of a beacon state. +func (b *BeaconState) FinalizedRootProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + cpt := b.state.FinalizedCheckpoint + // The epoch field of a finalized checkpoint is the neighbor + // index of the finalized root field in its Merkle tree representation + // of the checkpoint. This neighbor is the first element added to the proof. + epochBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(epochBuf, uint64(cpt.Epoch)) + epochRoot := bytesutil.ToBytes32(epochBuf) + proof := make([][]byte, 0) + proof = append(proof, epochRoot[:]) + branch := fieldtrie.ProofFromMerkleLayers(b.merkleLayers, finalizedCheckpoint) + proof = append(proof, branch...) + return proof, nil +} diff --git a/beacon-chain/state/v2/proofs_test.go b/beacon-chain/state-proto/v2/proofs_test.go similarity index 97% rename from beacon-chain/state/v2/proofs_test.go rename to beacon-chain/state-proto/v2/proofs_test.go index 83bf7aaab2..9ab4f46cb0 100644 --- a/beacon-chain/state/v2/proofs_test.go +++ b/beacon-chain/state-proto/v2/proofs_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/state-proto/v2/setters_block.go b/beacon-chain/state-proto/v2/setters_block.go new file mode 100644 index 0000000000..ddee0c3851 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_block.go @@ -0,0 +1,68 @@ +package v2 + +import ( + "fmt" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetLatestBlockHeader in the beacon state. +func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.LatestBlockHeader = ethpb.CopyBeaconBlockHeader(val) + b.markFieldAsDirty(latestBlockHeader) + return nil +} + +// SetBlockRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBlockRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[blockRoots].MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + + b.state.BlockRoots = val + b.markFieldAsDirty(blockRoots) + b.rebuildTrie[blockRoots] = true + return nil +} + +// UpdateBlockRootAtIndex for the beacon state. Updates the block root +// at a specific index to a new value. +func (b *BeaconState) UpdateBlockRootAtIndex(idx uint64, blockRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.BlockRoots)) <= idx { + return fmt.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + r := b.state.BlockRoots + if ref := b.sharedFieldReferences[blockRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.BlockRoots)) + copy(r, b.state.BlockRoots) + ref.MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + } + + r[idx] = blockRoot[:] + b.state.BlockRoots = r + + b.markFieldAsDirty(blockRoots) + b.addDirtyIndices(blockRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_checkpoint.go b/beacon-chain/state-proto/v2/setters_checkpoint.go new file mode 100644 index 0000000000..666ef8fff8 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_checkpoint.go @@ -0,0 +1,58 @@ +package v2 + +import ( + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetJustificationBits for the beacon state. +func (b *BeaconState) SetJustificationBits(val bitfield.Bitvector4) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.JustificationBits = val + b.markFieldAsDirty(justificationBits) + return nil +} + +// SetPreviousJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetPreviousJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.PreviousJustifiedCheckpoint = val + b.markFieldAsDirty(previousJustifiedCheckpoint) + return nil +} + +// SetCurrentJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetCurrentJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.CurrentJustifiedCheckpoint = val + b.markFieldAsDirty(currentJustifiedCheckpoint) + return nil +} + +// SetFinalizedCheckpoint for the beacon state. +func (b *BeaconState) SetFinalizedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.FinalizedCheckpoint = val + b.markFieldAsDirty(finalizedCheckpoint) + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_eth1.go b/beacon-chain/state-proto/v2/setters_eth1.go new file mode 100644 index 0000000000..d9eb338b51 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_eth1.go @@ -0,0 +1,74 @@ +package v2 + +import ( + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetEth1Data for the beacon state. +func (b *BeaconState) SetEth1Data(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1Data = val + b.markFieldAsDirty(eth1Data) + return nil +} + +// SetEth1DataVotes for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetEth1DataVotes(val []*ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + + b.state.Eth1DataVotes = val + b.markFieldAsDirty(eth1DataVotes) + b.rebuildTrie[eth1DataVotes] = true + return nil +} + +// SetEth1DepositIndex for the beacon state. +func (b *BeaconState) SetEth1DepositIndex(val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1DepositIndex = val + b.markFieldAsDirty(eth1DepositIndex) + return nil +} + +// AppendEth1DataVotes for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendEth1DataVotes(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + votes := b.state.Eth1DataVotes + if b.sharedFieldReferences[eth1DataVotes].Refs() > 1 { + // Copy elements in underlying array by reference. + votes = make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + copy(votes, b.state.Eth1DataVotes) + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + } + + b.state.Eth1DataVotes = append(votes, val) + b.markFieldAsDirty(eth1DataVotes) + b.addDirtyIndices(eth1DataVotes, []uint64{uint64(len(b.state.Eth1DataVotes) - 1)}) + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_misc.go b/beacon-chain/state-proto/v2/setters_misc.go new file mode 100644 index 0000000000..c61f3704ef --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_misc.go @@ -0,0 +1,186 @@ +package v2 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/crypto/hash" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "google.golang.org/protobuf/proto" +) + +// For our setters, we have a field reference counter through +// which we can track shared field references. This helps when +// performing state copies, as we simply copy the reference to the +// field. When we do need to do need to modify these fields, we +// perform a full copy of the field. This is true of most of our +// fields except for the following below. +// 1) BlockRoots +// 2) StateRoots +// 3) Eth1DataVotes +// 4) RandaoMixes +// 5) HistoricalRoots +// 6) CurrentParticipationBits +// 7) PreviousParticipationBits +// +// The fields referred to above are instead copied by reference, where +// we simply copy the reference to the underlying object instead of the +// whole object. This is possible due to how we have structured our state +// as we copy the value on read, so as to ensure the underlying object is +// not mutated while it is being accessed during a state read. + +const ( + // This specifies the limit till which we process all dirty indices for a certain field. + // If we have more dirty indices than the threshold, then we rebuild the whole trie. This + // comes due to the fact that O(alogn) > O(n) beyond a certain value of a. + indicesLimit = 8000 +) + +// SetGenesisTime for the beacon state. +func (b *BeaconState) SetGenesisTime(val uint64) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisTime = val + b.markFieldAsDirty(genesisTime) + return nil +} + +// SetGenesisValidatorRoot for the beacon state. +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisValidatorsRoot = val + b.markFieldAsDirty(genesisValidatorRoot) + return nil +} + +// SetSlot for the beacon state. +func (b *BeaconState) SetSlot(val types.Slot) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Slot = val + b.markFieldAsDirty(slot) + return nil +} + +// SetFork version for the beacon chain. +func (b *BeaconState) SetFork(val *ethpb.Fork) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + fk, ok := proto.Clone(val).(*ethpb.Fork) + if !ok { + return errors.New("proto.Clone did not return a fork proto") + } + b.state.Fork = fk + b.markFieldAsDirty(fork) + return nil +} + +// SetHistoricalRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + + b.state.HistoricalRoots = val + b.markFieldAsDirty(historicalRoots) + return nil +} + +// AppendHistoricalRoots for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendHistoricalRoots(root [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + roots := b.state.HistoricalRoots + if b.sharedFieldReferences[historicalRoots].Refs() > 1 { + roots = make([][]byte, len(b.state.HistoricalRoots)) + copy(roots, b.state.HistoricalRoots) + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + } + + b.state.HistoricalRoots = append(roots, root[:]) + b.markFieldAsDirty(historicalRoots) + return nil +} + +// Recomputes the branch up the index in the Merkle trie representation +// of the beacon state. This method performs slice reads and the caller MUST +// hold the lock before calling this method. +func (b *BeaconState) recomputeRoot(idx int) { + hashFunc := hash.CustomSHA256Hasher() + layers := b.merkleLayers + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + // Using information about the index which changed, idx, we recompute + // only its branch up the tree. + currentIndex := idx + root := b.merkleLayers[0][idx] + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := make([]byte, 32) + if layers[i] != nil && len(layers[i]) != 0 && neighborIdx < len(layers[i]) { + neighbor = layers[i][neighborIdx] + } + if isLeft { + parentHash := hashFunc(append(root, neighbor...)) + root = parentHash[:] + } else { + parentHash := hashFunc(append(neighbor, root...)) + root = parentHash[:] + } + parentIdx := currentIndex / 2 + // Update the cached layers at the parent index. + layers[i+1][parentIdx] = root + currentIndex = parentIdx + } + b.merkleLayers = layers +} + +func (b *BeaconState) markFieldAsDirty(field stateTypes.FieldIndex) { + b.dirtyFields[field] = true +} + +// addDirtyIndices adds the relevant dirty field indices, so that they +// can be recomputed. +func (b *BeaconState) addDirtyIndices(index stateTypes.FieldIndex, indices []uint64) { + if b.rebuildTrie[index] { + return + } + // Exit early if balance trie computation isn't enabled. + if !features.Get().EnableBalanceTrieComputation && index == balances { + return + } + totalIndicesLen := len(b.dirtyIndices[index]) + len(indices) + if totalIndicesLen > indicesLimit { + b.rebuildTrie[index] = true + b.dirtyIndices[index] = []uint64{} + } else { + b.dirtyIndices[index] = append(b.dirtyIndices[index], indices...) + } +} diff --git a/beacon-chain/state-proto/v2/setters_participation.go b/beacon-chain/state-proto/v2/setters_participation.go new file mode 100644 index 0000000000..2840b8de07 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_participation.go @@ -0,0 +1,89 @@ +package v2 + +import ( + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetPreviousParticipationBits for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetPreviousParticipationBits(val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[previousEpochParticipationBits].MinusRef() + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) + + b.state.PreviousEpochParticipation = val + b.markFieldAsDirty(previousEpochParticipationBits) + b.rebuildTrie[previousEpochParticipationBits] = true + return nil +} + +// SetCurrentParticipationBits for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetCurrentParticipationBits(val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[currentEpochParticipationBits].MinusRef() + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) + + b.state.CurrentEpochParticipation = val + b.markFieldAsDirty(currentEpochParticipationBits) + b.rebuildTrie[currentEpochParticipationBits] = true + return nil +} + +// AppendCurrentParticipationBits for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendCurrentParticipationBits(val byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + participation := b.state.CurrentEpochParticipation + if b.sharedFieldReferences[currentEpochParticipationBits].Refs() > 1 { + // Copy elements in underlying array by reference. + participation = make([]byte, len(b.state.CurrentEpochParticipation)) + copy(participation, b.state.CurrentEpochParticipation) + b.sharedFieldReferences[currentEpochParticipationBits].MinusRef() + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) + } + + b.state.CurrentEpochParticipation = append(participation, val) + b.markFieldAsDirty(currentEpochParticipationBits) + b.addDirtyIndices(currentEpochParticipationBits, []uint64{uint64(len(b.state.CurrentEpochParticipation) - 1)}) + return nil +} + +// AppendPreviousParticipationBits for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendPreviousParticipationBits(val byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + bits := b.state.PreviousEpochParticipation + if b.sharedFieldReferences[previousEpochParticipationBits].Refs() > 1 { + bits = make([]byte, len(b.state.PreviousEpochParticipation)) + copy(bits, b.state.PreviousEpochParticipation) + b.sharedFieldReferences[previousEpochParticipationBits].MinusRef() + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) + } + + b.state.PreviousEpochParticipation = append(bits, val) + b.markFieldAsDirty(previousEpochParticipationBits) + b.addDirtyIndices(previousEpochParticipationBits, []uint64{uint64(len(b.state.PreviousEpochParticipation) - 1)}) + + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_randao.go b/beacon-chain/state-proto/v2/setters_randao.go new file mode 100644 index 0000000000..d44bb0dc91 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_randao.go @@ -0,0 +1,53 @@ +package v2 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetRandaoMixes for the beacon state. Updates the entire +// randao mixes to a new value by overwriting the previous one. +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + + b.state.RandaoMixes = val + b.markFieldAsDirty(randaoMixes) + b.rebuildTrie[randaoMixes] = true + return nil +} + +// UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes +// at a specific index to a new value. +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.RandaoMixes)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + mixes := b.state.RandaoMixes + if refs := b.sharedFieldReferences[randaoMixes].Refs(); refs > 1 { + // Copy elements in underlying array by reference. + mixes = make([][]byte, len(b.state.RandaoMixes)) + copy(mixes, b.state.RandaoMixes) + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + } + + mixes[idx] = val + b.state.RandaoMixes = mixes + b.markFieldAsDirty(randaoMixes) + b.addDirtyIndices(randaoMixes, []uint64{idx}) + + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_state.go b/beacon-chain/state-proto/v2/setters_state.go new file mode 100644 index 0000000000..c9d7baaf91 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_state.go @@ -0,0 +1,59 @@ +package v2 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetStateRoots for the beacon state. Updates the state roots +// to a new value by overwriting the previous value. +func (b *BeaconState) SetStateRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[stateRoots].MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + + b.state.StateRoots = val + b.markFieldAsDirty(stateRoots) + b.rebuildTrie[stateRoots] = true + return nil +} + +// UpdateStateRootAtIndex for the beacon state. Updates the state root +// at a specific index to a new value. +func (b *BeaconState) UpdateStateRootAtIndex(idx uint64, stateRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + + b.lock.RLock() + if uint64(len(b.state.StateRoots)) <= idx { + b.lock.RUnlock() + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.RUnlock() + + b.lock.Lock() + defer b.lock.Unlock() + + // Check if we hold the only reference to the shared state roots slice. + r := b.state.StateRoots + if ref := b.sharedFieldReferences[stateRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.StateRoots)) + copy(r, b.state.StateRoots) + ref.MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + } + + r[idx] = stateRoot[:] + b.state.StateRoots = r + + b.markFieldAsDirty(stateRoots) + b.addDirtyIndices(stateRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_sync_committee.go b/beacon-chain/state-proto/v2/setters_sync_committee.go new file mode 100644 index 0000000000..c069cf3c12 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_sync_committee.go @@ -0,0 +1,31 @@ +package v2 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetCurrentSyncCommittee for the beacon state. +func (b *BeaconState) SetCurrentSyncCommittee(val *ethpb.SyncCommittee) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.CurrentSyncCommittee = val + b.markFieldAsDirty(currentSyncCommittee) + return nil +} + +// SetNextSyncCommittee for the beacon state. +func (b *BeaconState) SetNextSyncCommittee(val *ethpb.SyncCommittee) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.NextSyncCommittee = val + b.markFieldAsDirty(nextSyncCommittee) + return nil +} diff --git a/beacon-chain/state-proto/v2/setters_test.go b/beacon-chain/state-proto/v2/setters_test.go new file mode 100644 index 0000000000..9f1fd591ba --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_test.go @@ -0,0 +1,161 @@ +package v2 + +import ( + "context" + "strconv" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestAppendBeyondIndicesLimit(t *testing.T) { + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + st, err := InitializeFromProto(ðpb.BeaconStateAltair{ + Slot: 1, + CurrentEpochParticipation: []byte{}, + PreviousEpochParticipation: []byte{}, + Validators: []*ethpb.Validator{}, + Eth1Data: ðpb.Eth1Data{}, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + }) + require.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := stateTypes.FieldIndex(0); i < stateTypes.FieldIndex(params.BeaconConfig().BeaconStateAltairFieldCount); i++ { + st.dirtyFields[i] = true + } + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := 0; i < 10; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, false, st.rebuildTrie[validators]) + assert.NotEqual(t, len(st.dirtyIndices[validators]), 0) + + for i := 0; i < indicesLimit; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, true, st.rebuildTrie[validators]) + assert.Equal(t, len(st.dirtyIndices[validators]), 0) +} + +func TestBeaconState_AppendBalanceWithTrie(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + bals := make([]uint64, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + bals = append(bals, params.BeaconConfig().MaxEffectiveBalance) + } + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + var pubKeys [][]byte + for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSize; i++ { + pubKeys = append(pubKeys, bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength)) + } + st, err := InitializeFromProto(ðpb.BeaconStateAltair{ + Slot: 1, + GenesisValidatorsRoot: make([]byte, 32), + Fork: ðpb.Fork{ + PreviousVersion: make([]byte, 4), + CurrentVersion: make([]byte, 4), + Epoch: 0, + }, + LatestBlockHeader: ðpb.BeaconBlockHeader{ + ParentRoot: make([]byte, fieldparams.RootLength), + StateRoot: make([]byte, fieldparams.RootLength), + BodyRoot: make([]byte, fieldparams.RootLength), + }, + CurrentEpochParticipation: []byte{}, + PreviousEpochParticipation: []byte{}, + Validators: vals, + Balances: bals, + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, 32), + }, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + JustificationBits: bitfield.NewBitvector4(), + PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + FinalizedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + Slashings: make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector), + CurrentSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubKeys, + AggregatePubkey: make([]byte, 48), + }, + NextSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubKeys, + AggregatePubkey: make([]byte, 48), + }, + }) + assert.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + + for i := 0; i < 100; i++ { + if i%2 == 0 { + assert.NoError(t, st.UpdateBalancesAtIndex(types.ValidatorIndex(i), 1000)) + } + if i%3 == 0 { + assert.NoError(t, st.AppendBalance(1000)) + } + } + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + newRt := bytesutil.ToBytes32(st.merkleLayers[0][balances]) + wantedRt, err := stateutil.Uint64ListRootWithRegistryLimit(st.state.Balances) + assert.NoError(t, err) + assert.Equal(t, wantedRt, newRt, "state roots are unequal") +} diff --git a/beacon-chain/state-proto/v2/setters_validator.go b/beacon-chain/state-proto/v2/setters_validator.go new file mode 100644 index 0000000000..cdc04a7b64 --- /dev/null +++ b/beacon-chain/state-proto/v2/setters_validator.go @@ -0,0 +1,265 @@ +package v2 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetValidators for the beacon state. Updates the entire +// to a new value by overwriting the previous one. +func (b *BeaconState) SetValidators(val []*ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = val + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.markFieldAsDirty(validators) + b.rebuildTrie[validators] = true + b.valMapHandler = stateutil.NewValMapHandler(b.state.Validators) + return nil +} + +// ApplyToEveryValidator applies the provided callback function to each validator in the +// validator registry. +func (b *BeaconState) ApplyToEveryValidator(f func(idx int, val *ethpb.Validator) (bool, *ethpb.Validator, error)) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + b.lock.Unlock() + var changedVals []uint64 + for i, val := range v { + changed, newVal, err := f(i, val) + if err != nil { + return err + } + if changed { + changedVals = append(changedVals, uint64(i)) + v[i] = newVal + } + } + + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, changedVals) + + return nil +} + +// UpdateValidatorAtIndex for the beacon state. Updates the validator +// at a specific index to a new value. +func (b *BeaconState) UpdateValidatorAtIndex(idx types.ValidatorIndex, val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + v[idx] = val + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(idx)}) + + return nil +} + +// SetBalances for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBalances(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + + b.state.Balances = val + b.rebuildTrie[balances] = true + b.markFieldAsDirty(balances) + return nil +} + +// UpdateBalancesAtIndex for the beacon state. This method updates the balance +// at a specific index to a new value. +func (b *BeaconState) UpdateBalancesAtIndex(idx types.ValidatorIndex, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Balances)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + bals[idx] = val + b.state.Balances = bals + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(idx)}) + return nil +} + +// SetSlashings for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetSlashings(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + + b.state.Slashings = val + b.markFieldAsDirty(slashings) + return nil +} + +// UpdateSlashingsAtIndex for the beacon state. Updates the slashings +// at a specific index to a new value. +func (b *BeaconState) UpdateSlashingsAtIndex(idx, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Slashings)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + s := b.state.Slashings + if b.sharedFieldReferences[slashings].Refs() > 1 { + s = b.slashings() + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + } + + s[idx] = val + + b.state.Slashings = s + + b.markFieldAsDirty(slashings) + return nil +} + +// AppendValidator for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendValidator(val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + vals := b.state.Validators + if b.sharedFieldReferences[validators].Refs() > 1 { + vals = b.validatorsReferences() + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + // append validator to slice + b.state.Validators = append(vals, val) + valIdx := types.ValidatorIndex(len(b.state.Validators) - 1) + + b.valMapHandler.Set(bytesutil.ToBytes48(val.PublicKey), valIdx) + + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(valIdx)}) + return nil +} + +// AppendBalance for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendBalance(bal uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + b.state.Balances = append(bals, bal) + balIdx := len(b.state.Balances) - 1 + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(balIdx)}) + return nil +} + +// AppendInactivityScore for the beacon state. +func (b *BeaconState) AppendInactivityScore(s uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + scores := b.state.InactivityScores + if b.sharedFieldReferences[inactivityScores].Refs() > 1 { + scores = b.inactivityScores() + b.sharedFieldReferences[inactivityScores].MinusRef() + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) + } + + b.state.InactivityScores = append(scores, s) + b.markFieldAsDirty(inactivityScores) + return nil +} + +// SetInactivityScores for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetInactivityScores(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[inactivityScores].MinusRef() + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) + + b.state.InactivityScores = val + b.markFieldAsDirty(inactivityScores) + return nil +} diff --git a/beacon-chain/state-proto/v2/state_trie.go b/beacon-chain/state-proto/v2/state_trie.go new file mode 100644 index 0000000000..6314b2e164 --- /dev/null +++ b/beacon-chain/state-proto/v2/state_trie.go @@ -0,0 +1,428 @@ +package v2 + +import ( + "context" + "io" + "io/ioutil" + "runtime" + "sort" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/features" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/container/slice" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "go.opencensus.io/trace" + "google.golang.org/protobuf/proto" +) + +// InitializeFromProto the beacon state from a protobuf representation. +func InitializeFromProto(st *ethpb.BeaconStateAltair) (*BeaconState, error) { + return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconStateAltair)) +} + +// InitializeFromSSZReader can be used when the source for a serialized BeaconState object +// is an io.Reader. This allows client code to remain agnostic about whether the data comes +// from the network or a file without needing to read the entire state into mem as a large byte slice. +func InitializeFromSSZReader(r io.Reader) (*BeaconState, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + return InitializeFromSSZBytes(b) +} + +// InitializeFromSSZBytes is a convenience method to obtain a BeaconState by unmarshaling +// a slice of bytes containing the ssz-serialized representation of the state. +func InitializeFromSSZBytes(marshaled []byte) (*BeaconState, error) { + st := ðpb.BeaconStateAltair{} + if err := st.UnmarshalSSZ(marshaled); err != nil { + return nil, err + } + return InitializeFromProtoUnsafe(st) +} + +// InitializeFromProtoUnsafe directly uses the beacon state protobuf pointer +// and sets it as the inner state of the BeaconState type. +func InitializeFromProtoUnsafe(st *ethpb.BeaconStateAltair) (*BeaconState, error) { + if st == nil { + return nil, errors.New("received nil state") + } + + fieldCount := params.BeaconConfig().BeaconStateAltairFieldCount + b := &BeaconState{ + state: st, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 11), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + valMapHandler: stateutil.NewValMapHandler(st.Validators), + } + + var err error + for i := 0; i < fieldCount; i++ { + b.dirtyFields[types.FieldIndex(i)] = true + b.rebuildTrie[types.FieldIndex(i)] = true + b.dirtyIndices[types.FieldIndex(i)] = []uint64{} + b.stateFieldLeaves[types.FieldIndex(i)], err = fieldtrie.NewFieldTrie(types.FieldIndex(i), types.BasicArray, nil, 0) + if err != nil { + return nil, err + } + } + + // Initialize field reference tracking for shared data. + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + + sharedstate.StateCount.Inc() + return b, nil +} + +// Copy returns a deep copy of the beacon state. +func (b *BeaconState) Copy() state.BeaconState { + if !b.hasInnerState() { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + fieldCount := params.BeaconConfig().BeaconStateAltairFieldCount + + dst := &BeaconState{ + state: ðpb.BeaconStateAltair{ + // Primitive types, safe to copy. + GenesisTime: b.state.GenesisTime, + Slot: b.state.Slot, + Eth1DepositIndex: b.state.Eth1DepositIndex, + + // Large arrays, infrequently changed, constant size. + RandaoMixes: b.state.RandaoMixes, + StateRoots: b.state.StateRoots, + BlockRoots: b.state.BlockRoots, + Slashings: b.state.Slashings, + Eth1DataVotes: b.state.Eth1DataVotes, + + // Large arrays, increases over time. + Validators: b.state.Validators, + Balances: b.state.Balances, + HistoricalRoots: b.state.HistoricalRoots, + PreviousEpochParticipation: b.state.PreviousEpochParticipation, + CurrentEpochParticipation: b.state.CurrentEpochParticipation, + InactivityScores: b.state.InactivityScores, + + // Everything else, too small to be concerned about, constant size. + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + Eth1Data: b.eth1Data(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + CurrentSyncCommittee: b.currentSyncCommittee(), + NextSyncCommittee: b.nextSyncCommittee(), + }, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 11), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + + // Share the reference to validator index map. + valMapHandler: b.valMapHandler, + } + + for field, ref := range b.sharedFieldReferences { + ref.AddRef() + dst.sharedFieldReferences[field] = ref + } + + // Increment ref for validator map + b.valMapHandler.AddRef() + + for i := range b.dirtyFields { + dst.dirtyFields[i] = true + } + + for i := range b.dirtyIndices { + indices := make([]uint64, len(b.dirtyIndices[i])) + copy(indices, b.dirtyIndices[i]) + dst.dirtyIndices[i] = indices + } + + for i := range b.rebuildTrie { + dst.rebuildTrie[i] = true + } + + for fldIdx, fieldTrie := range b.stateFieldLeaves { + dst.stateFieldLeaves[fldIdx] = fieldTrie + if fieldTrie.FieldReference() != nil { + fieldTrie.Lock() + fieldTrie.FieldReference().AddRef() + fieldTrie.Unlock() + } + } + + if b.merkleLayers != nil { + dst.merkleLayers = make([][][]byte, len(b.merkleLayers)) + for i, layer := range b.merkleLayers { + dst.merkleLayers[i] = make([][]byte, len(layer)) + for j, content := range layer { + dst.merkleLayers[i][j] = make([]byte, len(content)) + copy(dst.merkleLayers[i][j], content) + } + } + } + + sharedstate.StateCount.Inc() + // Finalizer runs when dst is being destroyed in garbage collection. + runtime.SetFinalizer(dst, func(b *BeaconState) { + for field, v := range b.sharedFieldReferences { + v.MinusRef() + if b.stateFieldLeaves[field].FieldReference() != nil { + b.stateFieldLeaves[field].FieldReference().MinusRef() + } + } + for i := 0; i < fieldCount; i++ { + field := types.FieldIndex(i) + delete(b.stateFieldLeaves, field) + delete(b.dirtyIndices, field) + delete(b.dirtyFields, field) + delete(b.sharedFieldReferences, field) + delete(b.stateFieldLeaves, field) + } + sharedstate.StateCount.Sub(1) + }) + + return dst +} + +// HashTreeRoot of the beacon state retrieves the Merkle root of the trie +// representation of the beacon state based on the eth2 Simple Serialize specification. +func (b *BeaconState) HashTreeRoot(ctx context.Context) ([32]byte, error) { + _, span := trace.StartSpan(ctx, "beaconStateAltair.HashTreeRoot") + defer span.End() + + b.lock.Lock() + defer b.lock.Unlock() + + if b.merkleLayers == nil || len(b.merkleLayers) == 0 { + fieldRoots, err := computeFieldRoots(ctx, b.state) + if err != nil { + return [32]byte{}, err + } + layers := stateutil.Merkleize(fieldRoots) + b.merkleLayers = layers + b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateAltairFieldCount) + } + + for field := range b.dirtyFields { + root, err := b.rootSelector(ctx, field) + if err != nil { + return [32]byte{}, err + } + b.merkleLayers[0][field] = root[:] + b.recomputeRoot(int(field)) + delete(b.dirtyFields, field) + } + return bytesutil.ToBytes32(b.merkleLayers[len(b.merkleLayers)-1][0]), nil +} + +// FieldReferencesCount returns the reference count held by each field. This +// also includes the field trie held by each field. +func (b *BeaconState) FieldReferencesCount() map[string]uint64 { + refMap := make(map[string]uint64) + b.lock.RLock() + defer b.lock.RUnlock() + for i, f := range b.sharedFieldReferences { + refMap[i.String(b.Version())] = uint64(f.Refs()) + } + for i, f := range b.stateFieldLeaves { + numOfRefs := uint64(f.FieldReference().Refs()) + f.RLock() + if !f.Empty() { + refMap[i.String(b.Version())+"_trie"] = numOfRefs + } + f.RUnlock() + } + return refMap +} + +// IsNil checks if the state and the underlying proto +// object are nil. +func (b *BeaconState) IsNil() bool { + return b == nil || b.state == nil +} + +func (b *BeaconState) rootSelector(ctx context.Context, field types.FieldIndex) ([32]byte, error) { + _, span := trace.StartSpan(ctx, "beaconState.rootSelector") + defer span.End() + span.AddAttributes(trace.StringAttribute("field", field.String(b.Version()))) + + hasher := hash.CustomSHA256Hasher() + switch field { + case genesisTime: + return ssz.Uint64Root(b.state.GenesisTime), nil + case genesisValidatorRoot: + return bytesutil.ToBytes32(b.state.GenesisValidatorsRoot), nil + case slot: + return ssz.Uint64Root(uint64(b.state.Slot)), nil + case eth1DepositIndex: + return ssz.Uint64Root(b.state.Eth1DepositIndex), nil + case fork: + return ssz.ForkRoot(b.state.Fork) + case latestBlockHeader: + return stateutil.BlockHeaderRoot(b.state.LatestBlockHeader) + case blockRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.BlockRoots, fieldparams.BlockRootsLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(blockRoots, b.state.BlockRoots) + case stateRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.StateRoots, fieldparams.StateRootsLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(stateRoots, b.state.StateRoots) + case historicalRoots: + return ssz.ByteArrayRootWithLimit(b.state.HistoricalRoots, fieldparams.HistoricalRootsLength) + case eth1Data: + return stateutil.Eth1Root(hasher, b.state.Eth1Data) + case eth1DataVotes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie( + field, + b.state.Eth1DataVotes, + fieldparams.Eth1DataVotesLength, + ) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(field, b.state.Eth1DataVotes) + case validators: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.Validators, fieldparams.ValidatorRegistryLimit) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, validators) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(validators, b.state.Validators) + case balances: + if features.Get().EnableBalanceTrieComputation { + if b.rebuildTrie[field] { + maxBalCap := uint64(fieldparams.ValidatorRegistryLimit) + elemSize := uint64(8) + balLimit := (maxBalCap*elemSize + 31) / 32 + err := b.resetFieldTrie(field, b.state.Balances, balLimit) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(balances, b.state.Balances) + } + return stateutil.Uint64ListRootWithRegistryLimit(b.state.Balances) + case randaoMixes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.RandaoMixes, fieldparams.RandaoMixesLength) + if err != nil { + return [32]byte{}, err + } + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(randaoMixes, b.state.RandaoMixes) + case slashings: + return ssz.SlashingsRoot(b.state.Slashings) + case previousEpochParticipationBits: + return stateutil.ParticipationBitsRoot(b.state.PreviousEpochParticipation) + case currentEpochParticipationBits: + return stateutil.ParticipationBitsRoot(b.state.CurrentEpochParticipation) + case justificationBits: + return bytesutil.ToBytes32(b.state.JustificationBits), nil + case previousJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.PreviousJustifiedCheckpoint) + case currentJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.CurrentJustifiedCheckpoint) + case finalizedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.FinalizedCheckpoint) + case inactivityScores: + return stateutil.Uint64ListRootWithRegistryLimit(b.state.InactivityScores) + case currentSyncCommittee: + return stateutil.SyncCommitteeRoot(b.state.CurrentSyncCommittee) + case nextSyncCommittee: + return stateutil.SyncCommitteeRoot(b.state.NextSyncCommittee) + } + return [32]byte{}, errors.New("invalid field index provided") +} + +func (b *BeaconState) recomputeFieldTrie(index types.FieldIndex, elements interface{}) ([32]byte, error) { + fTrie := b.stateFieldLeaves[index] + // We can't lock the trie directly because the trie's variable gets reassigned, + // and therefore we would call Unlock() on a different object. + fTrieMutex := fTrie.RWMutex + if fTrie.FieldReference().Refs() > 1 { + fTrieMutex.Lock() + fTrie.FieldReference().MinusRef() + newTrie := fTrie.CopyTrie() + b.stateFieldLeaves[index] = newTrie + fTrie = newTrie + fTrieMutex.Unlock() + } + // remove duplicate indexes + b.dirtyIndices[index] = slice.SetUint64(b.dirtyIndices[index]) + // sort indexes again + sort.Slice(b.dirtyIndices[index], func(i int, j int) bool { + return b.dirtyIndices[index][i] < b.dirtyIndices[index][j] + }) + root, err := fTrie.RecomputeTrie(b.dirtyIndices[index], elements) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[index] = []uint64{} + return root, nil +} + +func (b *BeaconState) resetFieldTrie(index types.FieldIndex, elements interface{}, length uint64) error { + fTrie, err := fieldtrie.NewFieldTrie(index, fieldMap[index], elements, length) + if err != nil { + return err + } + b.stateFieldLeaves[index] = fTrie + b.dirtyIndices[index] = []uint64{} + return nil +} diff --git a/beacon-chain/state/v2/state_trie_test.go b/beacon-chain/state-proto/v2/state_trie_test.go similarity index 98% rename from beacon-chain/state/v2/state_trie_test.go rename to beacon-chain/state-proto/v2/state_trie_test.go index ede78dc944..d8ccea2077 100644 --- a/beacon-chain/state/v2/state_trie_test.go +++ b/beacon-chain/state-proto/v2/state_trie_test.go @@ -5,7 +5,7 @@ import ( "sync" "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" "github.com/prysmaticlabs/prysm/config/features" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/state-proto/v2/types.go b/beacon-chain/state-proto/v2/types.go new file mode 100644 index 0000000000..1213650392 --- /dev/null +++ b/beacon-chain/state-proto/v2/types.go @@ -0,0 +1,78 @@ +package v2 + +import ( + "sync" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +func init() { + fieldMap = make(map[types.FieldIndex]types.DataType, params.BeaconConfig().BeaconStateFieldCount) + + // Initialize the fixed sized arrays. + fieldMap[types.BlockRoots] = types.BasicArray + fieldMap[types.StateRoots] = types.BasicArray + fieldMap[types.RandaoMixes] = types.BasicArray + + // Initialize the composite arrays. + fieldMap[types.Eth1DataVotes] = types.CompositeArray + fieldMap[types.Validators] = types.CompositeArray + + // Initialize Compressed Arrays + fieldMap[types.Balances] = types.CompressedArray +} + +// fieldMap keeps track of each field +// to its corresponding data type. +var fieldMap map[types.FieldIndex]types.DataType + +// ErrNilInnerState returns when the inner state is nil and no copy set or get +// operations can be performed on state. +var ErrNilInnerState = errors.New("nil inner state") + +// BeaconState defines a struct containing utilities for the eth2 chain state, defining +// getters and setters for its respective values and helpful functions such as HashTreeRoot(). +type BeaconState struct { + state *ethpb.BeaconStateAltair + lock sync.RWMutex + dirtyFields map[types.FieldIndex]bool + dirtyIndices map[types.FieldIndex][]uint64 + stateFieldLeaves map[types.FieldIndex]*fieldtrie.FieldTrie + rebuildTrie map[types.FieldIndex]bool + valMapHandler *stateutil.ValidatorMapHandler + merkleLayers [][][]byte + sharedFieldReferences map[types.FieldIndex]*stateutil.Reference +} + +// Field Aliases for values from the types package. +const ( + genesisTime = types.GenesisTime + genesisValidatorRoot = types.GenesisValidatorRoot + slot = types.Slot + fork = types.Fork + latestBlockHeader = types.LatestBlockHeader + blockRoots = types.BlockRoots + stateRoots = types.StateRoots + historicalRoots = types.HistoricalRoots + eth1Data = types.Eth1Data + eth1DataVotes = types.Eth1DataVotes + eth1DepositIndex = types.Eth1DepositIndex + validators = types.Validators + balances = types.Balances + randaoMixes = types.RandaoMixes + slashings = types.Slashings + previousEpochParticipationBits = types.PreviousEpochParticipationBits + currentEpochParticipationBits = types.CurrentEpochParticipationBits + justificationBits = types.JustificationBits + previousJustifiedCheckpoint = types.PreviousJustifiedCheckpoint + currentJustifiedCheckpoint = types.CurrentJustifiedCheckpoint + finalizedCheckpoint = types.FinalizedCheckpoint + inactivityScores = types.InactivityScores + currentSyncCommittee = types.CurrentSyncCommittee + nextSyncCommittee = types.NextSyncCommittee +) diff --git a/beacon-chain/state-proto/v3/BUILD.bazel b/beacon-chain/state-proto/v3/BUILD.bazel new file mode 100644 index 0000000000..2ca097f45c --- /dev/null +++ b/beacon-chain/state-proto/v3/BUILD.bazel @@ -0,0 +1,92 @@ +load("@prysm//tools/go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "deprecated_getters.go", + "deprecated_setters.go", + "field_roots.go", + "getters_block.go", + "getters_checkpoint.go", + "getters_eth1.go", + "getters_misc.go", + "getters_participation.go", + "getters_payload_header.go", + "getters_randao.go", + "getters_state.go", + "getters_sync_committee.go", + "getters_validator.go", + "proofs.go", + "setters_block.go", + "setters_checkpoint.go", + "setters_eth1.go", + "setters_misc.go", + "setters_participation.go", + "setters_payload_header.go", + "setters_randao.go", + "setters_state.go", + "setters_sync_committee.go", + "setters_validator.go", + "state_trie.go", + "types.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3", + visibility = [ + "//beacon-chain:__subpackages__", + "//testing/util:__pkg__", + ], + deps = [ + "//beacon-chain/sharedstate:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/fieldtrie:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/slice:go_default_library", + "//crypto/hash:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//runtime/version:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + "@io_opencensus_go//trace:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "deprecated_getters_test.go", + "deprecated_setters_test.go", + "getters_block_test.go", + "getters_test.go", + "getters_validator_test.go", + "proofs_test.go", + "setters_test.go", + "state_trie_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/types:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//config/features:go_default_library", + "//config/fieldparams:go_default_library", + "//config/params:go_default_library", + "//container/trie:go_default_library", + "//crypto/bls:go_default_library", + "//encoding/bytesutil:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "//testing/assert:go_default_library", + "//testing/require:go_default_library", + "//testing/util:go_default_library", + "@com_github_prysmaticlabs_eth2_types//:go_default_library", + "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + ], +) diff --git a/beacon-chain/state-proto/v3/deprecated_getters.go b/beacon-chain/state-proto/v3/deprecated_getters.go new file mode 100644 index 0000000000..846ace35e2 --- /dev/null +++ b/beacon-chain/state-proto/v3/deprecated_getters.go @@ -0,0 +1,16 @@ +package v3 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// PreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) PreviousEpochAttestations() ([]*ethpb.PendingAttestation, error) { + return nil, errors.New("PreviousEpochAttestations is not supported for version Merge beacon state") +} + +// CurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) CurrentEpochAttestations() ([]*ethpb.PendingAttestation, error) { + return nil, errors.New("CurrentEpochAttestations is not supported for version Merge beacon state") +} diff --git a/beacon-chain/state-proto/v3/deprecated_getters_test.go b/beacon-chain/state-proto/v3/deprecated_getters_test.go new file mode 100644 index 0000000000..3488b284e5 --- /dev/null +++ b/beacon-chain/state-proto/v3/deprecated_getters_test.go @@ -0,0 +1,19 @@ +package v3 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_CurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + _, err := s.CurrentEpochAttestations() + require.ErrorContains(t, "CurrentEpochAttestations is not supported for version Merge beacon state", err) +} + +func TestBeaconState_PreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + _, err := s.PreviousEpochAttestations() + require.ErrorContains(t, "PreviousEpochAttestations is not supported for version Merge beacon state", err) +} diff --git a/beacon-chain/state-proto/v3/deprecated_setters.go b/beacon-chain/state-proto/v3/deprecated_setters.go new file mode 100644 index 0000000000..53c61280fd --- /dev/null +++ b/beacon-chain/state-proto/v3/deprecated_setters.go @@ -0,0 +1,31 @@ +package v3 + +import ( + "github.com/pkg/errors" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetPreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) SetPreviousEpochAttestations(_ []*ethpb.PendingAttestation) error { + return errors.New("SetPreviousEpochAttestations is not supported for version Merge beacon state") +} + +// SetCurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) SetCurrentEpochAttestations(_ []*ethpb.PendingAttestation) error { + return errors.New("SetCurrentEpochAttestations is not supported for version Merge beacon state") +} + +// AppendCurrentEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) AppendCurrentEpochAttestations(_ *ethpb.PendingAttestation) error { + return errors.New("AppendCurrentEpochAttestations is not supported for version Merge beacon state") +} + +// AppendPreviousEpochAttestations is not supported for HF1 beacon state. +func (*BeaconState) AppendPreviousEpochAttestations(_ *ethpb.PendingAttestation) error { + return errors.New("AppendPreviousEpochAttestations is not supported for version Merge beacon state") +} + +// RotateAttestations is not supported for HF1 beacon state. +func (*BeaconState) RotateAttestations() error { + return errors.New("RotateAttestations is not supported for version Merge beacon state") +} diff --git a/beacon-chain/state-proto/v3/deprecated_setters_test.go b/beacon-chain/state-proto/v3/deprecated_setters_test.go new file mode 100644 index 0000000000..4fbde1097d --- /dev/null +++ b/beacon-chain/state-proto/v3/deprecated_setters_test.go @@ -0,0 +1,27 @@ +package v3 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_AppendCurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "AppendCurrentEpochAttestations is not supported for version Merge beacon state", s.AppendCurrentEpochAttestations(nil)) +} + +func TestBeaconState_AppendPreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "AppendPreviousEpochAttestations is not supported for version Merge beacon state", s.AppendPreviousEpochAttestations(nil)) +} + +func TestBeaconState_SetCurrentEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "SetCurrentEpochAttestations is not supported for version Merge beacon state", s.SetCurrentEpochAttestations(nil)) +} + +func TestBeaconState_SetPreviousEpochAttestations(t *testing.T) { + s := &BeaconState{} + require.ErrorContains(t, "SetPreviousEpochAttestations is not supported for version Merge beacon state", s.SetPreviousEpochAttestations(nil)) +} diff --git a/beacon-chain/state-proto/v3/field_roots.go b/beacon-chain/state-proto/v3/field_roots.go new file mode 100644 index 0000000000..7eb1c9d075 --- /dev/null +++ b/beacon-chain/state-proto/v3/field_roots.go @@ -0,0 +1,19 @@ +package v3 + +import ( + "context" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/config/features" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// computeFieldRoots returns the hash tree root computations of every field in +// the beacon state as a list of 32 byte roots. +//nolint:deadcode +func computeFieldRoots(ctx context.Context, state *ethpb.BeaconStateMerge) ([][]byte, error) { + if features.Get().EnableSSZCache { + return stateutil.CachedHasher.ComputeFieldRootsWithHasherMerge(ctx, state) + } + return stateutil.NocachedHasher.ComputeFieldRootsWithHasherMerge(ctx, state) +} diff --git a/beacon-chain/state-proto/v3/getters_block.go b/beacon-chain/state-proto/v3/getters_block.go new file mode 100644 index 0000000000..b9f4bb5b3e --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_block.go @@ -0,0 +1,99 @@ +package v3 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// LatestBlockHeader stored within the beacon state. +func (b *BeaconState) LatestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.latestBlockHeader() +} + +// latestBlockHeader stored within the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) latestBlockHeader() *ethpb.BeaconBlockHeader { + if !b.hasInnerState() { + return nil + } + if b.state.LatestBlockHeader == nil { + return nil + } + + hdr := ðpb.BeaconBlockHeader{ + Slot: b.state.LatestBlockHeader.Slot, + ProposerIndex: b.state.LatestBlockHeader.ProposerIndex, + } + + parentRoot := make([]byte, len(b.state.LatestBlockHeader.ParentRoot)) + bodyRoot := make([]byte, len(b.state.LatestBlockHeader.BodyRoot)) + stateRoot := make([]byte, len(b.state.LatestBlockHeader.StateRoot)) + + copy(parentRoot, b.state.LatestBlockHeader.ParentRoot) + copy(bodyRoot, b.state.LatestBlockHeader.BodyRoot) + copy(stateRoot, b.state.LatestBlockHeader.StateRoot) + hdr.ParentRoot = parentRoot + hdr.BodyRoot = bodyRoot + hdr.StateRoot = stateRoot + return hdr +} + +// BlockRoots kept track of in the beacon state. +func (b *BeaconState) BlockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.BlockRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRoots() +} + +// blockRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.BlockRoots) +} + +// BlockRootAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.BlockRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.blockRootAtIndex(idx) +} + +// blockRootAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) blockRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.BlockRoots, idx) +} diff --git a/beacon-chain/state-proto/v3/getters_block_test.go b/beacon-chain/state-proto/v3/getters_block_test.go new file mode 100644 index 0000000000..bb0f88f7ad --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_block_test.go @@ -0,0 +1,59 @@ +package v3 + +import ( + "testing" + + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_LatestBlockHeader(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateMerge{}) + require.NoError(t, err) + got := s.LatestBlockHeader() + require.DeepEqual(t, (*ethpb.BeaconBlockHeader)(nil), got) + + want := ðpb.BeaconBlockHeader{Slot: 100} + s, err = InitializeFromProto(ðpb.BeaconStateMerge{LatestBlockHeader: want}) + require.NoError(t, err) + got = s.LatestBlockHeader() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got.Slot = 101 + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRoots(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateMerge{}) + require.NoError(t, err) + got := s.BlockRoots() + require.DeepEqual(t, ([][]byte)(nil), got) + + want := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconStateMerge{BlockRoots: want}) + require.NoError(t, err) + got = s.BlockRoots() + require.DeepEqual(t, want, got) + + // Test copy does not mutate. + got[0][0] = 'b' + require.DeepNotEqual(t, want, got) +} + +func TestBeaconState_BlockRootAtIndex(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateMerge{}) + require.NoError(t, err) + got, err := s.BlockRootAtIndex(0) + require.NoError(t, err) + require.DeepEqual(t, ([]byte)(nil), got) + + r := [][]byte{{'a'}} + s, err = InitializeFromProto(ðpb.BeaconStateMerge{BlockRoots: r}) + require.NoError(t, err) + got, err = s.BlockRootAtIndex(0) + require.NoError(t, err) + want := bytesutil.PadTo([]byte{'a'}, 32) + require.DeepSSZEqual(t, want, got) +} diff --git a/beacon-chain/state-proto/v3/getters_checkpoint.go b/beacon-chain/state-proto/v3/getters_checkpoint.go new file mode 100644 index 0000000000..f6b6eab16c --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_checkpoint.go @@ -0,0 +1,160 @@ +package v3 + +import ( + "bytes" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// JustificationBits marking which epochs have been justified in the beacon chain. +func (b *BeaconState) JustificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.justificationBits() +} + +// justificationBits marking which epochs have been justified in the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) justificationBits() bitfield.Bitvector4 { + if !b.hasInnerState() { + return nil + } + if b.state.JustificationBits == nil { + return nil + } + + res := make([]byte, len(b.state.JustificationBits.Bytes())) + copy(res, b.state.JustificationBits.Bytes()) + return res +} + +// PreviousJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) PreviousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.PreviousJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousJustifiedCheckpoint() +} + +// previousJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.PreviousJustifiedCheckpoint) +} + +// CurrentJustifiedCheckpoint denoting an epoch and block root. +func (b *BeaconState) CurrentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.CurrentJustifiedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentJustifiedCheckpoint() +} + +// currentJustifiedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentJustifiedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.CurrentJustifiedCheckpoint) +} + +// MatchCurrentJustifiedCheckpoint returns true if input justified checkpoint matches +// the current justified checkpoint in state. +func (b *BeaconState) MatchCurrentJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.CurrentJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.CurrentJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.CurrentJustifiedCheckpoint.Root) +} + +// MatchPreviousJustifiedCheckpoint returns true if the input justified checkpoint matches +// the previous justified checkpoint in state. +func (b *BeaconState) MatchPreviousJustifiedCheckpoint(c *ethpb.Checkpoint) bool { + if !b.hasInnerState() { + return false + } + if b.state.PreviousJustifiedCheckpoint == nil { + return false + } + + if c.Epoch != b.state.PreviousJustifiedCheckpoint.Epoch { + return false + } + return bytes.Equal(c.Root, b.state.PreviousJustifiedCheckpoint.Root) +} + +// FinalizedCheckpoint denoting an epoch and block root. +func (b *BeaconState) FinalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + if b.state.FinalizedCheckpoint == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.finalizedCheckpoint() +} + +// finalizedCheckpoint denoting an epoch and block root. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) finalizedCheckpoint() *ethpb.Checkpoint { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyCheckpoint(b.state.FinalizedCheckpoint) +} + +// FinalizedCheckpointEpoch returns the epoch value of the finalized checkpoint. +func (b *BeaconState) FinalizedCheckpointEpoch() types.Epoch { + if !b.hasInnerState() { + return 0 + } + if b.state.FinalizedCheckpoint == nil { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return b.state.FinalizedCheckpoint.Epoch +} diff --git a/beacon-chain/state-proto/v3/getters_eth1.go b/beacon-chain/state-proto/v3/getters_eth1.go new file mode 100644 index 0000000000..04449eb9d9 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_eth1.go @@ -0,0 +1,91 @@ +package v3 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// Eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +func (b *BeaconState) Eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1Data() +} + +// eth1Data corresponding to the proof-of-work chain information stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1Data() *ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1Data == nil { + return nil + } + + return ethpb.CopyETH1Data(b.state.Eth1Data) +} + +// Eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +func (b *BeaconState) Eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DataVotes() +} + +// eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain +// data retrieved from eth1. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DataVotes() []*ethpb.Eth1Data { + if !b.hasInnerState() { + return nil + } + if b.state.Eth1DataVotes == nil { + return nil + } + + res := make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + for i := 0; i < len(res); i++ { + res[i] = ethpb.CopyETH1Data(b.state.Eth1DataVotes[i]) + } + return res +} + +// Eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +func (b *BeaconState) Eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.eth1DepositIndex() +} + +// eth1DepositIndex corresponds to the index of the deposit made to the +// validator deposit contract at the time of this state's eth1 data. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) eth1DepositIndex() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.Eth1DepositIndex +} diff --git a/beacon-chain/state-proto/v3/getters_misc.go b/beacon-chain/state-proto/v3/getters_misc.go new file mode 100644 index 0000000000..99f82adb3b --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_misc.go @@ -0,0 +1,211 @@ +package v3 + +import ( + "time" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/runtime/version" +) + +// GenesisTime of the beacon state as a uint64. +func (b *BeaconState) GenesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisTime() +} + +// genesisTime of the beacon state as a uint64. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisTime() uint64 { + if !b.hasInnerState() { + return 0 + } + + return b.state.GenesisTime +} + +// GenesisValidatorRoot of the beacon state. +func (b *BeaconState) GenesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisValidatorRoot() +} + +// genesisValidatorRoot of the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisValidatorRoot() []byte { + if !b.hasInnerState() { + return nil + } + if b.state.GenesisValidatorsRoot == nil { + return params.BeaconConfig().ZeroHash[:] + } + + root := make([]byte, 32) + copy(root, b.state.GenesisValidatorsRoot) + return root +} + +// GenesisUnixTime returns the genesis time as time.Time. +func (b *BeaconState) GenesisUnixTime() time.Time { + if !b.hasInnerState() { + return time.Unix(0, 0) + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.genesisUnixTime() +} + +// genesisUnixTime returns the genesis time as time.Time. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) genesisUnixTime() time.Time { + if !b.hasInnerState() { + return time.Unix(0, 0) + } + + return time.Unix(int64(b.state.GenesisTime), 0) +} + +// ParentRoot is a convenience method to access state.LatestBlockRoot.ParentRoot. +func (b *BeaconState) ParentRoot() [32]byte { + if !b.hasInnerState() { + return [32]byte{} + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.parentRoot() +} + +// parentRoot is a convenience method to access state.LatestBlockRoot.ParentRoot. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) parentRoot() [32]byte { + if !b.hasInnerState() { + return [32]byte{} + } + + parentRoot := [32]byte{} + copy(parentRoot[:], b.state.LatestBlockHeader.ParentRoot) + return parentRoot +} + +// Version of the beacon state. This method +// is strictly meant to be used without a lock +// internally. +func (_ *BeaconState) Version() int { + return version.Merge +} + +// Slot of the current beacon chain state. +func (b *BeaconState) Slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slot() +} + +// slot of the current beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slot() types.Slot { + if !b.hasInnerState() { + return 0 + } + + return b.state.Slot +} + +// Fork version of the beacon chain. +func (b *BeaconState) Fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.fork() +} + +// fork version of the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) fork() *ethpb.Fork { + if !b.hasInnerState() { + return nil + } + if b.state.Fork == nil { + return nil + } + + prevVersion := make([]byte, len(b.state.Fork.PreviousVersion)) + copy(prevVersion, b.state.Fork.PreviousVersion) + currVersion := make([]byte, len(b.state.Fork.CurrentVersion)) + copy(currVersion, b.state.Fork.CurrentVersion) + return ðpb.Fork{ + PreviousVersion: prevVersion, + CurrentVersion: currVersion, + Epoch: b.state.Fork.Epoch, + } +} + +// HistoricalRoots based on epochs stored in the beacon state. +func (b *BeaconState) HistoricalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.HistoricalRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.historicalRoots() +} + +// historicalRoots based on epochs stored in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) historicalRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.HistoricalRoots) +} + +// balancesLength returns the length of the balances slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + return len(b.state.Balances) +} diff --git a/beacon-chain/state-proto/v3/getters_participation.go b/beacon-chain/state-proto/v3/getters_participation.go new file mode 100644 index 0000000000..42358b01de --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_participation.go @@ -0,0 +1,53 @@ +package v3 + +// CurrentEpochParticipation corresponding to participation bits on the beacon chain. +func (b *BeaconState) CurrentEpochParticipation() ([]byte, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.CurrentEpochParticipation == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.currentEpochParticipation(), nil +} + +// PreviousEpochParticipation corresponding to participation bits on the beacon chain. +func (b *BeaconState) PreviousEpochParticipation() ([]byte, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.PreviousEpochParticipation == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.previousEpochParticipation(), nil +} + +// currentEpochParticipation corresponding to participation bits on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentEpochParticipation() []byte { + if !b.hasInnerState() { + return nil + } + tmp := make([]byte, len(b.state.CurrentEpochParticipation)) + copy(tmp, b.state.CurrentEpochParticipation) + return tmp +} + +// previousEpochParticipation corresponding to participation bits on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) previousEpochParticipation() []byte { + if !b.hasInnerState() { + return nil + } + tmp := make([]byte, len(b.state.PreviousEpochParticipation)) + copy(tmp, b.state.PreviousEpochParticipation) + return tmp +} diff --git a/beacon-chain/state-proto/v3/getters_payload_header.go b/beacon-chain/state-proto/v3/getters_payload_header.go new file mode 100644 index 0000000000..bfbd893f25 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_payload_header.go @@ -0,0 +1,30 @@ +package v3 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// LatestExecutionPayloadHeader of the beacon state. +func (b *BeaconState) LatestExecutionPayloadHeader() (*ethpb.ExecutionPayloadHeader, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.LatestExecutionPayloadHeader == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.latestExecutionPayloadHeader(), nil +} + +// latestExecutionPayloadHeader of the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) latestExecutionPayloadHeader() *ethpb.ExecutionPayloadHeader { + if !b.hasInnerState() { + return nil + } + + return ethpb.CopyExecutionPayloadHeader(b.state.LatestExecutionPayloadHeader) +} diff --git a/beacon-chain/state-proto/v3/getters_randao.go b/beacon-chain/state-proto/v3/getters_randao.go new file mode 100644 index 0000000000..660e330ab3 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_randao.go @@ -0,0 +1,85 @@ +package v3 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +// RandaoMixes of block proposers on the beacon chain. +func (b *BeaconState) RandaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.RandaoMixes == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixes() +} + +// randaoMixes of block proposers on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixes() [][]byte { + if !b.hasInnerState() { + return nil + } + + return bytesutil.SafeCopy2dBytes(b.state.RandaoMixes) +} + +// RandaoMixAtIndex retrieves a specific block root based on an +// input index value. +func (b *BeaconState) RandaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.RandaoMixes == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixAtIndex(idx) +} + +// randaoMixAtIndex retrieves a specific block root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + + return bytesutil.SafeCopyRootAtIndex(b.state.RandaoMixes, idx) +} + +// RandaoMixesLength returns the length of the randao mixes slice. +func (b *BeaconState) RandaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.randaoMixesLength() +} + +// randaoMixesLength returns the length of the randao mixes slice. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) randaoMixesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.RandaoMixes == nil { + return 0 + } + + return len(b.state.RandaoMixes) +} diff --git a/beacon-chain/state-proto/v3/getters_state.go b/beacon-chain/state-proto/v3/getters_state.go new file mode 100644 index 0000000000..71604daae4 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_state.go @@ -0,0 +1,127 @@ +package v3 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// InnerStateUnsafe returns the pointer value of the underlying +// beacon state proto object, bypassing immutability. Use with care. +func (b *BeaconState) InnerStateUnsafe() interface{} { + if b == nil { + return nil + } + return b.state +} + +// CloneInnerState the beacon state into a protobuf for usage. +func (b *BeaconState) CloneInnerState() interface{} { + if b == nil || b.state == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + return ðpb.BeaconStateMerge{ + GenesisTime: b.genesisTime(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + Slot: b.slot(), + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + BlockRoots: b.blockRoots(), + StateRoots: b.stateRoots(), + HistoricalRoots: b.historicalRoots(), + Eth1Data: b.eth1Data(), + Eth1DataVotes: b.eth1DataVotes(), + Eth1DepositIndex: b.eth1DepositIndex(), + Validators: b.validators(), + Balances: b.balances(), + RandaoMixes: b.randaoMixes(), + Slashings: b.slashings(), + CurrentEpochParticipation: b.currentEpochParticipation(), + PreviousEpochParticipation: b.previousEpochParticipation(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + InactivityScores: b.inactivityScores(), + CurrentSyncCommittee: b.currentSyncCommittee(), + NextSyncCommittee: b.nextSyncCommittee(), + LatestExecutionPayloadHeader: b.latestExecutionPayloadHeader(), + } +} + +// hasInnerState detects if the internal reference to the state data structure +// is populated correctly. Returns false if nil. +func (b *BeaconState) hasInnerState() bool { + return b != nil && b.state != nil +} + +// StateRoots kept track of in the beacon state. +func (b *BeaconState) StateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + if b.state.StateRoots == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRoots() +} + +// StateRoots kept track of in the beacon state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRoots() [][]byte { + if !b.hasInnerState() { + return nil + } + return bytesutil.SafeCopy2dBytes(b.state.StateRoots) +} + +// StateRootAtIndex retrieves a specific state root based on an +// input index value. +func (b *BeaconState) StateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.StateRoots == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.stateRootAtIndex(idx) +} + +// stateRootAtIndex retrieves a specific state root based on an +// input index value. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) stateRootAtIndex(idx uint64) ([]byte, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + return bytesutil.SafeCopyRootAtIndex(b.state.StateRoots, idx) +} + +// MarshalSSZ marshals the underlying beacon state to bytes. +func (b *BeaconState) MarshalSSZ() ([]byte, error) { + if !b.hasInnerState() { + return nil, errors.New("nil beacon state") + } + return b.state.MarshalSSZ() +} + +// ProtobufBeaconState transforms an input into beacon state Merge in the form of protobuf. +// Error is returned if the input is not type protobuf beacon state. +func ProtobufBeaconState(s interface{}) (*ethpb.BeaconStateMerge, error) { + pbState, ok := s.(*ethpb.BeaconStateMerge) + if !ok { + return nil, errors.New("input is not type pb.BeaconStateMerge") + } + return pbState, nil +} diff --git a/beacon-chain/state-proto/v3/getters_sync_committee.go b/beacon-chain/state-proto/v3/getters_sync_committee.go new file mode 100644 index 0000000000..38faf4ac19 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_sync_committee.go @@ -0,0 +1,69 @@ +package v3 + +import ( + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// currentSyncCommittee of the current sync committee in beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) currentSyncCommittee() *ethpb.SyncCommittee { + if !b.hasInnerState() { + return nil + } + + return CopySyncCommittee(b.state.CurrentSyncCommittee) +} + +// nextSyncCommittee of the next sync committee in beacon chain state. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) nextSyncCommittee() *ethpb.SyncCommittee { + if !b.hasInnerState() { + return nil + } + + return CopySyncCommittee(b.state.NextSyncCommittee) +} + +// CurrentSyncCommittee of the current sync committee in beacon chain state. +func (b *BeaconState) CurrentSyncCommittee() (*ethpb.SyncCommittee, error) { + if !b.hasInnerState() { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.CurrentSyncCommittee == nil { + return nil, nil + } + + return b.currentSyncCommittee(), nil +} + +// NextSyncCommittee of the next sync committee in beacon chain state. +func (b *BeaconState) NextSyncCommittee() (*ethpb.SyncCommittee, error) { + if !b.hasInnerState() { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.NextSyncCommittee == nil { + return nil, nil + } + + return b.nextSyncCommittee(), nil +} + +// CopySyncCommittee copies the provided sync committee object. +func CopySyncCommittee(data *ethpb.SyncCommittee) *ethpb.SyncCommittee { + if data == nil { + return nil + } + return ðpb.SyncCommittee{ + Pubkeys: bytesutil.SafeCopy2dBytes(data.Pubkeys), + AggregatePubkey: bytesutil.SafeCopyBytes(data.AggregatePubkey), + } +} diff --git a/beacon-chain/state-proto/v3/getters_test.go b/beacon-chain/state-proto/v3/getters_test.go new file mode 100644 index 0000000000..c96bb51b27 --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_test.go @@ -0,0 +1,192 @@ +package v3 + +import ( + "runtime/debug" + "sync" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestBeaconState_SlotDataRace(t *testing.T) { + headState, err := InitializeFromProto(ðpb.BeaconStateMerge{Slot: 1}) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(2) + go func() { + require.NoError(t, headState.SetSlot(0)) + wg.Done() + }() + go func() { + headState.Slot() + wg.Done() + }() + + wg.Wait() +} + +func TestNilState_NoPanic(t *testing.T) { + var st *BeaconState + defer func() { + if r := recover(); r != nil { + t.Errorf("Method panicked when it was not supposed to: %v\n%v\n", r, string(debug.Stack())) + } + }() + // retrieve elements from nil state + _ = st.GenesisTime() + _ = st.GenesisValidatorRoot() + _ = st.GenesisUnixTime() + _ = st.GenesisValidatorRoot() + _ = st.Slot() + _ = st.Fork() + _ = st.LatestBlockHeader() + _ = st.ParentRoot() + _ = st.BlockRoots() + _, err := st.BlockRootAtIndex(0) + _ = err + _ = st.StateRoots() + _ = st.HistoricalRoots() + _ = st.Eth1Data() + _ = st.Eth1DataVotes() + _ = st.Eth1DepositIndex() + _, err = st.ValidatorAtIndex(0) + _ = err + _, err = st.ValidatorAtIndexReadOnly(0) + _ = err + _, _ = st.ValidatorIndexByPubkey([48]byte{}) + _ = st.PubkeyAtIndex(0) + _ = st.NumValidators() + _ = st.Balances() + _, err = st.BalanceAtIndex(0) + _ = err + _ = st.BalancesLength() + _ = st.RandaoMixes() + _, err = st.RandaoMixAtIndex(0) + _ = err + _ = st.RandaoMixesLength() + _ = st.Slashings() + _, err = st.CurrentEpochParticipation() + _ = err + _, err = st.PreviousEpochParticipation() + _ = err + _ = st.JustificationBits() + _ = st.PreviousJustifiedCheckpoint() + _ = st.CurrentJustifiedCheckpoint() + _ = st.FinalizedCheckpoint() + _, err = st.CurrentEpochParticipation() + _ = err + _, err = st.PreviousEpochParticipation() + _ = err + _, err = st.InactivityScores() + _ = err + _, err = st.CurrentSyncCommittee() + _ = err + _, err = st.NextSyncCommittee() + _ = err +} + +func TestBeaconState_ValidatorByPubkey(t *testing.T) { + keyCreator := func(input []byte) [48]byte { + nKey := [48]byte{} + copy(nKey[:1], input) + return nKey + } + + tests := []struct { + name string + modifyFunc func(b *BeaconState, k [48]byte) + exists bool + expectedIdx types.ValidatorIndex + largestIdxInSet types.ValidatorIndex + }{ + { + name: "retrieve validator", + modifyFunc: func(b *BeaconState, key [48]byte) { + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators from the start", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + }, + exists: true, + expectedIdx: 2, + }, + { + name: "retrieve validator with multiple validators from the start with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + _ = b.Copy() + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + }, + exists: true, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + key2 := keyCreator([]byte{'D'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key2[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + { + name: "retrieve validator with multiple validators with shared state at boundary", + modifyFunc: func(b *BeaconState, key [48]byte) { + key1 := keyCreator([]byte{'C'}) + assert.NoError(t, b.AppendValidator(ðpb.Validator{PublicKey: key1[:]})) + n := b.Copy() + // Append to another state + assert.NoError(t, n.AppendValidator(ðpb.Validator{PublicKey: key[:]})) + + }, + exists: false, + expectedIdx: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s, err := InitializeFromProto(ðpb.BeaconStateMerge{}) + require.NoError(t, err) + nKey := keyCreator([]byte{'A'}) + tt.modifyFunc(s, nKey) + idx, ok := s.ValidatorIndexByPubkey(nKey) + assert.Equal(t, tt.exists, ok) + assert.Equal(t, tt.expectedIdx, idx) + }) + } +} diff --git a/beacon-chain/state-proto/v3/getters_validator.go b/beacon-chain/state-proto/v3/getters_validator.go new file mode 100644 index 0000000000..084e0bf31f --- /dev/null +++ b/beacon-chain/state-proto/v3/getters_validator.go @@ -0,0 +1,328 @@ +package v3 + +import ( + "fmt" + + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// ValidatorIndexOutOfRangeError represents an error scenario where a validator does not exist +// at a given index in the validator's array. +type ValidatorIndexOutOfRangeError struct { + message string +} + +var ( + // ErrNilValidatorsInState returns when accessing validators in the state while the state has a + // nil slice for the validators field. + ErrNilValidatorsInState = errors.New("state has nil validator slice") +) + +// NewValidatorIndexOutOfRangeError creates a new error instance. +func NewValidatorIndexOutOfRangeError(index types.ValidatorIndex) ValidatorIndexOutOfRangeError { + return ValidatorIndexOutOfRangeError{ + message: fmt.Sprintf("index %d out of range", index), + } +} + +// Error returns the underlying error message. +func (e *ValidatorIndexOutOfRangeError) Error() string { + return e.message +} + +// Validators participating in consensus on the beacon chain. +func (b *BeaconState) Validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.validators() +} + +// validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) validators() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + val := b.state.Validators[i] + if val == nil { + continue + } + res[i] = ethpb.CopyValidator(val) + } + return res +} + +// references of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. This does not +// copy fully and instead just copies the reference. +func (b *BeaconState) validatorsReferences() []*ethpb.Validator { + if !b.hasInnerState() { + return nil + } + if b.state.Validators == nil { + return nil + } + + res := make([]*ethpb.Validator, len(b.state.Validators)) + for i := 0; i < len(res); i++ { + validator := b.state.Validators[i] + if validator == nil { + continue + } + // copy validator reference instead. + res[i] = validator + } + return res +} + +// ValidatorAtIndex is the validator at the provided index. +func (b *BeaconState) ValidatorAtIndex(idx types.ValidatorIndex) (*ethpb.Validator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return ðpb.Validator{}, nil + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + val := b.state.Validators[idx] + return ethpb.CopyValidator(val), nil +} + +// ValidatorAtIndexReadOnly is the validator at the provided index. This method +// doesn't clone the validator. +func (b *BeaconState) ValidatorAtIndexReadOnly(idx types.ValidatorIndex) (state.ReadOnlyValidator, error) { + if !b.hasInnerState() { + return nil, ErrNilInnerState + } + if b.state.Validators == nil { + return nil, ErrNilValidatorsInState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + e := NewValidatorIndexOutOfRangeError(idx) + return nil, &e + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return v1.NewValidator(b.state.Validators[idx]) +} + +// ValidatorIndexByPubkey returns a given validator by its 48-byte public key. +func (b *BeaconState) ValidatorIndexByPubkey(key [48]byte) (types.ValidatorIndex, bool) { + if b == nil || b.valMapHandler == nil || b.valMapHandler.IsNil() { + return 0, false + } + b.lock.RLock() + defer b.lock.RUnlock() + numOfVals := len(b.state.Validators) + + idx, ok := b.valMapHandler.Get(key) + if ok && numOfVals <= int(idx) { + return types.ValidatorIndex(0), false + } + return idx, ok +} + +// PubkeyAtIndex returns the pubkey at the given +// validator index. +func (b *BeaconState) PubkeyAtIndex(idx types.ValidatorIndex) [48]byte { + if !b.hasInnerState() { + return [48]byte{} + } + if uint64(idx) >= uint64(len(b.state.Validators)) { + return [48]byte{} + } + b.lock.RLock() + defer b.lock.RUnlock() + + if b.state.Validators[idx] == nil { + return [48]byte{} + } + return bytesutil.ToBytes48(b.state.Validators[idx].PublicKey) +} + +// NumValidators returns the size of the validator registry. +func (b *BeaconState) NumValidators() int { + if !b.hasInnerState() { + return 0 + } + b.lock.RLock() + defer b.lock.RUnlock() + + return len(b.state.Validators) +} + +// ReadFromEveryValidator reads values from every validator and applies it to the provided function. +// Warning: This method is potentially unsafe, as it exposes the actual validator registry. +func (b *BeaconState) ReadFromEveryValidator(f func(idx int, val state.ReadOnlyValidator) error) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if b.state.Validators == nil { + return errors.New("nil validators in state") + } + b.lock.RLock() + validators := b.state.Validators + b.lock.RUnlock() + + for i, v := range validators { + v, err := v1.NewValidator(v) + if err != nil { + return err + } + if err := f(i, v); err != nil { + return err + } + } + return nil +} + +// Balances of validators participating in consensus on the beacon chain. +func (b *BeaconState) Balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balances() +} + +// balances of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) balances() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Balances == nil { + return nil + } + + res := make([]uint64, len(b.state.Balances)) + copy(res, b.state.Balances) + return res +} + +// BalanceAtIndex of validator with the provided index. +func (b *BeaconState) BalanceAtIndex(idx types.ValidatorIndex) (uint64, error) { + if !b.hasInnerState() { + return 0, ErrNilInnerState + } + if b.state.Balances == nil { + return 0, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + if uint64(len(b.state.Balances)) <= uint64(idx) { + return 0, fmt.Errorf("index of %d does not exist", idx) + } + return b.state.Balances[idx], nil +} + +// BalancesLength returns the length of the balances slice. +func (b *BeaconState) BalancesLength() int { + if !b.hasInnerState() { + return 0 + } + if b.state.Balances == nil { + return 0 + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.balancesLength() +} + +// Slashings of validators on the beacon chain. +func (b *BeaconState) Slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.slashings() +} + +// slashings of validators on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) slashings() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.Slashings == nil { + return nil + } + + res := make([]uint64, len(b.state.Slashings)) + copy(res, b.state.Slashings) + return res +} + +// inactivityScores of validators participating in consensus on the beacon chain. +// This assumes that a lock is already held on BeaconState. +func (b *BeaconState) inactivityScores() []uint64 { + if !b.hasInnerState() { + return nil + } + if b.state.InactivityScores == nil { + return nil + } + + res := make([]uint64, len(b.state.InactivityScores)) + copy(res, b.state.InactivityScores) + return res +} + +// InactivityScores of validators participating in consensus on the beacon chain. +func (b *BeaconState) InactivityScores() ([]uint64, error) { + if !b.hasInnerState() { + return nil, nil + } + if b.state.InactivityScores == nil { + return nil, nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + + return b.inactivityScores(), nil +} diff --git a/beacon-chain/state/v3/getters_validator_test.go b/beacon-chain/state-proto/v3/getters_validator_test.go similarity index 88% rename from beacon-chain/state/v3/getters_validator_test.go rename to beacon-chain/state-proto/v3/getters_validator_test.go index 019f6dc8b8..b8e7181742 100644 --- a/beacon-chain/state/v3/getters_validator_test.go +++ b/beacon-chain/state-proto/v3/getters_validator_test.go @@ -3,7 +3,7 @@ package v3_test import ( "testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/state-proto/v3/proofs.go b/beacon-chain/state-proto/v3/proofs.go new file mode 100644 index 0000000000..dd691e6c25 --- /dev/null +++ b/beacon-chain/state-proto/v3/proofs.go @@ -0,0 +1,60 @@ +package v3 + +import ( + "encoding/binary" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" +) + +const ( + finalizedRootIndex = uint64(105) // Precomputed value. +) + +// FinalizedRootGeneralizedIndex for the beacon state. +func FinalizedRootGeneralizedIndex() uint64 { + return finalizedRootIndex +} + +// CurrentSyncCommitteeGeneralizedIndex for the beacon state. +func CurrentSyncCommitteeGeneralizedIndex() uint64 { + return uint64(currentSyncCommittee) +} + +// NextSyncCommitteeGeneralizedIndex for the beacon state. +func NextSyncCommitteeGeneralizedIndex() uint64 { + return uint64(nextSyncCommittee) +} + +// CurrentSyncCommitteeProof from the state's Merkle trie representation. +func (b *BeaconState) CurrentSyncCommitteeProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, currentSyncCommittee), nil +} + +// NextSyncCommitteeProof from the state's Merkle trie representation. +func (b *BeaconState) NextSyncCommitteeProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + return fieldtrie.ProofFromMerkleLayers(b.merkleLayers, nextSyncCommittee), nil +} + +// FinalizedRootProof crafts a Merkle proof for the finalized root +// contained within the finalized checkpoint of a beacon state. +func (b *BeaconState) FinalizedRootProof() ([][]byte, error) { + b.lock.RLock() + defer b.lock.RUnlock() + cpt := b.state.FinalizedCheckpoint + // The epoch field of a finalized checkpoint is the neighbor + // index of the finalized root field in its Merkle tree representation + // of the checkpoint. This neighbor is the first element added to the proof. + epochBuf := make([]byte, 8) + binary.LittleEndian.PutUint64(epochBuf, uint64(cpt.Epoch)) + epochRoot := bytesutil.ToBytes32(epochBuf) + proof := make([][]byte, 0) + proof = append(proof, epochRoot[:]) + branch := fieldtrie.ProofFromMerkleLayers(b.merkleLayers, finalizedCheckpoint) + proof = append(proof, branch...) + return proof, nil +} diff --git a/beacon-chain/state/v3/proofs_test.go b/beacon-chain/state-proto/v3/proofs_test.go similarity index 97% rename from beacon-chain/state/v3/proofs_test.go rename to beacon-chain/state-proto/v3/proofs_test.go index b683023a63..a7ff7eeea8 100644 --- a/beacon-chain/state/v3/proofs_test.go +++ b/beacon-chain/state-proto/v3/proofs_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - v3 "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/beacon-chain/state-proto/v3/setters_block.go b/beacon-chain/state-proto/v3/setters_block.go new file mode 100644 index 0000000000..5a08b311c0 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_block.go @@ -0,0 +1,68 @@ +package v3 + +import ( + "fmt" + + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetLatestBlockHeader in the beacon state. +func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.LatestBlockHeader = ethpb.CopyBeaconBlockHeader(val) + b.markFieldAsDirty(latestBlockHeader) + return nil +} + +// SetBlockRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBlockRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[blockRoots].MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + + b.state.BlockRoots = val + b.markFieldAsDirty(blockRoots) + b.rebuildTrie[blockRoots] = true + return nil +} + +// UpdateBlockRootAtIndex for the beacon state. Updates the block root +// at a specific index to a new value. +func (b *BeaconState) UpdateBlockRootAtIndex(idx uint64, blockRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.BlockRoots)) <= idx { + return fmt.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + r := b.state.BlockRoots + if ref := b.sharedFieldReferences[blockRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.BlockRoots)) + copy(r, b.state.BlockRoots) + ref.MinusRef() + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + } + + r[idx] = blockRoot[:] + b.state.BlockRoots = r + + b.markFieldAsDirty(blockRoots) + b.addDirtyIndices(blockRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_checkpoint.go b/beacon-chain/state-proto/v3/setters_checkpoint.go new file mode 100644 index 0000000000..601f89dab6 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_checkpoint.go @@ -0,0 +1,58 @@ +package v3 + +import ( + "github.com/prysmaticlabs/go-bitfield" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetJustificationBits for the beacon state. +func (b *BeaconState) SetJustificationBits(val bitfield.Bitvector4) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.JustificationBits = val + b.markFieldAsDirty(justificationBits) + return nil +} + +// SetPreviousJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetPreviousJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.PreviousJustifiedCheckpoint = val + b.markFieldAsDirty(previousJustifiedCheckpoint) + return nil +} + +// SetCurrentJustifiedCheckpoint for the beacon state. +func (b *BeaconState) SetCurrentJustifiedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.CurrentJustifiedCheckpoint = val + b.markFieldAsDirty(currentJustifiedCheckpoint) + return nil +} + +// SetFinalizedCheckpoint for the beacon state. +func (b *BeaconState) SetFinalizedCheckpoint(val *ethpb.Checkpoint) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.FinalizedCheckpoint = val + b.markFieldAsDirty(finalizedCheckpoint) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_eth1.go b/beacon-chain/state-proto/v3/setters_eth1.go new file mode 100644 index 0000000000..db768b5a7c --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_eth1.go @@ -0,0 +1,74 @@ +package v3 + +import ( + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetEth1Data for the beacon state. +func (b *BeaconState) SetEth1Data(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1Data = val + b.markFieldAsDirty(eth1Data) + return nil +} + +// SetEth1DataVotes for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetEth1DataVotes(val []*ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + + b.state.Eth1DataVotes = val + b.markFieldAsDirty(eth1DataVotes) + b.rebuildTrie[eth1DataVotes] = true + return nil +} + +// SetEth1DepositIndex for the beacon state. +func (b *BeaconState) SetEth1DepositIndex(val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Eth1DepositIndex = val + b.markFieldAsDirty(eth1DepositIndex) + return nil +} + +// AppendEth1DataVotes for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendEth1DataVotes(val *ethpb.Eth1Data) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + votes := b.state.Eth1DataVotes + if b.sharedFieldReferences[eth1DataVotes].Refs() > 1 { + // Copy elements in underlying array by reference. + votes = make([]*ethpb.Eth1Data, len(b.state.Eth1DataVotes)) + copy(votes, b.state.Eth1DataVotes) + b.sharedFieldReferences[eth1DataVotes].MinusRef() + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + } + + b.state.Eth1DataVotes = append(votes, val) + b.markFieldAsDirty(eth1DataVotes) + b.addDirtyIndices(eth1DataVotes, []uint64{uint64(len(b.state.Eth1DataVotes) - 1)}) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_misc.go b/beacon-chain/state-proto/v3/setters_misc.go new file mode 100644 index 0000000000..2adaf48cb0 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_misc.go @@ -0,0 +1,186 @@ +package v3 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/features" + "github.com/prysmaticlabs/prysm/crypto/hash" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "google.golang.org/protobuf/proto" +) + +// For our setters, we have a field reference counter through +// which we can track shared field references. This helps when +// performing state copies, as we simply copy the reference to the +// field. When we do need to do need to modify these fields, we +// perform a full copy of the field. This is true of most of our +// fields except for the following below. +// 1) BlockRoots +// 2) StateRoots +// 3) Eth1DataVotes +// 4) RandaoMixes +// 5) HistoricalRoots +// 6) CurrentParticipationBits +// 7) PreviousParticipationBits +// +// The fields referred to above are instead copied by reference, where +// we simply copy the reference to the underlying object instead of the +// whole object. This is possible due to how we have structured our state +// as we copy the value on read, so as to ensure the underlying object is +// not mutated while it is being accessed during a state read. + +const ( + // This specifies the limit till which we process all dirty indices for a certain field. + // If we have more dirty indices than the threshold, then we rebuild the whole trie. This + // comes due to the fact that O(alogn) > O(n) beyond a certain value of a. + indicesLimit = 8000 +) + +// SetGenesisTime for the beacon state. +func (b *BeaconState) SetGenesisTime(val uint64) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisTime = val + b.markFieldAsDirty(genesisTime) + return nil +} + +// SetGenesisValidatorRoot for the beacon state. +func (b *BeaconState) SetGenesisValidatorRoot(val []byte) error { + b.lock.Lock() + defer b.lock.Unlock() + + b.state.GenesisValidatorsRoot = val + b.markFieldAsDirty(genesisValidatorRoot) + return nil +} + +// SetSlot for the beacon state. +func (b *BeaconState) SetSlot(val types.Slot) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Slot = val + b.markFieldAsDirty(slot) + return nil +} + +// SetFork version for the beacon chain. +func (b *BeaconState) SetFork(val *ethpb.Fork) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + fk, ok := proto.Clone(val).(*ethpb.Fork) + if !ok { + return errors.New("proto.Clone did not return a fork proto") + } + b.state.Fork = fk + b.markFieldAsDirty(fork) + return nil +} + +// SetHistoricalRoots for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetHistoricalRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + + b.state.HistoricalRoots = val + b.markFieldAsDirty(historicalRoots) + return nil +} + +// AppendHistoricalRoots for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendHistoricalRoots(root [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + roots := b.state.HistoricalRoots + if b.sharedFieldReferences[historicalRoots].Refs() > 1 { + roots = make([][]byte, len(b.state.HistoricalRoots)) + copy(roots, b.state.HistoricalRoots) + b.sharedFieldReferences[historicalRoots].MinusRef() + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + } + + b.state.HistoricalRoots = append(roots, root[:]) + b.markFieldAsDirty(historicalRoots) + return nil +} + +// Recomputes the branch up the index in the Merkle trie representation +// of the beacon state. This method performs slice reads and the caller MUST +// hold the lock before calling this method. +func (b *BeaconState) recomputeRoot(idx int) { + hashFunc := hash.CustomSHA256Hasher() + layers := b.merkleLayers + // The merkle tree structure looks as follows: + // [[r1, r2, r3, r4], [parent1, parent2], [root]] + // Using information about the index which changed, idx, we recompute + // only its branch up the tree. + currentIndex := idx + root := b.merkleLayers[0][idx] + for i := 0; i < len(layers)-1; i++ { + isLeft := currentIndex%2 == 0 + neighborIdx := currentIndex ^ 1 + + neighbor := make([]byte, 32) + if layers[i] != nil && len(layers[i]) != 0 && neighborIdx < len(layers[i]) { + neighbor = layers[i][neighborIdx] + } + if isLeft { + parentHash := hashFunc(append(root, neighbor...)) + root = parentHash[:] + } else { + parentHash := hashFunc(append(neighbor, root...)) + root = parentHash[:] + } + parentIdx := currentIndex / 2 + // Update the cached layers at the parent index. + layers[i+1][parentIdx] = root + currentIndex = parentIdx + } + b.merkleLayers = layers +} + +func (b *BeaconState) markFieldAsDirty(field stateTypes.FieldIndex) { + b.dirtyFields[field] = true +} + +// addDirtyIndices adds the relevant dirty field indices, so that they +// can be recomputed. +func (b *BeaconState) addDirtyIndices(index stateTypes.FieldIndex, indices []uint64) { + if b.rebuildTrie[index] { + return + } + // Exit early if balance trie computation isn't enabled. + if !features.Get().EnableBalanceTrieComputation && index == balances { + return + } + totalIndicesLen := len(b.dirtyIndices[index]) + len(indices) + if totalIndicesLen > indicesLimit { + b.rebuildTrie[index] = true + b.dirtyIndices[index] = []uint64{} + } else { + b.dirtyIndices[index] = append(b.dirtyIndices[index], indices...) + } +} diff --git a/beacon-chain/state-proto/v3/setters_participation.go b/beacon-chain/state-proto/v3/setters_participation.go new file mode 100644 index 0000000000..b22fcc1fbd --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_participation.go @@ -0,0 +1,89 @@ +package v3 + +import ( + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetPreviousParticipationBits for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetPreviousParticipationBits(val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[previousEpochParticipationBits].MinusRef() + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) + + b.state.PreviousEpochParticipation = val + b.markFieldAsDirty(previousEpochParticipationBits) + b.rebuildTrie[previousEpochParticipationBits] = true + return nil +} + +// SetCurrentParticipationBits for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetCurrentParticipationBits(val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[currentEpochParticipationBits].MinusRef() + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) + + b.state.CurrentEpochParticipation = val + b.markFieldAsDirty(currentEpochParticipationBits) + b.rebuildTrie[currentEpochParticipationBits] = true + return nil +} + +// AppendCurrentParticipationBits for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendCurrentParticipationBits(val byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + participation := b.state.CurrentEpochParticipation + if b.sharedFieldReferences[currentEpochParticipationBits].Refs() > 1 { + // Copy elements in underlying array by reference. + participation = make([]byte, len(b.state.CurrentEpochParticipation)) + copy(participation, b.state.CurrentEpochParticipation) + b.sharedFieldReferences[currentEpochParticipationBits].MinusRef() + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) + } + + b.state.CurrentEpochParticipation = append(participation, val) + b.markFieldAsDirty(currentEpochParticipationBits) + b.addDirtyIndices(currentEpochParticipationBits, []uint64{uint64(len(b.state.CurrentEpochParticipation) - 1)}) + return nil +} + +// AppendPreviousParticipationBits for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendPreviousParticipationBits(val byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + bits := b.state.PreviousEpochParticipation + if b.sharedFieldReferences[previousEpochParticipationBits].Refs() > 1 { + bits = make([]byte, len(b.state.PreviousEpochParticipation)) + copy(bits, b.state.PreviousEpochParticipation) + b.sharedFieldReferences[previousEpochParticipationBits].MinusRef() + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) + } + + b.state.PreviousEpochParticipation = append(bits, val) + b.markFieldAsDirty(previousEpochParticipationBits) + b.addDirtyIndices(previousEpochParticipationBits, []uint64{uint64(len(b.state.PreviousEpochParticipation) - 1)}) + + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_payload_header.go b/beacon-chain/state-proto/v3/setters_payload_header.go new file mode 100644 index 0000000000..516db0f50f --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_payload_header.go @@ -0,0 +1,16 @@ +package v3 + +import ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + +// SetLatestExecutionPayloadHeader for the beacon state. +func (b *BeaconState) SetLatestExecutionPayloadHeader(val *ethpb.ExecutionPayloadHeader) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.LatestExecutionPayloadHeader = val + b.markFieldAsDirty(latestExecutionPayloadHeader) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_randao.go b/beacon-chain/state-proto/v3/setters_randao.go new file mode 100644 index 0000000000..db29c1bb71 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_randao.go @@ -0,0 +1,53 @@ +package v3 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetRandaoMixes for the beacon state. Updates the entire +// randao mixes to a new value by overwriting the previous one. +func (b *BeaconState) SetRandaoMixes(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + + b.state.RandaoMixes = val + b.markFieldAsDirty(randaoMixes) + b.rebuildTrie[randaoMixes] = true + return nil +} + +// UpdateRandaoMixesAtIndex for the beacon state. Updates the randao mixes +// at a specific index to a new value. +func (b *BeaconState) UpdateRandaoMixesAtIndex(idx uint64, val []byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.RandaoMixes)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + mixes := b.state.RandaoMixes + if refs := b.sharedFieldReferences[randaoMixes].Refs(); refs > 1 { + // Copy elements in underlying array by reference. + mixes = make([][]byte, len(b.state.RandaoMixes)) + copy(mixes, b.state.RandaoMixes) + b.sharedFieldReferences[randaoMixes].MinusRef() + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + } + + mixes[idx] = val + b.state.RandaoMixes = mixes + b.markFieldAsDirty(randaoMixes) + b.addDirtyIndices(randaoMixes, []uint64{idx}) + + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_state.go b/beacon-chain/state-proto/v3/setters_state.go new file mode 100644 index 0000000000..848cce747f --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_state.go @@ -0,0 +1,59 @@ +package v3 + +import ( + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" +) + +// SetStateRoots for the beacon state. Updates the state roots +// to a new value by overwriting the previous value. +func (b *BeaconState) SetStateRoots(val [][]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[stateRoots].MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + + b.state.StateRoots = val + b.markFieldAsDirty(stateRoots) + b.rebuildTrie[stateRoots] = true + return nil +} + +// UpdateStateRootAtIndex for the beacon state. Updates the state root +// at a specific index to a new value. +func (b *BeaconState) UpdateStateRootAtIndex(idx uint64, stateRoot [32]byte) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + + b.lock.RLock() + if uint64(len(b.state.StateRoots)) <= idx { + b.lock.RUnlock() + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.RUnlock() + + b.lock.Lock() + defer b.lock.Unlock() + + // Check if we hold the only reference to the shared state roots slice. + r := b.state.StateRoots + if ref := b.sharedFieldReferences[stateRoots]; ref.Refs() > 1 { + // Copy elements in underlying array by reference. + r = make([][]byte, len(b.state.StateRoots)) + copy(r, b.state.StateRoots) + ref.MinusRef() + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + } + + r[idx] = stateRoot[:] + b.state.StateRoots = r + + b.markFieldAsDirty(stateRoots) + b.addDirtyIndices(stateRoots, []uint64{idx}) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_sync_committee.go b/beacon-chain/state-proto/v3/setters_sync_committee.go new file mode 100644 index 0000000000..7b5fa8372b --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_sync_committee.go @@ -0,0 +1,31 @@ +package v3 + +import ( + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetCurrentSyncCommittee for the beacon state. +func (b *BeaconState) SetCurrentSyncCommittee(val *ethpb.SyncCommittee) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.CurrentSyncCommittee = val + b.markFieldAsDirty(currentSyncCommittee) + return nil +} + +// SetNextSyncCommittee for the beacon state. +func (b *BeaconState) SetNextSyncCommittee(val *ethpb.SyncCommittee) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.NextSyncCommittee = val + b.markFieldAsDirty(nextSyncCommittee) + return nil +} diff --git a/beacon-chain/state-proto/v3/setters_test.go b/beacon-chain/state-proto/v3/setters_test.go new file mode 100644 index 0000000000..e8c3f58239 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_test.go @@ -0,0 +1,184 @@ +package v3 + +import ( + "context" + "strconv" + "testing" + + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/go-bitfield" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateTypes "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/testing/assert" + "github.com/prysmaticlabs/prysm/testing/require" +) + +func TestAppendBeyondIndicesLimit(t *testing.T) { + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + payload := ðpb.ExecutionPayloadHeader{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, 32), + ReceiptRoot: make([]byte, 32), + LogsBloom: make([]byte, 256), + Random: make([]byte, 32), + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + TransactionsRoot: make([]byte, 32), + } + st, err := InitializeFromProto(ðpb.BeaconStateMerge{ + Slot: 1, + CurrentEpochParticipation: []byte{}, + PreviousEpochParticipation: []byte{}, + Validators: []*ethpb.Validator{}, + Eth1Data: ðpb.Eth1Data{}, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + LatestExecutionPayloadHeader: payload, + }) + require.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := stateTypes.FieldIndex(0); i < stateTypes.FieldIndex(params.BeaconConfig().BeaconStateMergeFieldCount); i++ { + st.dirtyFields[i] = true + } + _, err = st.HashTreeRoot(context.Background()) + require.NoError(t, err) + for i := 0; i < 10; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, false, st.rebuildTrie[validators]) + assert.NotEqual(t, len(st.dirtyIndices[validators]), 0) + + for i := 0; i < indicesLimit; i++ { + assert.NoError(t, st.AppendValidator(ðpb.Validator{})) + } + assert.Equal(t, true, st.rebuildTrie[validators]) + assert.Equal(t, len(st.dirtyIndices[validators]), 0) +} + +func TestBeaconState_AppendBalanceWithTrie(t *testing.T) { + count := uint64(100) + vals := make([]*ethpb.Validator, 0, count) + bals := make([]uint64, 0, count) + for i := uint64(1); i < count; i++ { + someRoot := [32]byte{} + someKey := [48]byte{} + copy(someRoot[:], strconv.Itoa(int(i))) + copy(someKey[:], strconv.Itoa(int(i))) + vals = append(vals, ðpb.Validator{ + PublicKey: someKey[:], + WithdrawalCredentials: someRoot[:], + EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, + Slashed: false, + ActivationEligibilityEpoch: 1, + ActivationEpoch: 1, + ExitEpoch: 1, + WithdrawableEpoch: 1, + }) + bals = append(bals, params.BeaconConfig().MaxEffectiveBalance) + } + zeroHash := params.BeaconConfig().ZeroHash + mockblockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockblockRoots); i++ { + mockblockRoots[i] = zeroHash[:] + } + + mockstateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) + for i := 0; i < len(mockstateRoots); i++ { + mockstateRoots[i] = zeroHash[:] + } + mockrandaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) + for i := 0; i < len(mockrandaoMixes); i++ { + mockrandaoMixes[i] = zeroHash[:] + } + var pubKeys [][]byte + for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSize; i++ { + pubKeys = append(pubKeys, bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength)) + } + payload := ðpb.ExecutionPayloadHeader{ + ParentHash: make([]byte, 32), + FeeRecipient: make([]byte, 20), + StateRoot: make([]byte, 32), + ReceiptRoot: make([]byte, 32), + LogsBloom: make([]byte, 256), + Random: make([]byte, 32), + BaseFeePerGas: make([]byte, 32), + BlockHash: make([]byte, 32), + TransactionsRoot: make([]byte, 32), + } + st, err := InitializeFromProto(ðpb.BeaconStateMerge{ + Slot: 1, + GenesisValidatorsRoot: make([]byte, 32), + Fork: ðpb.Fork{ + PreviousVersion: make([]byte, 4), + CurrentVersion: make([]byte, 4), + Epoch: 0, + }, + LatestBlockHeader: ðpb.BeaconBlockHeader{ + ParentRoot: make([]byte, 32), + StateRoot: make([]byte, 32), + BodyRoot: make([]byte, 32), + }, + CurrentEpochParticipation: []byte{}, + PreviousEpochParticipation: []byte{}, + Validators: vals, + Balances: bals, + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, 32), + BlockHash: make([]byte, 32), + }, + BlockRoots: mockblockRoots, + StateRoots: mockstateRoots, + RandaoMixes: mockrandaoMixes, + JustificationBits: bitfield.NewBitvector4(), + PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, 32)}, + CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, 32)}, + FinalizedCheckpoint: ðpb.Checkpoint{Root: make([]byte, 32)}, + Slashings: make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector), + CurrentSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubKeys, + AggregatePubkey: make([]byte, 48), + }, + NextSyncCommittee: ðpb.SyncCommittee{ + Pubkeys: pubKeys, + AggregatePubkey: make([]byte, 48), + }, + LatestExecutionPayloadHeader: payload, + }) + assert.NoError(t, err) + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + + for i := 0; i < 100; i++ { + if i%2 == 0 { + assert.NoError(t, st.UpdateBalancesAtIndex(types.ValidatorIndex(i), 1000)) + } + if i%3 == 0 { + assert.NoError(t, st.AppendBalance(1000)) + } + } + _, err = st.HashTreeRoot(context.Background()) + assert.NoError(t, err) + newRt := bytesutil.ToBytes32(st.merkleLayers[0][balances]) + wantedRt, err := stateutil.Uint64ListRootWithRegistryLimit(st.state.Balances) + assert.NoError(t, err) + assert.Equal(t, wantedRt, newRt, "state roots are unequal") +} diff --git a/beacon-chain/state-proto/v3/setters_validator.go b/beacon-chain/state-proto/v3/setters_validator.go new file mode 100644 index 0000000000..99ae32a9b1 --- /dev/null +++ b/beacon-chain/state-proto/v3/setters_validator.go @@ -0,0 +1,265 @@ +package v3 + +import ( + "github.com/pkg/errors" + types "github.com/prysmaticlabs/eth2-types" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// SetValidators for the beacon state. Updates the entire +// to a new value by overwriting the previous one. +func (b *BeaconState) SetValidators(val []*ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = val + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.markFieldAsDirty(validators) + b.rebuildTrie[validators] = true + b.valMapHandler = stateutil.NewValMapHandler(b.state.Validators) + return nil +} + +// ApplyToEveryValidator applies the provided callback function to each validator in the +// validator registry. +func (b *BeaconState) ApplyToEveryValidator(f func(idx int, val *ethpb.Validator) (bool, *ethpb.Validator, error)) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + b.lock.Unlock() + var changedVals []uint64 + for i, val := range v { + changed, newVal, err := f(i, val) + if err != nil { + return err + } + if changed { + changedVals = append(changedVals, uint64(i)) + v[i] = newVal + } + } + + b.lock.Lock() + defer b.lock.Unlock() + + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, changedVals) + + return nil +} + +// UpdateValidatorAtIndex for the beacon state. Updates the validator +// at a specific index to a new value. +func (b *BeaconState) UpdateValidatorAtIndex(idx types.ValidatorIndex, val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Validators)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + v := b.state.Validators + if ref := b.sharedFieldReferences[validators]; ref.Refs() > 1 { + v = b.validatorsReferences() + ref.MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + v[idx] = val + b.state.Validators = v + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(idx)}) + + return nil +} + +// SetBalances for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetBalances(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + + b.state.Balances = val + b.markFieldAsDirty(balances) + b.rebuildTrie[balances] = true + return nil +} + +// UpdateBalancesAtIndex for the beacon state. This method updates the balance +// at a specific index to a new value. +func (b *BeaconState) UpdateBalancesAtIndex(idx types.ValidatorIndex, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Balances)) <= uint64(idx) { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + bals[idx] = val + b.state.Balances = bals + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(idx)}) + return nil +} + +// SetSlashings for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetSlashings(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + + b.state.Slashings = val + b.markFieldAsDirty(slashings) + return nil +} + +// UpdateSlashingsAtIndex for the beacon state. Updates the slashings +// at a specific index to a new value. +func (b *BeaconState) UpdateSlashingsAtIndex(idx, val uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + if uint64(len(b.state.Slashings)) <= idx { + return errors.Errorf("invalid index provided %d", idx) + } + b.lock.Lock() + defer b.lock.Unlock() + + s := b.state.Slashings + if b.sharedFieldReferences[slashings].Refs() > 1 { + s = b.slashings() + b.sharedFieldReferences[slashings].MinusRef() + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + } + + s[idx] = val + + b.state.Slashings = s + + b.markFieldAsDirty(slashings) + return nil +} + +// AppendValidator for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendValidator(val *ethpb.Validator) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + vals := b.state.Validators + if b.sharedFieldReferences[validators].Refs() > 1 { + vals = b.validatorsReferences() + b.sharedFieldReferences[validators].MinusRef() + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + } + + // append validator to slice + b.state.Validators = append(vals, val) + valIdx := types.ValidatorIndex(len(b.state.Validators) - 1) + + b.valMapHandler.Set(bytesutil.ToBytes48(val.PublicKey), valIdx) + + b.markFieldAsDirty(validators) + b.addDirtyIndices(validators, []uint64{uint64(valIdx)}) + return nil +} + +// AppendBalance for the beacon state. Appends the new value +// to the the end of list. +func (b *BeaconState) AppendBalance(bal uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + bals := b.state.Balances + if b.sharedFieldReferences[balances].Refs() > 1 { + bals = b.balances() + b.sharedFieldReferences[balances].MinusRef() + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + } + + b.state.Balances = append(bals, bal) + balIdx := len(b.state.Balances) - 1 + b.markFieldAsDirty(balances) + b.addDirtyIndices(balances, []uint64{uint64(balIdx)}) + return nil +} + +// AppendInactivityScore for the beacon state. +func (b *BeaconState) AppendInactivityScore(s uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + scores := b.state.InactivityScores + if b.sharedFieldReferences[inactivityScores].Refs() > 1 { + scores = b.inactivityScores() + b.sharedFieldReferences[inactivityScores].MinusRef() + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) + } + + b.state.InactivityScores = append(scores, s) + b.markFieldAsDirty(inactivityScores) + return nil +} + +// SetInactivityScores for the beacon state. Updates the entire +// list to a new value by overwriting the previous one. +func (b *BeaconState) SetInactivityScores(val []uint64) error { + if !b.hasInnerState() { + return ErrNilInnerState + } + b.lock.Lock() + defer b.lock.Unlock() + + b.sharedFieldReferences[inactivityScores].MinusRef() + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) + + b.state.InactivityScores = val + b.markFieldAsDirty(inactivityScores) + return nil +} diff --git a/beacon-chain/state-proto/v3/state_trie.go b/beacon-chain/state-proto/v3/state_trie.go new file mode 100644 index 0000000000..3170ef3578 --- /dev/null +++ b/beacon-chain/state-proto/v3/state_trie.go @@ -0,0 +1,390 @@ +package v3 + +import ( + "context" + "runtime" + "sort" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/sharedstate" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/container/slice" + "github.com/prysmaticlabs/prysm/crypto/hash" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" + "go.opencensus.io/trace" + "google.golang.org/protobuf/proto" +) + +// InitializeFromProto the beacon state from a protobuf representation. +func InitializeFromProto(st *ethpb.BeaconStateMerge) (*BeaconState, error) { + return InitializeFromProtoUnsafe(proto.Clone(st).(*ethpb.BeaconStateMerge)) +} + +// InitializeFromProtoUnsafe directly uses the beacon state protobuf pointer +// and sets it as the inner state of the BeaconState type. +func InitializeFromProtoUnsafe(st *ethpb.BeaconStateMerge) (*BeaconState, error) { + if st == nil { + return nil, errors.New("received nil state") + } + + fieldCount := params.BeaconConfig().BeaconStateMergeFieldCount + b := &BeaconState{ + state: st, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 11), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + valMapHandler: stateutil.NewValMapHandler(st.Validators), + } + + var err error + for i := 0; i < fieldCount; i++ { + b.dirtyFields[types.FieldIndex(i)] = true + b.rebuildTrie[types.FieldIndex(i)] = true + b.dirtyIndices[types.FieldIndex(i)] = []uint64{} + b.stateFieldLeaves[types.FieldIndex(i)], err = fieldtrie.NewFieldTrie(types.FieldIndex(i), types.BasicArray, nil, 0) + if err != nil { + return nil, err + } + } + + // Initialize field reference tracking for shared data. + b.sharedFieldReferences[randaoMixes] = stateutil.NewRef(1) + b.sharedFieldReferences[stateRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[previousEpochParticipationBits] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[currentEpochParticipationBits] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[slashings] = stateutil.NewRef(1) + b.sharedFieldReferences[eth1DataVotes] = stateutil.NewRef(1) + b.sharedFieldReferences[validators] = stateutil.NewRef(1) + b.sharedFieldReferences[balances] = stateutil.NewRef(1) + b.sharedFieldReferences[inactivityScores] = stateutil.NewRef(1) // New in Altair. + b.sharedFieldReferences[historicalRoots] = stateutil.NewRef(1) + b.sharedFieldReferences[latestExecutionPayloadHeader] = stateutil.NewRef(1) // New in Merge. + sharedstate.StateCount.Inc() + return b, nil +} + +// Copy returns a deep copy of the beacon state. +func (b *BeaconState) Copy() state.BeaconState { + if !b.hasInnerState() { + return nil + } + + b.lock.RLock() + defer b.lock.RUnlock() + fieldCount := params.BeaconConfig().BeaconStateMergeFieldCount + + dst := &BeaconState{ + state: ðpb.BeaconStateMerge{ + // Primitive types, safe to copy. + GenesisTime: b.state.GenesisTime, + Slot: b.state.Slot, + Eth1DepositIndex: b.state.Eth1DepositIndex, + + // Large arrays, infrequently changed, constant size. + RandaoMixes: b.state.RandaoMixes, + StateRoots: b.state.StateRoots, + BlockRoots: b.state.BlockRoots, + Slashings: b.state.Slashings, + Eth1DataVotes: b.state.Eth1DataVotes, + + // Large arrays, increases over time. + Validators: b.state.Validators, + Balances: b.state.Balances, + HistoricalRoots: b.state.HistoricalRoots, + PreviousEpochParticipation: b.state.PreviousEpochParticipation, + CurrentEpochParticipation: b.state.CurrentEpochParticipation, + InactivityScores: b.state.InactivityScores, + + // Everything else, too small to be concerned about, constant size. + Fork: b.fork(), + LatestBlockHeader: b.latestBlockHeader(), + Eth1Data: b.eth1Data(), + JustificationBits: b.justificationBits(), + PreviousJustifiedCheckpoint: b.previousJustifiedCheckpoint(), + CurrentJustifiedCheckpoint: b.currentJustifiedCheckpoint(), + FinalizedCheckpoint: b.finalizedCheckpoint(), + GenesisValidatorsRoot: b.genesisValidatorRoot(), + CurrentSyncCommittee: b.currentSyncCommittee(), + NextSyncCommittee: b.nextSyncCommittee(), + LatestExecutionPayloadHeader: b.latestExecutionPayloadHeader(), + }, + dirtyFields: make(map[types.FieldIndex]bool, fieldCount), + dirtyIndices: make(map[types.FieldIndex][]uint64, fieldCount), + rebuildTrie: make(map[types.FieldIndex]bool, fieldCount), + sharedFieldReferences: make(map[types.FieldIndex]*stateutil.Reference, 11), + stateFieldLeaves: make(map[types.FieldIndex]*fieldtrie.FieldTrie, fieldCount), + + // Copy on write validator index map. + valMapHandler: b.valMapHandler, + } + + for field, ref := range b.sharedFieldReferences { + ref.AddRef() + dst.sharedFieldReferences[field] = ref + } + + // Increment ref for validator map + b.valMapHandler.AddRef() + + for i := range b.dirtyFields { + dst.dirtyFields[i] = true + } + + for i := range b.dirtyIndices { + indices := make([]uint64, len(b.dirtyIndices[i])) + copy(indices, b.dirtyIndices[i]) + dst.dirtyIndices[i] = indices + } + + for i := range b.rebuildTrie { + dst.rebuildTrie[i] = true + } + + for fldIdx, fieldTrie := range b.stateFieldLeaves { + dst.stateFieldLeaves[fldIdx] = fieldTrie + if fieldTrie.FieldReference() != nil { + fieldTrie.Lock() + fieldTrie.FieldReference().AddRef() + fieldTrie.Unlock() + } + } + + if b.merkleLayers != nil { + dst.merkleLayers = make([][][]byte, len(b.merkleLayers)) + for i, layer := range b.merkleLayers { + dst.merkleLayers[i] = make([][]byte, len(layer)) + for j, content := range layer { + dst.merkleLayers[i][j] = make([]byte, len(content)) + copy(dst.merkleLayers[i][j], content) + } + } + } + sharedstate.StateCount.Inc() + // Finalizer runs when dst is being destroyed in garbage collection. + runtime.SetFinalizer(dst, func(b *BeaconState) { + for field, v := range b.sharedFieldReferences { + v.MinusRef() + if b.stateFieldLeaves[field].FieldReference() != nil { + b.stateFieldLeaves[field].FieldReference().MinusRef() + } + } + for i := 0; i < fieldCount; i++ { + field := types.FieldIndex(i) + delete(b.stateFieldLeaves, field) + delete(b.dirtyIndices, field) + delete(b.dirtyFields, field) + delete(b.sharedFieldReferences, field) + delete(b.stateFieldLeaves, field) + } + sharedstate.StateCount.Sub(1) + }) + + return dst +} + +// HashTreeRoot of the beacon state retrieves the Merkle root of the trie +// representation of the beacon state based on the eth2 Simple Serialize specification. +func (b *BeaconState) HashTreeRoot(ctx context.Context) ([32]byte, error) { + _, span := trace.StartSpan(ctx, "BeaconStateMerge.HashTreeRoot") + defer span.End() + + b.lock.Lock() + defer b.lock.Unlock() + + if b.merkleLayers == nil || len(b.merkleLayers) == 0 { + fieldRoots, err := computeFieldRoots(ctx, b.state) + if err != nil { + return [32]byte{}, err + } + layers := stateutil.Merkleize(fieldRoots) + b.merkleLayers = layers + b.dirtyFields = make(map[types.FieldIndex]bool, params.BeaconConfig().BeaconStateMergeFieldCount) + } + + for field := range b.dirtyFields { + root, err := b.rootSelector(field) + if err != nil { + return [32]byte{}, err + } + b.merkleLayers[0][field] = root[:] + b.recomputeRoot(int(field)) + delete(b.dirtyFields, field) + } + return bytesutil.ToBytes32(b.merkleLayers[len(b.merkleLayers)-1][0]), nil +} + +// FieldReferencesCount returns the reference count held by each field. This +// also includes the field trie held by each field. +func (b *BeaconState) FieldReferencesCount() map[string]uint64 { + refMap := make(map[string]uint64) + b.lock.RLock() + defer b.lock.RUnlock() + for i, f := range b.sharedFieldReferences { + refMap[i.String(b.Version())] = uint64(f.Refs()) + } + for i, f := range b.stateFieldLeaves { + numOfRefs := uint64(f.FieldReference().Refs()) + f.RLock() + if !f.Empty() { + refMap[i.String(b.Version())+"_trie"] = numOfRefs + } + f.RUnlock() + } + return refMap +} + +// IsNil checks if the state and the underlying proto +// object are nil. +func (b *BeaconState) IsNil() bool { + return b == nil || b.state == nil +} + +func (b *BeaconState) rootSelector(field types.FieldIndex) ([32]byte, error) { + hasher := hash.CustomSHA256Hasher() + switch field { + case genesisTime: + return ssz.Uint64Root(b.state.GenesisTime), nil + case genesisValidatorRoot: + return bytesutil.ToBytes32(b.state.GenesisValidatorsRoot), nil + case slot: + return ssz.Uint64Root(uint64(b.state.Slot)), nil + case eth1DepositIndex: + return ssz.Uint64Root(b.state.Eth1DepositIndex), nil + case fork: + return ssz.ForkRoot(b.state.Fork) + case latestBlockHeader: + return stateutil.BlockHeaderRoot(b.state.LatestBlockHeader) + case blockRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.BlockRoots, fieldparams.BlockRootsLength) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(blockRoots, b.state.BlockRoots) + case stateRoots: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.StateRoots, fieldparams.StateRootsLength) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(stateRoots, b.state.StateRoots) + case historicalRoots: + return ssz.ByteArrayRootWithLimit(b.state.HistoricalRoots, fieldparams.HistoricalRootsLength) + case eth1Data: + return stateutil.Eth1Root(hasher, b.state.Eth1Data) + case eth1DataVotes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie( + field, + b.state.Eth1DataVotes, + fieldparams.Eth1DataVotesLength, + ) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(field, b.state.Eth1DataVotes) + case validators: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.Validators, fieldparams.ValidatorRegistryLimit) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[validators] = []uint64{} + delete(b.rebuildTrie, validators) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(validators, b.state.Validators) + case balances: + return stateutil.Uint64ListRootWithRegistryLimit(b.state.Balances) + case randaoMixes: + if b.rebuildTrie[field] { + err := b.resetFieldTrie(field, b.state.RandaoMixes, fieldparams.RandaoMixesLength) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[field] = []uint64{} + delete(b.rebuildTrie, field) + return b.stateFieldLeaves[field].TrieRoot() + } + return b.recomputeFieldTrie(randaoMixes, b.state.RandaoMixes) + case slashings: + return ssz.SlashingsRoot(b.state.Slashings) + case previousEpochParticipationBits: + return stateutil.ParticipationBitsRoot(b.state.PreviousEpochParticipation) + case currentEpochParticipationBits: + return stateutil.ParticipationBitsRoot(b.state.CurrentEpochParticipation) + case justificationBits: + return bytesutil.ToBytes32(b.state.JustificationBits), nil + case previousJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.PreviousJustifiedCheckpoint) + case currentJustifiedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.CurrentJustifiedCheckpoint) + case finalizedCheckpoint: + return ssz.CheckpointRoot(hasher, b.state.FinalizedCheckpoint) + case inactivityScores: + return stateutil.Uint64ListRootWithRegistryLimit(b.state.InactivityScores) + case currentSyncCommittee: + return stateutil.SyncCommitteeRoot(b.state.CurrentSyncCommittee) + case nextSyncCommittee: + return stateutil.SyncCommitteeRoot(b.state.NextSyncCommittee) + case latestExecutionPayloadHeader: + return b.state.LatestExecutionPayloadHeader.HashTreeRoot() + } + return [32]byte{}, errors.New("invalid field index provided") +} + +func (b *BeaconState) recomputeFieldTrie(index types.FieldIndex, elements interface{}) ([32]byte, error) { + fTrie := b.stateFieldLeaves[index] + if fTrie.FieldReference().Refs() > 1 { + fTrie.Lock() + defer fTrie.Unlock() + fTrie.FieldReference().MinusRef() + newTrie := fTrie.CopyTrie() + b.stateFieldLeaves[index] = newTrie + fTrie = newTrie + } + // remove duplicate indexes + b.dirtyIndices[index] = slice.SetUint64(b.dirtyIndices[index]) + // sort indexes again + sort.Slice(b.dirtyIndices[index], func(i int, j int) bool { + return b.dirtyIndices[index][i] < b.dirtyIndices[index][j] + }) + root, err := fTrie.RecomputeTrie(b.dirtyIndices[index], elements) + if err != nil { + return [32]byte{}, err + } + b.dirtyIndices[index] = []uint64{} + return root, nil +} + +func (b *BeaconState) resetFieldTrie(index types.FieldIndex, elements interface{}, length uint64) error { + fTrie, err := fieldtrie.NewFieldTrie(index, fieldMap[index], elements, length) + if err != nil { + return err + } + b.stateFieldLeaves[index] = fTrie + b.dirtyIndices[index] = []uint64{} + return nil +} diff --git a/beacon-chain/state/v3/state_trie_test.go b/beacon-chain/state-proto/v3/state_trie_test.go similarity index 98% rename from beacon-chain/state/v3/state_trie_test.go rename to beacon-chain/state-proto/v3/state_trie_test.go index 0c5dc67343..62b5282264 100644 --- a/beacon-chain/state/v3/state_trie_test.go +++ b/beacon-chain/state-proto/v3/state_trie_test.go @@ -5,7 +5,7 @@ import ( "sync" "testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" "github.com/prysmaticlabs/prysm/config/features" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/state-proto/v3/types.go b/beacon-chain/state-proto/v3/types.go new file mode 100644 index 0000000000..9b16629ad4 --- /dev/null +++ b/beacon-chain/state-proto/v3/types.go @@ -0,0 +1,77 @@ +package v3 + +import ( + "sync" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/fieldtrie" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/types" + "github.com/prysmaticlabs/prysm/config/params" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +func init() { + fieldMap = make(map[types.FieldIndex]types.DataType, params.BeaconConfig().BeaconStateMergeFieldCount) + + // Initialize the fixed sized arrays. + fieldMap[types.BlockRoots] = types.BasicArray + fieldMap[types.StateRoots] = types.BasicArray + fieldMap[types.RandaoMixes] = types.BasicArray + + // Initialize the composite arrays. + fieldMap[types.Eth1DataVotes] = types.CompositeArray + fieldMap[types.Validators] = types.CompositeArray + fieldMap[types.Balances] = types.CompressedArray +} + +// Field Aliases for values from the types package. +const ( + genesisTime = types.GenesisTime + genesisValidatorRoot = types.GenesisValidatorRoot + slot = types.Slot + fork = types.Fork + latestBlockHeader = types.LatestBlockHeader + blockRoots = types.BlockRoots + stateRoots = types.StateRoots + historicalRoots = types.HistoricalRoots + eth1Data = types.Eth1Data + eth1DataVotes = types.Eth1DataVotes + eth1DepositIndex = types.Eth1DepositIndex + validators = types.Validators + balances = types.Balances + randaoMixes = types.RandaoMixes + slashings = types.Slashings + previousEpochParticipationBits = types.PreviousEpochParticipationBits + currentEpochParticipationBits = types.CurrentEpochParticipationBits + justificationBits = types.JustificationBits + previousJustifiedCheckpoint = types.PreviousJustifiedCheckpoint + currentJustifiedCheckpoint = types.CurrentJustifiedCheckpoint + finalizedCheckpoint = types.FinalizedCheckpoint + inactivityScores = types.InactivityScores + currentSyncCommittee = types.CurrentSyncCommittee + nextSyncCommittee = types.NextSyncCommittee + latestExecutionPayloadHeader = types.LatestExecutionPayloadHeader +) + +// fieldMap keeps track of each field +// to its corresponding data type. +var fieldMap map[types.FieldIndex]types.DataType + +// ErrNilInnerState returns when the inner state is nil and no copy set or get +// operations can be performed on state. +var ErrNilInnerState = errors.New("nil inner state") + +// BeaconState defines a struct containing utilities for the eth2 chain state, defining +// getters and setters for its respective values and helpful functions such as HashTreeRoot(). +type BeaconState struct { + state *ethpb.BeaconStateMerge + lock sync.RWMutex + dirtyFields map[types.FieldIndex]bool + dirtyIndices map[types.FieldIndex][]uint64 + stateFieldLeaves map[types.FieldIndex]*fieldtrie.FieldTrie + rebuildTrie map[types.FieldIndex]bool + valMapHandler *stateutil.ValidatorMapHandler + merkleLayers [][][]byte + sharedFieldReferences map[types.FieldIndex]*stateutil.Reference +} diff --git a/beacon-chain/sync/BUILD.bazel b/beacon-chain/sync/BUILD.bazel index 88a9a0ff56..388e97c651 100644 --- a/beacon-chain/sync/BUILD.bazel +++ b/beacon-chain/sync/BUILD.bazel @@ -76,8 +76,8 @@ go_library( "//beacon-chain/p2p/encoder:go_default_library", "//beacon-chain/p2p/peers:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//cache/lru:go_default_library", "//cmd/beacon-chain/flags:go_default_library", "//config/features:go_default_library", @@ -184,9 +184,9 @@ go_test( "//beacon-chain/p2p/peers:go_default_library", "//beacon-chain/p2p/testing:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//cache/lru:go_default_library", "//cmd/beacon-chain/flags:go_default_library", diff --git a/beacon-chain/sync/initial-sync/BUILD.bazel b/beacon-chain/sync/initial-sync/BUILD.bazel index f89d7750ea..080d1b0db8 100644 --- a/beacon-chain/sync/initial-sync/BUILD.bazel +++ b/beacon-chain/sync/initial-sync/BUILD.bazel @@ -68,8 +68,8 @@ go_test( "//beacon-chain/p2p/peers:go_default_library", "//beacon-chain/p2p/testing:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//beacon-chain/sync:go_default_library", "//cmd/beacon-chain/flags:go_default_library", "//config/features:go_default_library", diff --git a/beacon-chain/sync/options.go b/beacon-chain/sync/options.go index b05a905e71..003165dae8 100644 --- a/beacon-chain/sync/options.go +++ b/beacon-chain/sync/options.go @@ -11,7 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/synccommittee" "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" ) type Option func(s *Service) error diff --git a/beacon-chain/sync/pending_attestations_queue_test.go b/beacon-chain/sync/pending_attestations_queue_test.go index 476fb5a843..9f4ab1fecf 100644 --- a/beacon-chain/sync/pending_attestations_queue_test.go +++ b/beacon-chain/sync/pending_attestations_queue_test.go @@ -83,8 +83,7 @@ func TestProcessPendingAtts_HasBlockSaveUnAggregatedAtt(t *testing.T) { assert.NoError(t, err) attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) @@ -195,8 +194,7 @@ func TestProcessPendingAtts_NoBroadcastWithBadSignature(t *testing.T) { assert.NoError(t, err) attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) - gvr := s.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(s.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(s.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, s.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) @@ -269,8 +267,7 @@ func TestProcessPendingAtts_HasBlockSaveAggregatedAtt(t *testing.T) { assert.NoError(t, err) attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) diff --git a/beacon-chain/sync/pending_blocks_queue_test.go b/beacon-chain/sync/pending_blocks_queue_test.go index 6110ebad43..c4627939c7 100644 --- a/beacon-chain/sync/pending_blocks_queue_test.go +++ b/beacon-chain/sync/pending_blocks_queue_test.go @@ -19,7 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/rand" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/beacon-chain/sync/rpc_status_test.go b/beacon-chain/sync/rpc_status_test.go index f171e3e253..ac2697bf7a 100644 --- a/beacon-chain/sync/rpc_status_test.go +++ b/beacon-chain/sync/rpc_status_test.go @@ -19,7 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/sync/service.go b/beacon-chain/sync/service.go index 6eb094462c..9c2d071e29 100644 --- a/beacon-chain/sync/service.go +++ b/beacon-chain/sync/service.go @@ -29,7 +29,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/synccommittee" "github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/sync/service_test.go b/beacon-chain/sync/service_test.go index 7f6b2368f4..98263c55d3 100644 --- a/beacon-chain/sync/service_test.go +++ b/beacon-chain/sync/service_test.go @@ -12,7 +12,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/feed" statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/beacon-chain/sync/subscriber_beacon_blocks_test.go b/beacon-chain/sync/subscriber_beacon_blocks_test.go index 10dbf54438..f10a3c5038 100644 --- a/beacon-chain/sync/subscriber_beacon_blocks_test.go +++ b/beacon-chain/sync/subscriber_beacon_blocks_test.go @@ -58,7 +58,7 @@ func TestService_beaconBlockSubscriber(t *testing.T) { check func(*testing.T, *Service) }{ { - name: "valid block", + name: "invalid block does not remove attestations", args: args{ msg: func() *ethpb.SignedBeaconBlock { b := util.NewBeaconBlock() @@ -66,6 +66,7 @@ func TestService_beaconBlockSubscriber(t *testing.T) { return b }(), }, + wantedErr: "nil inner state", check: func(t *testing.T, s *Service) { if s.cfg.attPool.AggregatedAttestationCount() != 0 { t.Error("Expected no attestation in the pool") diff --git a/beacon-chain/sync/validate_aggregate_proof.go b/beacon-chain/sync/validate_aggregate_proof.go index 415e389d20..d4c1245b75 100644 --- a/beacon-chain/sync/validate_aggregate_proof.go +++ b/beacon-chain/sync/validate_aggregate_proof.go @@ -14,7 +14,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -293,8 +293,7 @@ func validateSelectionIndex( return nil, err } - gvRoot := bs.GenesisValidatorRoot() - d, err := signing.Domain(bs.Fork(), epoch, domain, gvRoot[:]) + d, err := signing.Domain(bs.Fork(), epoch, domain, bs.GenesisValidatorRoot()) if err != nil { return nil, err } @@ -322,8 +321,7 @@ func aggSigSet(s state.ReadOnlyBeaconState, a *ethpb.SignedAggregateAttestationA } epoch := slots.ToEpoch(a.Message.Aggregate.Data.Slot) - gvRoot := s.GenesisValidatorRoot() - d, err := signing.Domain(s.Fork(), epoch, params.BeaconConfig().DomainAggregateAndProof, gvRoot[:]) + d, err := signing.Domain(s.Fork(), epoch, params.BeaconConfig().DomainAggregateAndProof, s.GenesisValidatorRoot()) if err != nil { return nil, err } diff --git a/beacon-chain/sync/validate_aggregate_proof_test.go b/beacon-chain/sync/validate_aggregate_proof_test.go index 105e808520..76691467a8 100644 --- a/beacon-chain/sync/validate_aggregate_proof_test.go +++ b/beacon-chain/sync/validate_aggregate_proof_test.go @@ -330,8 +330,7 @@ func TestValidateAggregateAndProof_CanValidate(t *testing.T) { attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) assert.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) assert.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) @@ -425,8 +424,7 @@ func TestVerifyIndexInCommittee_SeenAggregatorEpoch(t *testing.T) { require.NoError(t, err) attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) @@ -539,8 +537,7 @@ func TestValidateAggregateAndProof_BadBlock(t *testing.T) { attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) assert.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) assert.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) @@ -631,8 +628,7 @@ func TestValidateAggregateAndProof_RejectWhenAttEpochDoesntEqualTargetEpoch(t *t attestingIndices, err := attestation.AttestingIndices(att.AggregationBits, committee) require.NoError(t, err) assert.NoError(t, err) - gvr := beaconState.GenesisValidatorRoot() - attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + attesterDomain, err := signing.Domain(beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, beaconState.GenesisValidatorRoot()) assert.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att.Data, attesterDomain) assert.NoError(t, err) diff --git a/beacon-chain/sync/validate_attester_slashing_test.go b/beacon-chain/sync/validate_attester_slashing_test.go index b9f9d3b397..ca68fe9e16 100644 --- a/beacon-chain/sync/validate_attester_slashing_test.go +++ b/beacon-chain/sync/validate_attester_slashing_test.go @@ -15,7 +15,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -39,8 +39,7 @@ func setupValidAttesterSlashing(t *testing.T) (*ethpb.AttesterSlashing, state.Be }, AttestingIndices: []uint64{0, 1}, }) - gvr := state.GenesisValidatorRoot() - domain, err := signing.Domain(state.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(state.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, state.GenesisValidatorRoot()) require.NoError(t, err) hashTreeRoot, err := signing.ComputeSigningRoot(att1.Data, domain) assert.NoError(t, err) diff --git a/beacon-chain/sync/validate_beacon_attestation.go b/beacon-chain/sync/validate_beacon_attestation.go index a33f267230..c893288332 100644 --- a/beacon-chain/sync/validate_beacon_attestation.go +++ b/beacon-chain/sync/validate_beacon_attestation.go @@ -15,7 +15,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/operation" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/monitoring/tracing" diff --git a/beacon-chain/sync/validate_beacon_attestation_test.go b/beacon-chain/sync/validate_beacon_attestation_test.go index 8c04357c79..83f5b03f91 100644 --- a/beacon-chain/sync/validate_beacon_attestation_test.go +++ b/beacon-chain/sync/validate_beacon_attestation_test.go @@ -258,8 +258,7 @@ func TestService_validateCommitteeIndexBeaconAttestation(t *testing.T) { if tt.validAttestationSignature { com, err := helpers.BeaconCommitteeFromState(context.Background(), savedState, tt.msg.Data.Slot, tt.msg.Data.CommitteeIndex) require.NoError(t, err) - gvr := savedState.GenesisValidatorRoot() - domain, err := signing.Domain(savedState.Fork(), tt.msg.Data.Target.Epoch, params.BeaconConfig().DomainBeaconAttester, gvr[:]) + domain, err := signing.Domain(savedState.Fork(), tt.msg.Data.Target.Epoch, params.BeaconConfig().DomainBeaconAttester, savedState.GenesisValidatorRoot()) require.NoError(t, err) attRoot, err := signing.ComputeSigningRoot(tt.msg.Data, domain) require.NoError(t, err) diff --git a/beacon-chain/sync/validate_beacon_blocks_test.go b/beacon-chain/sync/validate_beacon_blocks_test.go index 46948b9cdf..e434097f15 100644 --- a/beacon-chain/sync/validate_beacon_blocks_test.go +++ b/beacon-chain/sync/validate_beacon_blocks_test.go @@ -23,7 +23,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" diff --git a/beacon-chain/sync/validate_proposer_slashing_test.go b/beacon-chain/sync/validate_proposer_slashing_test.go index 21421d5616..7cf5b86371 100644 --- a/beacon-chain/sync/validate_proposer_slashing_test.go +++ b/beacon-chain/sync/validate_proposer_slashing_test.go @@ -17,8 +17,8 @@ import ( coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "github.com/prysmaticlabs/prysm/config/params" diff --git a/beacon-chain/sync/validate_sync_committee_message_test.go b/beacon-chain/sync/validate_sync_committee_message_test.go index 9ac6b13a71..ea65558128 100644 --- a/beacon-chain/sync/validate_sync_committee_message_test.go +++ b/beacon-chain/sync/validate_sync_committee_message_test.go @@ -19,7 +19,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder" mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -319,8 +319,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { msg.ValidatorIndex = types.ValidatorIndex(chosenVal) msg.Slot = slots.PrevSlot(hState.Slot()) - gvr := hState.GenesisValidatorRoot() - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, hState.GenesisValidatorRoot()) assert.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -371,8 +370,7 @@ func TestService_ValidateSyncCommitteeMessage(t *testing.T) { numOfVals := hState.NumValidators() chosenVal := numOfVals - 10 - gvr := hState.GenesisValidatorRoot() - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, hState.GenesisValidatorRoot()) assert.NoError(t, err) rawBytes := p2ptypes.SSZBytes(headRoot[:]) sigRoot, err := signing.ComputeSigningRoot(&rawBytes, d) diff --git a/beacon-chain/sync/validate_sync_contribution_proof_test.go b/beacon-chain/sync/validate_sync_contribution_proof_test.go index eef94e0c91..74a71d3aa5 100644 --- a/beacon-chain/sync/validate_sync_contribution_proof_test.go +++ b/beacon-chain/sync/validate_sync_contribution_proof_test.go @@ -24,8 +24,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder" mockp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -473,7 +473,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { } } gvr := hState.GenesisValidatorRoot() - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr) require.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -550,7 +550,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { msg.Signature = infiniteSig[:] gvr := hState.GenesisValidatorRoot() - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr) assert.NoError(t, err) sigRoot, err := signing.ComputeSigningRoot(msg.Message, d) assert.NoError(t, err) @@ -608,7 +608,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { sc, err := hState.CurrentSyncCommittee() assert.NoError(t, err) gvr := hState.GenesisValidatorRoot() - cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr) assert.NoError(t, err) for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSubnetCount; i++ { coms, err := altair.SyncSubCommitteePubkeys(sc, types.CommitteeIndex(i)) @@ -640,7 +640,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { } } - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr) require.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -693,9 +693,9 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { sc, err := hState.CurrentSyncCommittee() assert.NoError(t, err) gvr := hState.GenesisValidatorRoot() - cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr) assert.NoError(t, err) - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr) assert.NoError(t, err) var pubkeys [][]byte for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSubnetCount; i++ { @@ -736,7 +736,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { } } - pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr) require.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -790,9 +790,9 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { sc, err := hState.CurrentSyncCommittee() assert.NoError(t, err) gvr := hState.GenesisValidatorRoot() - cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr) assert.NoError(t, err) - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr) assert.NoError(t, err) var pubkeys [][]byte for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSubnetCount; i++ { @@ -835,7 +835,7 @@ func TestService_ValidateSyncContributionAndProof(t *testing.T) { } } - pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr) require.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -937,9 +937,9 @@ func TestService_ValidateSyncContributionAndProof_Broadcast(t *testing.T) { sc, err := hState.CurrentSyncCommittee() assert.NoError(t, err) gvr := hState.GenesisValidatorRoot() - cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr[:]) + cd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainContributionAndProof, gvr) assert.NoError(t, err) - d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr[:]) + d, err := signing.Domain(hState.Fork(), slots.ToEpoch(hState.Slot()), params.BeaconConfig().DomainSyncCommittee, gvr) assert.NoError(t, err) var pubkeys [][]byte for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSubnetCount; i++ { @@ -980,7 +980,7 @@ func TestService_ValidateSyncContributionAndProof_Broadcast(t *testing.T) { } } - pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + pd, err := signing.Domain(hState.Fork(), slots.ToEpoch(slots.PrevSlot(hState.Slot())), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr) require.NoError(t, err) subCommitteeSize := params.BeaconConfig().SyncCommitteeSize / params.BeaconConfig().SyncCommitteeSubnetCount s.cfg.chain = &mockChain.ChainService{ @@ -1060,8 +1060,7 @@ func fillUpBlocksAndState(ctx context.Context, t *testing.T, beaconDB db.Databas } func syncSelectionProofSigningRoot(st state.BeaconState, slot types.Slot, comIdx types.CommitteeIndex) ([32]byte, error) { - gvr := st.GenesisValidatorRoot() - dom, err := signing.Domain(st.Fork(), slots.ToEpoch(slot), params.BeaconConfig().DomainSyncCommitteeSelectionProof, gvr[:]) + dom, err := signing.Domain(st.Fork(), slots.ToEpoch(slot), params.BeaconConfig().DomainSyncCommitteeSelectionProof, st.GenesisValidatorRoot()) if err != nil { return [32]byte{}, err } diff --git a/beacon-chain/sync/validate_voluntary_exit.go b/beacon-chain/sync/validate_voluntary_exit.go index e0474c2e06..00d954f8db 100644 --- a/beacon-chain/sync/validate_voluntary_exit.go +++ b/beacon-chain/sync/validate_voluntary_exit.go @@ -62,8 +62,7 @@ func (s *Service) validateVoluntaryExit(ctx context.Context, pid peer.ID, msg *p if err != nil { return pubsub.ValidationIgnore, err } - gvRoot := headState.GenesisValidatorRoot() - if err := blocks.VerifyExitAndSignature(val, headState.Slot(), headState.Fork(), exit, gvRoot[:]); err != nil { + if err := blocks.VerifyExitAndSignature(val, headState.Slot(), headState.Fork(), exit, headState.GenesisValidatorRoot()); err != nil { return pubsub.ValidationReject, err } diff --git a/beacon-chain/sync/validate_voluntary_exit_test.go b/beacon-chain/sync/validate_voluntary_exit_test.go index 5f3eabc63f..f2749b258a 100644 --- a/beacon-chain/sync/validate_voluntary_exit_test.go +++ b/beacon-chain/sync/validate_voluntary_exit_test.go @@ -17,8 +17,8 @@ import ( coreTime "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" lruwrpr "github.com/prysmaticlabs/prysm/cache/lru" "github.com/prysmaticlabs/prysm/config/params" diff --git a/encoding/bytesutil/bytes.go b/encoding/bytesutil/bytes.go index c3733282f9..e3ec106ffb 100644 --- a/encoding/bytesutil/bytes.go +++ b/encoding/bytesutil/bytes.go @@ -3,6 +3,7 @@ package bytesutil import ( "encoding/binary" + "fmt" "math/bits" "regexp" @@ -378,3 +379,17 @@ func IsHex(b []byte) bool { } return hexRegex.Match(b) } + +// SafeCopyRootAtIndex takes a copy of an 32-byte slice in a slice of byte slices. Returns error if index out of range. +func SafeCopyRootAtIndex(input [][]byte, idx uint64) ([]byte, error) { + if input == nil { + return nil, nil + } + + if uint64(len(input)) <= idx { + return nil, fmt.Errorf("index %d out of range", idx) + } + item := make([]byte, 32) + copy(item, input[idx]) + return item, nil +} diff --git a/nogo_config.json b/nogo_config.json index d6299096ff..23184ce6c9 100644 --- a/nogo_config.json +++ b/nogo_config.json @@ -140,9 +140,12 @@ "validator/.*": "" }, "exclude_files": { - "beacon-chain/state/v1/generated.ssz.go": "Exclude generated SSZ file", - "beacon-chain/state/v2/generated.ssz.go": "Exclude generated SSZ file", - "beacon-chain/state/v3/generated.ssz.go": "Exclude generated SSZ file" + "beacon-chain/state-native/v1/generated.ssz.go": "Exclude generated SSZ file", + "beacon-chain/state-native/v2/generated.ssz.go": "Exclude generated SSZ file", + "beacon-chain/state-native/v3/generated.ssz.go": "Exclude generated SSZ file", + "beacon-chain/state-proto/v1/generated.ssz.go": "Exclude generated SSZ file", + "beacon-chain/state-proto/v2/generated.ssz.go": "Exclude generated SSZ file", + "beacon-chain/state-proto/v3/generated.ssz.go": "Exclude generated SSZ file" } }, "properpermissions": { diff --git a/proto/eth/v1/BUILD.bazel b/proto/eth/v1/BUILD.bazel index 0765b7b2f2..88ed7166ce 100644 --- a/proto/eth/v1/BUILD.bazel +++ b/proto/eth/v1/BUILD.bazel @@ -36,7 +36,7 @@ ssz_gen_marshal( go_proto = ":go_proto", includes = [ "@com_github_prysmaticlabs_eth2_types//:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", ], objs = [ "AggregateAttestationAndProof", @@ -71,7 +71,7 @@ go_proto_library( proto = ":proto", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//proto/eth/ext:go_default_library", "@io_bazel_rules_go//proto/wkt:descriptor_go_proto", "@com_github_golang_protobuf//proto:go_default_library", diff --git a/proto/eth/v2/BUILD.bazel b/proto/eth/v2/BUILD.bazel index 38221842ba..e64d6f6816 100644 --- a/proto/eth/v2/BUILD.bazel +++ b/proto/eth/v2/BUILD.bazel @@ -33,7 +33,7 @@ ssz_gen_marshal( includes = [ "//proto/eth/v1:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", ], objs = [ "SignedBeaconBlockAltair", @@ -50,7 +50,7 @@ go_proto_library( proto = ":proto", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//proto/eth/ext:go_default_library", "//proto/eth/v1:go_default_library", "@com_github_prysmaticlabs_go_bitfield//:go_default_library", diff --git a/proto/migration/BUILD.bazel b/proto/migration/BUILD.bazel index e8cfae4846..6d5df903c6 100644 --- a/proto/migration/BUILD.bazel +++ b/proto/migration/BUILD.bazel @@ -10,8 +10,8 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/proto/migration", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/eth/v1:go_default_library", "//proto/eth/v2:go_default_library", @@ -31,7 +31,6 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//beacon-chain/state:go_default_library", "//config/fieldparams:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/eth/v1:go_default_library", diff --git a/proto/migration/v1alpha1_to_v1.go b/proto/migration/v1alpha1_to_v1.go index 80b1698f7a..92e119124d 100644 --- a/proto/migration/v1alpha1_to_v1.go +++ b/proto/migration/v1alpha1_to_v1.go @@ -2,7 +2,7 @@ package migration import ( "github.com/pkg/errors" - statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + statev1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpbv1 "github.com/prysmaticlabs/prysm/proto/eth/v1" ethpbalpha "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -436,30 +436,9 @@ func BeaconStateToV1(state *statev1.BeaconState) (*ethpbv1.BeaconState, error) { } } - gvr := state.GenesisValidatorRoot() - bRoots := make([][]byte, len(state.BlockRoots())) - for i, r := range state.BlockRoots() { - tmp := r - bRoots[i] = tmp[:] - } - sRoots := make([][]byte, len(state.StateRoots())) - for i, r := range state.StateRoots() { - tmp := r - sRoots[i] = tmp[:] - } - hRoots := make([][]byte, len(state.HistoricalRoots())) - for i, r := range state.HistoricalRoots() { - tmp := r - hRoots[i] = tmp[:] - } - mixes := make([][]byte, len(state.RandaoMixes())) - for i, m := range state.RandaoMixes() { - tmp := m - mixes[i] = tmp[:] - } result := ðpbv1.BeaconState{ GenesisTime: state.GenesisTime(), - GenesisValidatorsRoot: gvr[:], + GenesisValidatorsRoot: state.GenesisValidatorRoot(), Slot: state.Slot(), Fork: ðpbv1.Fork{ PreviousVersion: bytesutil.SafeCopyBytes(sourceFork.PreviousVersion), @@ -473,9 +452,9 @@ func BeaconStateToV1(state *statev1.BeaconState) (*ethpbv1.BeaconState, error) { StateRoot: bytesutil.SafeCopyBytes(sourceLatestBlockHeader.StateRoot), BodyRoot: bytesutil.SafeCopyBytes(sourceLatestBlockHeader.BodyRoot), }, - BlockRoots: bRoots, - StateRoots: sRoots, - HistoricalRoots: hRoots, + BlockRoots: bytesutil.SafeCopy2dBytes(state.BlockRoots()), + StateRoots: bytesutil.SafeCopy2dBytes(state.StateRoots()), + HistoricalRoots: bytesutil.SafeCopy2dBytes(state.HistoricalRoots()), Eth1Data: ðpbv1.Eth1Data{ DepositRoot: bytesutil.SafeCopyBytes(sourceEth1Data.DepositRoot), DepositCount: sourceEth1Data.DepositCount, @@ -485,7 +464,7 @@ func BeaconStateToV1(state *statev1.BeaconState) (*ethpbv1.BeaconState, error) { Eth1DepositIndex: state.Eth1DepositIndex(), Validators: resultValidators, Balances: state.Balances(), - RandaoMixes: mixes, + RandaoMixes: bytesutil.SafeCopy2dBytes(state.RandaoMixes()), Slashings: state.Slashings(), PreviousEpochAttestations: resultPrevEpochAtts, CurrentEpochAttestations: resultCurrEpochAtts, diff --git a/proto/migration/v1alpha1_to_v1_test.go b/proto/migration/v1alpha1_to_v1_test.go index df186eb4b8..9e7c14163a 100644 --- a/proto/migration/v1alpha1_to_v1_test.go +++ b/proto/migration/v1alpha1_to_v1_test.go @@ -5,7 +5,6 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpbv1 "github.com/prysmaticlabs/prysm/proto/eth/v1" @@ -438,39 +437,37 @@ func Test_V1AttestationToV1Alpha1(t *testing.T) { assert.DeepEqual(t, v1Root, v1Alpha1Root) } func TestBeaconStateToV1(t *testing.T) { - source, err := util.NewBeaconState(util.FillRootsNaturalOpt, func(state state.BeaconState) error { - require.NoError(t, state.SetGenesisTime(1)) - require.NoError(t, state.SetGenesisValidatorRoot(bytesutil.ToBytes32([]byte("genesisvalidatorroot")))) - require.NoError(t, state.SetSlot(2)) - require.NoError(t, state.SetFork(ðpbalpha.Fork{ + source, err := util.NewBeaconState(util.FillRootsNaturalOpt, func(state *ethpbalpha.BeaconState) error { + state.GenesisTime = 1 + state.GenesisValidatorsRoot = bytesutil.PadTo([]byte("genesisvalidatorroot"), 32) + state.Slot = 2 + state.Fork = ðpbalpha.Fork{ PreviousVersion: bytesutil.PadTo([]byte("123"), 4), CurrentVersion: bytesutil.PadTo([]byte("456"), 4), Epoch: 3, - })) - require.NoError(t, state.SetLatestBlockHeader(ðpbalpha.BeaconBlockHeader{ + } + state.LatestBlockHeader = ðpbalpha.BeaconBlockHeader{ Slot: 4, ProposerIndex: 5, ParentRoot: bytesutil.PadTo([]byte("lbhparentroot"), 32), StateRoot: bytesutil.PadTo([]byte("lbhstateroot"), 32), BodyRoot: bytesutil.PadTo([]byte("lbhbodyroot"), 32), - })) - bRoots := [fieldparams.BlockRootsLength][32]byte{bytesutil.ToBytes32([]byte("blockroots"))} - require.NoError(t, state.SetBlockRoots(&bRoots)) - sRoots := [fieldparams.StateRootsLength][32]byte{bytesutil.ToBytes32([]byte("stateroots"))} - require.NoError(t, state.SetStateRoots(&sRoots)) - require.NoError(t, state.SetHistoricalRoots([][32]byte{bytesutil.ToBytes32([]byte("historicalroots"))})) - require.NoError(t, state.SetEth1Data(ðpbalpha.Eth1Data{ + } + state.BlockRoots = [][]byte{bytesutil.PadTo([]byte("blockroots"), 32)} + state.StateRoots = [][]byte{bytesutil.PadTo([]byte("stateroots"), 32)} + state.HistoricalRoots = [][]byte{bytesutil.PadTo([]byte("historicalroots"), 32)} + state.Eth1Data = ðpbalpha.Eth1Data{ DepositRoot: bytesutil.PadTo([]byte("e1ddepositroot"), 32), DepositCount: 6, BlockHash: bytesutil.PadTo([]byte("e1dblockhash"), 32), - })) - require.NoError(t, state.SetEth1DataVotes([]*ethpbalpha.Eth1Data{{ + } + state.Eth1DataVotes = []*ethpbalpha.Eth1Data{{ DepositRoot: bytesutil.PadTo([]byte("e1dvdepositroot"), 32), DepositCount: 7, BlockHash: bytesutil.PadTo([]byte("e1dvblockhash"), 32), - }})) - require.NoError(t, state.SetEth1DepositIndex(8)) - require.NoError(t, state.SetValidators([]*ethpbalpha.Validator{{ + }} + state.Eth1DepositIndex = 8 + state.Validators = []*ethpbalpha.Validator{{ PublicKey: bytesutil.PadTo([]byte("publickey"), 48), WithdrawalCredentials: bytesutil.PadTo([]byte("withdrawalcredentials"), 32), EffectiveBalance: 9, @@ -479,12 +476,11 @@ func TestBeaconStateToV1(t *testing.T) { ActivationEpoch: 11, ExitEpoch: 12, WithdrawableEpoch: 13, - }})) - require.NoError(t, state.SetBalances([]uint64{14})) - mixes := [fieldparams.RandaoMixesLength][32]byte{bytesutil.ToBytes32([]byte("randaomixes"))} - require.NoError(t, state.SetRandaoMixes(&mixes)) - require.NoError(t, state.SetSlashings([]uint64{15})) - require.NoError(t, state.AppendPreviousEpochAttestations(ðpbalpha.PendingAttestation{ + }} + state.Balances = []uint64{14} + state.RandaoMixes = [][]byte{bytesutil.PadTo([]byte("randaomixes"), 32)} + state.Slashings = []uint64{15} + state.PreviousEpochAttestations = []*ethpbalpha.PendingAttestation{{ AggregationBits: bitfield.Bitlist{16}, Data: ðpbalpha.AttestationData{ Slot: 17, @@ -501,8 +497,8 @@ func TestBeaconStateToV1(t *testing.T) { }, InclusionDelay: 21, ProposerIndex: 22, - })) - require.NoError(t, state.AppendCurrentEpochAttestations(ðpbalpha.PendingAttestation{ + }} + state.CurrentEpochAttestations = []*ethpbalpha.PendingAttestation{{ AggregationBits: bitfield.Bitlist{23}, Data: ðpbalpha.AttestationData{ Slot: 24, @@ -519,20 +515,20 @@ func TestBeaconStateToV1(t *testing.T) { }, InclusionDelay: 28, ProposerIndex: 29, - })) - require.NoError(t, state.SetJustificationBits(bitfield.Bitvector4{1})) - require.NoError(t, state.SetPreviousJustifiedCheckpoint(ðpbalpha.Checkpoint{ + }} + state.JustificationBits = bitfield.Bitvector4{1} + state.PreviousJustifiedCheckpoint = ðpbalpha.Checkpoint{ Epoch: 30, Root: bytesutil.PadTo([]byte("pjcroot"), 32), - })) - require.NoError(t, state.SetCurrentJustifiedCheckpoint(ðpbalpha.Checkpoint{ + } + state.CurrentJustifiedCheckpoint = ðpbalpha.Checkpoint{ Epoch: 31, Root: bytesutil.PadTo([]byte("cjcroot"), 32), - })) - require.NoError(t, state.SetFinalizedCheckpoint(ðpbalpha.Checkpoint{ + } + state.FinalizedCheckpoint = ðpbalpha.Checkpoint{ Epoch: 32, Root: bytesutil.PadTo([]byte("fcroot"), 32), - })) + } return nil }) require.NoError(t, err) @@ -555,18 +551,8 @@ func TestBeaconStateToV1(t *testing.T) { assert.DeepEqual(t, bytesutil.PadTo([]byte("lbhparentroot"), 32), resultLatestBlockHeader.ParentRoot) assert.DeepEqual(t, bytesutil.PadTo([]byte("lbhstateroot"), 32), resultLatestBlockHeader.StateRoot) assert.DeepEqual(t, bytesutil.PadTo([]byte("lbhbodyroot"), 32), resultLatestBlockHeader.BodyRoot) - bRoots := make([][]byte, fieldparams.BlockRootsLength) - for i := 0; i < len(bRoots); i++ { - bRoots[i] = make([]byte, 32) - } - bRoots[0] = bytesutil.PadTo([]byte("blockroots"), 32) - assert.DeepEqual(t, bRoots, result.BlockRoots) - sRoots := make([][]byte, fieldparams.StateRootsLength) - for i := 0; i < len(sRoots); i++ { - sRoots[i] = make([]byte, 32) - } - sRoots[0] = bytesutil.PadTo([]byte("stateroots"), 32) - assert.DeepEqual(t, sRoots, result.StateRoots) + assert.DeepEqual(t, [][]byte{bytesutil.PadTo([]byte("blockroots"), 32)}, result.BlockRoots) + assert.DeepEqual(t, [][]byte{bytesutil.PadTo([]byte("stateroots"), 32)}, result.StateRoots) assert.DeepEqual(t, [][]byte{bytesutil.PadTo([]byte("historicalroots"), 32)}, result.HistoricalRoots) resultEth1Data := result.Eth1Data require.NotNil(t, resultEth1Data) @@ -592,12 +578,7 @@ func TestBeaconStateToV1(t *testing.T) { assert.Equal(t, types.Epoch(12), resultValidator.ExitEpoch) assert.Equal(t, types.Epoch(13), resultValidator.WithdrawableEpoch) assert.DeepEqual(t, []uint64{14}, result.Balances) - mixes := make([][]byte, fieldparams.RandaoMixesLength) - for i := 0; i < len(mixes); i++ { - mixes[i] = make([]byte, 32) - } - mixes[0] = bytesutil.PadTo([]byte("randaomixes"), 32) - assert.DeepEqual(t, mixes, result.RandaoMixes) + assert.DeepEqual(t, [][]byte{bytesutil.PadTo([]byte("randaomixes"), 32)}, result.RandaoMixes) assert.DeepEqual(t, []uint64{15}, result.Slashings) require.Equal(t, 1, len(result.PreviousEpochAttestations)) resultPrevEpochAtt := result.PreviousEpochAttestations[0] diff --git a/proto/migration/v1alpha1_to_v2.go b/proto/migration/v1alpha1_to_v2.go index 64252a5e9f..801404fd54 100644 --- a/proto/migration/v1alpha1_to_v2.go +++ b/proto/migration/v1alpha1_to_v2.go @@ -2,7 +2,7 @@ package migration import ( "github.com/pkg/errors" - statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + statev2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpbv1 "github.com/prysmaticlabs/prysm/proto/eth/v1" ethpbv2 "github.com/prysmaticlabs/prysm/proto/eth/v2" @@ -89,30 +89,9 @@ func BeaconStateAltairToV2(altairState *statev2.BeaconState) (*ethpbv2.BeaconSta return nil, errors.Wrap(err, "could not get next sync committee") } - gvr := altairState.GenesisValidatorRoot() - bRoots := make([][]byte, len(altairState.BlockRoots())) - for i, r := range altairState.BlockRoots() { - tmp := r - bRoots[i] = tmp[:] - } - sRoots := make([][]byte, len(altairState.StateRoots())) - for i, r := range altairState.StateRoots() { - tmp := r - sRoots[i] = tmp[:] - } - hRoots := make([][]byte, len(altairState.HistoricalRoots())) - for i, r := range altairState.HistoricalRoots() { - tmp := r - hRoots[i] = tmp[:] - } - mixes := make([][]byte, len(altairState.RandaoMixes())) - for i, m := range altairState.RandaoMixes() { - tmp := m - mixes[i] = tmp[:] - } result := ðpbv2.BeaconStateV2{ GenesisTime: altairState.GenesisTime(), - GenesisValidatorsRoot: gvr[:], + GenesisValidatorsRoot: altairState.GenesisValidatorRoot(), Slot: altairState.Slot(), Fork: ðpbv1.Fork{ PreviousVersion: bytesutil.SafeCopyBytes(sourceFork.PreviousVersion), @@ -126,9 +105,9 @@ func BeaconStateAltairToV2(altairState *statev2.BeaconState) (*ethpbv2.BeaconSta StateRoot: bytesutil.SafeCopyBytes(sourceLatestBlockHeader.StateRoot), BodyRoot: bytesutil.SafeCopyBytes(sourceLatestBlockHeader.BodyRoot), }, - BlockRoots: bRoots, - StateRoots: sRoots, - HistoricalRoots: bytesutil.SafeCopy2dBytes(hRoots), + BlockRoots: bytesutil.SafeCopy2dBytes(altairState.BlockRoots()), + StateRoots: bytesutil.SafeCopy2dBytes(altairState.StateRoots()), + HistoricalRoots: bytesutil.SafeCopy2dBytes(altairState.HistoricalRoots()), Eth1Data: ðpbv1.Eth1Data{ DepositRoot: bytesutil.SafeCopyBytes(sourceEth1Data.DepositRoot), DepositCount: sourceEth1Data.DepositCount, @@ -138,7 +117,7 @@ func BeaconStateAltairToV2(altairState *statev2.BeaconState) (*ethpbv2.BeaconSta Eth1DepositIndex: altairState.Eth1DepositIndex(), Validators: resultValidators, Balances: altairState.Balances(), - RandaoMixes: mixes, + RandaoMixes: bytesutil.SafeCopy2dBytes(altairState.RandaoMixes()), Slashings: altairState.Slashings(), PreviousEpochParticipation: bytesutil.SafeCopyBytes(sourcePrevEpochParticipation), CurrentEpochParticipation: bytesutil.SafeCopyBytes(sourceCurrEpochParticipation), diff --git a/proto/prysm/v1alpha1/BUILD.bazel b/proto/prysm/v1alpha1/BUILD.bazel index d0bd0779b6..0e83f210d2 100644 --- a/proto/prysm/v1alpha1/BUILD.bazel +++ b/proto/prysm/v1alpha1/BUILD.bazel @@ -53,7 +53,7 @@ ssz_gen_marshal( go_proto = ":go_proto", includes = [ "@com_github_prysmaticlabs_eth2_types//:go_default_library", - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", ], objs = [ "BeaconBlockAltair", @@ -114,7 +114,7 @@ go_proto_library( proto = ":proto", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//proto/eth/ext:go_default_library", "@com_github_golang_protobuf//proto:go_default_library", "@com_github_grpc_ecosystem_grpc_gateway_v2//protoc-gen-openapiv2/options:options_go_proto", diff --git a/proto/testing/BUILD.bazel b/proto/testing/BUILD.bazel index 26d515499c..bdb02996c4 100644 --- a/proto/testing/BUILD.bazel +++ b/proto/testing/BUILD.bazel @@ -52,8 +52,8 @@ go_test( embed = [":go_default_library"], tags = ["spectest"], deps = [ - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//config/fieldparams:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/runtime/interop/BUILD.bazel b/runtime/interop/BUILD.bazel index 83d54479f8..95e8e55428 100644 --- a/runtime/interop/BUILD.bazel +++ b/runtime/interop/BUILD.bazel @@ -12,7 +12,7 @@ go_library( "//async:go_default_library", "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", "//crypto/bls:go_default_library", diff --git a/runtime/interop/generate_genesis_state.go b/runtime/interop/generate_genesis_state.go index 75c54b9552..4d18913fb7 100644 --- a/runtime/interop/generate_genesis_state.go +++ b/runtime/interop/generate_genesis_state.go @@ -10,7 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/async" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" coreState "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -65,7 +65,7 @@ func GenerateGenesisStateFromDepositData( return nil, nil, errors.Wrap(err, "could not generate genesis state") } - pbState, err := v1.ProtobufBeaconState(beaconState.ToProto()) + pbState, err := v1.ProtobufBeaconState(beaconState.CloneInnerState()) if err != nil { return nil, nil, err } diff --git a/testing/benchmark/BUILD.bazel b/testing/benchmark/BUILD.bazel index 70120820ad..36ebd4c2d4 100644 --- a/testing/benchmark/BUILD.bazel +++ b/testing/benchmark/BUILD.bazel @@ -7,8 +7,8 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/testing/benchmark", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", diff --git a/testing/benchmark/pregen.go b/testing/benchmark/pregen.go index 286cbde827..61ff0ddb77 100644 --- a/testing/benchmark/pregen.go +++ b/testing/benchmark/pregen.go @@ -7,8 +7,8 @@ import ( "io/ioutil" "github.com/bazelbuild/rules_go/go/tools/bazel" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) diff --git a/testing/endtoend/BUILD.bazel b/testing/endtoend/BUILD.bazel index 65ef0b5522..7bbe38b016 100644 --- a/testing/endtoend/BUILD.bazel +++ b/testing/endtoend/BUILD.bazel @@ -33,7 +33,7 @@ go_test( "//beacon-chain/core/transition:go_default_library", "//beacon-chain/db/testing:go_default_library", "//beacon-chain/operations/slashings:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/testing/endtoend/slasher_simulator_e2e_test.go b/testing/endtoend/slasher_simulator_e2e_test.go index 62deb8106d..7ca57bc7ba 100644 --- a/testing/endtoend/slasher_simulator_e2e_test.go +++ b/testing/endtoend/slasher_simulator_e2e_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" dbtest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/fuzz/BUILD.bazel b/testing/fuzz/BUILD.bazel index e399a29243..3df76df9e2 100644 --- a/testing/fuzz/BUILD.bazel +++ b/testing/fuzz/BUILD.bazel @@ -15,7 +15,7 @@ ssz_gen_marshal( name = "ssz_generated_files", srcs = ["inputs.go"], includes = [ - "//beacon-chain/state/custom-types:go_default_library", + "//beacon-chain/state-native/custom-types:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "@com_github_prysmaticlabs_eth2_types//:go_default_library", ], @@ -27,7 +27,7 @@ ssz_gen_marshal( IMPORT_PATH = "github.com/prysmaticlabs/prysm/fuzz" COMMON_DEPS = [ - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/features:go_default_library", ] + SSZ_DEPS @@ -85,7 +85,7 @@ go_fuzz_test( "//beacon-chain/p2p:go_default_library", "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/cache:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//crypto/rand:go_default_library", ] + COMMON_DEPS, ) @@ -184,8 +184,8 @@ go_library( "//beacon-chain/p2p:go_default_library", "//beacon-chain/p2p/encoder:go_default_library", "//beacon-chain/p2p/testing:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//beacon-chain/sync/initial-sync/testing:go_default_library", "//testing/fuzz/testing:go_default_library", diff --git a/testing/fuzz/block_fuzz.go b/testing/fuzz/block_fuzz.go index 0af7c1d0e9..df27d28ffa 100644 --- a/testing/fuzz/block_fuzz.go +++ b/testing/fuzz/block_fuzz.go @@ -26,8 +26,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2pt "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" powt "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/beacon-chain/sync" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/rand" diff --git a/testing/fuzz/state_fuzz.go b/testing/fuzz/state_fuzz.go index 3c22f02439..1909a4d0ae 100644 --- a/testing/fuzz/state_fuzz.go +++ b/testing/fuzz/state_fuzz.go @@ -5,7 +5,7 @@ import ( "fmt" stateutil "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -43,7 +43,7 @@ func BeaconStateFuzz(input []byte) { } func validateStateHTR(s *v1.BeaconState) { - rawState, ok := s.ToProtoUnsafe().(*ethpb.BeaconState) + rawState, ok := s.InnerStateUnsafe().(*ethpb.BeaconState) if !ok { panic("non valid type assertion") } diff --git a/testing/slasher/simulator/BUILD.bazel b/testing/slasher/simulator/BUILD.bazel index 3565c27463..1f47cae4d1 100644 --- a/testing/slasher/simulator/BUILD.bazel +++ b/testing/slasher/simulator/BUILD.bazel @@ -22,8 +22,8 @@ go_library( "//beacon-chain/db:go_default_library", "//beacon-chain/operations/slashings:go_default_library", "//beacon-chain/slasher:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", @@ -47,7 +47,7 @@ go_test( deps = [ "//beacon-chain/blockchain/testing:go_default_library", "//beacon-chain/db/testing:go_default_library", - "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/state-proto/stategen:go_default_library", "//config/params:go_default_library", "//crypto/bls:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/testing/slasher/simulator/attestation_generator.go b/testing/slasher/simulator/attestation_generator.go index d8b2294c1b..90b5c624f1 100644 --- a/testing/slasher/simulator/attestation_generator.go +++ b/testing/slasher/simulator/attestation_generator.go @@ -7,7 +7,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/crypto/rand" @@ -110,12 +110,11 @@ func (s *Simulator) generateAttestationsForSlot( func (s *Simulator) aggregateSigForAttestation( beaconState state.BeaconState, att *ethpb.IndexedAttestation, ) (bls.Signature, error) { - gvRoot := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), att.Data.Target.Epoch, params.BeaconConfig().DomainBeaconAttester, - gvRoot[:], + beaconState.GenesisValidatorRoot(), ) if err != nil { return nil, err diff --git a/testing/slasher/simulator/block_generator.go b/testing/slasher/simulator/block_generator.go index 6a29e6dc87..5d449fa2d7 100644 --- a/testing/slasher/simulator/block_generator.go +++ b/testing/slasher/simulator/block_generator.go @@ -5,7 +5,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/crypto/rand" @@ -72,12 +72,11 @@ func (s *Simulator) signBlockHeader( beaconState state.BeaconState, header *ethpb.SignedBeaconBlockHeader, ) (bls.Signature, error) { - gvRoot := beaconState.GenesisValidatorRoot() domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconProposer, - gvRoot[:], + beaconState.GenesisValidatorRoot(), ) if err != nil { return nil, err diff --git a/testing/slasher/simulator/simulator.go b/testing/slasher/simulator/simulator.go index 85c217e4ff..e1e286dbef 100644 --- a/testing/slasher/simulator/simulator.go +++ b/testing/slasher/simulator/simulator.go @@ -13,7 +13,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/db" "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" "github.com/prysmaticlabs/prysm/beacon-chain/slasher" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/beacon-chain/sync" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/testing/slasher/simulator/simulator_test.go b/testing/slasher/simulator/simulator_test.go index 9aa7c41e3b..eb8732769f 100644 --- a/testing/slasher/simulator/simulator_test.go +++ b/testing/slasher/simulator/simulator_test.go @@ -6,7 +6,7 @@ import ( types "github.com/prysmaticlabs/eth2-types" mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" dbtest "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stategen" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/epoch_processing/BUILD.bazel b/testing/spectest/shared/altair/epoch_processing/BUILD.bazel index 13394f49bd..3f4546e93a 100644 --- a/testing/spectest/shared/altair/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/altair/epoch_processing/BUILD.bazel @@ -24,8 +24,8 @@ go_library( "//beacon-chain/core/epoch:go_default_library", "//beacon-chain/core/epoch/precompute:go_default_library", "//beacon-chain/core/helpers:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/altair/epoch_processing/effective_balance_updates.go b/testing/spectest/shared/altair/epoch_processing/effective_balance_updates.go index 86eae0b877..090f21699e 100644 --- a/testing/spectest/shared/altair/epoch_processing/effective_balance_updates.go +++ b/testing/spectest/shared/altair/epoch_processing/effective_balance_updates.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/eth1_data_reset.go b/testing/spectest/shared/altair/epoch_processing/eth1_data_reset.go index 661e4f7efe..80e846c55a 100644 --- a/testing/spectest/shared/altair/epoch_processing/eth1_data_reset.go +++ b/testing/spectest/shared/altair/epoch_processing/eth1_data_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/helpers.go b/testing/spectest/shared/altair/epoch_processing/helpers.go index ff4444fd1e..eb5ed4269b 100644 --- a/testing/spectest/shared/altair/epoch_processing/helpers.go +++ b/testing/spectest/shared/altair/epoch_processing/helpers.go @@ -8,8 +8,8 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" @@ -59,10 +59,10 @@ func RunEpochOperationTest( t.Fatalf("Failed to unmarshal: %v", err) } - pbState, err := stateAltair.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := stateAltair.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/altair/epoch_processing/historical_roots_update.go b/testing/spectest/shared/altair/epoch_processing/historical_roots_update.go index 894f1f5da8..09f1be21af 100644 --- a/testing/spectest/shared/altair/epoch_processing/historical_roots_update.go +++ b/testing/spectest/shared/altair/epoch_processing/historical_roots_update.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/inactivity_updates.go b/testing/spectest/shared/altair/epoch_processing/inactivity_updates.go index 44d7ad8d6e..e13d3123a9 100644 --- a/testing/spectest/shared/altair/epoch_processing/inactivity_updates.go +++ b/testing/spectest/shared/altair/epoch_processing/inactivity_updates.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/justification_and_finalization.go b/testing/spectest/shared/altair/epoch_processing/justification_and_finalization.go index 1333351f23..a1a419961b 100644 --- a/testing/spectest/shared/altair/epoch_processing/justification_and_finalization.go +++ b/testing/spectest/shared/altair/epoch_processing/justification_and_finalization.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/participation_flag_updates.go b/testing/spectest/shared/altair/epoch_processing/participation_flag_updates.go index 6332c88896..522ea46253 100644 --- a/testing/spectest/shared/altair/epoch_processing/participation_flag_updates.go +++ b/testing/spectest/shared/altair/epoch_processing/participation_flag_updates.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/randao_mixes_reset.go b/testing/spectest/shared/altair/epoch_processing/randao_mixes_reset.go index a7cfb8020f..e2e622eeaa 100644 --- a/testing/spectest/shared/altair/epoch_processing/randao_mixes_reset.go +++ b/testing/spectest/shared/altair/epoch_processing/randao_mixes_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/registry_updates.go b/testing/spectest/shared/altair/epoch_processing/registry_updates.go index b0c3e59f1e..a6f4034c38 100644 --- a/testing/spectest/shared/altair/epoch_processing/registry_updates.go +++ b/testing/spectest/shared/altair/epoch_processing/registry_updates.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/rewards_and_penalties.go b/testing/spectest/shared/altair/epoch_processing/rewards_and_penalties.go index 48a95a0dd8..74fd340a51 100644 --- a/testing/spectest/shared/altair/epoch_processing/rewards_and_penalties.go +++ b/testing/spectest/shared/altair/epoch_processing/rewards_and_penalties.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/epoch_processing/slashings.go b/testing/spectest/shared/altair/epoch_processing/slashings.go index 617eca09b7..c4b48661cd 100644 --- a/testing/spectest/shared/altair/epoch_processing/slashings.go +++ b/testing/spectest/shared/altair/epoch_processing/slashings.go @@ -6,7 +6,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/spectest/shared/altair/epoch_processing/slashings_reset.go b/testing/spectest/shared/altair/epoch_processing/slashings_reset.go index 459925f3d4..b4c0ea8c92 100644 --- a/testing/spectest/shared/altair/epoch_processing/slashings_reset.go +++ b/testing/spectest/shared/altair/epoch_processing/slashings_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/altair/finality/BUILD.bazel b/testing/spectest/shared/altair/finality/BUILD.bazel index 07a6795cef..ab95ec16bc 100644 --- a/testing/spectest/shared/altair/finality/BUILD.bazel +++ b/testing/spectest/shared/altair/finality/BUILD.bazel @@ -9,8 +9,8 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/altair/finality/finality.go b/testing/spectest/shared/altair/finality/finality.go index 24905fd083..5c4031281f 100644 --- a/testing/spectest/shared/altair/finality/finality.go +++ b/testing/spectest/shared/altair/finality/finality.go @@ -8,8 +8,8 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" @@ -73,7 +73,7 @@ func RunFinalityTest(t *testing.T, config string) { require.NoError(t, err, "Failed to decompress") postBeaconState := ðpb.BeaconStateAltair{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := stateAltair.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := stateAltair.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { t.Fatal("Post state does not match expected") diff --git a/testing/spectest/shared/altair/fork/BUILD.bazel b/testing/spectest/shared/altair/fork/BUILD.bazel index 7f6d94e58a..bb2006f971 100644 --- a/testing/spectest/shared/altair/fork/BUILD.bazel +++ b/testing/spectest/shared/altair/fork/BUILD.bazel @@ -13,9 +13,9 @@ go_library( "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", diff --git a/testing/spectest/shared/altair/fork/transition.go b/testing/spectest/shared/altair/fork/transition.go index 006f427689..877b875a07 100644 --- a/testing/spectest/shared/altair/fork/transition.go +++ b/testing/spectest/shared/altair/fork/transition.go @@ -9,9 +9,9 @@ import ( types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" "github.com/prysmaticlabs/prysm/config/params" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" @@ -122,7 +122,7 @@ func RunForkTransitionTest(t *testing.T, config string) { postBeaconState := ðpb.BeaconStateAltair{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := stateAltair.ProtobufBeaconState(altairState.ToProto()) + pbState, err := stateAltair.ProtobufBeaconState(altairState.CloneInnerState()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { t.Fatal("Post state does not match expected") diff --git a/testing/spectest/shared/altair/fork/upgrade_to_altair.go b/testing/spectest/shared/altair/fork/upgrade_to_altair.go index 9f2a08f374..23847691c2 100644 --- a/testing/spectest/shared/altair/fork/upgrade_to_altair.go +++ b/testing/spectest/shared/altair/fork/upgrade_to_altair.go @@ -8,8 +8,8 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - statealtair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + statealtair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" @@ -40,7 +40,7 @@ func RunUpgradeToAltair(t *testing.T, config string) { require.NoError(t, err) postState, err := altair.UpgradeToAltair(context.Background(), preState) require.NoError(t, err) - postStateFromFunction, err := statealtair.ProtobufBeaconState(postState.ToProtoUnsafe()) + postStateFromFunction, err := statealtair.ProtobufBeaconState(postState.InnerStateUnsafe()) require.NoError(t, err) postStateFile, err := util.BazelFileBytes(path.Join(folderPath, "post.ssz_snappy")) diff --git a/testing/spectest/shared/altair/operations/BUILD.bazel b/testing/spectest/shared/altair/operations/BUILD.bazel index baa7f1f917..0fdc28074b 100644 --- a/testing/spectest/shared/altair/operations/BUILD.bazel +++ b/testing/spectest/shared/altair/operations/BUILD.bazel @@ -20,8 +20,8 @@ go_library( "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/validators:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/block:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", diff --git a/testing/spectest/shared/altair/operations/attestation.go b/testing/spectest/shared/altair/operations/attestation.go index efa9e702b8..4a77f6f60e 100644 --- a/testing/spectest/shared/altair/operations/attestation.go +++ b/testing/spectest/shared/altair/operations/attestation.go @@ -9,7 +9,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/operations/attester_slashing.go b/testing/spectest/shared/altair/operations/attester_slashing.go index 489e78df3b..dc0558c0fb 100644 --- a/testing/spectest/shared/altair/operations/attester_slashing.go +++ b/testing/spectest/shared/altair/operations/attester_slashing.go @@ -8,7 +8,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/operations/block_header.go b/testing/spectest/shared/altair/operations/block_header.go index 0a34394df7..7286b06e0c 100644 --- a/testing/spectest/shared/altair/operations/block_header.go +++ b/testing/spectest/shared/altair/operations/block_header.go @@ -10,7 +10,7 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" @@ -63,10 +63,10 @@ func RunBlockHeaderTest(t *testing.T, config string) { postBeaconState := ðpb.BeaconStateAltair{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := stateAltair.ProtobufBeaconState(beaconState.ToProto()) + pbState, err := stateAltair.ProtobufBeaconState(beaconState.CloneInnerState()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProto(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.CloneInnerState(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/altair/operations/deposit.go b/testing/spectest/shared/altair/operations/deposit.go index 143a9c2ae4..2e5277f66b 100644 --- a/testing/spectest/shared/altair/operations/deposit.go +++ b/testing/spectest/shared/altair/operations/deposit.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/operations/helpers.go b/testing/spectest/shared/altair/operations/helpers.go index ea125aadd5..9b0932c8ec 100644 --- a/testing/spectest/shared/altair/operations/helpers.go +++ b/testing/spectest/shared/altair/operations/helpers.go @@ -10,8 +10,8 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" @@ -69,10 +69,10 @@ func RunBlockOperationTest( if err := postBeaconState.UnmarshalSSZ(postBeaconStateSSZ); err != nil { t.Fatalf("Failed to unmarshal: %v", err) } - pbState, err := stateAltair.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := stateAltair.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/altair/operations/proposer_slashing.go b/testing/spectest/shared/altair/operations/proposer_slashing.go index 14abcb876f..53f93ffacc 100644 --- a/testing/spectest/shared/altair/operations/proposer_slashing.go +++ b/testing/spectest/shared/altair/operations/proposer_slashing.go @@ -8,7 +8,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/operations/sync_committee.go b/testing/spectest/shared/altair/operations/sync_committee.go index 65916ad856..84dd2f7e7d 100644 --- a/testing/spectest/shared/altair/operations/sync_committee.go +++ b/testing/spectest/shared/altair/operations/sync_committee.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/operations/voluntary_exit.go b/testing/spectest/shared/altair/operations/voluntary_exit.go index 6ec080fc3c..06bdd2fbcc 100644 --- a/testing/spectest/shared/altair/operations/voluntary_exit.go +++ b/testing/spectest/shared/altair/operations/voluntary_exit.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/altair/rewards/BUILD.bazel b/testing/spectest/shared/altair/rewards/BUILD.bazel index 4def4684b3..c06c1cb52d 100644 --- a/testing/spectest/shared/altair/rewards/BUILD.bazel +++ b/testing/spectest/shared/altair/rewards/BUILD.bazel @@ -9,7 +9,7 @@ go_library( deps = [ "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/helpers:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/altair/rewards/rewards_penalties.go b/testing/spectest/shared/altair/rewards/rewards_penalties.go index 678b3badb9..72717d22de 100644 --- a/testing/spectest/shared/altair/rewards/rewards_penalties.go +++ b/testing/spectest/shared/altair/rewards/rewards_penalties.go @@ -12,7 +12,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/spectest/shared/altair/sanity/BUILD.bazel b/testing/spectest/shared/altair/sanity/BUILD.bazel index 8f569ba165..cf031a710d 100644 --- a/testing/spectest/shared/altair/sanity/BUILD.bazel +++ b/testing/spectest/shared/altair/sanity/BUILD.bazel @@ -13,8 +13,8 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/altair/sanity/block_processing.go b/testing/spectest/shared/altair/sanity/block_processing.go index d7df096fad..bdffd8c15a 100644 --- a/testing/spectest/shared/altair/sanity/block_processing.go +++ b/testing/spectest/shared/altair/sanity/block_processing.go @@ -13,8 +13,8 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" @@ -92,10 +92,10 @@ func RunBlockProcessingTest(t *testing.T, config, folderPath string) { postBeaconState := ðpb.BeaconStateAltair{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := stateAltair.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := stateAltair.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/altair/sanity/slot_processing.go b/testing/spectest/shared/altair/sanity/slot_processing.go index 99fb0b87b9..4d7084c4e0 100644 --- a/testing/spectest/shared/altair/sanity/slot_processing.go +++ b/testing/spectest/shared/altair/sanity/slot_processing.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" @@ -52,7 +52,7 @@ func RunSlotProcessingTests(t *testing.T, config string) { postState, err := transition.ProcessSlots(context.Background(), beaconState, beaconState.Slot().Add(uint64(slotsCount))) require.NoError(t, err) - pbState, err := stateAltair.ProtobufBeaconState(postState.ToProto()) + pbState, err := stateAltair.ProtobufBeaconState(postState.CloneInnerState()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { diff, _ := messagediff.PrettyDiff(beaconState, postBeaconState) diff --git a/testing/spectest/shared/altair/ssz_static/BUILD.bazel b/testing/spectest/shared/altair/ssz_static/BUILD.bazel index a20fa4b549..e62dd35ebb 100644 --- a/testing/spectest/shared/altair/ssz_static/BUILD.bazel +++ b/testing/spectest/shared/altair/ssz_static/BUILD.bazel @@ -7,7 +7,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/testing/spectest/shared/altair/ssz_static", visibility = ["//testing/spectest:__subpackages__"], deps = [ - "//beacon-chain/state/v2:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/altair/ssz_static/ssz_static.go b/testing/spectest/shared/altair/ssz_static/ssz_static.go index ff544833f2..ef93195f6a 100644 --- a/testing/spectest/shared/altair/ssz_static/ssz_static.go +++ b/testing/spectest/shared/altair/ssz_static/ssz_static.go @@ -9,7 +9,7 @@ import ( fssz "github.com/ferranbt/fastssz" "github.com/golang/snappy" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel b/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel index 6569928e5f..075e998e88 100644 --- a/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel +++ b/testing/spectest/shared/phase0/epoch_processing/BUILD.bazel @@ -22,8 +22,8 @@ go_library( "//beacon-chain/core/epoch:go_default_library", "//beacon-chain/core/epoch/precompute:go_default_library", "//beacon-chain/core/helpers:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/phase0/epoch_processing/effective_balance_updates.go b/testing/spectest/shared/phase0/epoch_processing/effective_balance_updates.go index bfbc8c1ea5..8f9b35e2d8 100644 --- a/testing/spectest/shared/phase0/epoch_processing/effective_balance_updates.go +++ b/testing/spectest/shared/phase0/epoch_processing/effective_balance_updates.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/eth1_data_reset.go b/testing/spectest/shared/phase0/epoch_processing/eth1_data_reset.go index a65f5c8e4f..c06bede2e0 100644 --- a/testing/spectest/shared/phase0/epoch_processing/eth1_data_reset.go +++ b/testing/spectest/shared/phase0/epoch_processing/eth1_data_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/helpers.go b/testing/spectest/shared/phase0/epoch_processing/helpers.go index 84ee305175..e05cea37bd 100644 --- a/testing/spectest/shared/phase0/epoch_processing/helpers.go +++ b/testing/spectest/shared/phase0/epoch_processing/helpers.go @@ -8,8 +8,8 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" @@ -58,7 +58,7 @@ func RunEpochOperationTest( t.Fatalf("Failed to unmarshal: %v", err) } - pbState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { t.Fatal("Post state does not match expected") diff --git a/testing/spectest/shared/phase0/epoch_processing/historical_roots_update.go b/testing/spectest/shared/phase0/epoch_processing/historical_roots_update.go index 54ee7862f9..03768d111c 100644 --- a/testing/spectest/shared/phase0/epoch_processing/historical_roots_update.go +++ b/testing/spectest/shared/phase0/epoch_processing/historical_roots_update.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/justification_and_finalization.go b/testing/spectest/shared/phase0/epoch_processing/justification_and_finalization.go index a50ef87a9d..dc79739ee6 100644 --- a/testing/spectest/shared/phase0/epoch_processing/justification_and_finalization.go +++ b/testing/spectest/shared/phase0/epoch_processing/justification_and_finalization.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/participation_record_updates.go b/testing/spectest/shared/phase0/epoch_processing/participation_record_updates.go index 77c8971900..2eeaa7a9b6 100644 --- a/testing/spectest/shared/phase0/epoch_processing/participation_record_updates.go +++ b/testing/spectest/shared/phase0/epoch_processing/participation_record_updates.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/randao_mixes_reset.go b/testing/spectest/shared/phase0/epoch_processing/randao_mixes_reset.go index 1201f29acd..536c71dc7d 100644 --- a/testing/spectest/shared/phase0/epoch_processing/randao_mixes_reset.go +++ b/testing/spectest/shared/phase0/epoch_processing/randao_mixes_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/registry_updates.go b/testing/spectest/shared/phase0/epoch_processing/registry_updates.go index 7c2832f7cd..3a4129d906 100644 --- a/testing/spectest/shared/phase0/epoch_processing/registry_updates.go +++ b/testing/spectest/shared/phase0/epoch_processing/registry_updates.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/rewards_and_penalties.go b/testing/spectest/shared/phase0/epoch_processing/rewards_and_penalties.go index c07779b5b7..90d2741b79 100644 --- a/testing/spectest/shared/phase0/epoch_processing/rewards_and_penalties.go +++ b/testing/spectest/shared/phase0/epoch_processing/rewards_and_penalties.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/epoch_processing/slashings.go b/testing/spectest/shared/phase0/epoch_processing/slashings.go index 3155d87a52..fa5e69bbe9 100644 --- a/testing/spectest/shared/phase0/epoch_processing/slashings.go +++ b/testing/spectest/shared/phase0/epoch_processing/slashings.go @@ -8,7 +8,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/spectest/shared/phase0/epoch_processing/slashings_reset.go b/testing/spectest/shared/phase0/epoch_processing/slashings_reset.go index 6d67bacd45..413744afdb 100644 --- a/testing/spectest/shared/phase0/epoch_processing/slashings_reset.go +++ b/testing/spectest/shared/phase0/epoch_processing/slashings_reset.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" ) diff --git a/testing/spectest/shared/phase0/finality/BUILD.bazel b/testing/spectest/shared/phase0/finality/BUILD.bazel index 61201d8b9f..f3dd1476b2 100644 --- a/testing/spectest/shared/phase0/finality/BUILD.bazel +++ b/testing/spectest/shared/phase0/finality/BUILD.bazel @@ -9,8 +9,8 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/phase0/finality/runner.go b/testing/spectest/shared/phase0/finality/runner.go index f308c12d3c..2347801be2 100644 --- a/testing/spectest/shared/phase0/finality/runner.go +++ b/testing/spectest/shared/phase0/finality/runner.go @@ -8,8 +8,8 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" @@ -72,10 +72,10 @@ func RunFinalityTest(t *testing.T, config string) { require.NoError(t, err, "Failed to decompress") postBeaconState := ðpb.BeaconState{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/phase0/operations/BUILD.bazel b/testing/spectest/shared/phase0/operations/BUILD.bazel index f091afdca2..ac037af344 100644 --- a/testing/spectest/shared/phase0/operations/BUILD.bazel +++ b/testing/spectest/shared/phase0/operations/BUILD.bazel @@ -18,8 +18,8 @@ go_library( "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/validators:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/block:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", diff --git a/testing/spectest/shared/phase0/operations/attestation.go b/testing/spectest/shared/phase0/operations/attestation.go index 7417353480..ab66adb2ec 100644 --- a/testing/spectest/shared/phase0/operations/attestation.go +++ b/testing/spectest/shared/phase0/operations/attestation.go @@ -8,7 +8,7 @@ import ( "github.com/golang/snappy" "github.com/pkg/errors" b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/phase0/operations/attester_slashing.go b/testing/spectest/shared/phase0/operations/attester_slashing.go index c887ee8a4b..ffa0b375b7 100644 --- a/testing/spectest/shared/phase0/operations/attester_slashing.go +++ b/testing/spectest/shared/phase0/operations/attester_slashing.go @@ -8,7 +8,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/phase0/operations/block_header.go b/testing/spectest/shared/phase0/operations/block_header.go index 1de37ee8af..6698f2228c 100644 --- a/testing/spectest/shared/phase0/operations/block_header.go +++ b/testing/spectest/shared/phase0/operations/block_header.go @@ -10,7 +10,7 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" @@ -64,10 +64,10 @@ func RunBlockHeaderTest(t *testing.T, config string) { postBeaconState := ðpb.BeaconState{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := v1.ProtobufBeaconState(beaconState.ToProto()) + pbState, err := v1.ProtobufBeaconState(beaconState.CloneInnerState()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProto(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.CloneInnerState(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/phase0/operations/deposit.go b/testing/spectest/shared/phase0/operations/deposit.go index fc17b51789..146080fe7c 100644 --- a/testing/spectest/shared/phase0/operations/deposit.go +++ b/testing/spectest/shared/phase0/operations/deposit.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/phase0/operations/helpers.go b/testing/spectest/shared/phase0/operations/helpers.go index 7adf89b489..58253cfa4f 100644 --- a/testing/spectest/shared/phase0/operations/helpers.go +++ b/testing/spectest/shared/phase0/operations/helpers.go @@ -10,8 +10,8 @@ import ( "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" @@ -67,10 +67,10 @@ func RunBlockOperationTest( if err := postBeaconState.UnmarshalSSZ(postBeaconStateSSZ); err != nil { t.Fatalf("Failed to unmarshal: %v", err) } - pbState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/phase0/operations/proposer_slashing.go b/testing/spectest/shared/phase0/operations/proposer_slashing.go index 64de7727d4..e1d22f9afa 100644 --- a/testing/spectest/shared/phase0/operations/proposer_slashing.go +++ b/testing/spectest/shared/phase0/operations/proposer_slashing.go @@ -8,7 +8,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" v "github.com/prysmaticlabs/prysm/beacon-chain/core/validators" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/phase0/operations/voluntary_exit.go b/testing/spectest/shared/phase0/operations/voluntary_exit.go index 398b1f323b..e31d54095e 100644 --- a/testing/spectest/shared/phase0/operations/voluntary_exit.go +++ b/testing/spectest/shared/phase0/operations/voluntary_exit.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/block" "github.com/prysmaticlabs/prysm/testing/require" diff --git a/testing/spectest/shared/phase0/rewards/BUILD.bazel b/testing/spectest/shared/phase0/rewards/BUILD.bazel index 83e40043ef..8b2c958fed 100644 --- a/testing/spectest/shared/phase0/rewards/BUILD.bazel +++ b/testing/spectest/shared/phase0/rewards/BUILD.bazel @@ -9,7 +9,7 @@ go_library( deps = [ "//beacon-chain/core/epoch/precompute:go_default_library", "//beacon-chain/core/helpers:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/phase0/rewards/rewards_penalties.go b/testing/spectest/shared/phase0/rewards/rewards_penalties.go index bdd604d915..ff33a7414f 100644 --- a/testing/spectest/shared/phase0/rewards/rewards_penalties.go +++ b/testing/spectest/shared/phase0/rewards/rewards_penalties.go @@ -11,7 +11,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/epoch/precompute" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/spectest/shared/phase0/sanity/BUILD.bazel b/testing/spectest/shared/phase0/sanity/BUILD.bazel index 95da1ab321..66371b980e 100644 --- a/testing/spectest/shared/phase0/sanity/BUILD.bazel +++ b/testing/spectest/shared/phase0/sanity/BUILD.bazel @@ -13,8 +13,8 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", "//testing/require:go_default_library", diff --git a/testing/spectest/shared/phase0/sanity/block_processing.go b/testing/spectest/shared/phase0/sanity/block_processing.go index d1e55896da..151de7eb39 100644 --- a/testing/spectest/shared/phase0/sanity/block_processing.go +++ b/testing/spectest/shared/phase0/sanity/block_processing.go @@ -12,8 +12,8 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/require" @@ -90,10 +90,10 @@ func RunBlockProcessingTest(t *testing.T, config, folderPath string) { postBeaconState := ðpb.BeaconState{} require.NoError(t, postBeaconState.UnmarshalSSZ(postBeaconStateSSZ), "Failed to unmarshal") - pbState, err := v1.ProtobufBeaconState(beaconState.ToProtoUnsafe()) + pbState, err := v1.ProtobufBeaconState(beaconState.InnerStateUnsafe()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { - diff, _ := messagediff.PrettyDiff(beaconState.ToProtoUnsafe(), postBeaconState) + diff, _ := messagediff.PrettyDiff(beaconState.InnerStateUnsafe(), postBeaconState) t.Log(diff) t.Fatal("Post state does not match expected") } diff --git a/testing/spectest/shared/phase0/sanity/slot_processing.go b/testing/spectest/shared/phase0/sanity/slot_processing.go index 2c55f8460e..3a98f65460 100644 --- a/testing/spectest/shared/phase0/sanity/slot_processing.go +++ b/testing/spectest/shared/phase0/sanity/slot_processing.go @@ -7,7 +7,7 @@ import ( "github.com/golang/snappy" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" @@ -52,7 +52,7 @@ func RunSlotProcessingTests(t *testing.T, config string) { postState, err := transition.ProcessSlots(context.Background(), beaconState, beaconState.Slot().Add(uint64(slotsCount))) require.NoError(t, err) - pbState, err := v1.ProtobufBeaconState(postState.ToProto()) + pbState, err := v1.ProtobufBeaconState(postState.CloneInnerState()) require.NoError(t, err) if !proto.Equal(pbState, postBeaconState) { diff, _ := messagediff.PrettyDiff(beaconState, postBeaconState) diff --git a/testing/spectest/shared/phase0/ssz_static/BUILD.bazel b/testing/spectest/shared/phase0/ssz_static/BUILD.bazel index 2668769d4e..59a260284b 100644 --- a/testing/spectest/shared/phase0/ssz_static/BUILD.bazel +++ b/testing/spectest/shared/phase0/ssz_static/BUILD.bazel @@ -7,7 +7,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/testing/spectest/shared/phase0/ssz_static", visibility = ["//testing/spectest:__subpackages__"], deps = [ - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//testing/require:go_default_library", "//testing/spectest/utils:go_default_library", diff --git a/testing/spectest/shared/phase0/ssz_static/ssz_static.go b/testing/spectest/shared/phase0/ssz_static/ssz_static.go index d9dda481f3..abceba5442 100644 --- a/testing/spectest/shared/phase0/ssz_static/ssz_static.go +++ b/testing/spectest/shared/phase0/ssz_static/ssz_static.go @@ -9,7 +9,7 @@ import ( fssz "github.com/ferranbt/fastssz" "github.com/golang/snappy" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/spectest/utils" diff --git a/testing/util/BUILD.bazel b/testing/util/BUILD.bazel index 57741dab44..f4ca6dc6f9 100644 --- a/testing/util/BUILD.bazel +++ b/testing/util/BUILD.bazel @@ -28,11 +28,11 @@ go_library( "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/transition:go_default_library", "//beacon-chain/p2p/types:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/stateutil:go_default_library", - "//beacon-chain/state/v1:go_default_library", - "//beacon-chain/state/v2:go_default_library", - "//beacon-chain/state/v3:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/stateutil:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", + "//beacon-chain/state-proto/v2:go_default_library", + "//beacon-chain/state-proto/v3:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//container/trie:go_default_library", diff --git a/testing/util/altair.go b/testing/util/altair.go index ac86440014..4b31700b1c 100644 --- a/testing/util/altair.go +++ b/testing/util/altair.go @@ -14,9 +14,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + stateAltair "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -87,29 +87,28 @@ func buildGenesisBeaconState(genesisTime uint64, preState state.BeaconStateAltai return nil, errors.New("no eth1data provided for genesis state") } - var randaoMixes [fieldparams.RandaoMixesLength][32]byte + randaoMixes := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) for i := 0; i < len(randaoMixes); i++ { - var h [32]byte - copy(h[:], eth1Data.BlockHash) + h := make([]byte, 32) + copy(h, eth1Data.BlockHash) randaoMixes[i] = h } - zeroHash32 := params.BeaconConfig().ZeroHash - zeroHash := zeroHash32[:] + zeroHash := params.BeaconConfig().ZeroHash[:] activeIndexRoots := make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector) for i := 0; i < len(activeIndexRoots); i++ { activeIndexRoots[i] = zeroHash } - var blockRoots [fieldparams.BlockRootsLength][32]byte + blockRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) for i := 0; i < len(blockRoots); i++ { - blockRoots[i] = zeroHash32 + blockRoots[i] = zeroHash } - var stateRoots [fieldparams.StateRootsLength][32]byte + stateRoots := make([][]byte, params.BeaconConfig().SlotsPerHistoricalRoot) for i := 0; i < len(stateRoots); i++ { - stateRoots[i] = zeroHash32 + stateRoots[i] = zeroHash } slashings := make([]uint64, params.BeaconConfig().EpochsPerSlashingsVector) @@ -131,6 +130,53 @@ func buildGenesisBeaconState(genesisTime uint64, preState state.BeaconStateAltai if err != nil { return nil, err } + st := ðpb.BeaconStateAltair{ + // Misc fields. + Slot: 0, + GenesisTime: genesisTime, + GenesisValidatorsRoot: genesisValidatorsRoot[:], + + Fork: ðpb.Fork{ + PreviousVersion: params.BeaconConfig().GenesisForkVersion, + CurrentVersion: params.BeaconConfig().GenesisForkVersion, + Epoch: 0, + }, + + // Validator registry fields. + Validators: preState.Validators(), + Balances: preState.Balances(), + PreviousEpochParticipation: prevEpochParticipation, + CurrentEpochParticipation: currEpochParticipation, + InactivityScores: scores, + + // Randomness and committees. + RandaoMixes: randaoMixes, + + // Finality. + PreviousJustifiedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + CurrentJustifiedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + JustificationBits: []byte{0}, + FinalizedCheckpoint: ðpb.Checkpoint{ + Epoch: 0, + Root: params.BeaconConfig().ZeroHash[:], + }, + + HistoricalRoots: [][]byte{}, + BlockRoots: blockRoots, + StateRoots: stateRoots, + Slashings: slashings, + + // Eth1 data. + Eth1Data: eth1Data, + Eth1DataVotes: []*ethpb.Eth1Data{}, + Eth1DepositIndex: preState.Eth1DepositIndex(), + } bodyRoot, err := (ðpb.BeaconBlockBodyAltair{ RandaoReveal: make([]byte, 96), @@ -148,166 +194,53 @@ func buildGenesisBeaconState(genesisTime uint64, preState state.BeaconStateAltai return nil, errors.Wrap(err, "could not hash tree root empty block body") } + st.LatestBlockHeader = ðpb.BeaconBlockHeader{ + ParentRoot: zeroHash, + StateRoot: zeroHash, + BodyRoot: bodyRoot[:], + } + var pubKeys [][]byte for i := uint64(0); i < params.BeaconConfig().SyncCommitteeSize; i++ { pubKeys = append(pubKeys, bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength)) } - - s, err := stateAltair.Initialize() - if err != nil { - return nil, errors.Wrap(err, "could not initialize state from proto state") - } - - if err = s.SetGenesisTime(genesisTime); err != nil { - return nil, errors.Wrap(err, "could not set genesis time") - } - if err = s.SetGenesisValidatorRoot(genesisValidatorsRoot); err != nil { - return nil, errors.Wrap(err, "could not set genesis validators root") - } - if err = s.SetSlot(0); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = s.SetFork(ðpb.Fork{ - PreviousVersion: params.BeaconConfig().GenesisForkVersion, - CurrentVersion: params.BeaconConfig().GenesisForkVersion, - Epoch: 0, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = s.SetLatestBlockHeader(ðpb.BeaconBlockHeader{ - ParentRoot: zeroHash, - StateRoot: zeroHash, - BodyRoot: bodyRoot[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set latest block header") - } - if err = s.SetBlockRoots(&blockRoots); err != nil { - return nil, errors.Wrap(err, "could not set block roots") - } - if err = s.SetStateRoots(&stateRoots); err != nil { - return nil, errors.Wrap(err, "could not set state roots") - } - if err = s.SetHistoricalRoots([][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = s.SetEth1Data(eth1Data); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = s.SetEth1DataVotes([]*ethpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = s.SetEth1Data(eth1Data); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = s.SetEth1DepositIndex(preState.Eth1DepositIndex()); err != nil { - return nil, errors.Wrap(err, "could not set eth1 deposit index") - } - if err = s.SetValidators(preState.Validators()); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = s.SetBalances(preState.Balances()); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = s.SetRandaoMixes(&randaoMixes); err != nil { - return nil, errors.Wrap(err, "could not set randao mixes") - } - if err = s.SetPreviousParticipationBits(prevEpochParticipation); err != nil { - return nil, errors.Wrap(err, "could not set previous epoch participation") - } - if err = s.SetCurrentParticipationBits(currEpochParticipation); err != nil { - return nil, errors.Wrap(err, "could not set current epoch participation") - } - if err = s.SetInactivityScores(scores); err != nil { - return nil, errors.Wrap(err, "could not set inactivity scores") - } - if err = s.SetSlashings(slashings); err != nil { - return nil, errors.Wrap(err, "could not set slashings") - } - if err = s.SetJustificationBits([]byte{0}); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } - if err = s.SetPreviousJustifiedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set previous justified checkpoint") - } - if err = s.SetCurrentJustifiedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set current justified checkpoint") - } - if err = s.SetFinalizedCheckpoint(ðpb.Checkpoint{ - Epoch: 0, - Root: params.BeaconConfig().ZeroHash[:], - }); err != nil { - return nil, errors.Wrap(err, "could not set finalized checkpoint") - } - if err = s.SetCurrentSyncCommittee(ðpb.SyncCommittee{ + st.CurrentSyncCommittee = ðpb.SyncCommittee{ Pubkeys: pubKeys, AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength), - }); err != nil { - return nil, errors.Wrap(err, "could not set current sync committee") } - if err = s.SetNextSyncCommittee(ðpb.SyncCommittee{ + st.NextSyncCommittee = ðpb.SyncCommittee{ Pubkeys: bytesutil.SafeCopy2dBytes(pubKeys), AggregatePubkey: bytesutil.PadTo([]byte{}, params.BeaconConfig().BLSPubkeyLength), - }); err != nil { - return nil, errors.Wrap(err, "could not set next sync committee") } - return s, nil + return stateAltair.InitializeFromProto(st) } func emptyGenesisState() (state.BeaconStateAltair, error) { - s, err := stateAltair.Initialize() - if err != nil { - return nil, errors.Wrap(err, "could not initialize state from proto state") - } + st := ðpb.BeaconStateAltair{ + // Misc fields. + Slot: 0, + Fork: ðpb.Fork{ + PreviousVersion: params.BeaconConfig().GenesisForkVersion, + CurrentVersion: params.BeaconConfig().AltairForkVersion, + Epoch: 0, + }, + // Validator registry fields. + Validators: []*ethpb.Validator{}, + Balances: []uint64{}, + InactivityScores: []uint64{}, - if err = s.SetSlot(0); err != nil { - return nil, errors.Wrap(err, "could not set slot") - } - if err = s.SetFork(ðpb.Fork{ - PreviousVersion: params.BeaconConfig().GenesisForkVersion, - CurrentVersion: params.BeaconConfig().AltairForkVersion, - Epoch: 0, - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = s.SetHistoricalRoots([][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = s.SetEth1Data(ðpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = s.SetEth1DataVotes([]*ethpb.Eth1Data{}); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = s.SetEth1DepositIndex(0); err != nil { - return nil, errors.Wrap(err, "could not set eth1 deposit index") - } - if err = s.SetValidators([]*ethpb.Validator{}); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = s.SetBalances([]uint64{}); err != nil { - return nil, errors.Wrap(err, "could not set balances") - } - if err = s.SetInactivityScores([]uint64{}); err != nil { - return nil, errors.Wrap(err, "could not set inactivity scores") - } - if err = s.SetPreviousParticipationBits([]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set previous participation bits") - } - if err = s.SetCurrentParticipationBits([]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set current participation bits") - } - if err = s.SetJustificationBits([]byte{0}); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } + JustificationBits: []byte{0}, + HistoricalRoots: [][]byte{}, + CurrentEpochParticipation: []byte{}, + PreviousEpochParticipation: []byte{}, - return s, nil + // Eth1 data. + Eth1Data: ðpb.Eth1Data{}, + Eth1DataVotes: []*ethpb.Eth1Data{}, + Eth1DepositIndex: 0, + } + return stateAltair.InitializeFromProto(st) } // NewBeaconBlockAltair creates a beacon block with minimum marshalable fields. @@ -354,8 +287,7 @@ func BlockSignatureAltair( return nil, err } block.StateRoot = s[:] - gvRoot := bState.GenesisValidatorRoot() - domain, err := signing.Domain(bState.Fork(), time.CurrentEpoch(bState), params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(bState.Fork(), time.CurrentEpoch(bState), params.BeaconConfig().DomainBeaconProposer, bState.GenesisValidatorRoot()) if err != nil { return nil, err } diff --git a/testing/util/attestation.go b/testing/util/attestation.go index fad63c2f8c..fd7a79e4db 100644 --- a/testing/util/attestation.go +++ b/testing/util/attestation.go @@ -11,9 +11,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" - v2 "github.com/prysmaticlabs/prysm/beacon-chain/state/v2" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" + v2 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v2" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" @@ -70,7 +70,7 @@ func GenerateAttestations( var headState state.BeaconState switch bState.Version() { case version.Phase0: - pbState, err := v1.ProtobufBeaconState(bState.ToProto()) + pbState, err := v1.ProtobufBeaconState(bState.CloneInnerState()) if err != nil { return nil, err } @@ -80,7 +80,7 @@ func GenerateAttestations( } headState = state.BeaconState(genState) case version.Altair: - pbState, err := v2.ProtobufBeaconState(bState.ToProto()) + pbState, err := v2.ProtobufBeaconState(bState.CloneInnerState()) if err != nil { return nil, err } @@ -151,8 +151,7 @@ func GenerateAttestations( ) } - gvRoot := bState.GenesisValidatorRoot() - domain, err := signing.Domain(bState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconAttester, gvRoot[:]) + domain, err := signing.Domain(bState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconAttester, bState.GenesisValidatorRoot()) if err != nil { return nil, err } diff --git a/testing/util/bellatrix.go b/testing/util/bellatrix.go index 5b92c11205..e6421e62bd 100644 --- a/testing/util/bellatrix.go +++ b/testing/util/bellatrix.go @@ -7,7 +7,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/testing/util/block.go b/testing/util/block.go index 2c31e5e017..db03e7fb0b 100644 --- a/testing/util/block.go +++ b/testing/util/block.go @@ -9,7 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/testing/util/deposits.go b/testing/util/deposits.go index dd37a05894..fc68d29689 100644 --- a/testing/util/deposits.go +++ b/testing/util/deposits.go @@ -8,7 +8,7 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/container/trie" "github.com/prysmaticlabs/prysm/crypto/bls" diff --git a/testing/util/helpers.go b/testing/util/helpers.go index 596334d3e2..210da1d431 100644 --- a/testing/util/helpers.go +++ b/testing/util/helpers.go @@ -11,7 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/crypto/rand" @@ -46,8 +46,7 @@ func BlockSignature( return nil, err } block.StateRoot = s[:] - gvRoot := bState.GenesisValidatorRoot() - domain, err := signing.Domain(bState.Fork(), time.CurrentEpoch(bState), params.BeaconConfig().DomainBeaconProposer, gvRoot[:]) + domain, err := signing.Domain(bState.Fork(), time.CurrentEpoch(bState), params.BeaconConfig().DomainBeaconProposer, bState.GenesisValidatorRoot()) if err != nil { return nil, err } diff --git a/testing/util/merge_state.go b/testing/util/merge_state.go index 7c74c62b22..b1c29155bd 100644 --- a/testing/util/merge_state.go +++ b/testing/util/merge_state.go @@ -7,9 +7,9 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - "github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil" - v3 "github.com/prysmaticlabs/prysm/beacon-chain/state/v3" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/stateutil" + v3 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v3" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" diff --git a/testing/util/state.go b/testing/util/state.go index 487737c797..40805d6a06 100644 --- a/testing/util/state.go +++ b/testing/util/state.go @@ -4,21 +4,18 @@ import ( "fmt" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/pkg/errors" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" "github.com/prysmaticlabs/prysm/config/params" - "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" ) // FillRootsNaturalOpt is meant to be used as an option when calling NewBeaconState. // It fills state and block roots with hex representations of natural numbers starting with 0. // Example: 16 becomes 0x00...0f. -func FillRootsNaturalOpt(state state.BeaconState) error { +func FillRootsNaturalOpt(state *ethpb.BeaconState) error { rootsLen := params.MainnetConfig().SlotsPerHistoricalRoot roots := make([][]byte, rootsLen) for i := types.Slot(0); i < rootsLen; i++ { @@ -33,85 +30,59 @@ func FillRootsNaturalOpt(state state.BeaconState) error { } roots[j] = h } - var stateRoots [fieldparams.StateRootsLength][32]byte - for i := range stateRoots { - stateRoots[i] = bytesutil.ToBytes32(roots[i]) - } - if err := state.SetStateRoots(&stateRoots); err != nil { - return errors.Wrap(err, "could not set state roots") - } - var blockRoots [fieldparams.BlockRootsLength][32]byte - for i := range blockRoots { - blockRoots[i] = bytesutil.ToBytes32(roots[i]) - } - if err := state.SetBlockRoots(&blockRoots); err != nil { - return errors.Wrap(err, "could not set block roots") - } + state.StateRoots = roots + state.BlockRoots = roots return nil } // NewBeaconState creates a beacon state with minimum marshalable fields. -func NewBeaconState(options ...func(beaconState state.BeaconState) error) (*v1.BeaconState, error) { - var st, err = v1.Initialize() - if err != nil { - return nil, err - } - - if err = st.SetFork(ðpb.Fork{ - PreviousVersion: make([]byte, 4), - CurrentVersion: make([]byte, 4), - }); err != nil { - return nil, errors.Wrap(err, "could not set fork") - } - if err = st.SetLatestBlockHeader(HydrateBeaconHeader(ðpb.BeaconBlockHeader{})); err != nil { - return nil, errors.Wrap(err, "could not set latest block header") - } - if err = st.SetHistoricalRoots([][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set historical roots") - } - if err = st.SetBlockRoots(&[fieldparams.BlockRootsLength][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set block roots") - } - if err = st.SetStateRoots(&[fieldparams.StateRootsLength][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set state roots") - } - if err = st.SetEth1Data(ðpb.Eth1Data{ - DepositRoot: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, 32), - }); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data") - } - if err = st.SetEth1DataVotes(make([]*ethpb.Eth1Data, 0)); err != nil { - return nil, errors.Wrap(err, "could not set eth1 data votes") - } - if err = st.SetValidators(make([]*ethpb.Validator, 0)); err != nil { - return nil, errors.Wrap(err, "could not set validators") - } - if err = st.SetRandaoMixes(&[fieldparams.RandaoMixesLength][32]byte{}); err != nil { - return nil, errors.Wrap(err, "could not set randao mixes") - } - if err = st.SetSlashings(make([]uint64, params.MainnetConfig().EpochsPerSlashingsVector)); err != nil { - return nil, errors.Wrap(err, "could not set slashings") - } - if err = st.SetJustificationBits(bitfield.Bitvector4{0x0}); err != nil { - return nil, errors.Wrap(err, "could not set justification bits") - } - if err = st.SetPreviousJustifiedCheckpoint(ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}); err != nil { - return nil, errors.Wrap(err, "could not set previous justified checkpoint") - } - if err = st.SetCurrentJustifiedCheckpoint(ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}); err != nil { - return nil, errors.Wrap(err, "could not set current justified checkpoint") - } - if err = st.SetFinalizedCheckpoint(ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}); err != nil { - return nil, errors.Wrap(err, "could not set finalized checkpoint") +func NewBeaconState(options ...func(state *ethpb.BeaconState) error) (*v1.BeaconState, error) { + seed := ðpb.BeaconState{ + BlockRoots: filledByteSlice2D(uint64(params.MainnetConfig().SlotsPerHistoricalRoot), 32), + StateRoots: filledByteSlice2D(uint64(params.MainnetConfig().SlotsPerHistoricalRoot), 32), + Slashings: make([]uint64, params.MainnetConfig().EpochsPerSlashingsVector), + RandaoMixes: filledByteSlice2D(uint64(params.MainnetConfig().EpochsPerHistoricalVector), 32), + Validators: make([]*ethpb.Validator, 0), + CurrentJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + Eth1Data: ðpb.Eth1Data{ + DepositRoot: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, 32), + }, + Fork: ðpb.Fork{ + PreviousVersion: make([]byte, 4), + CurrentVersion: make([]byte, 4), + }, + Eth1DataVotes: make([]*ethpb.Eth1Data, 0), + HistoricalRoots: make([][]byte, 0), + JustificationBits: bitfield.Bitvector4{0x0}, + FinalizedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, + LatestBlockHeader: HydrateBeaconHeader(ðpb.BeaconBlockHeader{}), + PreviousEpochAttestations: make([]*ethpb.PendingAttestation, 0), + CurrentEpochAttestations: make([]*ethpb.PendingAttestation, 0), + PreviousJustifiedCheckpoint: ðpb.Checkpoint{Root: make([]byte, fieldparams.RootLength)}, } for _, opt := range options { - err = opt(st) + err := opt(seed) if err != nil { return nil, err } } + var st, err = v1.InitializeFromProtoUnsafe(seed) + if err != nil { + return nil, err + } + return st.Copy().(*v1.BeaconState), nil } + +// SSZ will fill 2D byte slices with their respective values, so we must fill these in too for round +// trip testing. +func filledByteSlice2D(length, innerLen uint64) [][]byte { + b := make([][]byte, length) + for i := uint64(0); i < length; i++ { + b[i] = make([]byte, innerLen) + } + return b +} diff --git a/testing/util/sync_aggregate.go b/testing/util/sync_aggregate.go index b8972bea36..8cb2abf336 100644 --- a/testing/util/sync_aggregate.go +++ b/testing/util/sync_aggregate.go @@ -5,7 +5,7 @@ import ( "github.com/prysmaticlabs/go-bitfield" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" p2pType "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" @@ -52,8 +52,7 @@ func generateSyncAggregate(bState state.BeaconState, privs []bls.SecretKey, pare if !ok { continue } - gvRoot := st.GenesisValidatorRoot() - d, err := signing.Domain(st.Fork(), slots.ToEpoch(st.Slot()), params.BeaconConfig().DomainSyncCommittee, gvRoot[:]) + d, err := signing.Domain(st.Fork(), slots.ToEpoch(st.Slot()), params.BeaconConfig().DomainSyncCommittee, st.GenesisValidatorRoot()) if err != nil { return nil, err } diff --git a/tools/benchmark-files-gen/BUILD.bazel b/tools/benchmark-files-gen/BUILD.bazel index b23aa4d89c..cc1638b210 100644 --- a/tools/benchmark-files-gen/BUILD.bazel +++ b/tools/benchmark-files-gen/BUILD.bazel @@ -12,8 +12,8 @@ go_library( "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-native:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//config/params:go_default_library", "//io/file:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/tools/benchmark-files-gen/main.go b/tools/benchmark-files-gen/main.go index 3637e2b354..e484b11487 100644 --- a/tools/benchmark-files-gen/main.go +++ b/tools/benchmark-files-gen/main.go @@ -14,8 +14,8 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - "github.com/prysmaticlabs/prysm/beacon-chain/state" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/io/file" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" diff --git a/tools/exploredb/BUILD.bazel b/tools/exploredb/BUILD.bazel index 4a90aee61c..e2bb4fe6eb 100644 --- a/tools/exploredb/BUILD.bazel +++ b/tools/exploredb/BUILD.bazel @@ -8,7 +8,7 @@ go_library( visibility = ["//visibility:private"], deps = [ "//beacon-chain/db/kv:go_default_library", - "//beacon-chain/state:go_default_library", + "//beacon-chain/state-native:go_default_library", "//config/params:go_default_library", "//encoding/bytesutil:go_default_library", "//proto/prysm/v1alpha1:go_default_library", diff --git a/tools/exploredb/main.go b/tools/exploredb/main.go index 7a2b1f2e60..c2bad6761e 100644 --- a/tools/exploredb/main.go +++ b/tools/exploredb/main.go @@ -20,7 +20,7 @@ import ( "github.com/dustin/go-humanize" types "github.com/prysmaticlabs/eth2-types" "github.com/prysmaticlabs/prysm/beacon-chain/db/kv" - "github.com/prysmaticlabs/prysm/beacon-chain/state" + "github.com/prysmaticlabs/prysm/beacon-chain/state-native" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" @@ -326,34 +326,15 @@ func printStates(stateC <-chan *modifiedState, doneC chan<- bool) { log.Infof("value : compressed size = %s", humanize.Bytes(mst.valueSize)) t := time.Unix(int64(st.GenesisTime()), 0) log.Infof("genesis_time : %s", t.Format(time.UnixDate)) - gvRoot := st.GenesisValidatorRoot() - log.Infof("genesis_validators_root : %s", hexutils.BytesToHex(gvRoot[:])) + log.Infof("genesis_validators_root : %s", hexutils.BytesToHex(st.GenesisValidatorRoot())) log.Infof("slot : %d", st.Slot()) log.Infof("fork : previous_version = %b, current_version = %b", st.Fork().PreviousVersion, st.Fork().CurrentVersion) log.Infof("latest_block_header : sizeSSZ = %s", humanize.Bytes(uint64(st.LatestBlockHeader().SizeSSZ()))) - blockRoots := st.BlockRoots() - bRoots := make([][]byte, len(blockRoots)) - for i := range bRoots { - tmp := blockRoots[i] - bRoots[i] = tmp[:] - } - size, count := sizeAndCountOfByteList(bRoots) + size, count := sizeAndCountOfByteList(st.BlockRoots()) log.Infof("block_roots : size = %s, count = %d", humanize.Bytes(size), count) - stateRoots := st.StateRoots() - sRoots := make([][]byte, len(stateRoots)) - for i := range sRoots { - tmp := stateRoots[i] - sRoots[i] = tmp[:] - } - size, count = sizeAndCountOfByteList(sRoots) + size, count = sizeAndCountOfByteList(st.StateRoots()) log.Infof("state_roots : size = %s, count = %d", humanize.Bytes(size), count) - historicalRoots := st.HistoricalRoots() - hRoots := make([][]byte, len(historicalRoots)) - for i := range hRoots { - tmp := historicalRoots[i] - hRoots[i] = tmp[:] - } - size, count = sizeAndCountOfByteList(hRoots) + size, count = sizeAndCountOfByteList(st.HistoricalRoots()) log.Infof("historical_roots : size = %s, count = %d", humanize.Bytes(size), count) log.Infof("eth1_data : sizeSSZ = %s", humanize.Bytes(uint64(st.Eth1Data().SizeSSZ()))) size, count = sizeAndCountGeneric(st.Eth1DataVotes(), nil) @@ -363,13 +344,7 @@ func printStates(stateC <-chan *modifiedState, doneC chan<- bool) { log.Infof("validators : sizeSSZ = %s, count = %d", humanize.Bytes(size), count) size, count = sizeAndCountOfUin64List(st.Balances()) log.Infof("balances : size = %s, count = %d", humanize.Bytes(size), count) - randaoMixes := st.RandaoMixes() - mixes := make([][]byte, len(randaoMixes)) - for i := range mixes { - tmp := randaoMixes[i] - mixes[i] = tmp[:] - } - size, count = sizeAndCountOfByteList(mixes) + size, count = sizeAndCountOfByteList(st.RandaoMixes()) log.Infof("randao_mixes : size = %s, count = %d", humanize.Bytes(size), count) size, count = sizeAndCountOfUin64List(st.Slashings()) log.Infof("slashings : size = %s, count = %d", humanize.Bytes(size), count) diff --git a/tools/pcli/BUILD.bazel b/tools/pcli/BUILD.bazel index 09a70d3561..93566a3079 100644 --- a/tools/pcli/BUILD.bazel +++ b/tools/pcli/BUILD.bazel @@ -11,7 +11,7 @@ go_library( visibility = ["//visibility:private"], deps = [ "//beacon-chain/core/transition:go_default_library", - "//beacon-chain/state/v1:go_default_library", + "//beacon-chain/state-proto/v1:go_default_library", "//encoding/ssz:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/wrapper:go_default_library", diff --git a/tools/pcli/main.go b/tools/pcli/main.go index f40009ffa9..6d61f0ea8e 100644 --- a/tools/pcli/main.go +++ b/tools/pcli/main.go @@ -12,7 +12,7 @@ import ( fssz "github.com/ferranbt/fastssz" "github.com/kr/pretty" "github.com/prysmaticlabs/prysm/beacon-chain/core/transition" - v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state-proto/v1" "github.com/prysmaticlabs/prysm/encoding/ssz" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" @@ -191,8 +191,8 @@ func main() { if err := dataFetcher(expectedPostStatePath, expectedState); err != nil { log.Fatal(err) } - if !ssz.DeepEqual(expectedState, postState.ToProtoUnsafe()) { - diff, _ := messagediff.PrettyDiff(expectedState, postState.ToProtoUnsafe()) + if !ssz.DeepEqual(expectedState, postState.InnerStateUnsafe()) { + diff, _ := messagediff.PrettyDiff(expectedState, postState.InnerStateUnsafe()) log.Errorf("Derived state differs from provided post state: %s", diff) } }