Update get_eth1_data from v0.11.1 to v1.0.0-rc
This commit is contained in:
parent
9a543e0af7
commit
9899578e1c
|
@ -120,25 +120,6 @@ template asBlockHash(x: Eth2Digest): BlockHash =
|
||||||
func shortLog*(b: Eth1Block): string =
|
func shortLog*(b: Eth1Block): string =
|
||||||
&"{b.number}:{shortLog b.voteData.block_hash}"
|
&"{b.number}:{shortLog b.voteData.block_hash}"
|
||||||
|
|
||||||
func getDepositsInRange(eth1Chain: Eth1Chain,
|
|
||||||
sinceBlock, latestBlock: Eth1BlockNumber): seq[Deposit] =
|
|
||||||
## Returns all deposits that happened AFTER the block `sinceBlock` (not inclusive).
|
|
||||||
## The deposits in `latestBlock` will be included.
|
|
||||||
if latestBlock <= sinceBlock: return
|
|
||||||
|
|
||||||
let firstBlockInCache = eth1Chain.blocks[0].number
|
|
||||||
|
|
||||||
# This function should be used with indices obtained with `eth1Chain.findBlock`.
|
|
||||||
# This guarantess that both of these indices will be valid:
|
|
||||||
doAssert sinceBlock >= firstBlockInCache and
|
|
||||||
(latestBlock - firstBlockInCache) < eth1Chain.blocks.lenu64
|
|
||||||
let
|
|
||||||
sinceBlockIdx = sinceBlock - firstBlockInCache
|
|
||||||
latestBlockIdx = latestBlock - firstBlockInCache
|
|
||||||
|
|
||||||
for i in (sinceBlockIdx + 1) ..< latestBlockIdx:
|
|
||||||
result.add eth1Chain.blocks[i].deposits
|
|
||||||
|
|
||||||
template findBlock*(eth1Chain: Eth1Chain, hash: BlockHash): Eth1Block =
|
template findBlock*(eth1Chain: Eth1Chain, hash: BlockHash): Eth1Block =
|
||||||
eth1Chain.blocksByHash.getOrDefault(hash, nil)
|
eth1Chain.blocksByHash.getOrDefault(hash, nil)
|
||||||
|
|
||||||
|
@ -316,49 +297,45 @@ proc onBlockHeaders*(p: Web3DataProviderRef,
|
||||||
p.blockHeadersSubscription = await p.web3.subscribeForBlockHeaders(
|
p.blockHeadersSubscription = await p.web3.subscribeForBlockHeaders(
|
||||||
blockHeaderHandler, errorHandler)
|
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/v1.0.0-rc.0/specs/phase0/validator.md#get_eth1_data
|
||||||
proc getBlockProposalData*(m: MainchainMonitor,
|
proc getBlockProposalData*(m: MainchainMonitor,
|
||||||
state: BeaconState): (Eth1Data, seq[Deposit]) =
|
state: BeaconState): (Eth1Data, seq[Deposit]) =
|
||||||
template voteForNoChange() =
|
|
||||||
result[0] = state.eth1_data
|
|
||||||
return
|
|
||||||
|
|
||||||
let prevBlock = m.eth1Chain.findBlock(state.eth1_data)
|
|
||||||
if prevBlock == nil:
|
|
||||||
# The Eth1 block currently referenced in the BeaconState is unknown to us.
|
|
||||||
# This situation is not specifically covered in the honest validator spec,
|
|
||||||
# but there is a similar condition where none of the eth1_data_votes is
|
|
||||||
# present in our worldview. The suggestion there is to vote for "no change"
|
|
||||||
# and we'll do the same here:
|
|
||||||
voteForNoChange()
|
|
||||||
|
|
||||||
let periodStart = voting_period_start_time(state)
|
let periodStart = voting_period_start_time(state)
|
||||||
|
|
||||||
var otherVotesCountTable = initCountTable[Eth1Block]()
|
var otherVotesCountTable = initCountTable[Eth1Block]()
|
||||||
for vote in state.eth1_data_votes:
|
for vote in state.eth1_data_votes:
|
||||||
let eth1Block = m.eth1Chain.findBlock(vote)
|
let eth1Block = m.eth1Chain.findBlock(vote)
|
||||||
if eth1Block != nil and is_candidate_block(m.preset, eth1Block, periodStart):
|
if eth1Block != nil and
|
||||||
|
is_candidate_block(m.preset, eth1Block, periodStart) and
|
||||||
|
eth1Block.voteData.deposit_count > state.eth1_data.deposit_count:
|
||||||
otherVotesCountTable.inc eth1Block
|
otherVotesCountTable.inc eth1Block
|
||||||
|
|
||||||
|
var pendingDeposits = state.eth1_data.deposit_count - state.eth1_deposit_index
|
||||||
if otherVotesCountTable.len > 0:
|
if otherVotesCountTable.len > 0:
|
||||||
let (winningBlock, votes) = otherVotesCountTable.largest
|
let (winningBlock, votes) = otherVotesCountTable.largest
|
||||||
result[0] = winningBlock.voteData
|
result[0] = winningBlock.voteData
|
||||||
if uint64((votes + 1) * 2) > SLOTS_PER_ETH1_VOTING_PERIOD:
|
if uint64((votes + 1) * 2) > SLOTS_PER_ETH1_VOTING_PERIOD:
|
||||||
result[1] = m.eth1Chain.getDepositsInRange(prevBlock.number,
|
pendingDeposits = winningBlock.voteData.deposit_count -
|
||||||
winningBlock.number)
|
state.eth1_deposit_index
|
||||||
# TODO This can be significantly more optimal
|
|
||||||
var newAllDeposits = m.allDepositsUpTo(winningBlock.voteData.deposit_count)
|
|
||||||
newAllDeposits.add result[1]
|
|
||||||
attachMerkleProofs(newAllDeposits)
|
|
||||||
for i in 0 ..< result[1].len:
|
|
||||||
result[1][i].proof = newAllDeposits[newAllDeposits.len - result[1].len + i].proof
|
|
||||||
else:
|
else:
|
||||||
let latestBlock = m.eth1Chain.latestCandidateBlock(m.preset, periodStart)
|
let latestBlock = m.eth1Chain.latestCandidateBlock(m.preset, periodStart)
|
||||||
if latestBlock == nil:
|
if latestBlock == nil:
|
||||||
voteForNoChange()
|
result[0] = state.eth1_data
|
||||||
else:
|
else:
|
||||||
result[0] = latestBlock.voteData
|
result[0] = latestBlock.voteData
|
||||||
return
|
|
||||||
|
if pendingDeposits > 0:
|
||||||
|
# TODO This can be significantly more optimal
|
||||||
|
let targetDepositCount = result[0].deposit_count
|
||||||
|
|
||||||
|
var newAllDeposits = m.allDepositsUpTo(targetDepositCount)
|
||||||
|
attachMerkleProofs(newAllDeposits.toOpenArray(0, targetDepositCount.int - 1))
|
||||||
|
|
||||||
|
let
|
||||||
|
totalDepositsInNewBlock = min(MAX_DEPOSITS, pendingDeposits)
|
||||||
|
newDepositIndex = state.eth1_deposit_index + totalDepositsInNewBlock
|
||||||
|
|
||||||
|
result[1] = newAllDeposits[state.eth1_deposit_index ..< newDepositIndex]
|
||||||
|
|
||||||
proc init*(T: type MainchainMonitor,
|
proc init*(T: type MainchainMonitor,
|
||||||
db: BeaconChainDB,
|
db: BeaconChainDB,
|
||||||
|
|
Loading…
Reference in New Issue