def empty_beacon_state(): return BeaconState( validator_registry=(), validator_registry_latest_change_slot=10, validator_registry_exit_count=10, validator_registry_delta_chain_tip=b'\x55' * 32, randao_mix=b'\x55' * 32, next_seed=b'\x55' * 32, shard_committees_at_slots=(), persistent_committees=(), persistent_committee_reassignments=(), previous_justified_slot=0, justified_slot=0, justification_bitfield=0, finalized_slot=0, latest_crosslinks=(), latest_state_recalculation_slot=0, latest_block_hashes=(), latest_penalized_exit_balances=(), latest_attestations=(), processed_pow_receipt_root=b'\x55' * 32, candidate_pow_receipt_roots=(), genesis_time=0, fork_data=ForkData( pre_fork_version=0, post_fork_version=0, fork_slot=0, ), )
def sample_beacon_state_params(sample_fork_data_params): return { 'slot': 0, 'genesis_time': 0, 'fork_data': ForkData(**sample_fork_data_params), 'validator_registry': (), 'validator_balances': (), 'validator_registry_latest_change_slot': 10, 'validator_registry_exit_count': 10, 'validator_registry_delta_chain_tip': b'\x55' * 32, 'latest_randao_mixes': (), 'latest_vdf_outputs': (), 'shard_committees_at_slots': (), 'persistent_committees': (), 'persistent_committee_reassignments': (), 'previous_justified_slot': 0, 'justified_slot': 0, 'justification_bitfield': b'\x00', 'finalized_slot': 0, 'latest_crosslinks': (), 'latest_block_roots': (), 'latest_penalized_exit_balances': (), 'latest_attestations': (), 'batched_block_roots': (), 'processed_pow_receipt_root': b'\x55' * 32, 'candidate_pow_receipt_roots': (), }
def empty_beacon_state(latest_block_roots_length, latest_penalized_exit_length): return BeaconState( slot=0, genesis_time=0, fork_data=ForkData( pre_fork_version=0, post_fork_version=0, fork_slot=0, ), validator_registry=(), validator_balances=(), validator_registry_latest_change_slot=10, validator_registry_exit_count=10, validator_registry_delta_chain_tip=b'\x55' * 32, latest_randao_mixes=(), latest_vdf_outputs=(), shard_committees_at_slots=(), persistent_committees=(), persistent_committee_reassignments=(), previous_justified_slot=0, justified_slot=0, justification_bitfield=0, finalized_slot=0, latest_crosslinks=(), latest_block_roots=(ZERO_HASH32, ) * latest_block_roots_length, latest_penalized_exit_balances=(0, ) * latest_penalized_exit_length, latest_attestations=(), batched_block_roots=(), processed_pow_receipt_root=b'\x55' * 32, candidate_pow_receipt_roots=(), )
def test_verify_slashable_vote_data( num_validators, param_mapper, should_succeed, needs_fork_data, privkeys, sample_beacon_state_params, activated_genesis_validators, genesis_balances, sample_slashable_vote_data_params, sample_fork_data_params, max_casper_votes): state = BeaconState(**sample_beacon_state_params).copy( validator_registry=activated_genesis_validators, validator_balances=genesis_balances, fork_data=ForkData(**sample_fork_data_params), ) # NOTE: we can do this before "correcting" the params as they # touch disjoint subsets of the provided params messages = _create_slashable_vote_data_messages( sample_slashable_vote_data_params) params = _correct_slashable_vote_data_params( num_validators, sample_slashable_vote_data_params, messages, privkeys, state.fork_data, ) if needs_fork_data: params = param_mapper(params, state.fork_data) else: params = param_mapper(params) _run_verify_slashable_vote(params, state, max_casper_votes, should_succeed)
def test_verify_slashable_vote_data_signature( num_validators, privkeys, sample_beacon_state_params, activated_genesis_validators, genesis_balances, sample_slashable_vote_data_params, sample_fork_data_params): state = BeaconState(**sample_beacon_state_params).copy( validator_registry=activated_genesis_validators, validator_balances=genesis_balances, fork_data=ForkData(**sample_fork_data_params), ) # NOTE: we can do this before "correcting" the params as they # touch disjoint subsets of the provided params messages = _create_slashable_vote_data_messages( sample_slashable_vote_data_params) valid_params = _correct_slashable_vote_data_params( num_validators, sample_slashable_vote_data_params, messages, privkeys, state.fork_data, ) valid_votes = SlashableVoteData(**valid_params) assert verify_slashable_vote_data_signature(state, valid_votes) invalid_params = _corrupt_signature(valid_params, state.fork_data) invalid_votes = SlashableVoteData(**invalid_params) assert not verify_slashable_vote_data_signature(state, invalid_votes)
def test_get_fork_version(pre_fork_version, post_fork_version, fork_slot, current_slot, expected): fork_data = ForkData( pre_fork_version=pre_fork_version, post_fork_version=post_fork_version, fork_slot=fork_slot, ) assert expected == get_fork_version( fork_data, current_slot, )
def test_get_domain(pre_fork_version, post_fork_version, fork_slot, current_slot, domain_type, expected): fork_data = ForkData( pre_fork_version=pre_fork_version, post_fork_version=post_fork_version, fork_slot=fork_slot, ) assert expected == get_domain( fork_data=fork_data, slot=current_slot, domain_type=domain_type, )
def test_defaults(sample_fork_data_params): fork_data = ForkData(**sample_fork_data_params) assert fork_data.pre_fork_version == sample_fork_data_params['pre_fork_version'] assert fork_data.post_fork_version == sample_fork_data_params['post_fork_version'] assert fork_data.fork_slot == sample_fork_data_params['fork_slot']