Fix off-by-one error in Eth1 pruning
This commit is contained in:
parent
a995cdd3d9
commit
151d116f02
|
@ -177,9 +177,6 @@ template asBlockHash(x: Eth2Digest): BlockHash =
|
||||||
func shortLog*(b: Eth1Block): string =
|
func shortLog*(b: Eth1Block): string =
|
||||||
&"{b.number}:{shortLog b.voteData.block_hash}(deposits = {b.voteData.deposit_count})"
|
&"{b.number}:{shortLog b.voteData.block_hash}(deposits = {b.voteData.deposit_count})"
|
||||||
|
|
||||||
template findBlock*(eth1Chain: Eth1Chain, hash: BlockHash): Eth1Block =
|
|
||||||
eth1Chain.blocksByHash.getOrDefault(hash, nil)
|
|
||||||
|
|
||||||
template findBlock*(eth1Chain: Eth1Chain, eth1Data: Eth1Data): Eth1Block =
|
template findBlock*(eth1Chain: Eth1Chain, eth1Data: Eth1Data): Eth1Block =
|
||||||
getOrDefault(eth1Chain.blocksByHash, asBlockHash(eth1Data.block_hash), nil)
|
getOrDefault(eth1Chain.blocksByHash, asBlockHash(eth1Data.block_hash), nil)
|
||||||
|
|
||||||
|
@ -343,6 +340,8 @@ proc onBlockHeaders*(p: Web3DataProviderRef,
|
||||||
p.blockHeadersSubscription = await p.web3.subscribeForBlockHeaders(
|
p.blockHeadersSubscription = await p.web3.subscribeForBlockHeaders(
|
||||||
blockHeaderHandler, errorHandler)
|
blockHeaderHandler, errorHandler)
|
||||||
|
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
func getDepositsRoot(m: DepositsMerkleizer): Eth2Digest =
|
func getDepositsRoot(m: DepositsMerkleizer): Eth2Digest =
|
||||||
mixInLength(m.getFinalHash, int m.totalChunks)
|
mixInLength(m.getFinalHash, int m.totalChunks)
|
||||||
|
|
||||||
|
@ -371,13 +370,13 @@ func eth1DataFromMerkleizer(eth1Block: Eth2Digest,
|
||||||
deposit_count: merkleizer.getChunkCount,
|
deposit_count: merkleizer.getChunkCount,
|
||||||
deposit_root: merkleizer.getDepositsRoot)
|
deposit_root: merkleizer.getDepositsRoot)
|
||||||
|
|
||||||
proc pruneOldBlocks(m: Eth1Monitor, depositIndex: uint64) {.raises: [Defect].} =
|
proc pruneOldBlocks(m: Eth1Monitor, depositIndex: uint64) =
|
||||||
let initialChunks = m.eth2FinalizedDepositsMerkleizer.getChunkCount
|
let initialChunks = m.eth2FinalizedDepositsMerkleizer.getChunkCount
|
||||||
var lastBlock: Eth1Block
|
var lastBlock: Eth1Block
|
||||||
|
|
||||||
while m.eth1Chain.blocks.len > 0:
|
while m.eth1Chain.blocks.len > 0:
|
||||||
let blk = m.eth1Chain.blocks.peekFirst
|
let blk = m.eth1Chain.blocks.peekFirst
|
||||||
if blk.voteData.deposit_count > depositIndex:
|
if blk.voteData.deposit_count >= depositIndex:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
for deposit in blk.deposits:
|
for deposit in blk.deposits:
|
||||||
|
@ -443,6 +442,7 @@ proc getBlockProposalData*(m: Eth1Monitor,
|
||||||
let finalizedEth1Block = m.eth1Chain.findBlock(finalizedEth1Data)
|
let finalizedEth1Block = m.eth1Chain.findBlock(finalizedEth1Data)
|
||||||
let hasLatestDeposits = if finalizedEth1Block != nil:
|
let hasLatestDeposits = if finalizedEth1Block != nil:
|
||||||
if finalizedEth1Block.voteData.deposit_root == finalizedEth1Data.deposit_root:
|
if finalizedEth1Block.voteData.deposit_root == finalizedEth1Data.deposit_root:
|
||||||
|
finalizedEth1Block.voteDataVerified = true
|
||||||
true
|
true
|
||||||
else:
|
else:
|
||||||
error "Corrupted deposits history detected",
|
error "Corrupted deposits history detected",
|
||||||
|
@ -524,6 +524,8 @@ proc getBlockProposalData*(m: Eth1Monitor,
|
||||||
else:
|
else:
|
||||||
result.hasMissingDeposits = true
|
result.hasMissingDeposits = true
|
||||||
|
|
||||||
|
{.pop.}
|
||||||
|
|
||||||
proc new(T: type Web3DataProvider,
|
proc new(T: type Web3DataProvider,
|
||||||
depositContractAddress: Eth1Address,
|
depositContractAddress: Eth1Address,
|
||||||
web3Url: string): Future[Result[Web3DataProviderRef, string]] {.async.} =
|
web3Url: string): Future[Result[Web3DataProviderRef, string]] {.async.} =
|
||||||
|
|
Loading…
Reference in New Issue