Exemplo n.º 1
0
def test_update_validator(
    genesis_state,
    validator_index_offset,
    validator_count,
    new_pubkey,
    new_balance,
    config,
):
    state = genesis_state
    validator = create_mock_validator(new_pubkey, config)
    validator_index = validator_count + validator_index_offset

    if validator_index < state.validator_count:
        result_state = state.update_validator(validator_index=validator_index,
                                              validator=validator,
                                              balance=new_balance)
        assert result_state.balances[validator_index] == new_balance
        assert result_state.validators[validator_index].pubkey == new_pubkey
        assert state.validators[validator_index].pubkey != new_pubkey
    else:
        with pytest.raises(IndexError):
            state.update_validator(
                validator_index=validator_index,
                validator=validator,
                balance=new_balance,
            )
Exemplo n.º 2
0
def genesis_validators(validator_count, pubkeys, config):
    """
    Returns ``validator_count`` number of activated validators.
    """
    return tuple(
        create_mock_validator(pubkey=pubkey, config=config)
        for pubkey in pubkeys[:validator_count])
def test_randao_processing_validates_randao_reveal(
    sample_beacon_block_params,
    sample_beacon_block_body_params,
    sample_beacon_state_params,
    sample_fork_params,
    keymap,
    config,
):
    proposer_pubkey, proposer_privkey = first(keymap.items())
    state = SerenityBeaconState.create(**sample_beacon_state_params).mset(
        "validators",
        tuple(
            create_mock_validator(proposer_pubkey, config)
            for _ in range(config.TARGET_COMMITTEE_SIZE)),
        "balances",
        (config.MAX_EFFECTIVE_BALANCE, ) * config.TARGET_COMMITTEE_SIZE,
        "randao_mixes",
        tuple(ZERO_HASH32 for _ in range(config.EPOCHS_PER_HISTORICAL_VECTOR)),
    )

    epoch = state.current_epoch(config.SLOTS_PER_EPOCH)
    message_hash = (epoch + 1).to_bytes(32, byteorder="little")
    domain = get_domain(state, SignatureDomain.DOMAIN_RANDAO,
                        config.SLOTS_PER_EPOCH)
    randao_reveal = bls.sign(message_hash, proposer_privkey, domain)

    block_body = BeaconBlockBody.create(**sample_beacon_block_body_params).set(
        "randao_reveal", randao_reveal)

    block = SerenityBeaconBlock.create(**sample_beacon_block_params).set(
        "body", block_body)

    with pytest.raises(ValidationError):
        process_randao(state, block, config)
Exemplo n.º 4
0
def genesis_validators(validator_count, pubkeys, config):
    """
    Returns ``validator_count`` number of activated validators.
    """
    return HashableList.from_iterable(
        (create_mock_validator(pubkey=pubkey, config=config)
         for pubkey in pubkeys[:validator_count]),
        List(Validator, config.VALIDATOR_REGISTRY_LIMIT),
    )
Exemplo n.º 5
0
def test_validate_proposer_signature(
        slots_per_epoch,
        shard_count,
        proposer_privkey,
        proposer_pubkey,
        is_valid_signature,
        sample_beacon_block_params,
        sample_beacon_state_params,
        target_committee_size,
        max_effective_balance,
        config):

    state = BeaconState(**sample_beacon_state_params).copy(
        validators=tuple(
            create_mock_validator(proposer_pubkey, config)
            for _ in range(10)
        ),
        balances=(max_effective_balance,) * 10,
    )

    block = BeaconBlock(**sample_beacon_block_params)
    header = block.header

    proposed_block = block.copy(
        signature=bls.sign(
            message_hash=header.signing_root,
            privkey=proposer_privkey,
            domain=get_domain(
                state,
                SignatureDomain.DOMAIN_BEACON_PROPOSER,
                slots_per_epoch,
            ),
        ),
    )

    if is_valid_signature:
        validate_proposer_signature(
            state,
            proposed_block,
            CommitteeConfig(config),
        )
    else:
        with pytest.raises(ValidationError):
            validate_proposer_signature(
                state,
                proposed_block,
                CommitteeConfig(config),
            )
Exemplo n.º 6
0
def test_randao_processing(sample_beacon_block_params,
                           sample_beacon_block_body_params,
                           sample_beacon_state_params,
                           keymap,
                           config):
    proposer_pubkey, proposer_privkey = first(keymap.items())
    state = SerenityBeaconState(**sample_beacon_state_params).copy(
        validators=tuple(
            create_mock_validator(proposer_pubkey, config)
            for _ in range(config.TARGET_COMMITTEE_SIZE)
        ),
        balances=(config.MAX_EFFECTIVE_BALANCE,) * config.TARGET_COMMITTEE_SIZE,

        randao_mixes=tuple(
            ZERO_HASH32
            for _ in range(config.EPOCHS_PER_HISTORICAL_VECTOR)
        ),
    )

    epoch = state.current_epoch(config.SLOTS_PER_EPOCH)
    slot = get_epoch_start_slot(epoch, config.SLOTS_PER_EPOCH)

    randao_reveal = _generate_randao_reveal(
        privkey=proposer_privkey,
        slot=slot,
        state=state,
        config=config,
    )

    block_body = BeaconBlockBody(**sample_beacon_block_body_params).copy(
        randao_reveal=randao_reveal,
    )

    block = SerenityBeaconBlock(**sample_beacon_block_params).copy(
        body=block_body,
    )

    new_state = process_randao(state, block, config)

    updated_index = epoch % config.EPOCHS_PER_HISTORICAL_VECTOR
    original_mixes = state.randao_mixes
    updated_mixes = new_state.randao_mixes

    assert all(
        updated == original if index != updated_index else updated != original
        for index, (updated, original) in enumerate(zip(updated_mixes, original_mixes))
    )
Exemplo n.º 7
0
def test_activate_validator(genesis_state, is_already_activated,
                            validator_count, pubkeys, config):
    some_future_epoch = config.GENESIS_EPOCH + random.randrange(1, 2**32)

    if is_already_activated:
        assert validator_count > 0
        some_validator = genesis_state.validators[0]
        assert some_validator.activation_eligibility_epoch == config.GENESIS_EPOCH
        assert some_validator.activation_epoch == config.GENESIS_EPOCH
    else:
        some_validator = create_mock_validator(pubkeys[:validator_count + 1],
                                               config,
                                               is_active=is_already_activated)
        assert some_validator.activation_eligibility_epoch == FAR_FUTURE_EPOCH
        assert some_validator.activation_epoch == FAR_FUTURE_EPOCH
    assert not some_validator.slashed

    activated_validator = activate_validator(some_validator, some_future_epoch)
    assert activated_validator.activation_eligibility_epoch == some_future_epoch
    assert activated_validator.activation_epoch == some_future_epoch
    assert not activated_validator.slashed
def test_validate_proposer_signature(
    slots_per_epoch,
    max_committees_per_slot,
    proposer_privkey,
    proposer_pubkey,
    is_valid_signature,
    sample_beacon_block_params,
    sample_beacon_state_params,
    target_committee_size,
    max_effective_balance,
    config,
):

    state = BeaconState.create(**sample_beacon_state_params).mset(
        "validators",
        tuple(
            create_mock_validator(proposer_pubkey, config) for _ in range(10)),
        "balances",
        (max_effective_balance, ) * 10,
    )

    block = BeaconBlock.create(**sample_beacon_block_params)

    proposed_block = SignedBeaconBlock.create(
        message=block,
        signature=bls.sign(
            message_hash=block.hash_tree_root,
            privkey=proposer_privkey,
            domain=get_domain(state, SignatureDomain.DOMAIN_BEACON_PROPOSER,
                              slots_per_epoch),
        ),
    )

    if is_valid_signature:
        validate_proposer_signature(state, proposed_block,
                                    CommitteeConfig(config))
    else:
        with pytest.raises(ValidationError):
            validate_proposer_signature(state, proposed_block,
                                        CommitteeConfig(config))
Exemplo n.º 9
0
def test_validators_and_balances_length(sample_beacon_state_params, config):
    # When len(BeaconState.validators) != len(BeaconState.validtor_balances)
    with pytest.raises(ValueError):
        BeaconState(**sample_beacon_state_params).copy(validators=tuple(
            create_mock_validator(pubkey, config) for pubkey in range(10)), )