Skip to content

v1.9.6.0: Wrongful Peer Bans While Syncing

Latest

Choose a tag to compare

@BreakoutCoin BreakoutCoin released this 16 Sep 01:21

This release fixes a node that is syncing from well behind the network rejecting the good blocks its peers relay to it, and banning those peers for sending them. Left alone, it works through its peers until it has disconnected them all and can no longer sync.

It is a recommended upgrade for anyone bringing a node up from scratch or from a long outage, and for anyone running a node that others sync from. Both breakoutd and the Qt client are affected, and both proof-of-work and proof-of-stake blocks trigger it. A node already at the tip is not affected.

There are no consensus, network protocol or fork schedule changes. The protocol version is unchanged at 61030, and the explore index is not rebuilt.

What was wrong

While a node catches up, its peers keep relaying it the blocks they are hearing about now — at the tip, hundreds of thousands of blocks ahead of where the syncing node has reached. Those blocks are orphans as far as it is concerned: it has no parent for them and cannot validate them until it does, so it should hold them and move on.

Instead it rejected them and scored the sender for misbehaviour. Over one sync from height 0 to 25,000, with peers at height 1,498,074, a node recorded 109 misbehaviour events against 8 peers and disconnected all 8, several more than once. Nothing was wrong with any of the blocks or any of the peers.

The cause was two checks inside CBlock::CheckBlock() — which is meant to hold only checks that need no chain context, so that a parentless block can be held without being judged. Both had come to depend on local chain state, and both carried a ban score.

What's fixed

  • The KawPoW mix check would only run for a block whose claimed height was within 100,000 of how far this node had synced. A good block 1.5 million blocks ahead fell outside that window and was scored as forged proof-of-work — two such blocks banned the peer. The window is a crash-safety bound, not a consensus rule, and is now anchored to where the block actually sits in the chain.
  • The proof-of-stake block signature check needs the coinstake's previous transaction from the local database, which a node that has not downloaded that part of the chain does not have. "Cannot read it" was reported as "bad signature" and scored — twenty blocks banned the peer. It is now settled in AcceptBlock(), where that transaction has just been read.
  • A proof of work that could not be evaluated for a purely local reason is now rejected without scoring the sender.

Nothing is skipped and no rule is relaxed. No block can join the best chain without its mix being verified against its real height, or enter the block index without its signature being settled, so the BRK_FORK009 and BRK_FORK007 rules are enforced in full. The set of blocks that can join the chain is unchanged; only the point at which two checks are applied has moved.

Downloads

  • macOS 11 and later (Apple Silicon and Intel): Breakout-Chain-1.9.6.0-macOS-Universal.dmg, signed and notarized.
  • Windows 64-bit: Install-Breakout-Coin-1.9.6.0-Win64.exe, signed. It upgrades an existing installation in place.
File SHA-256
Breakout-Chain-1.9.6.0-macOS-Universal.dmg fa40559e8d6ca197d58a9b1953fd18dafd2b0ec163993221a59b22f0c4b30802
Install-Breakout-Coin-1.9.6.0-Win64.exe 2a9ee677efd97518dcf24473ff58b8e361ceff83c9eeaba102c55b4b7f5ceabb

Release notes with a full description of this release: doc/release-notes/release-notes-1.9.6.0.md.