Merge pull request #1812 from ethereum/no_signature
Handle phase 1 `PKs == []` cases
This commit is contained in:
commit
689a6955b0
|
@ -156,6 +156,8 @@ DOMAIN_SHARD_PROPOSAL: 0x80000000
|
||||||
DOMAIN_SHARD_COMMITTEE: 0x81000000
|
DOMAIN_SHARD_COMMITTEE: 0x81000000
|
||||||
DOMAIN_LIGHT_CLIENT: 0x82000000
|
DOMAIN_LIGHT_CLIENT: 0x82000000
|
||||||
DOMAIN_CUSTODY_BIT_SLASHING: 0x83000000
|
DOMAIN_CUSTODY_BIT_SLASHING: 0x83000000
|
||||||
|
# Constant
|
||||||
|
NO_SIGNATURE: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
|
||||||
|
|
||||||
# Phase 1: Upgrade from Phase 0
|
# Phase 1: Upgrade from Phase 0
|
||||||
|
|
|
@ -156,6 +156,8 @@ DOMAIN_SHARD_PROPOSAL: 0x80000000
|
||||||
DOMAIN_SHARD_COMMITTEE: 0x81000000
|
DOMAIN_SHARD_COMMITTEE: 0x81000000
|
||||||
DOMAIN_LIGHT_CLIENT: 0x82000000
|
DOMAIN_LIGHT_CLIENT: 0x82000000
|
||||||
DOMAIN_CUSTODY_BIT_SLASHING: 0x83000000
|
DOMAIN_CUSTODY_BIT_SLASHING: 0x83000000
|
||||||
|
# Constant
|
||||||
|
NO_SIGNATURE: 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
|
||||||
|
|
||||||
# Phase 1: Upgrade from Phase 0
|
# Phase 1: Upgrade from Phase 0
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
- [Updated `is_valid_indexed_attestation`](#updated-is_valid_indexed_attestation)
|
- [Updated `is_valid_indexed_attestation`](#updated-is_valid_indexed_attestation)
|
||||||
- [`is_shard_attestation`](#is_shard_attestation)
|
- [`is_shard_attestation`](#is_shard_attestation)
|
||||||
- [`is_winning_attestation`](#is_winning_attestation)
|
- [`is_winning_attestation`](#is_winning_attestation)
|
||||||
|
- [`optional_aggregate_verify`](#optional_aggregate_verify)
|
||||||
|
- [`optional_fast_aggregate_verify`](#optional_fast_aggregate_verify)
|
||||||
- [Block processing](#block-processing)
|
- [Block processing](#block-processing)
|
||||||
- [Operations](#operations)
|
- [Operations](#operations)
|
||||||
- [New Attestation processing](#new-attestation-processing)
|
- [New Attestation processing](#new-attestation-processing)
|
||||||
|
@ -110,6 +112,7 @@ Configuration is not namespaced. Instead it is strictly an extension;
|
||||||
| `DOMAIN_SHARD_PROPOSAL` | `DomainType('0x80000000')` | |
|
| `DOMAIN_SHARD_PROPOSAL` | `DomainType('0x80000000')` | |
|
||||||
| `DOMAIN_SHARD_COMMITTEE` | `DomainType('0x81000000')` | |
|
| `DOMAIN_SHARD_COMMITTEE` | `DomainType('0x81000000')` | |
|
||||||
| `DOMAIN_LIGHT_CLIENT` | `DomainType('0x82000000')` | |
|
| `DOMAIN_LIGHT_CLIENT` | `DomainType('0x82000000')` | |
|
||||||
|
| `NO_SIGNATURE` | `BLSSignature(b'\x00' * 96)` | |
|
||||||
|
|
||||||
## Updated containers
|
## Updated containers
|
||||||
|
|
||||||
|
@ -633,6 +636,36 @@ def is_winning_attestation(state: BeaconState,
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### `optional_aggregate_verify`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def optional_aggregate_verify(pubkeys: Sequence[BLSPubkey],
|
||||||
|
messages: Sequence[Bytes32],
|
||||||
|
signature: BLSSignature) -> bool:
|
||||||
|
"""
|
||||||
|
If ``pubkeys`` is an empty list, the given ``signature`` should be a stub ``NO_SIGNATURE``.
|
||||||
|
Otherwise, verify it with standard BLS AggregateVerify API.
|
||||||
|
"""
|
||||||
|
if len(pubkeys) == 0:
|
||||||
|
return signature == NO_SIGNATURE
|
||||||
|
else:
|
||||||
|
return bls.AggregateVerify(pubkeys, messages, signature)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `optional_fast_aggregate_verify`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def optional_fast_aggregate_verify(pubkeys: Sequence[BLSPubkey], message: Bytes32, signature: BLSSignature) -> bool:
|
||||||
|
"""
|
||||||
|
If ``pubkeys`` is an empty list, the given ``signature`` should be a stub ``NO_SIGNATURE``.
|
||||||
|
Otherwise, verify it with standard BLS FastAggregateVerify API.
|
||||||
|
"""
|
||||||
|
if len(pubkeys) == 0:
|
||||||
|
return signature == NO_SIGNATURE
|
||||||
|
else:
|
||||||
|
return bls.FastAggregateVerify(pubkeys, message, signature)
|
||||||
|
```
|
||||||
|
|
||||||
### Block processing
|
### Block processing
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
@ -764,7 +797,7 @@ def apply_shard_transition(state: BeaconState, shard: Shard, transition: ShardTr
|
||||||
for header in headers
|
for header in headers
|
||||||
]
|
]
|
||||||
# Verify combined proposer signature
|
# Verify combined proposer signature
|
||||||
assert bls.AggregateVerify(pubkeys, signing_roots, signature=transition.proposer_signature_aggregate)
|
assert optional_aggregate_verify(pubkeys, signing_roots, transition.proposer_signature_aggregate)
|
||||||
|
|
||||||
# Save updated state
|
# Save updated state
|
||||||
state.shard_states[shard] = transition.shard_states[len(transition.shard_states) - 1]
|
state.shard_states[shard] = transition.shard_states[len(transition.shard_states) - 1]
|
||||||
|
@ -942,12 +975,7 @@ def process_light_client_signatures(state: BeaconState, block_body: BeaconBlockB
|
||||||
slot = compute_previous_slot(state.slot)
|
slot = compute_previous_slot(state.slot)
|
||||||
signing_root = compute_signing_root(get_block_root_at_slot(state, slot),
|
signing_root = compute_signing_root(get_block_root_at_slot(state, slot),
|
||||||
get_domain(state, DOMAIN_LIGHT_CLIENT, compute_epoch_at_slot(slot)))
|
get_domain(state, DOMAIN_LIGHT_CLIENT, compute_epoch_at_slot(slot)))
|
||||||
if len(signer_pubkeys) == 0:
|
assert optional_fast_aggregate_verify(signer_pubkeys, signing_root, block_body.light_client_signature)
|
||||||
# TODO: handle the empty light_client_signature case?
|
|
||||||
assert block_body.light_client_signature == BLSSignature()
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
assert bls.FastAggregateVerify(signer_pubkeys, signing_root, signature=block_body.light_client_signature)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Epoch transition
|
### Epoch transition
|
||||||
|
|
|
@ -277,13 +277,13 @@ def get_shard_transition(beacon_state: BeaconState,
|
||||||
proposer_signatures = []
|
proposer_signatures = []
|
||||||
for proposal in proposals:
|
for proposal in proposals:
|
||||||
shard_block_lengths.append(len(proposal.message.body))
|
shard_block_lengths.append(len(proposal.message.body))
|
||||||
if proposal.signature != BLSSignature():
|
if proposal.signature != NO_SIGNATURE:
|
||||||
proposer_signatures.append(proposal.signature)
|
proposer_signatures.append(proposal.signature)
|
||||||
|
|
||||||
if len(proposer_signatures) > 0:
|
if len(proposer_signatures) > 0:
|
||||||
proposer_signature_aggregate = bls.Aggregate(proposer_signatures)
|
proposer_signature_aggregate = bls.Aggregate(proposer_signatures)
|
||||||
else:
|
else:
|
||||||
proposer_signature_aggregate = BLSSignature()
|
proposer_signature_aggregate = NO_SIGNATURE
|
||||||
|
|
||||||
return ShardTransition(
|
return ShardTransition(
|
||||||
start_slot=start_slot,
|
start_slot=start_slot,
|
||||||
|
|
Loading…
Reference in New Issue