Merge pull request #228 from ethereum/fix-validator-states
Fix deposit logic
This commit is contained in:
commit
b40a7c5ad6
|
@ -192,7 +192,7 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
|
||||||
| - | - |
|
| - | - |
|
||||||
| `PENDING_ACTIVATION` | `0` |
|
| `PENDING_ACTIVATION` | `0` |
|
||||||
| `ACTIVE` | `1` |
|
| `ACTIVE` | `1` |
|
||||||
| `PENDING_EXIT` | `2` |
|
| `ACTIVE_PENDING_EXIT` | `2` |
|
||||||
| `EXITED_WITHOUT_PENALTY` | `3` |
|
| `EXITED_WITHOUT_PENALTY` | `3` |
|
||||||
| `EXITED_WITH_PENALTY` | `4` |
|
| `EXITED_WITH_PENALTY` | `4` |
|
||||||
|
|
||||||
|
@ -582,29 +582,33 @@ CHAIN_START_FULL_DEPOSIT_THRESHOLD: constant(uint256) = 16384 # 2**14
|
||||||
DEPOSIT_CONTRACT_TREE_DEPTH: constant(uint256) = 32
|
DEPOSIT_CONTRACT_TREE_DEPTH: constant(uint256) = 32
|
||||||
SECONDS_PER_DAY: constant(uint256) = 86400
|
SECONDS_PER_DAY: constant(uint256) = 86400
|
||||||
|
|
||||||
Deposit: event({previous_receipt_root: bytes32, data: bytes[2064], full_deposit_count: uint256})
|
Deposit: event({previous_receipt_root: bytes32, data: bytes[2064], deposit_count: uint256})
|
||||||
ChainStart: event({receipt_root: bytes32, time: bytes[8]})
|
ChainStart: event({receipt_root: bytes32, time: bytes[8]})
|
||||||
|
|
||||||
receipt_tree: bytes32[uint256]
|
receipt_tree: bytes32[uint256]
|
||||||
|
deposit_count: uint256
|
||||||
full_deposit_count: uint256
|
full_deposit_count: uint256
|
||||||
|
|
||||||
@payable
|
@payable
|
||||||
@public
|
@public
|
||||||
def deposit(deposit_parameters: bytes[2048]):
|
def deposit(deposit_parameters: bytes[2048]):
|
||||||
index: uint256 = self.full_deposit_count + 2**DEPOSIT_CONTRACT_TREE_DEPTH
|
assert msg.value >= as_wei_value(MIN_DEPOSIT, "ether")
|
||||||
|
assert msg.value <= as_wei_value(MAX_DEPOSIT, "ether")
|
||||||
|
|
||||||
|
index: uint256 = self.deposit_count + 2**DEPOSIT_CONTRACT_TREE_DEPTH
|
||||||
msg_gwei_bytes8: bytes[8] = slice(concat("", convert(msg.value / GWEI_PER_ETH, bytes32)), start=24, len=8)
|
msg_gwei_bytes8: bytes[8] = slice(concat("", convert(msg.value / GWEI_PER_ETH, bytes32)), start=24, len=8)
|
||||||
timestamp_bytes8: bytes[8] = slice(concat("", convert(block.timestamp, bytes32)), start=24, len=8)
|
timestamp_bytes8: bytes[8] = slice(concat("", convert(block.timestamp, bytes32)), start=24, len=8)
|
||||||
deposit_data: bytes[2064] = concat(msg_gwei_bytes8, timestamp_bytes8, deposit_parameters)
|
deposit_data: bytes[2064] = concat(msg_gwei_bytes8, timestamp_bytes8, deposit_parameters)
|
||||||
|
|
||||||
log.Deposit(self.receipt_tree[1], deposit_data, self.full_deposit_count)
|
log.Deposit(self.receipt_tree[1], deposit_data, self.deposit_count)
|
||||||
|
|
||||||
|
# add deposit to merkle tree
|
||||||
self.receipt_tree[index] = sha3(deposit_data)
|
self.receipt_tree[index] = sha3(deposit_data)
|
||||||
for i in range(32): # DEPOSIT_CONTRACT_TREE_DEPTH (range of constant var not yet supported)
|
for i in range(32): # DEPOSIT_CONTRACT_TREE_DEPTH (range of constant var not yet supported)
|
||||||
index /= 2
|
index /= 2
|
||||||
self.receipt_tree[index] = sha3(concat(self.receipt_tree[index * 2], self.receipt_tree[index * 2 + 1]))
|
self.receipt_tree[index] = sha3(concat(self.receipt_tree[index * 2], self.receipt_tree[index * 2 + 1]))
|
||||||
|
|
||||||
assert msg.value >= as_wei_value(MIN_DEPOSIT, "ether")
|
self.deposit_count += 1
|
||||||
assert msg.value <= as_wei_value(MAX_DEPOSIT, "ether")
|
|
||||||
if msg.value == as_wei_value(MAX_DEPOSIT, "ether"):
|
if msg.value == as_wei_value(MAX_DEPOSIT, "ether"):
|
||||||
self.full_deposit_count += 1
|
self.full_deposit_count += 1
|
||||||
if self.full_deposit_count == CHAIN_START_FULL_DEPOSIT_THRESHOLD:
|
if self.full_deposit_count == CHAIN_START_FULL_DEPOSIT_THRESHOLD:
|
||||||
|
@ -690,7 +694,7 @@ def get_active_validator_indices(validators: [ValidatorRecord]) -> List[int]:
|
||||||
"""
|
"""
|
||||||
Gets indices of active validators from ``validators``.
|
Gets indices of active validators from ``validators``.
|
||||||
"""
|
"""
|
||||||
return [i for i, v in enumerate(validators) if v.status in [ACTIVE, PENDING_EXIT]]
|
return [i for i, v in enumerate(validators) if v.status in [ACTIVE, ACTIVE_PENDING_EXIT]]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `shuffle`
|
#### `shuffle`
|
||||||
|
@ -1161,7 +1165,7 @@ def exit_validator(index: int,
|
||||||
whistleblower.balance += whistleblower_reward
|
whistleblower.balance += whistleblower_reward
|
||||||
validator.balance -= whistleblower_reward
|
validator.balance -= whistleblower_reward
|
||||||
else:
|
else:
|
||||||
validator.status = PENDING_EXIT
|
validator.status = ACTIVE_PENDING_EXIT
|
||||||
|
|
||||||
state.validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
state.validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
||||||
validator_registry_delta_chain_tip=state.validator_registry_delta_chain_tip,
|
validator_registry_delta_chain_tip=state.validator_registry_delta_chain_tip,
|
||||||
|
@ -1452,8 +1456,9 @@ def get_changed_validators(validators: List[ValidatorRecord],
|
||||||
# Go through the list start to end, depositing and withdrawing as many as possible
|
# Go through the list start to end, depositing and withdrawing as many as possible
|
||||||
total_changed = 0
|
total_changed = 0
|
||||||
for i in range(len(validators)):
|
for i in range(len(validators)):
|
||||||
if validators[i].status == PENDING_ACTIVATION:
|
if validators[i].status == PENDING_ACTIVATION and validators[i].balance >= MAX_DEPOSIT:
|
||||||
validators[i].status = ACTIVE
|
validators[i].status = ACTIVE
|
||||||
|
validators[i].latest_status_change_slot = current_slot
|
||||||
total_changed += get_effective_balance(validators[i])
|
total_changed += get_effective_balance(validators[i])
|
||||||
validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
||||||
validator_registry_delta_chain_tip=validator_registry_delta_chain_tip,
|
validator_registry_delta_chain_tip=validator_registry_delta_chain_tip,
|
||||||
|
@ -1461,7 +1466,8 @@ def get_changed_validators(validators: List[ValidatorRecord],
|
||||||
pubkey=validators[i].pubkey,
|
pubkey=validators[i].pubkey,
|
||||||
flag=ACTIVATION,
|
flag=ACTIVATION,
|
||||||
)
|
)
|
||||||
if validators[i].status == EXITED_WITHOUT_PENALTY:
|
if validators[i].status == ACTIVE_PENDING_EXIT:
|
||||||
|
validators[i].status = EXITED_WITHOUT_PENALTY
|
||||||
validators[i].latest_status_change_slot = current_slot
|
validators[i].latest_status_change_slot = current_slot
|
||||||
total_changed += get_effective_balance(validators[i])
|
total_changed += get_effective_balance(validators[i])
|
||||||
validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
validator_registry_delta_chain_tip = get_new_validator_registry_delta_chain_tip(
|
||||||
|
|
Loading…
Reference in New Issue