Merge pull request #1060 from ethereum/JustinDrake-patch-20
Cleanup int_to_bytes
This commit is contained in:
commit
67e733dfac
|
@ -15,16 +15,9 @@ from typing import (
|
||||||
from eth2spec.utils.minimal_ssz import *
|
from eth2spec.utils.minimal_ssz import *
|
||||||
from eth2spec.utils.bls_stub import *
|
from eth2spec.utils.bls_stub import *
|
||||||
|
|
||||||
""")
|
|
||||||
for i in (1, 2, 3, 4, 8, 32, 48, 96):
|
|
||||||
code_lines.append("def int_to_bytes%d(x): return x.to_bytes(%d, 'little')" % (i, i))
|
|
||||||
|
|
||||||
code_lines.append("""
|
|
||||||
|
|
||||||
# stub, will get overwritten by real var
|
# stub, will get overwritten by real var
|
||||||
SLOTS_PER_EPOCH = 64
|
SLOTS_PER_EPOCH = 64
|
||||||
|
|
||||||
|
|
||||||
Slot = NewType('Slot', int) # uint64
|
Slot = NewType('Slot', int) # uint64
|
||||||
Epoch = NewType('Epoch', int) # uint64
|
Epoch = NewType('Epoch', int) # uint64
|
||||||
Shard = NewType('Shard', int) # uint64
|
Shard = NewType('Shard', int) # uint64
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
- [`compute_committee`](#compute_committee)
|
- [`compute_committee`](#compute_committee)
|
||||||
- [`get_crosslink_committee`](#get_crosslink_committee)
|
- [`get_crosslink_committee`](#get_crosslink_committee)
|
||||||
- [`get_attesting_indices`](#get_attesting_indices)
|
- [`get_attesting_indices`](#get_attesting_indices)
|
||||||
- [`int_to_bytes1`, `int_to_bytes2`, ...](#int_to_bytes1-int_to_bytes2-)
|
- [`int_to_bytes`](#int_to_bytes)
|
||||||
- [`bytes_to_int`](#bytes_to_int)
|
- [`bytes_to_int`](#bytes_to_int)
|
||||||
- [`get_total_balance`](#get_total_balance)
|
- [`get_total_balance`](#get_total_balance)
|
||||||
- [`get_domain`](#get_domain)
|
- [`get_domain`](#get_domain)
|
||||||
|
@ -194,8 +194,8 @@ These configurations are updated for releases, but may be out of sync during `de
|
||||||
| `GENESIS_SLOT` | `0` |
|
| `GENESIS_SLOT` | `0` |
|
||||||
| `GENESIS_EPOCH` | `0` |
|
| `GENESIS_EPOCH` | `0` |
|
||||||
| `FAR_FUTURE_EPOCH` | `2**64 - 1` |
|
| `FAR_FUTURE_EPOCH` | `2**64 - 1` |
|
||||||
| `ZERO_HASH` | `int_to_bytes32(0)` |
|
| `ZERO_HASH` | `b'\x00' * 32` |
|
||||||
| `BLS_WITHDRAWAL_PREFIX_BYTE` | `int_to_bytes1(0)` |
|
| `BLS_WITHDRAWAL_PREFIX` | `0` |
|
||||||
|
|
||||||
### Time parameters
|
### Time parameters
|
||||||
|
|
||||||
|
@ -830,7 +830,7 @@ def generate_seed(state: BeaconState,
|
||||||
return hash(
|
return hash(
|
||||||
get_randao_mix(state, epoch + LATEST_RANDAO_MIXES_LENGTH - MIN_SEED_LOOKAHEAD) +
|
get_randao_mix(state, epoch + LATEST_RANDAO_MIXES_LENGTH - MIN_SEED_LOOKAHEAD) +
|
||||||
get_active_index_root(state, epoch) +
|
get_active_index_root(state, epoch) +
|
||||||
int_to_bytes32(epoch)
|
int_to_bytes(epoch, length=32)
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -851,7 +851,7 @@ def get_beacon_proposer_index(state: BeaconState) -> ValidatorIndex:
|
||||||
i = 0
|
i = 0
|
||||||
while True:
|
while True:
|
||||||
candidate_index = first_committee[(epoch + i) % len(first_committee)]
|
candidate_index = first_committee[(epoch + i) % len(first_committee)]
|
||||||
random_byte = hash(seed + int_to_bytes8(i // 32))[i % 32]
|
random_byte = hash(seed + int_to_bytes(i // 32, length=8))[i % 32]
|
||||||
effective_balance = state.validator_registry[candidate_index].effective_balance
|
effective_balance = state.validator_registry[candidate_index].effective_balance
|
||||||
if effective_balance * MAX_RANDOM_BYTE >= MAX_EFFECTIVE_BALANCE * random_byte:
|
if effective_balance * MAX_RANDOM_BYTE >= MAX_EFFECTIVE_BALANCE * random_byte:
|
||||||
return candidate_index
|
return candidate_index
|
||||||
|
@ -888,10 +888,10 @@ def get_shuffled_index(index: ValidatorIndex, index_count: int, seed: Bytes32) -
|
||||||
# Swap or not (https://link.springer.com/content/pdf/10.1007%2F978-3-642-32009-5_1.pdf)
|
# Swap or not (https://link.springer.com/content/pdf/10.1007%2F978-3-642-32009-5_1.pdf)
|
||||||
# See the 'generalized domain' algorithm on page 3
|
# See the 'generalized domain' algorithm on page 3
|
||||||
for round in range(SHUFFLE_ROUND_COUNT):
|
for round in range(SHUFFLE_ROUND_COUNT):
|
||||||
pivot = bytes_to_int(hash(seed + int_to_bytes1(round))[0:8]) % index_count
|
pivot = bytes_to_int(hash(seed + int_to_bytes(round, length=1))[0:8]) % index_count
|
||||||
flip = (pivot - index) % index_count
|
flip = (pivot - index) % index_count
|
||||||
position = max(index, flip)
|
position = max(index, flip)
|
||||||
source = hash(seed + int_to_bytes1(round) + int_to_bytes4(position // 256))
|
source = hash(seed + int_to_bytes(round, length=1) + int_to_bytes(position // 256, length=4))
|
||||||
byte = source[(position % 256) // 8]
|
byte = source[(position % 256) // 8]
|
||||||
bit = (byte >> (position % 8)) % 2
|
bit = (byte >> (position % 8)) % 2
|
||||||
index = flip if bit else index
|
index = flip if bit else index
|
||||||
|
@ -934,9 +934,12 @@ def get_attesting_indices(state: BeaconState,
|
||||||
return sorted([index for i, index in enumerate(committee) if get_bitfield_bit(bitfield, i) == 0b1])
|
return sorted([index for i, index in enumerate(committee) if get_bitfield_bit(bitfield, i) == 0b1])
|
||||||
```
|
```
|
||||||
|
|
||||||
### `int_to_bytes1`, `int_to_bytes2`, ...
|
### `int_to_bytes`
|
||||||
|
|
||||||
`int_to_bytes1(x): return x.to_bytes(1, 'little')`, `int_to_bytes2(x): return x.to_bytes(2, 'little')`, and so on for all integers, particularly 1, 2, 3, 4, 8, 32, 48, 96.
|
```python
|
||||||
|
def int_to_bytes(integer: int, length: int) -> bytes:
|
||||||
|
return integer.to_bytes(length, 'little')
|
||||||
|
```
|
||||||
|
|
||||||
### `bytes_to_int`
|
### `bytes_to_int`
|
||||||
|
|
||||||
|
@ -966,7 +969,7 @@ def get_domain(state: BeaconState,
|
||||||
"""
|
"""
|
||||||
epoch = get_current_epoch(state) if message_epoch is None else message_epoch
|
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 = state.fork.previous_version if epoch < state.fork.epoch else state.fork.current_version
|
||||||
return bytes_to_int(fork_version + int_to_bytes4(domain_type))
|
return bytes_to_int(fork_version + int_to_bytes(domain_type, length=4))
|
||||||
```
|
```
|
||||||
|
|
||||||
### `get_bitfield_bit`
|
### `get_bitfield_bit`
|
||||||
|
@ -1837,7 +1840,7 @@ def process_transfer(state: BeaconState, transfer: Transfer) -> None:
|
||||||
# Verify that the pubkey is valid
|
# Verify that the pubkey is valid
|
||||||
assert (
|
assert (
|
||||||
state.validator_registry[transfer.sender].withdrawal_credentials ==
|
state.validator_registry[transfer.sender].withdrawal_credentials ==
|
||||||
BLS_WITHDRAWAL_PREFIX_BYTE + hash(transfer.pubkey)[1:]
|
int_to_bytes(BLS_WITHDRAWAL_PREFIX, length=1) + hash(transfer.pubkey)[1:]
|
||||||
)
|
)
|
||||||
# Verify that the signature is valid
|
# Verify that the signature is valid
|
||||||
assert bls_verify(transfer.pubkey, signing_root(transfer), transfer.signature, get_domain(state, DOMAIN_TRANSFER))
|
assert bls_verify(transfer.pubkey, signing_root(transfer), transfer.signature, get_domain(state, DOMAIN_TRANSFER))
|
||||||
|
|
|
@ -180,7 +180,7 @@ def get_shard_proposer_index(state: BeaconState,
|
||||||
slot: Slot) -> ValidatorIndex:
|
slot: Slot) -> ValidatorIndex:
|
||||||
# Randomly shift persistent committee
|
# Randomly shift persistent committee
|
||||||
persistent_committee = get_persistent_committee(state, shard, slot)
|
persistent_committee = get_persistent_committee(state, shard, slot)
|
||||||
seed = hash(state.current_shuffling_seed + int_to_bytes8(shard) + int_to_bytes8(slot))
|
seed = hash(state.current_shuffling_seed + int_to_bytes(shard, length=8) + int_to_bytes(slot, length=8))
|
||||||
random_index = bytes_to_int(seed[0:8]) % len(persistent_committee)
|
random_index = bytes_to_int(seed[0:8]) % len(persistent_committee)
|
||||||
persistent_committee = persistent_committee[random_index:] + persistent_committee[:random_index]
|
persistent_committee = persistent_committee[random_index:] + persistent_committee[:random_index]
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,7 @@ def compute_committee(header: BeaconBlockHeader,
|
||||||
]
|
]
|
||||||
def get_switchover_epoch(index):
|
def get_switchover_epoch(index):
|
||||||
return (
|
return (
|
||||||
bytes_to_int(hash(validator_memory.earlier_period_data.seed + int_to_bytes3(index))[0:8]) %
|
bytes_to_int(hash(validator_memory.earlier_period_data.seed + int_to_bytes(index, length=3))[0:8]) %
|
||||||
PERSISTENT_COMMITTEE_PERIOD
|
PERSISTENT_COMMITTEE_PERIOD
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ def shuffling_case(seed: spec.Bytes32, count: int):
|
||||||
|
|
||||||
@to_tuple
|
@to_tuple
|
||||||
def shuffling_test_cases():
|
def shuffling_test_cases():
|
||||||
for seed in [spec.hash(spec.int_to_bytes4(seed_init_value)) for seed_init_value in range(30)]:
|
for seed in [spec.hash(spec.int_to_bytes(seed_init_value, length=4)) for seed_init_value in range(30)]:
|
||||||
for count in [0, 1, 2, 3, 5, 10, 33, 100, 1000]:
|
for count in [0, 1, 2, 3, 5, 10, 33, 100, 1000]:
|
||||||
yield shuffling_case(seed, count)
|
yield shuffling_case(seed, count)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue