diff --git a/doc/release-notes.md b/doc/release-notes.md --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -9,3 +9,5 @@ is similar to `listunspent` but does not use a wallet, meaning that the wallet can be disabled at compile or run time. This call is experimental, as such, is subject to changes or removal in future releases. + - Seeder now filters out nodes that are not following the BCH chain up to the + most recent checkpoint. This applies to both mainnet and testnet. diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h --- a/src/seeder/bitcoin.h +++ b/src/seeder/bitcoin.h @@ -52,7 +52,9 @@ void PushVersion(); - void GotVersion(); + void CheckpointVerified(); + + void CheckForCheckpoint(); bool ProcessMessages(); diff --git a/src/seeder/bitcoin.cpp b/src/seeder/bitcoin.cpp --- a/src/seeder/bitcoin.cpp +++ b/src/seeder/bitcoin.cpp @@ -95,7 +95,7 @@ EndMessage(); } -void CSeederNode::GotVersion() { +void CSeederNode::CheckpointVerified() { // fprintf(stdout, "\n%s: version %i\n", ToString(you).c_str(), // nVersion); if (vAddr) { @@ -107,6 +107,21 @@ } } +void CSeederNode::CheckForCheckpoint() { + // Create a getheaders message + BeginMessage("getheaders"); + // Locator hash; Seeder requests the headers after the latest checkpoint + uint256 seederCheckpoint = + networkParams->Checkpoints().mapCheckpoints.rbegin()->second; + std::vector hashStop(32, 0); + uint8_t numberOfLocatorHashes = 1; + vSend << PROTOCOL_VERSION << numberOfLocatorHashes << seederCheckpoint + << uint256(hashStop); + EndMessage(); + // Update socket timeout + doneAfter = time(nullptr) + GetTimeout(); +} + bool CSeederNode::ProcessMessage(std::string strCommand, CDataStream &recv) { // fprintf(stdout, "%s: RECV %s\n", ToString(you).c_str(), // strCommand.c_str()); @@ -130,7 +145,7 @@ if (strCommand == "verack") { vRecv.SetVersion(std::min(nVersion, PROTOCOL_VERSION)); - GotVersion(); + CheckForCheckpoint(); return false; } @@ -188,6 +203,7 @@ header.hashPrevBlock) { // fprintf(stderr, "Peer (%s) found seeder checkpoint.\n", // ToString(you).c_str()); + CheckpointVerified(); return false; }