Skip to content

Commit

Permalink
Merge pull request #3769 from ethDreamer/fix_compute_proposer_index
Browse files Browse the repository at this point in the history
Electra: Properly Calculate Proposer Probabilities
  • Loading branch information
hwwhww committed May 28, 2024
2 parents 836bc43 + 32b441d commit 071f0a3
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions specs/electra/beacon-chain.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
- [`BeaconState`](#beaconstate)
- [Helper functions](#helper-functions)
- [Predicates](#predicates)
- [Updated `compute_proposer_index`](#updated-compute_proposer_index)
- [Updated `is_eligible_for_activation_queue`](#updated-is_eligible_for_activation_queue)
- [New `is_compounding_withdrawal_credential`](#new-is_compounding_withdrawal_credential)
- [New `has_compounding_withdrawal_credential`](#new-has_compounding_withdrawal_credential)
Expand Down Expand Up @@ -438,6 +439,27 @@ class BeaconState(Container):

### Predicates

#### Updated `compute_proposer_index`

```python
def compute_proposer_index(state: BeaconState, indices: Sequence[ValidatorIndex], seed: Bytes32) -> ValidatorIndex:
"""
Return from ``indices`` a random index sampled by effective balance.
"""
assert len(indices) > 0
MAX_RANDOM_BYTE = 2**8 - 1
i = uint64(0)
total = uint64(len(indices))
while True:
candidate_index = indices[compute_shuffled_index(i % total, total, seed)]
random_byte = hash(seed + uint_to_bytes(uint64(i // 32)))[i % 32]
effective_balance = state.validators[candidate_index].effective_balance
# [Modified in Electra:EIP7251]
if effective_balance * MAX_RANDOM_BYTE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_byte:
return candidate_index
i += 1
```

#### Updated `is_eligible_for_activation_queue`

```python
Expand Down

0 comments on commit 071f0a3

Please sign in to comment.