utilize bls_domain directly for deposits

This commit is contained in:
Danny Ryan 2019-05-21 11:30:38 -06:00
parent 7a9097ec23
commit 847fcf52cc
No known key found for this signature in database
GPG Key ID: 2765A792E42CE07A
3 changed files with 20 additions and 7 deletions

View File

@ -174,6 +174,7 @@ These configurations are updated for releases, but may be out of sync during `de
| Name | Value |
| - | - |
| `DEPOSIT_CONTRACT_TREE_DEPTH` | `2**5` (= 32) |
| `DEPOSIT_FORK_VERSION` | `b'\x00' * 4` |
### Gwei values
@ -629,6 +630,16 @@ The `hash` function is SHA256.
`def signing_root(object: SSZContainer) -> Bytes32` is a function defined in the [SimpleSerialize spec](../simple-serialize.md#self-signed-containers) to compute signing messages.
### `bls_domain`
```python
def bls_domain(domain_type: int, fork_version: bytes) -> int:
"""
Return the bls domain given by the ``domain_type`` and 4 byte ``fork_version``..
"""
return bytes_to_int(int_to_bytes(domain_type, length=4) + fork_version)
```
### `slot_to_epoch`
```python
@ -968,8 +979,7 @@ def get_domain(state: BeaconState,
"""
epoch = get_current_epoch(state) if message_epoch is None else message_epoch
fork_version = state.fork.previous_version if epoch < state.fork.epoch else state.fork.current_version
# fork version is on the big-endian side: when signing using only the type (e.g. deposits), the type can be passed directly.
return bytes_to_int(int_to_bytes(domain_type, length=4) + fork_version)
return bls_domain(domain_type, fork_version)
```
### `get_bitfield_bit`
@ -1766,8 +1776,10 @@ def process_deposit(state: BeaconState, deposit: Deposit) -> None:
validator_pubkeys = [v.pubkey for v in state.validator_registry]
if pubkey not in validator_pubkeys:
# Verify the deposit signature (proof of possession)
# Note: deposits are valid regardless of fork version, hence the type is passed directly as domain.
if not bls_verify(pubkey, signing_root(deposit.data), deposit.data.signature, DOMAIN_DEPOSIT):
# Note: deposits are valid across forks, hence the deposit domain is retrieved directly from `bls_domain`
if not bls_verify(
pubkey, signing_root(deposit.data), deposit.data.signature, bls_domain(DOMAIN_DEPOSIT, DEPOSIT_FORK_VERSION)
):
return
# Add validator and balance entries

View File

@ -98,7 +98,7 @@ To submit a deposit:
* Pack the validator's [initialization parameters](#initialization) into `deposit_data`, a [`DepositData`](../core/0_beacon-chain.md#depositdata) SSZ object.
* Let `amount` be the amount in Gwei to be deposited by the validator where `MIN_DEPOSIT_AMOUNT <= amount <= MAX_EFFECTIVE_BALANCE`.
* Set `deposit_data.amount = amount`.
* Let `signature` be the result of `bls_sign` of the `signing_root(deposit_data)` with `domain=DOMAIN_DEPOSIT`. (Deposits are valid regardless of fork version, hence the type is passed directly as domain.)
* Let `signature` be the result of `bls_sign` of the `signing_root(deposit_data)` with `domain=bls_domain(DOMAIN_DEPOSIT, DEPOSIT_FORK_VERSION)`. (Deposits are valid regardless of fork version, hence the static fork version being directly passed into `bls_domain`).
* Send a transaction on the Ethereum 1.0 chain to `DEPOSIT_CONTRACT_ADDRESS` executing `def deposit(pubkey: bytes[48], withdrawal_credentials: bytes[32], signature: bytes[96])` along with a deposit of `amount` Gwei.
*Note*: Deposits made for the same `pubkey` are treated as for the same validator. A singular `Validator` will be added to `state.validator_registry` with each additional deposit amount added to the validator's balance. A validator can only be activated when total deposits for the validator pubkey meet or exceed `MAX_EFFECTIVE_BALANCE`.

View File

@ -24,6 +24,7 @@ from eth2spec.phase0.spec import (
VoluntaryExit,
# functions
convert_to_indexed,
bls_domain,
get_active_validator_indices,
get_attesting_indices,
get_block_root,
@ -144,9 +145,9 @@ def build_deposit_data(state, pubkey, privkey, amount):
signature = bls.sign(
message_hash=signing_root(deposit_data),
privkey=privkey,
domain=get_domain(
state,
domain=bls_domain(
spec.DOMAIN_DEPOSIT,
spec.DEPOSIT_FORK_VERSION,
)
)
deposit_data.signature = signature