Browse Source
Add NODE_BLOOM service bit and bump protocol version
Lets nodes advertise that they offer bloom filter support explicitly.
The protocol version bump allows SPV nodes to assume that NODE_BLOOM is
set if NODE_NETWORK is set for pre-170004 nodes.
Also adds an option to turn bloom filter support off for nodes which
advertise a version number >= 170004. Nodes attempting to use bloom
filters on such protocol versions are banned, and a later upgade
should drop nodes of an older version which attempt to use bloom
filters.
Much code stolen from Peter Todd.
Zcash: Implements Zcash equivalent of BIP 111; deploys with Overwinter
pull/4/head
Matt Corallo
9 years ago
committed by
Jack Grigg
No known key found for this signature in database
GPG Key ID: 665DBCD284F7DAFF
4 changed files with
26 additions and
1 deletions
src/init.cpp
src/main.cpp
src/protocol.h
src/version.h
@ -1025,6 +1025,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// Option to startup with mocktime set (used for regression testing):
SetMockTime ( GetArg ( " -mocktime " , 0 ) ) ; // SetMockTime(0) is a no-op
if ( GetBoolArg ( " -peerbloomfilters " , true ) )
nLocalServices | = NODE_BLOOM ;
# ifdef ENABLE_MINING
if ( mapArgs . count ( " -mineraddress " ) ) {
CBitcoinAddress addr ;
@ -5498,6 +5498,21 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
else if ( ! ( nLocalServices & NODE_BLOOM ) & &
( strCommand = = " filterload " | |
strCommand = = " filteradd " | |
strCommand = = " filterclear " ) & &
//TODO: Remove this line after reasonable network upgrade
pfrom - > nVersion > = NO_BLOOM_VERSION )
{
if ( pfrom - > nVersion > = NO_BLOOM_VERSION )
Misbehaving ( pfrom - > GetId ( ) , 100 ) ;
//TODO: Enable this after reasonable network upgrade
//else
// pfrom->fDisconnect = true;
}
else if ( strCommand = = " filterload " )
{
CBloomFilter filter ;
@ -71,6 +71,10 @@ enum {
// set by all Bitcoin Core nodes, and is unset by SPV clients or other peers that just want
// network services but don't provide them.
NODE_NETWORK = ( 1 < < 0 ) ,
// NODE_BLOOM means the node is capable and willing to handle bloom-filtered connections.
// Zcash nodes used to support this by default, without advertising this bit,
// but no longer do as of protocol version 170004 (= NO_BLOOM_VERSION)
NODE_BLOOM = ( 1 < < 2 ) ,
// Bits 24-31 are reserved for temporary experiments. Just pick a bit that
// isn't getting used, or one not being used much, and notify the
@ -9,7 +9,7 @@
* network protocol versioning
*/
static const int PROTOCOL_VERSION = 170003 ;
static const int PROTOCOL_VERSION = 170004 ;
//! initial proto version, to be increased after version/verack negotiation
static const int INIT_PROTO_VERSION = 209 ;
@ -30,4 +30,7 @@ static const int BIP0031_VERSION = 60000;
//! "mempool" command, enhanced "getdata" behavior starts with this version
static const int MEMPOOL_GD_VERSION = 60002 ;
//! "filter*" commands are disabled without NODE_BLOOM after and including this version
static const int NO_BLOOM_VERSION = 170004 ;
# endif // BITCOIN_VERSION_H