mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-06-07 06:36:46 +00:00
wire: Implement SFNodeBloom (BIP0111).
SFNodeBloom is a new service flag that a node is required to use to indicate that it supports bloom filtering. This includes a protocol version bump to 70011 and a wire version bump to 0.3.0. btcd: The SFNodeBloom flag is set by default. A new configuration option --nopeerbloomfilters has been added to to disable bloom filtering. Any node advertising a version greater than or equal to 70011 that attempts to use bloom filtering will be disconnected if bloom filtering is disabled. This mimics Bitcoin Core commit afb0ccaf9c9e4e8fac7db3564c4e19c9218c6b03
This commit is contained in:
parent
064cc8e7c3
commit
c9ee3d9c5e
@ -116,6 +116,7 @@ type config struct {
|
|||||||
GetWorkKeys []string `long:"getworkkey" description:"DEPRECATED -- Use the --miningaddr option instead"`
|
GetWorkKeys []string `long:"getworkkey" description:"DEPRECATED -- Use the --miningaddr option instead"`
|
||||||
AddrIndex bool `long:"addrindex" description:"Build and maintain a full address index. Currently only supported by leveldb."`
|
AddrIndex bool `long:"addrindex" description:"Build and maintain a full address index. Currently only supported by leveldb."`
|
||||||
DropAddrIndex bool `long:"dropaddrindex" description:"Deletes the address-based transaction index from the database on start up, and the exits."`
|
DropAddrIndex bool `long:"dropaddrindex" description:"Deletes the address-based transaction index from the database on start up, and the exits."`
|
||||||
|
NoPeerBloomFilters bool `long:"nopeerbloomfilters" description:"Disable bloom filtering support."`
|
||||||
onionlookup func(string) ([]net.IP, error)
|
onionlookup func(string) ([]net.IP, error)
|
||||||
lookup func(string) ([]net.IP, error)
|
lookup func(string) ([]net.IP, error)
|
||||||
oniondial func(string, string) (net.Conn, error)
|
oniondial func(string, string) (net.Conn, error)
|
||||||
|
49
doc.go
49
doc.go
@ -24,6 +24,7 @@ Application Options:
|
|||||||
-V, --version Display version information and exit
|
-V, --version Display version information and exit
|
||||||
-C, --configfile= Path to configuration file
|
-C, --configfile= Path to configuration file
|
||||||
-b, --datadir= Directory to store data
|
-b, --datadir= Directory to store data
|
||||||
|
--logdir= Directory to log output.
|
||||||
-a, --addpeer= Add a peer to connect with at startup
|
-a, --addpeer= Add a peer to connect with at startup
|
||||||
--connect= Connect only to the specified peers at startup
|
--connect= Connect only to the specified peers at startup
|
||||||
--nolisten Disable listening for incoming connections -- NOTE:
|
--nolisten Disable listening for incoming connections -- NOTE:
|
||||||
@ -45,51 +46,53 @@ Application Options:
|
|||||||
--rpckey= File containing the certificate key
|
--rpckey= File containing the certificate key
|
||||||
--rpcmaxclients= Max number of RPC clients for standard connections
|
--rpcmaxclients= Max number of RPC clients for standard connections
|
||||||
(10)
|
(10)
|
||||||
--rpcmaxwebsockets= Max number of RPC clients for standard connections
|
--rpcmaxwebsockets= Max number of RPC websocket connections (25)
|
||||||
(25)
|
|
||||||
--norpc Disable built-in RPC server -- NOTE: The RPC server
|
--norpc Disable built-in RPC server -- NOTE: The RPC server
|
||||||
is disabled by default if no rpcuser/rpcpass is
|
is disabled by default if no rpcuser/rpcpass or
|
||||||
specified
|
rpclimituser/rpclimitpass is specified
|
||||||
--notls Disable TLS for the RPC server -- NOTE: This is only
|
--notls Disable TLS for the RPC server -- NOTE: This is only
|
||||||
allowed if the RPC server is bound to localhost
|
allowed if the RPC server is bound to localhost
|
||||||
--nodnsseed Disable DNS seeding for peers
|
--nodnsseed Disable DNS seeding for peers
|
||||||
--externalip: Add an ip to the list of local addresses we claim to
|
--externalip= Add an ip to the list of local addresses we claim to
|
||||||
listen on to peers
|
listen on to peers
|
||||||
--proxy= Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)
|
--proxy= Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)
|
||||||
--proxyuser= Username for proxy server
|
--proxyuser= Username for proxy server
|
||||||
--proxypass= Password for proxy server
|
--proxypass= Password for proxy server
|
||||||
--onion= Connect to tor hidden services via SOCKS5 proxy (eg.
|
--onion= Connect to tor hidden services via SOCKS5 proxy
|
||||||
127.0.0.1:9050)
|
(eg. 127.0.0.1:9050)
|
||||||
--onionuser= Username for onion proxy server
|
--onionuser= Username for onion proxy server
|
||||||
--onionpass= Password for onion proxy server
|
--onionpass= Password for onion proxy server
|
||||||
--noonion= Disable connecting to tor hidden services
|
--noonion Disable connecting to tor hidden services
|
||||||
--torisolation Enable Tor stream isolation by randomizing user
|
--torisolation Enable Tor stream isolation by randomizing user
|
||||||
credentials for each connection.
|
credentials for each connection.
|
||||||
--testnet= Use the test network
|
--testnet Use the test network
|
||||||
--regtest= Use the regression test network
|
--regtest Use the regression test network
|
||||||
--nocheckpoints= Disable built-in checkpoints. Don't do this unless
|
--simnet Use the simulation test network
|
||||||
|
--nocheckpoints Disable built-in checkpoints. Don't do this unless
|
||||||
you know what you're doing.
|
you know what you're doing.
|
||||||
--dbtype= Database backend to use for the Block Chain (leveldb)
|
--dbtype= Database backend to use for the Block Chain
|
||||||
--profile= Enable HTTP profiling on given port -- NOTE port must
|
(leveldb)
|
||||||
be between 1024 and 65536 (6060)
|
--profile= Enable HTTP profiling on given port -- NOTE port
|
||||||
|
must be between 1024 and 65536
|
||||||
--cpuprofile= Write CPU profile to the specified file
|
--cpuprofile= Write CPU profile to the specified file
|
||||||
-d, --debuglevel: Logging level for all subsystems {trace, debug, info,
|
-d, --debuglevel= Logging level for all subsystems {trace, debug,
|
||||||
warn, error, critical} -- You may also specify
|
info, warn, error, critical} -- You may also specify
|
||||||
<subsystem>=<level>,<subsystem2>=<level>,... to set
|
<subsystem>=<level>,<subsystem2>=<level>,... to set
|
||||||
the log level for individual subsystems -- Use show
|
the log level for individual subsystems -- Use show
|
||||||
to list available subsystems (info)
|
to list available subsystems (info)
|
||||||
--upnp Use UPnP to map our listening port outside of NAT
|
--upnp Use UPnP to map our listening port outside of NAT
|
||||||
--limitfreerelay= Limit relay of transactions with no transaction fee
|
--limitfreerelay= Limit relay of transactions with no transaction fee
|
||||||
to the given amount in thousands of bytes per minute
|
to the given amount in thousands of bytes per
|
||||||
(15)
|
minute (15)
|
||||||
--norelaypriority Do not require free or low-fee transactions to have
|
--norelaypriority Do not require free or low-fee transactions to have
|
||||||
high priority for relaying
|
high priority for relaying
|
||||||
--maxorphantx= Max number of orphan transactions to keep in memory
|
--maxorphantx= Max number of orphan transactions to keep in memory
|
||||||
(1000)
|
(1000)
|
||||||
--generate= Generate (mine) bitcoins using the CPU
|
--generate Generate (mine) bitcoins using the CPU
|
||||||
--miningaddr= Add the specified payment address to the list of
|
--miningaddr= Add the specified payment address to the list of
|
||||||
addresses to use for generated blocks -- At least
|
addresses to use for generated blocks -- At least
|
||||||
one address is required if the generate option is set
|
one address is required if the generate option is
|
||||||
|
set
|
||||||
--blockminsize= Mininum block size in bytes to be used when creating
|
--blockminsize= Mininum block size in bytes to be used when creating
|
||||||
a block
|
a block
|
||||||
--blockmaxsize= Maximum block size in bytes to be used when creating
|
--blockmaxsize= Maximum block size in bytes to be used when creating
|
||||||
@ -97,10 +100,12 @@ Application Options:
|
|||||||
--blockprioritysize= Size in bytes for high-priority/low-fee transactions
|
--blockprioritysize= Size in bytes for high-priority/low-fee transactions
|
||||||
when creating a block (50000)
|
when creating a block (50000)
|
||||||
--getworkkey= DEPRECATED -- Use the --miningaddr option instead
|
--getworkkey= DEPRECATED -- Use the --miningaddr option instead
|
||||||
--addrindex= Build and maintain a full address index. Currently
|
--addrindex Build and maintain a full address index. Currently
|
||||||
only supported by leveldb.
|
only supported by leveldb.
|
||||||
--dropaddrindex= Deletes the address-based transaction index from the
|
--dropaddrindex Deletes the address-based transaction index from the
|
||||||
database on start up, and the exits.
|
database on start up, and the exits.
|
||||||
|
--nopeerbloomfilters Disable bloom filtering support.
|
||||||
|
|
||||||
Help Options:
|
Help Options:
|
||||||
-h, --help Show this help message
|
-h, --help Show this help message
|
||||||
|
|
||||||
|
37
peer.go
37
peer.go
@ -28,7 +28,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// maxProtocolVersion is the max protocol version the peer supports.
|
// maxProtocolVersion is the max protocol version the peer supports.
|
||||||
maxProtocolVersion = 70002
|
maxProtocolVersion = 70011
|
||||||
|
|
||||||
// outputBufferSize is the number of elements the output channels use.
|
// outputBufferSize is the number of elements the output channels use.
|
||||||
outputBufferSize = 50
|
outputBufferSize = 50
|
||||||
@ -335,8 +335,8 @@ func (p *peer) pushVersionMsg() error {
|
|||||||
// by the remote peer in its version message
|
// by the remote peer in its version message
|
||||||
msg.AddrYou.Services = wire.SFNodeNetwork
|
msg.AddrYou.Services = wire.SFNodeNetwork
|
||||||
|
|
||||||
// Advertise that we're a full node.
|
// Advertise our supported services.
|
||||||
msg.Services = wire.SFNodeNetwork
|
msg.Services = p.server.services
|
||||||
|
|
||||||
// Advertise our max supported protocol version.
|
// Advertise our max supported protocol version.
|
||||||
msg.ProtocolVersion = maxProtocolVersion
|
msg.ProtocolVersion = maxProtocolVersion
|
||||||
@ -1088,11 +1088,33 @@ func (p *peer) handleGetHeadersMsg(msg *wire.MsgGetHeaders) {
|
|||||||
p.QueueMessage(headersMsg, nil)
|
p.QueueMessage(headersMsg, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isValidBIP0111 is a helper function for the bloom filter commands to check
|
||||||
|
// BIP0111 compliance.
|
||||||
|
func (p *peer) isValidBIP0111(cmd string) bool {
|
||||||
|
if p.server.services&wire.SFNodeBloom != wire.SFNodeBloom {
|
||||||
|
if p.ProtocolVersion() >= wire.BIP0111Version {
|
||||||
|
peerLog.Debugf("%s sent an unsupported %s "+
|
||||||
|
"request -- disconnecting", p, cmd)
|
||||||
|
p.Disconnect()
|
||||||
|
} else {
|
||||||
|
peerLog.Debugf("Ignoring %s request from %s -- bloom "+
|
||||||
|
"support is disabled", cmd, p)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// handleFilterAddMsg is invoked when a peer receives a filteradd bitcoin
|
// handleFilterAddMsg is invoked when a peer receives a filteradd bitcoin
|
||||||
// message and is used by remote peers to add data to an already loaded bloom
|
// message and is used by remote peers to add data to an already loaded bloom
|
||||||
// filter. The peer will be disconnected if a filter is not loaded when this
|
// filter. The peer will be disconnected if a filter is not loaded when this
|
||||||
// message is received.
|
// message is received.
|
||||||
func (p *peer) handleFilterAddMsg(msg *wire.MsgFilterAdd) {
|
func (p *peer) handleFilterAddMsg(msg *wire.MsgFilterAdd) {
|
||||||
|
if !p.isValidBIP0111(msg.Command()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if !p.filter.IsLoaded() {
|
if !p.filter.IsLoaded() {
|
||||||
peerLog.Debugf("%s sent a filteradd request with no filter "+
|
peerLog.Debugf("%s sent a filteradd request with no filter "+
|
||||||
"loaded -- disconnecting", p)
|
"loaded -- disconnecting", p)
|
||||||
@ -1108,12 +1130,17 @@ func (p *peer) handleFilterAddMsg(msg *wire.MsgFilterAdd) {
|
|||||||
// The peer will be disconnected if a filter is not loaded when this message is
|
// The peer will be disconnected if a filter is not loaded when this message is
|
||||||
// received.
|
// received.
|
||||||
func (p *peer) handleFilterClearMsg(msg *wire.MsgFilterClear) {
|
func (p *peer) handleFilterClearMsg(msg *wire.MsgFilterClear) {
|
||||||
|
if !p.isValidBIP0111(msg.Command()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if !p.filter.IsLoaded() {
|
if !p.filter.IsLoaded() {
|
||||||
peerLog.Debugf("%s sent a filterclear request with no "+
|
peerLog.Debugf("%s sent a filterclear request with no "+
|
||||||
"filter loaded -- disconnecting", p)
|
"filter loaded -- disconnecting", p)
|
||||||
p.Disconnect()
|
p.Disconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
p.filter.Unload()
|
p.filter.Unload()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1121,6 +1148,10 @@ func (p *peer) handleFilterClearMsg(msg *wire.MsgFilterClear) {
|
|||||||
// message and it used to load a bloom filter that should be used for delivering
|
// message and it used to load a bloom filter that should be used for delivering
|
||||||
// merkle blocks and associated transactions that match the filter.
|
// merkle blocks and associated transactions that match the filter.
|
||||||
func (p *peer) handleFilterLoadMsg(msg *wire.MsgFilterLoad) {
|
func (p *peer) handleFilterLoadMsg(msg *wire.MsgFilterLoad) {
|
||||||
|
if !p.isValidBIP0111(msg.Command()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Transaction relay is no longer disabled once a filterload message is
|
// Transaction relay is no longer disabled once a filterload message is
|
||||||
// received regardless of its original state.
|
// received regardless of its original state.
|
||||||
p.relayMtx.Lock()
|
p.relayMtx.Lock()
|
||||||
|
@ -144,6 +144,8 @@
|
|||||||
; Disable listening for incoming connections. This will override all listeners.
|
; Disable listening for incoming connections. This will override all listeners.
|
||||||
; nolisten=1
|
; nolisten=1
|
||||||
|
|
||||||
|
; Disable peer bloom filtering. See BIP0111.
|
||||||
|
; nopeerbloomfilters=1
|
||||||
|
|
||||||
; ------------------------------------------------------------------------------
|
; ------------------------------------------------------------------------------
|
||||||
; RPC server options - The following options control the built-in RPC server
|
; RPC server options - The following options control the built-in RPC server
|
||||||
|
23
server.go
23
server.go
@ -28,16 +28,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// These constants are used by the DNS seed code to pick a random last seen
|
// These constants are used by the DNS seed code to pick a random last
|
||||||
// time.
|
// seen time.
|
||||||
secondsIn3Days int32 = 24 * 60 * 60 * 3
|
secondsIn3Days int32 = 24 * 60 * 60 * 3
|
||||||
secondsIn4Days int32 = 24 * 60 * 60 * 4
|
secondsIn4Days int32 = 24 * 60 * 60 * 4
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// supportedServices describes which services are supported by the
|
// defaultServices describes the default services that are supported by
|
||||||
// server.
|
// the server.
|
||||||
supportedServices = wire.SFNodeNetwork
|
defaultServices = wire.SFNodeNetwork | wire.SFNodeBloom
|
||||||
|
|
||||||
// defaultMaxOutbound is the default number of max outbound peers.
|
// defaultMaxOutbound is the default number of max outbound peers.
|
||||||
defaultMaxOutbound = 8
|
defaultMaxOutbound = 8
|
||||||
@ -109,6 +109,7 @@ type server struct {
|
|||||||
nat NAT
|
nat NAT
|
||||||
db database.Db
|
db database.Db
|
||||||
timeSource blockchain.MedianTimeSource
|
timeSource blockchain.MedianTimeSource
|
||||||
|
services wire.ServiceFlag
|
||||||
}
|
}
|
||||||
|
|
||||||
type peerState struct {
|
type peerState struct {
|
||||||
@ -1216,7 +1217,7 @@ out:
|
|||||||
continue out
|
continue out
|
||||||
}
|
}
|
||||||
na := wire.NewNetAddressIPPort(externalip, uint16(listenPort),
|
na := wire.NewNetAddressIPPort(externalip, uint16(listenPort),
|
||||||
wire.SFNodeNetwork)
|
s.services)
|
||||||
err = s.addrManager.AddLocalAddress(na, addrmgr.UpnpPrio)
|
err = s.addrManager.AddLocalAddress(na, addrmgr.UpnpPrio)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// XXX DeletePortMapping?
|
// XXX DeletePortMapping?
|
||||||
@ -1250,6 +1251,11 @@ func newServer(listenAddrs []string, db database.Db, chainParams *chaincfg.Param
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
services := defaultServices
|
||||||
|
if cfg.NoPeerBloomFilters {
|
||||||
|
services &^= wire.SFNodeBloom
|
||||||
|
}
|
||||||
|
|
||||||
amgr := addrmgr.New(cfg.DataDir, btcdLookup)
|
amgr := addrmgr.New(cfg.DataDir, btcdLookup)
|
||||||
|
|
||||||
var listeners []net.Listener
|
var listeners []net.Listener
|
||||||
@ -1287,7 +1293,7 @@ func newServer(listenAddrs []string, db database.Db, chainParams *chaincfg.Param
|
|||||||
eport = uint16(port)
|
eport = uint16(port)
|
||||||
}
|
}
|
||||||
na, err := amgr.HostToNetAddress(host, eport,
|
na, err := amgr.HostToNetAddress(host, eport,
|
||||||
wire.SFNodeNetwork)
|
services)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
srvrLog.Warnf("Not adding %s as "+
|
srvrLog.Warnf("Not adding %s as "+
|
||||||
"externalip: %v", sip, err)
|
"externalip: %v", sip, err)
|
||||||
@ -1323,7 +1329,7 @@ func newServer(listenAddrs []string, db database.Db, chainParams *chaincfg.Param
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
na := wire.NewNetAddressIPPort(ip,
|
na := wire.NewNetAddressIPPort(ip,
|
||||||
uint16(port), wire.SFNodeNetwork)
|
uint16(port), services)
|
||||||
if discover {
|
if discover {
|
||||||
err = amgr.AddLocalAddress(na, addrmgr.InterfacePrio)
|
err = amgr.AddLocalAddress(na, addrmgr.InterfacePrio)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1394,6 +1400,7 @@ func newServer(listenAddrs []string, db database.Db, chainParams *chaincfg.Param
|
|||||||
nat: nat,
|
nat: nat,
|
||||||
db: db,
|
db: db,
|
||||||
timeSource: blockchain.NewMedianTime(),
|
timeSource: blockchain.NewMedianTime(),
|
||||||
|
services: services,
|
||||||
}
|
}
|
||||||
bm, err := newBlockManager(&s)
|
bm, err := newBlockManager(&s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -151,9 +151,10 @@ Bitcoin Improvement Proposals
|
|||||||
|
|
||||||
This package includes spec changes outlined by the following BIPs:
|
This package includes spec changes outlined by the following BIPs:
|
||||||
|
|
||||||
BIP0014 (https://en.bitcoin.it/wiki/BIP_0014)
|
BIP0014 (https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki)
|
||||||
BIP0031 (https://en.bitcoin.it/wiki/BIP_0031)
|
BIP0031 (https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki)
|
||||||
BIP0035 (https://en.bitcoin.it/wiki/BIP_0035)
|
BIP0035 (https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki)
|
||||||
BIP0037 (https://en.bitcoin.it/wiki/BIP_0037)
|
BIP0037 (https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki)
|
||||||
|
BIP0111 (https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki)
|
||||||
*/
|
*/
|
||||||
package wire
|
package wire
|
||||||
|
@ -18,7 +18,7 @@ import (
|
|||||||
const MaxUserAgentLen = 2000
|
const MaxUserAgentLen = 2000
|
||||||
|
|
||||||
// DefaultUserAgent for wire in the stack
|
// DefaultUserAgent for wire in the stack
|
||||||
const DefaultUserAgent = "/btcwire:0.2.1/"
|
const DefaultUserAgent = "/btcwire:0.3.0/"
|
||||||
|
|
||||||
// MsgVersion implements the Message interface and represents a bitcoin version
|
// MsgVersion implements the Message interface and represents a bitcoin version
|
||||||
// message. It is used for a peer to advertise itself as soon as an outbound
|
// message. It is used for a peer to advertise itself as soon as an outbound
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// ProtocolVersion is the latest protocol version this package supports.
|
// ProtocolVersion is the latest protocol version this package supports.
|
||||||
ProtocolVersion uint32 = 70002
|
ProtocolVersion uint32 = 70011
|
||||||
|
|
||||||
// MultipleAddressVersion is the protocol version which added multiple
|
// MultipleAddressVersion is the protocol version which added multiple
|
||||||
// addresses per message (pver >= MultipleAddressVersion).
|
// addresses per message (pver >= MultipleAddressVersion).
|
||||||
@ -35,6 +35,10 @@ const (
|
|||||||
// with a relay flag (pver >= BIP0037Version).
|
// with a relay flag (pver >= BIP0037Version).
|
||||||
BIP0037Version uint32 = 70001
|
BIP0037Version uint32 = 70001
|
||||||
|
|
||||||
|
// BIP0111Version is the protocol version which added the SFNodeBloom
|
||||||
|
// service flag.
|
||||||
|
BIP0111Version uint32 = 70011
|
||||||
|
|
||||||
// RejectVersion is the protocol version which added a new reject
|
// RejectVersion is the protocol version which added a new reject
|
||||||
// message.
|
// message.
|
||||||
RejectVersion uint32 = 70002
|
RejectVersion uint32 = 70002
|
||||||
@ -50,12 +54,17 @@ const (
|
|||||||
// SFNodeGetUTXO is a flag used to indicate a peer supports the
|
// SFNodeGetUTXO is a flag used to indicate a peer supports the
|
||||||
// getutxos and utxos commands (BIP0064).
|
// getutxos and utxos commands (BIP0064).
|
||||||
SFNodeGetUTXO
|
SFNodeGetUTXO
|
||||||
|
|
||||||
|
// SFNodeBloom is a flag used to indiciate a peer supports bloom
|
||||||
|
// filtering.
|
||||||
|
SFNodeBloom
|
||||||
)
|
)
|
||||||
|
|
||||||
// Map of service flags back to their constant names for pretty printing.
|
// Map of service flags back to their constant names for pretty printing.
|
||||||
var sfStrings = map[ServiceFlag]string{
|
var sfStrings = map[ServiceFlag]string{
|
||||||
SFNodeNetwork: "SFNodeNetwork",
|
SFNodeNetwork: "SFNodeNetwork",
|
||||||
SFNodeGetUTXO: "SFNodeGetUTXO",
|
SFNodeGetUTXO: "SFNodeGetUTXO",
|
||||||
|
SFNodeBloom: "SFNodeBloom",
|
||||||
}
|
}
|
||||||
|
|
||||||
// orderedSFStrings is an ordered list of service flags from highest to
|
// orderedSFStrings is an ordered list of service flags from highest to
|
||||||
@ -63,6 +72,7 @@ var sfStrings = map[ServiceFlag]string{
|
|||||||
var orderedSFStrings = []ServiceFlag{
|
var orderedSFStrings = []ServiceFlag{
|
||||||
SFNodeNetwork,
|
SFNodeNetwork,
|
||||||
SFNodeGetUTXO,
|
SFNodeGetUTXO,
|
||||||
|
SFNodeBloom,
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the ServiceFlag in human-readable form.
|
// String returns the ServiceFlag in human-readable form.
|
||||||
|
@ -19,7 +19,8 @@ func TestServiceFlagStringer(t *testing.T) {
|
|||||||
{0, "0x0"},
|
{0, "0x0"},
|
||||||
{wire.SFNodeNetwork, "SFNodeNetwork"},
|
{wire.SFNodeNetwork, "SFNodeNetwork"},
|
||||||
{wire.SFNodeGetUTXO, "SFNodeGetUTXO"},
|
{wire.SFNodeGetUTXO, "SFNodeGetUTXO"},
|
||||||
{0xffffffff, "SFNodeNetwork|SFNodeGetUTXO|0xfffffffc"},
|
{wire.SFNodeBloom, "SFNodeBloom"},
|
||||||
|
{0xffffffff, "SFNodeNetwork|SFNodeGetUTXO|SFNodeBloom|0xfffffff8"},
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("Running %d tests", len(tests))
|
t.Logf("Running %d tests", len(tests))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user