コード例 #1
0
ファイル: deposit_helpers.py プロジェクト: stringray55/py-evm
def process_deposit(*, state: BeaconState, pubkey: BLSPubkey, amount: Gwei,
                    proof_of_possession: BLSSignature,
                    withdrawal_credentials: Hash32, randao_commitment: Hash32,
                    custody_commitment: Hash32) -> BeaconState:
    """
    Process a deposit from Ethereum 1.0.
    """
    validate_proof_of_possession(
        state=state,
        pubkey=pubkey,
        proof_of_possession=proof_of_possession,
        withdrawal_credentials=withdrawal_credentials,
        randao_commitment=randao_commitment,
        custody_commitment=custody_commitment,
    )

    validator_pubkeys = tuple(v.pubkey for v in state.validator_registry)
    if pubkey not in validator_pubkeys:
        validator = ValidatorRecord.create_pending_validator(
            pubkey=pubkey,
            withdrawal_credentials=withdrawal_credentials,
            randao_commitment=randao_commitment,
            custody_commitment=custody_commitment,
        )

        # Note: In phase 2 registry indices that has been withdrawn for a long time
        # will be recycled.
        state = add_pending_validator(
            state,
            validator,
            amount,
        )
    else:
        # Top-up - increase balance by deposit
        index = ValidatorIndex(validator_pubkeys.index(pubkey))
        validator = state.validator_registry[index]

        if validator.withdrawal_credentials != withdrawal_credentials:
            raise ValidationError("`withdrawal_credentials` are incorrect:\n"
                                  "\texpected: %s, found: %s" % (
                                      validator.withdrawal_credentials,
                                      validator.withdrawal_credentials,
                                  ))

        # Update validator's balance and state
        state = state.update_validator_balance(
            validator_index=index,
            balance=state.validator_balances[index] + amount,
        )

    return state
コード例 #2
0
def test_create_pending_validator():
    pubkey = 123
    withdrawal_credentials = b'\x11' * 32
    randao_commitment = b'\x22' * 32
    custody_commitment = b'\x33' * 32

    validator = ValidatorRecord.create_pending_validator(
        pubkey=pubkey,
        withdrawal_credentials=withdrawal_credentials,
        randao_commitment=randao_commitment,
        custody_commitment=custody_commitment,
    )

    assert validator.pubkey == pubkey
    assert validator.withdrawal_credentials == withdrawal_credentials
    assert validator.randao_commitment == randao_commitment
    assert validator.randao_layers == 0
    assert validator.activation_slot == FAR_FUTURE_SLOT
    assert validator.exit_slot == FAR_FUTURE_SLOT
    assert validator.withdrawal_slot == FAR_FUTURE_SLOT
    assert validator.penalized_slot == FAR_FUTURE_SLOT
    assert validator.exit_count == 0