type BLS domain and domain type
This commit is contained in:
parent
3d2eaa22cb
commit
e53063c08d
|
@ -117,9 +117,9 @@ MAX_TRANSFERS: 0
|
||||||
|
|
||||||
# Signature domains
|
# Signature domains
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
DOMAIN_BEACON_PROPOSER: 0
|
DOMAIN_BEACON_PROPOSER: 0x00000000
|
||||||
DOMAIN_RANDAO: 1
|
DOMAIN_RANDAO: 0x01000000
|
||||||
DOMAIN_ATTESTATION: 2
|
DOMAIN_ATTESTATION: 0x02000000
|
||||||
DOMAIN_DEPOSIT: 3
|
DOMAIN_DEPOSIT: 0x03000000
|
||||||
DOMAIN_VOLUNTARY_EXIT: 4
|
DOMAIN_VOLUNTARY_EXIT: 0x04000000
|
||||||
DOMAIN_TRANSFER: 5
|
DOMAIN_TRANSFER: 0x05000000
|
||||||
|
|
|
@ -118,9 +118,9 @@ MAX_TRANSFERS: 0
|
||||||
|
|
||||||
# Signature domains
|
# Signature domains
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
DOMAIN_BEACON_PROPOSER: 0
|
DOMAIN_BEACON_PROPOSER: 0x00000000
|
||||||
DOMAIN_RANDAO: 1
|
DOMAIN_RANDAO: 0x01000000
|
||||||
DOMAIN_ATTESTATION: 2
|
DOMAIN_ATTESTATION: 0x02000000
|
||||||
DOMAIN_DEPOSIT: 3
|
DOMAIN_DEPOSIT: 0x03000000
|
||||||
DOMAIN_VOLUNTARY_EXIT: 4
|
DOMAIN_VOLUNTARY_EXIT: 0x04000000
|
||||||
DOMAIN_TRANSFER: 5
|
DOMAIN_TRANSFER: 0x05000000
|
|
@ -25,7 +25,7 @@ from eth2spec.utils.ssz.ssz_impl import (
|
||||||
)
|
)
|
||||||
from eth2spec.utils.ssz.ssz_typing import (
|
from eth2spec.utils.ssz.ssz_typing import (
|
||||||
bit, boolean, Container, List, Vector, uint64,
|
bit, boolean, Container, List, Vector, uint64,
|
||||||
Bytes4, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
Bytes4, Bytes8, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
||||||
)
|
)
|
||||||
from eth2spec.utils.bls import (
|
from eth2spec.utils.bls import (
|
||||||
bls_aggregate_pubkeys,
|
bls_aggregate_pubkeys,
|
||||||
|
@ -52,7 +52,7 @@ from eth2spec.utils.ssz.ssz_impl import (
|
||||||
)
|
)
|
||||||
from eth2spec.utils.ssz.ssz_typing import (
|
from eth2spec.utils.ssz.ssz_typing import (
|
||||||
bit, boolean, Container, List, Vector, Bytes, uint64,
|
bit, boolean, Container, List, Vector, Bytes, uint64,
|
||||||
Bytes4, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
Bytes4, Bytes8, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
||||||
)
|
)
|
||||||
from eth2spec.utils.bls import (
|
from eth2spec.utils.bls import (
|
||||||
bls_aggregate_pubkeys,
|
bls_aggregate_pubkeys,
|
||||||
|
@ -94,7 +94,10 @@ def compute_committee(indices: Sequence[ValidatorIndex], # type: ignore
|
||||||
def apply_constants_preset(preset: Dict[str, Any]) -> None:
|
def apply_constants_preset(preset: Dict[str, Any]) -> None:
|
||||||
global_vars = globals()
|
global_vars = globals()
|
||||||
for k, v in preset.items():
|
for k, v in preset.items():
|
||||||
global_vars[k] = v
|
if k.startswith('DOMAIN_'):
|
||||||
|
global_vars[k] = DomainType(v) # domain types are defined as bytes in the configs
|
||||||
|
else:
|
||||||
|
global_vars[k] = v
|
||||||
|
|
||||||
# Deal with derived constants
|
# Deal with derived constants
|
||||||
global_vars['GENESIS_EPOCH'] = slot_to_epoch(GENESIS_SLOT)
|
global_vars['GENESIS_EPOCH'] = slot_to_epoch(GENESIS_SLOT)
|
||||||
|
@ -135,6 +138,9 @@ def objects_to_spec(functions: Dict[str, str],
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
functions_spec = '\n\n'.join(functions.values())
|
functions_spec = '\n\n'.join(functions.values())
|
||||||
|
for k in list(constants.keys()):
|
||||||
|
if k.startswith('DOMAIN_'):
|
||||||
|
constants[k] = f"DomainType(({constants[k]}).to_bytes(length=4, byteorder='little'))"
|
||||||
constants_spec = '\n'.join(map(lambda x: '%s = %s' % (x, constants[x]), constants))
|
constants_spec = '\n'.join(map(lambda x: '%s = %s' % (x, constants[x]), constants))
|
||||||
ssz_objects_instantiation_spec = '\n\n'.join(ssz_objects.values())
|
ssz_objects_instantiation_spec = '\n\n'.join(ssz_objects.values())
|
||||||
ssz_objects_reinitialization_spec = (
|
ssz_objects_reinitialization_spec = (
|
||||||
|
|
|
@ -71,10 +71,10 @@ We require:
|
||||||
G2_cofactor = 305502333931268344200999753193121504214466019254188142667664032982267604182971884026507427359259977847832272839041616661285803823378372096355777062779109
|
G2_cofactor = 305502333931268344200999753193121504214466019254188142667664032982267604182971884026507427359259977847832272839041616661285803823378372096355777062779109
|
||||||
q = 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787
|
q = 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787
|
||||||
|
|
||||||
def hash_to_G2(message_hash: Bytes32, domain: uint64) -> Tuple[uint384, uint384]:
|
def hash_to_G2(message_hash: Bytes32, domain: Bytes8) -> Tuple[uint384, uint384]:
|
||||||
# Initial candidate x coordinate
|
# Initial candidate x coordinate
|
||||||
x_re = int.from_bytes(hash(message_hash + bytes8(domain) + b'\x01'), 'big')
|
x_re = int.from_bytes(hash(message_hash + domain + b'\x01'), 'big')
|
||||||
x_im = int.from_bytes(hash(message_hash + bytes8(domain) + b'\x02'), 'big')
|
x_im = int.from_bytes(hash(message_hash + domain + b'\x02'), 'big')
|
||||||
x_coordinate = Fq2([x_re, x_im]) # x = x_re + i * x_im
|
x_coordinate = Fq2([x_re, x_im]) # x = x_re + i * x_im
|
||||||
|
|
||||||
# Test candidate y coordinates until a one is found
|
# Test candidate y coordinates until a one is found
|
||||||
|
@ -130,7 +130,7 @@ g = Fq2([g_x, g_y])
|
||||||
|
|
||||||
### `bls_verify`
|
### `bls_verify`
|
||||||
|
|
||||||
Let `bls_verify(pubkey: Bytes48, message_hash: Bytes32, signature: Bytes96, domain: uint64) -> bool`:
|
Let `bls_verify(pubkey: Bytes48, message_hash: Bytes32, signature: Bytes96, domain: Bytes8) -> bool`:
|
||||||
|
|
||||||
* Verify that `pubkey` is a valid G1 point.
|
* Verify that `pubkey` is a valid G1 point.
|
||||||
* Verify that `signature` is a valid G2 point.
|
* Verify that `signature` is a valid G2 point.
|
||||||
|
@ -138,7 +138,7 @@ Let `bls_verify(pubkey: Bytes48, message_hash: Bytes32, signature: Bytes96, doma
|
||||||
|
|
||||||
### `bls_verify_multiple`
|
### `bls_verify_multiple`
|
||||||
|
|
||||||
Let `bls_verify_multiple(pubkeys: List[Bytes48], message_hashes: List[Bytes32], signature: Bytes96, domain: uint64) -> bool`:
|
Let `bls_verify_multiple(pubkeys: List[Bytes48], message_hashes: List[Bytes32], signature: Bytes96, domain: Bytes8) -> bool`:
|
||||||
|
|
||||||
* Verify that each `pubkey` in `pubkeys` is a valid G1 point.
|
* Verify that each `pubkey` in `pubkeys` is a valid G1 point.
|
||||||
* Verify that `signature` is a valid G2 point.
|
* Verify that `signature` is a valid G2 point.
|
||||||
|
|
|
@ -147,6 +147,8 @@ We define the following Python custom types for type hinting and readability:
|
||||||
| `ValidatorIndex` | `uint64` | a validator registry index |
|
| `ValidatorIndex` | `uint64` | a validator registry index |
|
||||||
| `Gwei` | `uint64` | an amount in Gwei |
|
| `Gwei` | `uint64` | an amount in Gwei |
|
||||||
| `Version` | `Bytes4` | a fork version number |
|
| `Version` | `Bytes4` | a fork version number |
|
||||||
|
| `DomainType` | `Bytes4` | a signature domain type |
|
||||||
|
| `Domain` | `Bytes8` | a signature domain |
|
||||||
| `Hash` | `Bytes32` | a hash |
|
| `Hash` | `Bytes32` | a hash |
|
||||||
| `BLSPubkey` | `Bytes48` | a BLS12-381 public key |
|
| `BLSPubkey` | `Bytes48` | a BLS12-381 public key |
|
||||||
| `BLSSignature` | `Bytes96` | a BLS12-381 signature |
|
| `BLSSignature` | `Bytes96` | a BLS12-381 signature |
|
||||||
|
@ -249,7 +251,9 @@ The following values are (non-configurable) constants used throughout the specif
|
||||||
| `MAX_VOLUNTARY_EXITS` | `2**4` (= 16) |
|
| `MAX_VOLUNTARY_EXITS` | `2**4` (= 16) |
|
||||||
| `MAX_TRANSFERS` | `0` |
|
| `MAX_TRANSFERS` | `0` |
|
||||||
|
|
||||||
### Signature domains
|
### Signature domain types
|
||||||
|
|
||||||
|
The following types are defined, mapping into `DomainType` (little endian):
|
||||||
|
|
||||||
| Name | Value |
|
| Name | Value |
|
||||||
| - | - |
|
| - | - |
|
||||||
|
@ -767,11 +771,11 @@ def compute_activation_exit_epoch(epoch: Epoch) -> Epoch:
|
||||||
#### `bls_domain`
|
#### `bls_domain`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def bls_domain(domain_type: uint64, fork_version: bytes=b'\x00' * 4) -> int:
|
def bls_domain(domain_type: DomainType, fork_version: bytes=b'\x00' * 4) -> Domain:
|
||||||
"""
|
"""
|
||||||
Return the BLS domain for the ``domain_type`` and ``fork_version``.
|
Return the BLS domain for the ``domain_type`` and ``fork_version``.
|
||||||
"""
|
"""
|
||||||
return bytes_to_int(int_to_bytes(domain_type, length=4) + fork_version)
|
return Domain(domain_type + fork_version)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Beacon state accessors
|
### Beacon state accessors
|
||||||
|
@ -997,7 +1001,7 @@ def get_total_active_balance(state: BeaconState) -> Gwei:
|
||||||
#### `get_domain`
|
#### `get_domain`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def get_domain(state: BeaconState, domain_type: uint64, message_epoch: Epoch=None) -> int:
|
def get_domain(state: BeaconState, domain_type: DomainType, message_epoch: Epoch=None) -> Domain:
|
||||||
"""
|
"""
|
||||||
Return the signature domain (fork version concatenated with domain type) of a message.
|
Return the signature domain (fork version concatenated with domain type) of a message.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -107,7 +107,9 @@ This document details the beacon chain additions and changes in Phase 1 of Ether
|
||||||
| - | - |
|
| - | - |
|
||||||
| `EARLY_DERIVED_SECRET_REVEAL_SLOT_REWARD_MULTIPLE` | `2**1` (= 2) |
|
| `EARLY_DERIVED_SECRET_REVEAL_SLOT_REWARD_MULTIPLE` | `2**1` (= 2) |
|
||||||
|
|
||||||
### Signature domains
|
### Signature domain types
|
||||||
|
|
||||||
|
The following types are defined, mapping into `DomainType` (little endian):
|
||||||
|
|
||||||
| Name | Value |
|
| Name | Value |
|
||||||
| - | - |
|
| - | - |
|
||||||
|
|
|
@ -62,7 +62,9 @@ This document describes the shard data layer and the shard fork choice rule in P
|
||||||
| `CROSSLINK_LOOKBACK` | `2**0` (= 1) | epochs | 6.2 minutes |
|
| `CROSSLINK_LOOKBACK` | `2**0` (= 1) | epochs | 6.2 minutes |
|
||||||
| `PERSISTENT_COMMITTEE_PERIOD` | `2**11` (= 2,048) | epochs | ~9 days |
|
| `PERSISTENT_COMMITTEE_PERIOD` | `2**11` (= 2,048) | epochs | ~9 days |
|
||||||
|
|
||||||
### Signature domains
|
### Signature domain types
|
||||||
|
|
||||||
|
The following types are defined, mapping into `DomainType` (little endian):
|
||||||
|
|
||||||
| Name | Value |
|
| Name | Value |
|
||||||
| - | - |
|
| - | - |
|
||||||
|
|
|
@ -23,7 +23,8 @@ def only_with_bls(alt_return=None):
|
||||||
|
|
||||||
@only_with_bls(alt_return=True)
|
@only_with_bls(alt_return=True)
|
||||||
def bls_verify(pubkey, message_hash, signature, domain):
|
def bls_verify(pubkey, message_hash, signature, domain):
|
||||||
return bls.verify(message_hash=message_hash, pubkey=pubkey, signature=signature, domain=domain)
|
return bls.verify(message_hash=message_hash, pubkey=pubkey,
|
||||||
|
signature=signature, domain=int.from_bytes(domain, byteorder='little'))
|
||||||
|
|
||||||
|
|
||||||
@only_with_bls(alt_return=True)
|
@only_with_bls(alt_return=True)
|
||||||
|
@ -43,4 +44,5 @@ def bls_aggregate_signatures(signatures):
|
||||||
|
|
||||||
@only_with_bls(alt_return=STUB_SIGNATURE)
|
@only_with_bls(alt_return=STUB_SIGNATURE)
|
||||||
def bls_sign(message_hash, privkey, domain):
|
def bls_sign(message_hash, privkey, domain):
|
||||||
return bls.sign(message_hash=message_hash, privkey=privkey, domain=domain)
|
return bls.sign(message_hash=message_hash, privkey=privkey,
|
||||||
|
domain=int.from_bytes(domain, byteorder='little'))
|
||||||
|
|
|
@ -497,6 +497,11 @@ class BytesN(BaseBytes):
|
||||||
|
|
||||||
# Helpers for common BytesN types.
|
# Helpers for common BytesN types.
|
||||||
Bytes4: BytesType = BytesN[4]
|
Bytes4: BytesType = BytesN[4]
|
||||||
|
Bytes8: BytesType = BytesN[8]
|
||||||
Bytes32: BytesType = BytesN[32]
|
Bytes32: BytesType = BytesN[32]
|
||||||
Bytes48: BytesType = BytesN[48]
|
Bytes48: BytesType = BytesN[48]
|
||||||
Bytes96: BytesType = BytesN[96]
|
Bytes96: BytesType = BytesN[96]
|
||||||
|
|
||||||
|
|
||||||
|
class DomainType(Bytes4):
|
||||||
|
pass
|
||||||
|
|
Loading…
Reference in New Issue