From dceb2a4261669489868c1f8d694112610c025bb3 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 31 Jan 2019 12:45:42 +0100 Subject: [PATCH] VersionMessage: Add support for BIP111 (NODE_BLOOM service bit). --- .../java/org/bitcoinj/core/NetworkParameters.java | 3 ++- core/src/main/java/org/bitcoinj/core/Peer.java | 4 ++++ .../java/org/bitcoinj/core/VersionMessage.java | 13 +++++++++---- .../test/java/org/bitcoinj/core/PeerGroupTest.java | 14 +++++++------- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/NetworkParameters.java b/core/src/main/java/org/bitcoinj/core/NetworkParameters.java index 77c469d08..fe69622c6 100644 --- a/core/src/main/java/org/bitcoinj/core/NetworkParameters.java +++ b/core/src/main/java/org/bitcoinj/core/NetworkParameters.java @@ -516,7 +516,8 @@ public abstract class NetworkParameters { public static enum ProtocolVersion { MINIMUM(70000), PONG(60001), - BLOOM_FILTER(70000), + BLOOM_FILTER(70000), // BIP37 + BLOOM_FILTER_BIP111(70011), // BIP111 WITNESS_VERSION(70012), CURRENT(70012); diff --git a/core/src/main/java/org/bitcoinj/core/Peer.java b/core/src/main/java/org/bitcoinj/core/Peer.java index 162281b74..9ff01bb3e 100644 --- a/core/src/main/java/org/bitcoinj/core/Peer.java +++ b/core/src/main/java/org/bitcoinj/core/Peer.java @@ -420,6 +420,10 @@ public class Peer extends PeerSocketHandler { a.add("GETUTXOS"); services &= ~VersionMessage.NODE_GETUTXOS; } + if ((services & VersionMessage.NODE_BLOOM) == VersionMessage.NODE_BLOOM) { + a.add("BLOOM"); + services &= ~VersionMessage.NODE_BLOOM; + } if ((services & VersionMessage.NODE_WITNESS) == VersionMessage.NODE_WITNESS) { a.add("WITNESS"); services &= ~VersionMessage.NODE_WITNESS; diff --git a/core/src/main/java/org/bitcoinj/core/VersionMessage.java b/core/src/main/java/org/bitcoinj/core/VersionMessage.java index a039d9014..760239655 100644 --- a/core/src/main/java/org/bitcoinj/core/VersionMessage.java +++ b/core/src/main/java/org/bitcoinj/core/VersionMessage.java @@ -49,6 +49,8 @@ public class VersionMessage extends Message { public static final int NODE_NETWORK = 1 << 0; /** A service bit that denotes whether the peer supports the getutxos message or not. */ public static final int NODE_GETUTXOS = 1 << 1; + /** A service bit that denotes whether the peer supports BIP37 bloom filters or not. The service bit is defined in BIP111. */ + public static final int NODE_BLOOM = 1 << 2; /** Indicates that a node can be asked for blocks and transactions including witness data. */ public static final int NODE_WITNESS = 1 << 3; /** A service bit that denotes whether the peer has at least the last two days worth of blockchain (BIP159). */ @@ -273,12 +275,15 @@ public class VersionMessage extends Message { } /** - * Returns true if the clientVersion field is {@link NetworkParameters.ProtocolVersion#BLOOM_FILTER} or higher. - * If it is then Bloom filtering - * is available and the memory pool of the remote peer will be queried when the downloadData property is true. + * Returns true if the peer supports bloom filtering according to BIP37 and BIP111. */ public boolean isBloomFilteringSupported() { - return clientVersion >= params.getProtocolVersionNum(NetworkParameters.ProtocolVersion.BLOOM_FILTER); + if (clientVersion >= params.getProtocolVersionNum(NetworkParameters.ProtocolVersion.BLOOM_FILTER) + && clientVersion < params.getProtocolVersionNum(NetworkParameters.ProtocolVersion.BLOOM_FILTER_BIP111)) + return true; + if ((localServices & NODE_BLOOM) == NODE_BLOOM) + return true; + return false; } /** Returns true if the protocol version and service bits both indicate support for the getutxos message. */ diff --git a/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java b/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java index cfb622642..eff91ea16 100644 --- a/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java +++ b/core/src/test/java/org/bitcoinj/core/PeerGroupTest.java @@ -688,24 +688,24 @@ public class PeerGroupTest extends TestWithPeerGroup { @Test public void waitForPeersOfVersion() throws Exception { - final int baseVer = peerGroup.getMinRequiredProtocolVersion() + 3000; - final int newVer = baseVer + 1000; + final int bip37ver = UNITTEST.getProtocolVersionNum(NetworkParameters.ProtocolVersion.BLOOM_FILTER); + final int bip111ver = UNITTEST.getProtocolVersionNum(NetworkParameters.ProtocolVersion.BLOOM_FILTER_BIP111); - ListenableFuture> future = peerGroup.waitForPeersOfVersion(2, newVer); + ListenableFuture> future = peerGroup.waitForPeersOfVersion(2, bip111ver); VersionMessage ver1 = new VersionMessage(UNITTEST, 10); - ver1.clientVersion = baseVer; + ver1.clientVersion = bip37ver; ver1.localServices = VersionMessage.NODE_NETWORK; VersionMessage ver2 = new VersionMessage(UNITTEST, 10); - ver2.clientVersion = newVer; - ver2.localServices = VersionMessage.NODE_NETWORK; + ver2.clientVersion = bip111ver; + ver2.localServices = VersionMessage.NODE_NETWORK | VersionMessage.NODE_BLOOM; peerGroup.start(); assertFalse(future.isDone()); connectPeer(1, ver1); assertFalse(future.isDone()); connectPeer(2, ver2); assertFalse(future.isDone()); - assertTrue(peerGroup.waitForPeersOfVersion(1, newVer).isDone()); // Immediate completion. + assertTrue(peerGroup.waitForPeersOfVersion(1, bip111ver).isDone()); // Immediate completion. connectPeer(3, ver2); future.get(); assertTrue(future.isDone());