Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
def test_generate_aggregate_pubkeys(genesis_validators,
                                    sample_slashable_vote_data_params, data):
    max_value_for_list = len(genesis_validators) - 1
    (indices, some_index) = _list_and_index(data,
                                            elements=st.integers(
                                                min_value=0,
                                                max_value=max_value_for_list,
                                            ))
    proof_of_custody_0_indices = indices[:some_index]
    proof_of_custody_1_indices = indices[some_index:]

    key = "aggregate_signature_poc_0_indices"
    sample_slashable_vote_data_params[key] = proof_of_custody_0_indices
    key = "aggregate_signature_poc_1_indices"
    sample_slashable_vote_data_params[key] = proof_of_custody_1_indices

    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    keys = generate_aggregate_pubkeys(genesis_validators, votes)
    assert len(keys) == 2

    (poc_0_key, poc_1_key) = keys

    poc_0_keys = get_pubkey_for_indices(genesis_validators,
                                        proof_of_custody_0_indices)
    poc_1_keys = get_pubkey_for_indices(genesis_validators,
                                        proof_of_custody_1_indices)

    assert bls.aggregate_pubkeys(poc_0_keys) == poc_0_key
    assert bls.aggregate_pubkeys(poc_1_keys) == poc_1_key
Ejemplo n.º 3
0
def test_root(sample_slashable_vote_data_params):
    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    # NOTE: see note in `test_hash`, this test will need to be updated
    # once ssz tree hash lands...

    assert votes.root == votes.hash
Ejemplo n.º 4
0
def test_messages(sample_slashable_vote_data_params):
    vote_data = SlashableVoteData(**sample_slashable_vote_data_params)

    assert vote_data.messages == (
        AttestationDataAndCustodyBit(vote_data.data, False).root,
        AttestationDataAndCustodyBit(vote_data.data, True).root,
    )
Ejemplo n.º 5
0
def _run_verify_slashable_vote(params, state, max_casper_votes,
                               should_succeed):
    votes = SlashableVoteData(**params)
    result = verify_slashable_vote_data(state, votes, max_casper_votes)
    if should_succeed:
        assert result
    else:
        assert not result
Ejemplo n.º 6
0
def test_messages(sample_slashable_vote_data_params):
    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    zero_discriminator = (0).to_bytes(1, 'big')
    one_discriminator = (1).to_bytes(1, 'big')

    assert votes.messages == (
        votes.root + zero_discriminator,
        votes.root + one_discriminator,
    )
Ejemplo n.º 7
0
def test_vote_count(sample_slashable_vote_data_params):
    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    key = "aggregate_signature_poc_0_indices"
    proof_of_custody_0_indices = sample_slashable_vote_data_params[key]
    key = "aggregate_signature_poc_1_indices"
    proof_of_custody_1_indices = sample_slashable_vote_data_params[key]

    assert votes.vote_count == len(proof_of_custody_0_indices) + len(
        proof_of_custody_1_indices)
Ejemplo n.º 8
0
def test_defaults(sample_slashable_vote_data_params):
    vote_data = SlashableVoteData(**sample_slashable_vote_data_params)

    assert (vote_data.custody_bit_0_indices ==
            sample_slashable_vote_data_params['custody_bit_0_indices'])
    assert (vote_data.custody_bit_1_indices ==
            sample_slashable_vote_data_params['custody_bit_1_indices'])
    assert vote_data.data == sample_slashable_vote_data_params['data']
    assert vote_data.aggregate_signature == sample_slashable_vote_data_params[
        'aggregate_signature']
Ejemplo n.º 9
0
def test_vote_count(sample_slashable_vote_data_params):
    vote_data = SlashableVoteData(**sample_slashable_vote_data_params)

    key = "custody_bit_0_indices"
    custody_bit_0_indices = sample_slashable_vote_data_params[key]
    key = "custody_bit_1_indices"
    custody_bit_1_indices = sample_slashable_vote_data_params[key]

    assert vote_data.vote_count == len(custody_bit_0_indices) + len(
        custody_bit_1_indices)
Ejemplo n.º 10
0
def test_hash(sample_slashable_vote_data_params):
    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    # NOTE: this hash was simply copied from the existing implementation
    # which should be the keccak-256 of the rlp serialization of `votes`.
    # Given that this value will change soon (cf. ssz tree hash), we just
    # do this to get the test passing for now and will need to update later
    # if we expect the hash computation is not working correctly
    hash_hex = "7e4b4cf3ac47988865d693a29b6aa5a825f27e065cf21a80af5e077ea102e297"

    assert votes.hash == bytes.fromhex(hash_hex)
Ejemplo n.º 11
0
def test_verify_slashable_vote_data_signature(
        privkeys, sample_beacon_state_params, genesis_validators,
        sample_slashable_vote_data_params):
    sample_beacon_state_params["validator_registry"] = genesis_validators
    state = BeaconState(**sample_beacon_state_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(
        sample_slashable_vote_data_params,
        genesis_validators,
        messages,
        privkeys,
    )
    valid_votes = SlashableVoteData(**valid_params)
    assert verify_slashable_vote_data_signature(state, valid_votes)

    invalid_params = _corrupt_signature(valid_params)
    invalid_votes = SlashableVoteData(**invalid_params)
    assert not verify_slashable_vote_data_signature(state, invalid_votes)
Ejemplo n.º 12
0
def test_verify_vote_count(max_casper_votes, sample_slashable_vote_data_params,
                           data):
    (indices, some_index) = _list_and_index(data, max_size=max_casper_votes)
    proof_of_custody_0_indices = indices[:some_index]
    proof_of_custody_1_indices = indices[some_index:]

    key = "aggregate_signature_poc_0_indices"
    sample_slashable_vote_data_params[key] = proof_of_custody_0_indices
    key = "aggregate_signature_poc_1_indices"
    sample_slashable_vote_data_params[key] = proof_of_custody_1_indices

    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    assert verify_vote_count(votes, max_casper_votes)
Ejemplo n.º 13
0
def test_verify_vote_count(max_casper_votes, sample_slashable_vote_data_params,
                           data):
    (indices, some_index) = _list_and_index(data, max_size=max_casper_votes)
    custody_bit_0_indices = indices[:some_index]
    custody_bit_1_indices = indices[some_index:]

    key = "custody_bit_0_indices"
    sample_slashable_vote_data_params[key] = custody_bit_0_indices
    key = "custody_bit_1_indices"
    sample_slashable_vote_data_params[key] = custody_bit_1_indices

    votes = SlashableVoteData(**sample_slashable_vote_data_params)

    assert verify_vote_count(votes, max_casper_votes)
Ejemplo n.º 14
0
def _create_slashable_vote_data_messages(params):
    # TODO update when we move to `ssz` tree hash
    votes = SlashableVoteData(**params)
    return votes.messages
Ejemplo n.º 15
0
def sample_casper_slashing_params(sample_slashable_vote_data_params):
    vote_data = SlashableVoteData(**sample_slashable_vote_data_params)
    return {
        'slashable_vote_data_1': vote_data,
        'slashable_vote_data_2': vote_data,
    }