Add first efforts

This commit is contained in:
Paul Hauner 2021-12-06 10:07:54 +11:00
parent 4d35748ff0
commit c99e48c60c
No known key found for this signature in database
GPG Key ID: 5E2CFF9B75FA63DF
1 changed files with 105 additions and 0 deletions

105
sync/optimistic.md Normal file
View File

@ -0,0 +1,105 @@
# Optimistic Sync
## Introduction
In order to provide a syncing execution engine with a (partially-verified) view
of the head of the chain, it may be desirable for a consensus engine to import
beacon blocks without verifying the execution payloads. This partial sync is
called an *optimistic sync*.
## Mechanisms
To perform an optimistic sync:
- The `execute_payload` function MUST return `True` if the execution
engine returns SYNCING or VALID. An INVALID response MUST return `False`.
- The `validate_merge_block` function MUST NOT raise an assertion if both the
`pow_block` and `pow_parent` are unknown to the execution engine.
In addition to these changes to validation, the consensus engine MUST be able
to ascertain, after import, which blocks returned SYNCING and which returned
VALID. This document will assume consensus engines store the following sets:
- `valid_roots: Set[Root]`: `hash_tree_root(block)` where
`block.body.execution_payload` is known to be VALID.
- `optimistic_roots: Set[Root]`: `hash_tree_root(block)` where
`block.body.execution_payload` is known to be SYNCING.
Notably, `optimistic_roots` only includes blocks which have execution enabled
whilst `valid_roots` contains blocks *with or without* execution enabled (i.e.,
all blocks).
A consensus engine MUST be able to retrospectively (i.e., after import) modify
the status of SYNCING blocks to be either VALID or INVALID based upon responses
from an execution engine. I.e., perform the following transitions:
- SYNCING -> VALID
- SYNCING -> INVALID
When a block transitions from SYNCING -> VALID, all *ancestors* of the block MUST
also transition from SYNCING -> VALID.
When a block transitions from SYNCING -> INVALID, all *descendants* of the
block MUST also transition from SYNCING -> INVALID.
## Fork Choice
Consensus engines MUST support removing blocks that transition from SYNCING to
INVALID. Specifically, an INVALID block MUST NOT be included in the canonical
chain and the weights from INVALID blocks MUST NOT be applied to any VALID or
SYNCING ancestors.
## Validator assignments
An entirely optimistically synced node is *not* a full node. It is unable to
produce blocks, since an execution engine cannot produce a payload upon an
unknown parent. It cannot faithfully attest to the head block of the chain,
since it has not fully verified that block.
Let `head_block: BeaconBlock` be the result of calling of the fork choice
algorithm at the time of block production. Let `justified_block: BeaconBlock`
be the latest current justified ancestor ancestor of the `head_block`.
```python
def is_optimistic(block: BeaconBlock) -> bool:
hash_tree_root(block) in optimistic_roots
```
```python
def latest_valid_ancestor(block: BeaconBlock) -> Optional[BeaconBlock]:
while block.parent_root != Root():
if not is_optimistic(block):
return block
block = get_block(block.parent_root)
return None
```
Let a node which returns `is_optimistic(head) == True` be an *optimistic
node*. Let a validator on an optimistic node be an *optimistic validator*.
### Block production
A optimistic validator MUST NOT produce a block (i.e., sign across the
`DOMAIN_BEACON_PROPOSER` domain), unless one of the follow exceptions are met:
#### Exception 1.
If the justified block is fully verified (i.e., `not
is_optimistic(justified_block)`, the validator MUST produce a block upon
`latest_valid_ancestor(head)`.
### Attesting
An optimistic validator MUST NOT participate in attestation (i.e., sign across the
`DOMAIN_BEACON_ATTESTER`, `DOMAIN_SELECTION_PROOF` or
`DOMAIN_AGGREGATE_AND_PROOF` domains), unless one of the follow exceptions are
met:
#### Exception
#### Exception 1.
If a validator *does not* have an optimistic head (i.e., `not
is_optimistic(head_block)`), the node is *fully synced*.
The validator may produce an attestation.