make eth1 distance runtime configurable
This commit is contained in:
parent
d11f0ad86e
commit
e90c5440e8
|
@ -94,11 +94,10 @@ type
|
||||||
const
|
const
|
||||||
reorgDepthLimit = 1000
|
reorgDepthLimit = 1000
|
||||||
web3Timeouts = 5.seconds
|
web3Timeouts = 5.seconds
|
||||||
followDistanceInSeconds = uint64(SECONDS_PER_ETH1_BLOCK * ETH1_FOLLOW_DISTANCE)
|
|
||||||
|
|
||||||
# TODO: Add preset validation
|
# TODO: Add preset validation
|
||||||
# MIN_GENESIS_ACTIVE_VALIDATOR_COUNT should be larger than SLOTS_PER_EPOCH
|
# MIN_GENESIS_ACTIVE_VALIDATOR_COUNT should be larger than SLOTS_PER_EPOCH
|
||||||
# doAssert SECONDS_PER_ETH1_BLOCK * ETH1_FOLLOW_DISTANCE < GENESIS_DELAY,
|
# doAssert SECONDS_PER_ETH1_BLOCK * preset.ETH1_FOLLOW_DISTANCE < GENESIS_DELAY,
|
||||||
# "Invalid configuration: GENESIS_DELAY is set too low"
|
# "Invalid configuration: GENESIS_DELAY is set too low"
|
||||||
|
|
||||||
# TODO Nim's analysis on the lock level of the methods in this
|
# TODO Nim's analysis on the lock level of the methods in this
|
||||||
|
@ -116,9 +115,9 @@ func voting_period_start_time*(state: BeaconState): uint64 =
|
||||||
compute_time_at_slot(state, eth1_voting_period_start_slot)
|
compute_time_at_slot(state, eth1_voting_period_start_slot)
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.2/specs/phase0/validator.md#get_eth1_data
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.2/specs/phase0/validator.md#get_eth1_data
|
||||||
func is_candidate_block(blk: Eth1Block, period_start: uint64): bool =
|
func is_candidate_block(preset: RuntimePreset, blk: Eth1Block, period_start: uint64): bool =
|
||||||
(blk.timestamp + SECONDS_PER_ETH1_BLOCK.uint64 * ETH1_FOLLOW_DISTANCE.uint64 <= period_start) and
|
(blk.timestamp + SECONDS_PER_ETH1_BLOCK.uint64 * preset.ETH1_FOLLOW_DISTANCE <= period_start) and
|
||||||
(blk.timestamp + SECONDS_PER_ETH1_BLOCK.uint64 * ETH1_FOLLOW_DISTANCE.uint64 * 2 >= period_start)
|
(blk.timestamp + SECONDS_PER_ETH1_BLOCK.uint64 * preset.ETH1_FOLLOW_DISTANCE * 2 >= period_start)
|
||||||
|
|
||||||
func asEth2Digest*(x: BlockHash): Eth2Digest =
|
func asEth2Digest*(x: BlockHash): Eth2Digest =
|
||||||
Eth2Digest(data: array[32, byte](x))
|
Eth2Digest(data: array[32, byte](x))
|
||||||
|
@ -164,10 +163,10 @@ proc findParent*(eth1Chain: Eth1Chain, blk: BlockObject): Eth1Block =
|
||||||
parentHash = blk.parentHash.toHex, parentNumber = result.number
|
parentHash = blk.parentHash.toHex, parentNumber = result.number
|
||||||
result = nil
|
result = nil
|
||||||
|
|
||||||
func latestCandidateBlock(eth1Chain: Eth1Chain, periodStart: uint64): Eth1Block =
|
func latestCandidateBlock(eth1Chain: Eth1Chain, preset: RuntimePreset, periodStart: uint64): Eth1Block =
|
||||||
for i in countdown(eth1Chain.blocks.len - 1, 0):
|
for i in countdown(eth1Chain.blocks.len - 1, 0):
|
||||||
let blk = eth1Chain.blocks[i]
|
let blk = eth1Chain.blocks[i]
|
||||||
if is_candidate_block(blk, periodStart):
|
if is_candidate_block(preset, blk, periodStart):
|
||||||
return blk
|
return blk
|
||||||
|
|
||||||
func popBlock(eth1Chain: var Eth1Chain) =
|
func popBlock(eth1Chain: var Eth1Chain) =
|
||||||
|
@ -421,7 +420,7 @@ method onBlockHeaders*(p: Web3DataProviderRef,
|
||||||
options, blockHeaderHandler, errorHandler)
|
options, blockHeaderHandler, errorHandler)
|
||||||
|
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.11.1/specs/phase0/validator.md#get_eth1_data
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.11.1/specs/phase0/validator.md#get_eth1_data
|
||||||
func getBlockProposalData*(eth1Chain: Eth1Chain,
|
func getBlockProposalData*(preset: RuntimePreset, eth1Chain: Eth1Chain,
|
||||||
state: BeaconState): (Eth1Data, seq[Deposit]) =
|
state: BeaconState): (Eth1Data, seq[Deposit]) =
|
||||||
template voteForNoChange() =
|
template voteForNoChange() =
|
||||||
return (state.eth1_data, newSeq[Deposit]())
|
return (state.eth1_data, newSeq[Deposit]())
|
||||||
|
@ -440,21 +439,21 @@ func getBlockProposalData*(eth1Chain: Eth1Chain,
|
||||||
var otherVotesCountTable = initCountTable[Eth1Block]()
|
var otherVotesCountTable = initCountTable[Eth1Block]()
|
||||||
for vote in state.eth1_data_votes:
|
for vote in state.eth1_data_votes:
|
||||||
let eth1Block = eth1Chain.findBlock(vote)
|
let eth1Block = eth1Chain.findBlock(vote)
|
||||||
if eth1Block != nil and is_candidate_block(eth1Block, periodStart):
|
if eth1Block != nil and is_candidate_block(preset, eth1Block, periodStart):
|
||||||
otherVotesCountTable.inc eth1Block
|
otherVotesCountTable.inc eth1Block
|
||||||
|
|
||||||
var ourVote: Eth1Block
|
var ourVote: Eth1Block
|
||||||
if otherVotesCountTable.len > 0:
|
if otherVotesCountTable.len > 0:
|
||||||
ourVote = otherVotesCountTable.largest.key
|
ourVote = otherVotesCountTable.largest.key
|
||||||
else:
|
else:
|
||||||
ourVote = eth1Chain.latestCandidateBlock(periodStart)
|
ourVote = eth1Chain.latestCandidateBlock(preset, periodStart)
|
||||||
if ourVote == nil:
|
if ourVote == nil:
|
||||||
voteForNoChange()
|
voteForNoChange()
|
||||||
|
|
||||||
(ourVote.voteData, eth1Chain.getDepositsInRange(prevBlock.number, ourVote.number))
|
(ourVote.voteData, eth1Chain.getDepositsInRange(prevBlock.number, ourVote.number))
|
||||||
|
|
||||||
template getBlockProposalData*(m: MainchainMonitor, state: BeaconState): untyped =
|
template getBlockProposalData*(m: MainchainMonitor, state: BeaconState): untyped =
|
||||||
getBlockProposalData(m.eth1Chain, state)
|
getBlockProposalData(m.preset, m.eth1Chain, state)
|
||||||
|
|
||||||
proc init*(T: type MainchainMonitor,
|
proc init*(T: type MainchainMonitor,
|
||||||
preset: RuntimePreset,
|
preset: RuntimePreset,
|
||||||
|
@ -470,6 +469,7 @@ proc init*(T: type MainchainMonitor,
|
||||||
proc isCandidateForGenesis(preset: RuntimePreset,
|
proc isCandidateForGenesis(preset: RuntimePreset,
|
||||||
timeNow: float,
|
timeNow: float,
|
||||||
blk: Eth1Block): bool =
|
blk: Eth1Block): bool =
|
||||||
|
let followDistanceInSeconds = uint64(SECONDS_PER_ETH1_BLOCK) * preset.ETH1_FOLLOW_DISTANCE
|
||||||
if float(blk.timestamp + followDistanceInSeconds) > timeNow:
|
if float(blk.timestamp + followDistanceInSeconds) > timeNow:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ type
|
||||||
GENESIS_DELAY*: uint64
|
GENESIS_DELAY*: uint64
|
||||||
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT*: uint64
|
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT*: uint64
|
||||||
MIN_GENESIS_TIME*: uint64
|
MIN_GENESIS_TIME*: uint64
|
||||||
|
ETH1_FOLLOW_DISTANCE*: uint64
|
||||||
|
|
||||||
PresetFile* = object
|
PresetFile* = object
|
||||||
values*: Table[PresetValue, TaintedString]
|
values*: Table[PresetValue, TaintedString]
|
||||||
|
@ -33,6 +34,7 @@ const
|
||||||
MIN_GENESIS_TIME,
|
MIN_GENESIS_TIME,
|
||||||
GENESIS_FORK_VERSION,
|
GENESIS_FORK_VERSION,
|
||||||
GENESIS_DELAY,
|
GENESIS_DELAY,
|
||||||
|
ETH1_FOLLOW_DISTANCE,
|
||||||
}
|
}
|
||||||
|
|
||||||
# These constants cannot really be overriden in a preset.
|
# These constants cannot really be overriden in a preset.
|
||||||
|
@ -124,13 +126,15 @@ const
|
||||||
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 16384,
|
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 16384,
|
||||||
MIN_GENESIS_TIME: 1578009600,
|
MIN_GENESIS_TIME: 1578009600,
|
||||||
GENESIS_FORK_VERSION: Version [byte 0, 0, 0, 0],
|
GENESIS_FORK_VERSION: Version [byte 0, 0, 0, 0],
|
||||||
GENESIS_DELAY: 172800)
|
GENESIS_DELAY: 172800,
|
||||||
|
ETH1_FOLLOW_DISTANCE: 1024)
|
||||||
|
|
||||||
minimalRuntimePreset* = RuntimePreset(
|
minimalRuntimePreset* = RuntimePreset(
|
||||||
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 64,
|
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 64,
|
||||||
MIN_GENESIS_TIME: 1578009600,
|
MIN_GENESIS_TIME: 1578009600,
|
||||||
GENESIS_FORK_VERSION: Version [byte 0, 0, 0, 1],
|
GENESIS_FORK_VERSION: Version [byte 0, 0, 0, 1],
|
||||||
GENESIS_DELAY: 300)
|
GENESIS_DELAY: 300,
|
||||||
|
ETH1_FOLLOW_DISTANCE: 16)
|
||||||
|
|
||||||
when const_preset == "mainnet":
|
when const_preset == "mainnet":
|
||||||
template defaultRuntimePreset*: auto = mainnetRuntimePreset
|
template defaultRuntimePreset*: auto = mainnetRuntimePreset
|
||||||
|
@ -170,5 +174,6 @@ else:
|
||||||
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT,
|
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT,
|
||||||
MIN_GENESIS_TIME: MIN_GENESIS_TIME,
|
MIN_GENESIS_TIME: MIN_GENESIS_TIME,
|
||||||
GENESIS_FORK_VERSION: GENESIS_FORK_VERSION,
|
GENESIS_FORK_VERSION: GENESIS_FORK_VERSION,
|
||||||
GENESIS_DELAY: GENESIS_DELAY)
|
GENESIS_DELAY: GENESIS_DELAY,
|
||||||
|
ETH1_FOLLOW_DISTANCE: ETH1_FOLLOW_DISTANCE)
|
||||||
|
|
||||||
|
|
|
@ -151,8 +151,6 @@ const
|
||||||
|
|
||||||
# Validators
|
# Validators
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.2/configs/mainnet/phase0.yaml#L38
|
|
||||||
ETH1_FOLLOW_DISTANCE* {.intdefine.}: uint64 = 1024 # blocks ~ 4 hours
|
|
||||||
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16 # validators
|
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16 # validators
|
||||||
RANDOM_SUBNETS_PER_VALIDATOR*: uint64 = 1 # subnet
|
RANDOM_SUBNETS_PER_VALIDATOR*: uint64 = 1 # subnet
|
||||||
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION*: uint64 = 256 # epochs ~ 27 hours
|
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION*: uint64 = 256 # epochs ~ 27 hours
|
||||||
|
|
|
@ -136,9 +136,6 @@ const
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.2/configs/minimal/phase0.yaml#L38
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.12.2/configs/minimal/phase0.yaml#L38
|
||||||
|
|
||||||
# Changed
|
|
||||||
ETH1_FOLLOW_DISTANCE* {.intdefine.}: uint64 = 16 # blocks
|
|
||||||
|
|
||||||
# Unchanged
|
# Unchanged
|
||||||
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16 # validators
|
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16 # validators
|
||||||
RANDOM_SUBNETS_PER_VALIDATOR*: uint64 = 1 # subnet
|
RANDOM_SUBNETS_PER_VALIDATOR*: uint64 = 1 # subnet
|
||||||
|
|
|
@ -54,8 +54,7 @@ GANACHE_BLOCK_TIME=5
|
||||||
|
|
||||||
# Run with "SLOTS_PER_EPOCH=8 ./start.sh" to change these
|
# Run with "SLOTS_PER_EPOCH=8 ./start.sh" to change these
|
||||||
DEFS=""
|
DEFS=""
|
||||||
DEFS+="-d:SECONDS_PER_ETH1_BLOCK=$GANACHE_BLOCK_TIME \
|
DEFS+="-d:SECONDS_PER_ETH1_BLOCK=$GANACHE_BLOCK_TIME"
|
||||||
-d:ETH1_FOLLOW_DISTANCE=1 "
|
|
||||||
DEFS+="-d:MAX_COMMITTEES_PER_SLOT=${MAX_COMMITTEES_PER_SLOT:-1} " # Spec default: 64
|
DEFS+="-d:MAX_COMMITTEES_PER_SLOT=${MAX_COMMITTEES_PER_SLOT:-1} " # Spec default: 64
|
||||||
DEFS+="-d:SLOTS_PER_EPOCH=${SLOTS_PER_EPOCH:-6} " # Spec default: 32
|
DEFS+="-d:SLOTS_PER_EPOCH=${SLOTS_PER_EPOCH:-6} " # Spec default: 32
|
||||||
DEFS+="-d:SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-6} " # Spec default: 12
|
DEFS+="-d:SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-6} " # Spec default: 12
|
||||||
|
@ -201,7 +200,8 @@ tee "$NETWORK_METADATA_FILE" <<EOF
|
||||||
"MIN_GENESIS_ACTIVE_VALIDATOR_COUNT": ${NUM_VALIDATORS},
|
"MIN_GENESIS_ACTIVE_VALIDATOR_COUNT": ${NUM_VALIDATORS},
|
||||||
"MIN_GENESIS_TIME": 0,
|
"MIN_GENESIS_TIME": 0,
|
||||||
"GENESIS_DELAY": 10,
|
"GENESIS_DELAY": 10,
|
||||||
"GENESIS_FORK_VERSION": "0x00000000"
|
"GENESIS_FORK_VERSION": "0x00000000",
|
||||||
|
"ETH1_FOLLOW_DISTANCE": 1,
|
||||||
},
|
},
|
||||||
"depositContractAddress": "${DEPOSIT_CONTRACT_ADDRESS}",
|
"depositContractAddress": "${DEPOSIT_CONTRACT_ADDRESS}",
|
||||||
"depositContractDeployedAt": "${DEPOSIT_CONTRACT_BLOCK}"
|
"depositContractDeployedAt": "${DEPOSIT_CONTRACT_BLOCK}"
|
||||||
|
|
Loading…
Reference in New Issue