mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-01-12 11:44:41 +00:00
Merge pull request #2605 from mkalinin/hardcoded-ttd
Hardcode terminal total difficulty
This commit is contained in:
commit
926e5a3d72
@ -3,6 +3,12 @@
|
|||||||
# Extends the mainnet preset
|
# Extends the mainnet preset
|
||||||
PRESET_BASE: 'mainnet'
|
PRESET_BASE: 'mainnet'
|
||||||
|
|
||||||
|
# Transition
|
||||||
|
# ---------------------------------------------------------------
|
||||||
|
# TBD, 2**256-1 is a placeholder
|
||||||
|
TERMINAL_TOTAL_DIFFICULTY: 115792089237316195423570985008687907853269984665640564039457584007913129639935
|
||||||
|
|
||||||
|
|
||||||
# Genesis
|
# Genesis
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# `2**14` (= 16,384)
|
# `2**14` (= 16,384)
|
||||||
@ -31,9 +37,6 @@ MERGE_FORK_EPOCH: 18446744073709551615
|
|||||||
SHARDING_FORK_VERSION: 0x03000000
|
SHARDING_FORK_VERSION: 0x03000000
|
||||||
SHARDING_FORK_EPOCH: 18446744073709551615
|
SHARDING_FORK_EPOCH: 18446744073709551615
|
||||||
|
|
||||||
# TBD, 2**32 is a placeholder. Merge transition approach is in active R&D.
|
|
||||||
MIN_ANCHOR_POW_BLOCK_DIFFICULTY: 4294967296
|
|
||||||
|
|
||||||
|
|
||||||
# Time parameters
|
# Time parameters
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
# Extends the minimal preset
|
# Extends the minimal preset
|
||||||
PRESET_BASE: 'minimal'
|
PRESET_BASE: 'minimal'
|
||||||
|
|
||||||
|
# Transition
|
||||||
|
# ---------------------------------------------------------------
|
||||||
|
# TBD, 2**256-1 is a placeholder
|
||||||
|
TERMINAL_TOTAL_DIFFICULTY: 115792089237316195423570985008687907853269984665640564039457584007913129639935
|
||||||
|
|
||||||
|
|
||||||
# Genesis
|
# Genesis
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# [customized]
|
# [customized]
|
||||||
@ -30,9 +36,6 @@ MERGE_FORK_EPOCH: 18446744073709551615
|
|||||||
SHARDING_FORK_VERSION: 0x03000001
|
SHARDING_FORK_VERSION: 0x03000001
|
||||||
SHARDING_FORK_EPOCH: 18446744073709551615
|
SHARDING_FORK_EPOCH: 18446744073709551615
|
||||||
|
|
||||||
# TBD, 2**32 is a placeholder. Merge transition approach is in active R&D.
|
|
||||||
MIN_ANCHOR_POW_BLOCK_DIFFICULTY: 4294967296
|
|
||||||
|
|
||||||
|
|
||||||
# Time parameters
|
# Time parameters
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
- [Execution](#execution)
|
- [Execution](#execution)
|
||||||
- [Configuration](#configuration)
|
- [Configuration](#configuration)
|
||||||
- [Genesis testing settings](#genesis-testing-settings)
|
- [Genesis testing settings](#genesis-testing-settings)
|
||||||
|
- [Transition settings](#transition-settings)
|
||||||
- [Containers](#containers)
|
- [Containers](#containers)
|
||||||
- [Extended containers](#extended-containers)
|
- [Extended containers](#extended-containers)
|
||||||
- [`BeaconBlockBody`](#beaconblockbody)
|
- [`BeaconBlockBody`](#beaconblockbody)
|
||||||
@ -77,6 +78,12 @@ This patch adds transaction execution to the beacon chain as part of the Merge f
|
|||||||
| `GENESIS_GAS_LIMIT` | `uint64(30000000)` (= 30,000,000) |
|
| `GENESIS_GAS_LIMIT` | `uint64(30000000)` (= 30,000,000) |
|
||||||
| `GENESIS_BASE_FEE_PER_GAS` | `Bytes32('0x00ca9a3b00000000000000000000000000000000000000000000000000000000')` (= 1,000,000,000) |
|
| `GENESIS_BASE_FEE_PER_GAS` | `Bytes32('0x00ca9a3b00000000000000000000000000000000000000000000000000000000')` (= 1,000,000,000) |
|
||||||
|
|
||||||
|
### Transition settings
|
||||||
|
|
||||||
|
| Name | Value |
|
||||||
|
| - | - |
|
||||||
|
| `TERMINAL_TOTAL_DIFFICULTY` | **TBD** |
|
||||||
|
|
||||||
## Containers
|
## Containers
|
||||||
|
|
||||||
### Extended containers
|
### Extended containers
|
||||||
|
@ -15,12 +15,7 @@ This document specifies configurable settings that clients must implement for th
|
|||||||
|
|
||||||
### Override terminal total difficulty
|
### Override terminal total difficulty
|
||||||
|
|
||||||
To coordinate manual overrides to [`terminal_total_difficulty`](fork-choice.md#transitionstore), clients
|
To coordinate manual overrides to [`TERMINAL_TOTAL_DIFFICULTY`](./beacon-chain.md#Transition-settings) parameter, clients must provide `--terminal-total-difficulty-override` as a configurable setting. The value provided by this setting must take precedence over pre-configured `TERMINAL_TOTAL_DIFFICULTY` parameter.
|
||||||
must provide `--terminal-total-difficulty-override` as a configurable setting.
|
|
||||||
|
|
||||||
If `TransitionStore` has already [been initialized](./fork.md#initializing-transition-store), this alters the previously initialized value of
|
Except under exceptional scenarios, this setting is expected to not be used. Sufficient warning to the user about this exceptional configurable setting should be provided.
|
||||||
`TransitionStore.terminal_total_difficulty`, otherwise this setting initializes `TransitionStore` with the specified, bypassing `compute_terminal_total_difficulty` and the use of an `anchor_pow_block`.
|
|
||||||
`terminal_total_difficulty`.
|
|
||||||
|
|
||||||
Except under exceptional scenarios, this setting is expected to not be used, and `terminal_total_difficulty` will operate with [default functionality](./fork.md#initializing-transition-store). Sufficient warning to the user about this exceptional configurable setting should be provided.
|
|
||||||
[here](fork.md#initializing-transition-store).
|
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
- [`set_head`](#set_head)
|
- [`set_head`](#set_head)
|
||||||
- [`finalize_block`](#finalize_block)
|
- [`finalize_block`](#finalize_block)
|
||||||
- [Helpers](#helpers)
|
- [Helpers](#helpers)
|
||||||
- [`TransitionStore`](#transitionstore)
|
|
||||||
- [`PowBlock`](#powblock)
|
- [`PowBlock`](#powblock)
|
||||||
- [`get_pow_block`](#get_pow_block)
|
- [`get_pow_block`](#get_pow_block)
|
||||||
- [`is_valid_terminal_pow_block`](#is_valid_terminal_pow_block)
|
- [`is_valid_terminal_pow_block`](#is_valid_terminal_pow_block)
|
||||||
@ -68,14 +67,6 @@ def finalize_block(self: ExecutionEngine, block_hash: Hash32) -> bool:
|
|||||||
|
|
||||||
## Helpers
|
## Helpers
|
||||||
|
|
||||||
### `TransitionStore`
|
|
||||||
|
|
||||||
```python
|
|
||||||
@dataclass
|
|
||||||
class TransitionStore(object):
|
|
||||||
terminal_total_difficulty: uint256
|
|
||||||
```
|
|
||||||
|
|
||||||
### `PowBlock`
|
### `PowBlock`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
@ -98,9 +89,9 @@ Let `get_pow_block(block_hash: Hash32) -> PowBlock` be the function that given t
|
|||||||
Used by fork-choice handler, `on_block`.
|
Used by fork-choice handler, `on_block`.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def is_valid_terminal_pow_block(transition_store: TransitionStore, block: PowBlock, parent: PowBlock) -> bool:
|
def is_valid_terminal_pow_block(block: PowBlock, parent: PowBlock) -> bool:
|
||||||
is_total_difficulty_reached = block.total_difficulty >= transition_store.terminal_total_difficulty
|
is_total_difficulty_reached = block.total_difficulty >= TERMINAL_TOTAL_DIFFICULTY
|
||||||
is_parent_total_difficulty_valid = parent.total_difficulty < transition_store.terminal_total_difficulty
|
is_parent_total_difficulty_valid = parent.total_difficulty < TERMINAL_TOTAL_DIFFICULTY
|
||||||
return is_total_difficulty_reached and is_parent_total_difficulty_valid
|
return is_total_difficulty_reached and is_parent_total_difficulty_valid
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -111,7 +102,7 @@ def is_valid_terminal_pow_block(transition_store: TransitionStore, block: PowBlo
|
|||||||
*Note*: The only modification is the addition of the verification of transition block conditions.
|
*Note*: The only modification is the addition of the verification of transition block conditions.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def on_block(store: Store, signed_block: SignedBeaconBlock, transition_store: TransitionStore=None) -> None:
|
def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
|
||||||
block = signed_block.message
|
block = signed_block.message
|
||||||
# Parent block must be known
|
# Parent block must be known
|
||||||
assert block.parent_root in store.block_states
|
assert block.parent_root in store.block_states
|
||||||
@ -131,10 +122,10 @@ def on_block(store: Store, signed_block: SignedBeaconBlock, transition_store: Tr
|
|||||||
state_transition(state, signed_block, True)
|
state_transition(state, signed_block, True)
|
||||||
|
|
||||||
# [New in Merge]
|
# [New in Merge]
|
||||||
if (transition_store is not None) and is_merge_block(pre_state, block.body):
|
if is_merge_block(pre_state, block.body):
|
||||||
pow_block = get_pow_block(block.body.execution_payload.parent_hash)
|
pow_block = get_pow_block(block.body.execution_payload.parent_hash)
|
||||||
pow_parent = get_pow_block(pow_block.parent_hash)
|
pow_parent = get_pow_block(pow_block.parent_hash)
|
||||||
assert is_valid_terminal_pow_block(transition_store, pow_block, pow_parent)
|
assert is_valid_terminal_pow_block(pow_block, pow_parent)
|
||||||
|
|
||||||
# Add new block to the store
|
# Add new block to the store
|
||||||
store.blocks[hash_tree_root(block)] = block
|
store.blocks[hash_tree_root(block)] = block
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
- [Fork to Merge](#fork-to-merge)
|
- [Fork to Merge](#fork-to-merge)
|
||||||
- [Fork trigger](#fork-trigger)
|
- [Fork trigger](#fork-trigger)
|
||||||
- [Upgrading the state](#upgrading-the-state)
|
- [Upgrading the state](#upgrading-the-state)
|
||||||
- [Initializing transition store](#initializing-transition-store)
|
|
||||||
|
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
|
||||||
@ -28,8 +27,6 @@ Warning: this configuration is not definitive.
|
|||||||
| - | - |
|
| - | - |
|
||||||
| `MERGE_FORK_VERSION` | `Version('0x02000000')` |
|
| `MERGE_FORK_VERSION` | `Version('0x02000000')` |
|
||||||
| `MERGE_FORK_EPOCH` | `Epoch(18446744073709551615)` **TBD** |
|
| `MERGE_FORK_EPOCH` | `Epoch(18446744073709551615)` **TBD** |
|
||||||
| `MIN_ANCHOR_POW_BLOCK_DIFFICULTY` | **TBD** |
|
|
||||||
| `TARGET_SECONDS_TO_MERGE` | `uint64(7 * 86400)` = (604,800) |
|
|
||||||
|
|
||||||
## Fork to Merge
|
## Fork to Merge
|
||||||
|
|
||||||
@ -37,8 +34,6 @@ Warning: this configuration is not definitive.
|
|||||||
|
|
||||||
TBD. Social consensus, along with state conditions such as epoch boundary, finality, deposits, active validator count, etc. may be part of the decision process to trigger the fork. For now we assume the condition will be triggered at epoch `MERGE_FORK_EPOCH`.
|
TBD. Social consensus, along with state conditions such as epoch boundary, finality, deposits, active validator count, etc. may be part of the decision process to trigger the fork. For now we assume the condition will be triggered at epoch `MERGE_FORK_EPOCH`.
|
||||||
|
|
||||||
Since the Merge transition process relies on `Eth1Data` in the beacon state we do want to make sure that this data is fresh. This is achieved by forcing `MERGE_FORK_EPOCH` to point to eth1 voting period boundary, i.e. `MERGE_FORK_EPOCH` should satisfy the following condition `MERGE_FORK_EPOCH % EPOCHS_PER_ETH1_VOTING_PERIOD == 0`.
|
|
||||||
|
|
||||||
Note that for the pure Merge networks, we don't apply `upgrade_to_merge` since it starts with Merge version logic.
|
Note that for the pure Merge networks, we don't apply `upgrade_to_merge` since it starts with Merge version logic.
|
||||||
|
|
||||||
### Upgrading the state
|
### Upgrading the state
|
||||||
@ -100,33 +95,3 @@ def upgrade_to_merge(pre: altair.BeaconState) -> BeaconState:
|
|||||||
|
|
||||||
return post
|
return post
|
||||||
```
|
```
|
||||||
|
|
||||||
### Initializing transition store
|
|
||||||
|
|
||||||
If `state.slot % SLOTS_PER_EPOCH == 0`, `compute_epoch_at_slot(state.slot) == MERGE_FORK_EPOCH`, and the transition store has not already been initialized, a transition store is initialized to be further utilized by the transition process of the Merge.
|
|
||||||
|
|
||||||
Transition store initialization occurs after the state has been modified by corresponding `upgrade_to_merge` function.
|
|
||||||
|
|
||||||
```python
|
|
||||||
def compute_terminal_total_difficulty(anchor_pow_block: PowBlock) -> uint256:
|
|
||||||
seconds_per_voting_period = EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH * SECONDS_PER_SLOT
|
|
||||||
pow_blocks_per_voting_period = seconds_per_voting_period // SECONDS_PER_ETH1_BLOCK
|
|
||||||
pow_blocks_to_merge = TARGET_SECONDS_TO_MERGE // SECONDS_PER_ETH1_BLOCK
|
|
||||||
pow_blocks_after_anchor_block = ETH1_FOLLOW_DISTANCE + pow_blocks_per_voting_period + pow_blocks_to_merge
|
|
||||||
anchor_difficulty = max(MIN_ANCHOR_POW_BLOCK_DIFFICULTY, anchor_pow_block.difficulty)
|
|
||||||
|
|
||||||
return anchor_pow_block.total_difficulty + anchor_difficulty * pow_blocks_after_anchor_block
|
|
||||||
|
|
||||||
|
|
||||||
def get_transition_store(anchor_pow_block: PowBlock) -> TransitionStore:
|
|
||||||
terminal_total_difficulty = compute_terminal_total_difficulty(anchor_pow_block)
|
|
||||||
return TransitionStore(terminal_total_difficulty=terminal_total_difficulty)
|
|
||||||
|
|
||||||
|
|
||||||
def initialize_transition_store(state: BeaconState) -> TransitionStore:
|
|
||||||
pow_block = get_pow_block(state.eth1_data.block_hash)
|
|
||||||
return get_transition_store(pow_block)
|
|
||||||
```
|
|
||||||
|
|
||||||
*Note*: Transition store can also be initialized at client startup by [overriding terminal total
|
|
||||||
difficulty](client_settings.md#override-terminal-total-difficulty).
|
|
||||||
|
@ -62,7 +62,7 @@ All validator responsibilities remain unchanged other than those noted below. Na
|
|||||||
|
|
||||||
##### Execution Payload
|
##### Execution Payload
|
||||||
|
|
||||||
* Set `block.body.execution_payload = get_execution_payload(state, transition_store, execution_engine, pow_chain)` where:
|
* Set `block.body.execution_payload = get_execution_payload(state, execution_engine, pow_chain)` where:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def get_pow_block_at_total_difficulty(total_difficulty: uint256, pow_chain: Sequence[PowBlock]) -> Optional[PowBlock]:
|
def get_pow_block_at_total_difficulty(total_difficulty: uint256, pow_chain: Sequence[PowBlock]) -> Optional[PowBlock]:
|
||||||
@ -84,11 +84,10 @@ def produce_execution_payload(state: BeaconState,
|
|||||||
|
|
||||||
|
|
||||||
def get_execution_payload(state: BeaconState,
|
def get_execution_payload(state: BeaconState,
|
||||||
transition_store: TransitionStore,
|
|
||||||
execution_engine: ExecutionEngine,
|
execution_engine: ExecutionEngine,
|
||||||
pow_chain: Sequence[PowBlock]) -> ExecutionPayload:
|
pow_chain: Sequence[PowBlock]) -> ExecutionPayload:
|
||||||
if not is_merge_complete(state):
|
if not is_merge_complete(state):
|
||||||
terminal_pow_block = get_pow_block_at_total_difficulty(transition_store.terminal_total_difficulty, pow_chain)
|
terminal_pow_block = get_pow_block_at_total_difficulty(TERMINAL_TOTAL_DIFFICULTY, pow_chain)
|
||||||
if terminal_pow_block is None:
|
if terminal_pow_block is None:
|
||||||
# Pre-merge, empty payload
|
# Pre-merge, empty payload
|
||||||
return ExecutionPayload()
|
return ExecutionPayload()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user