c9ee3d9c5e
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
140 lines
3.8 KiB
Go
140 lines
3.8 KiB
Go
// Copyright (c) 2013-2015 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package wire
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
// ProtocolVersion is the latest protocol version this package supports.
|
|
ProtocolVersion uint32 = 70011
|
|
|
|
// MultipleAddressVersion is the protocol version which added multiple
|
|
// addresses per message (pver >= MultipleAddressVersion).
|
|
MultipleAddressVersion uint32 = 209
|
|
|
|
// NetAddressTimeVersion is the protocol version which added the
|
|
// timestamp field (pver >= NetAddressTimeVersion).
|
|
NetAddressTimeVersion uint32 = 31402
|
|
|
|
// BIP0031Version is the protocol version AFTER which a pong message
|
|
// and nonce field in ping were added (pver > BIP0031Version).
|
|
BIP0031Version uint32 = 60000
|
|
|
|
// BIP0035Version is the protocol version which added the mempool
|
|
// message (pver >= BIP0035Version).
|
|
BIP0035Version uint32 = 60002
|
|
|
|
// BIP0037Version is the protocol version which added new connection
|
|
// bloom filtering related messages and extended the version message
|
|
// with a relay flag (pver >= BIP0037Version).
|
|
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
|
|
// message.
|
|
RejectVersion uint32 = 70002
|
|
)
|
|
|
|
// ServiceFlag identifies services supported by a bitcoin peer.
|
|
type ServiceFlag uint64
|
|
|
|
const (
|
|
// SFNodeNetwork is a flag used to indicate a peer is a full node.
|
|
SFNodeNetwork ServiceFlag = 1 << iota
|
|
|
|
// SFNodeGetUTXO is a flag used to indicate a peer supports the
|
|
// getutxos and utxos commands (BIP0064).
|
|
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.
|
|
var sfStrings = map[ServiceFlag]string{
|
|
SFNodeNetwork: "SFNodeNetwork",
|
|
SFNodeGetUTXO: "SFNodeGetUTXO",
|
|
SFNodeBloom: "SFNodeBloom",
|
|
}
|
|
|
|
// orderedSFStrings is an ordered list of service flags from highest to
|
|
// lowest.
|
|
var orderedSFStrings = []ServiceFlag{
|
|
SFNodeNetwork,
|
|
SFNodeGetUTXO,
|
|
SFNodeBloom,
|
|
}
|
|
|
|
// String returns the ServiceFlag in human-readable form.
|
|
func (f ServiceFlag) String() string {
|
|
// No flags are set.
|
|
if f == 0 {
|
|
return "0x0"
|
|
}
|
|
|
|
// Add individual bit flags.
|
|
s := ""
|
|
for _, flag := range orderedSFStrings {
|
|
if f&flag == flag {
|
|
s += sfStrings[flag] + "|"
|
|
f -= flag
|
|
}
|
|
}
|
|
|
|
// Add any remaining flags which aren't accounted for as hex.
|
|
s = strings.TrimRight(s, "|")
|
|
if f != 0 {
|
|
s += "|0x" + strconv.FormatUint(uint64(f), 16)
|
|
}
|
|
s = strings.TrimLeft(s, "|")
|
|
return s
|
|
}
|
|
|
|
// BitcoinNet represents which bitcoin network a message belongs to.
|
|
type BitcoinNet uint32
|
|
|
|
// Constants used to indicate the message bitcoin network. They can also be
|
|
// used to seek to the next message when a stream's state is unknown, but
|
|
// this package does not provide that functionality since it's generally a
|
|
// better idea to simply disconnect clients that are misbehaving over TCP.
|
|
const (
|
|
// MainNet represents the main bitcoin network.
|
|
MainNet BitcoinNet = 0xd9b4bef9
|
|
|
|
// TestNet represents the regression test network.
|
|
TestNet BitcoinNet = 0xdab5bffa
|
|
|
|
// TestNet3 represents the test network (version 3).
|
|
TestNet3 BitcoinNet = 0x0709110b
|
|
|
|
// SimNet represents the simulation test network.
|
|
SimNet BitcoinNet = 0x12141c16
|
|
)
|
|
|
|
// bnStrings is a map of bitcoin networks back to their constant names for
|
|
// pretty printing.
|
|
var bnStrings = map[BitcoinNet]string{
|
|
MainNet: "MainNet",
|
|
TestNet: "TestNet",
|
|
TestNet3: "TestNet3",
|
|
SimNet: "SimNet",
|
|
}
|
|
|
|
// String returns the BitcoinNet in human-readable form.
|
|
func (n BitcoinNet) String() string {
|
|
if s, ok := bnStrings[n]; ok {
|
|
return s
|
|
}
|
|
|
|
return fmt.Sprintf("Unknown BitcoinNet (%d)", uint32(n))
|
|
}
|