Skip to content

Subpar handling of blocks from the future #4251

@karknu

Description

@karknu

When the node manage to download a block from the future it is not adopted directly, rather it is tucked away with the hope that it can be adopted when the time comes. Any time a new block is downloaded or after a forged block is adopted the node checks to see if there are any old blocks-from-the-future that it could adopt. If there are such blocks they are adopted before the new block.

Notably it appears that a new slot/tick isn't enough to trigger the adoption of blocks-from-the-future, it is always dependent on another block being added.

This means that if all nodes in the network where to download a block early then the only way for the network to progress would be by a BP forging a new block on the current tip (that is without the block from the future). This would cause the BP to notice and adopt the old block-from the future, then it would attempt to adopt its forged block. If it lost due to vrf the TraceDidntAdoptBlock would be shown. If the BP lost it means that another BP would have to attempt to beat the block-from-the-future, since no new block was adopted nothing will cause the rest of the nodes in the network to adopt the block-from-the-future.

Suggestions:

  1. Before forging a new block chainSelectionForFutureBlocks should be run so that the node can forge its block on top of blocks-from-the-future.
  2. Trigger adoption of blocks-from-the-future without depending on any new blocks. This could be done by having a 1s timeout on the getBlockToAdd in addBlockRunner . If there was a timeout call chainSelectionForFutureBlocks and try again.

This would stop blocks from the future causing forks.
I suspect that this is at least partially the cause of IntersectMBO/cardano-node#4720

@nfrisby

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Status

✅ Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions