generalize mininode.py protocol versioning
This commit is contained in:
parent
871e1726c6
commit
c0aa34a4b2
|
@ -4,7 +4,7 @@
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \
|
from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \
|
||||||
msg_ping, MY_VERSION, OVERWINTER_PROTO_VERSION
|
msg_ping, SPROUT_PROTO_VERSION, OVERWINTER_PROTO_VERSION
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import initialize_chain_clean, start_nodes, \
|
from test_framework.util import initialize_chain_clean, start_nodes, \
|
||||||
p2p_port, assert_equal
|
p2p_port, assert_equal
|
||||||
|
@ -55,8 +55,10 @@ class OverwinterPeerManagementTest(BitcoinTestFramework):
|
||||||
# Launch 10 Sprout and 10 Overwinter mininodes
|
# Launch 10 Sprout and 10 Overwinter mininodes
|
||||||
nodes = []
|
nodes = []
|
||||||
for x in xrange(10):
|
for x in xrange(10):
|
||||||
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", False))
|
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0],
|
||||||
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", True))
|
test, "regtest", SPROUT_PROTO_VERSION))
|
||||||
|
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0],
|
||||||
|
test, "regtest", OVERWINTER_PROTO_VERSION))
|
||||||
|
|
||||||
# Start up network handling in another thread
|
# Start up network handling in another thread
|
||||||
NetworkThread().start()
|
NetworkThread().start()
|
||||||
|
@ -68,7 +70,7 @@ class OverwinterPeerManagementTest(BitcoinTestFramework):
|
||||||
# Verify mininodes are still connected to zcashd node
|
# Verify mininodes are still connected to zcashd node
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(10, versions.count(MY_VERSION))
|
assert_equal(10, versions.count(SPROUT_PROTO_VERSION))
|
||||||
assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION))
|
assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION))
|
||||||
|
|
||||||
# Overwinter consensus rules activate at block height 10
|
# Overwinter consensus rules activate at block height 10
|
||||||
|
@ -86,19 +88,19 @@ class OverwinterPeerManagementTest(BitcoinTestFramework):
|
||||||
# Verify Sprout mininodes have been dropped and Overwinter mininodes are still connected.
|
# Verify Sprout mininodes have been dropped and Overwinter mininodes are still connected.
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(0, versions.count(MY_VERSION))
|
assert_equal(0, versions.count(SPROUT_PROTO_VERSION))
|
||||||
assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION))
|
assert_equal(10, versions.count(OVERWINTER_PROTO_VERSION))
|
||||||
|
|
||||||
# Extend the Overwinter chain with another block.
|
# Extend the Overwinter chain with another block.
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
|
|
||||||
# Connect a new Overwinter mininode to the zcashd node, which is accepted.
|
# Connect a new Overwinter mininode to the zcashd node, which is accepted.
|
||||||
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", True))
|
nodes.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", OVERWINTER_PROTO_VERSION))
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
assert_equal(11, len(self.nodes[0].getpeerinfo()))
|
assert_equal(11, len(self.nodes[0].getpeerinfo()))
|
||||||
|
|
||||||
# Try to connect a new Sprout mininode to the zcashd node, which is rejected.
|
# Try to connect a new Sprout mininode to the zcashd node, which is rejected.
|
||||||
sprout = NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", False)
|
sprout = NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test, "regtest", SPROUT_PROTO_VERSION)
|
||||||
nodes.append(sprout)
|
nodes.append(sprout)
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
assert("Version must be 170003 or greater" in str(sprout.rejectMessage))
|
assert("Version must be 170003 or greater" in str(sprout.rejectMessage))
|
||||||
|
@ -106,7 +108,7 @@ class OverwinterPeerManagementTest(BitcoinTestFramework):
|
||||||
# Verify that only Overwinter mininodes are connected.
|
# Verify that only Overwinter mininodes are connected.
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(0, versions.count(MY_VERSION))
|
assert_equal(0, versions.count(SPROUT_PROTO_VERSION))
|
||||||
assert_equal(11, versions.count(OVERWINTER_PROTO_VERSION))
|
assert_equal(11, versions.count(OVERWINTER_PROTO_VERSION))
|
||||||
|
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \
|
from test_framework.mininode import NodeConn, NodeConnCB, NetworkThread, \
|
||||||
msg_filteradd, msg_filterclear, mininode_lock, MY_VERSION
|
msg_filteradd, msg_filterclear, mininode_lock, SPROUT_PROTO_VERSION
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import initialize_chain_clean, start_nodes, \
|
from test_framework.util import initialize_chain_clean, start_nodes, \
|
||||||
p2p_port, assert_equal
|
p2p_port, assert_equal
|
||||||
|
@ -72,10 +72,10 @@ class NodeBloomTest(BitcoinTestFramework):
|
||||||
# Verify mininodes are connected to zcashd nodes
|
# Verify mininodes are connected to zcashd nodes
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(1, versions.count(MY_VERSION))
|
assert_equal(1, versions.count(SPROUT_PROTO_VERSION))
|
||||||
peerinfo = self.nodes[1].getpeerinfo()
|
peerinfo = self.nodes[1].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(1, versions.count(MY_VERSION))
|
assert_equal(1, versions.count(SPROUT_PROTO_VERSION))
|
||||||
|
|
||||||
# Mininodes send filterclear message to zcashd node.
|
# Mininodes send filterclear message to zcashd node.
|
||||||
nobf_node.send_message(msg_filterclear())
|
nobf_node.send_message(msg_filterclear())
|
||||||
|
@ -86,10 +86,10 @@ class NodeBloomTest(BitcoinTestFramework):
|
||||||
# Verify mininodes are still connected to zcashd nodes
|
# Verify mininodes are still connected to zcashd nodes
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(1, versions.count(MY_VERSION))
|
assert_equal(1, versions.count(SPROUT_PROTO_VERSION))
|
||||||
peerinfo = self.nodes[1].getpeerinfo()
|
peerinfo = self.nodes[1].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(1, versions.count(MY_VERSION))
|
assert_equal(1, versions.count(SPROUT_PROTO_VERSION))
|
||||||
|
|
||||||
# Mininodes send filteradd message to zcashd node.
|
# Mininodes send filteradd message to zcashd node.
|
||||||
nobf_node.send_message(msg_filteradd())
|
nobf_node.send_message(msg_filteradd())
|
||||||
|
@ -100,10 +100,10 @@ class NodeBloomTest(BitcoinTestFramework):
|
||||||
# Verify NoBF mininode has been dropped, and BF mininode is still connected.
|
# Verify NoBF mininode has been dropped, and BF mininode is still connected.
|
||||||
peerinfo = self.nodes[0].getpeerinfo()
|
peerinfo = self.nodes[0].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(0, versions.count(MY_VERSION))
|
assert_equal(0, versions.count(SPROUT_PROTO_VERSION))
|
||||||
peerinfo = self.nodes[1].getpeerinfo()
|
peerinfo = self.nodes[1].getpeerinfo()
|
||||||
versions = [x["version"] for x in peerinfo]
|
versions = [x["version"] for x in peerinfo]
|
||||||
assert_equal(1, versions.count(MY_VERSION))
|
assert_equal(1, versions.count(SPROUT_PROTO_VERSION))
|
||||||
|
|
||||||
[ c.disconnect_node() for c in connections ]
|
[ c.disconnect_node() for c in connections ]
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ class TxExpiryDoSTest(BitcoinTestFramework):
|
||||||
|
|
||||||
connections = []
|
connections = []
|
||||||
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0],
|
connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0],
|
||||||
test_node, "regtest", True))
|
test_node, "regtest", OVERWINTER_PROTO_VERSION))
|
||||||
test_node.add_connection(connections[0])
|
test_node.add_connection(connections[0])
|
||||||
|
|
||||||
# Start up network handling in another thread
|
# Start up network handling in another thread
|
||||||
|
|
|
@ -41,7 +41,7 @@ from .equihash import (
|
||||||
|
|
||||||
OVERWINTER_PROTO_VERSION = 170003
|
OVERWINTER_PROTO_VERSION = 170003
|
||||||
BIP0031_VERSION = 60000
|
BIP0031_VERSION = 60000
|
||||||
MY_VERSION = 170002 # past bip-31 for ping/pong
|
SPROUT_PROTO_VERSION = 170002 # past bip-31 for ping/pong
|
||||||
MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
|
MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
|
||||||
|
|
||||||
OVERWINTER_VERSION_GROUP_ID = 0x03C48270
|
OVERWINTER_VERSION_GROUP_ID = 0x03C48270
|
||||||
|
@ -330,7 +330,7 @@ class CInv(object):
|
||||||
|
|
||||||
class CBlockLocator(object):
|
class CBlockLocator(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.nVersion = MY_VERSION
|
self.nVersion = SPROUT_PROTO_VERSION
|
||||||
self.vHave = []
|
self.vHave = []
|
||||||
|
|
||||||
def deserialize(self, f):
|
def deserialize(self, f):
|
||||||
|
@ -901,12 +901,8 @@ class CAlert(object):
|
||||||
class msg_version(object):
|
class msg_version(object):
|
||||||
command = "version"
|
command = "version"
|
||||||
|
|
||||||
def __init__(self, overwintered=False):
|
def __init__(self, protocol_version=SPROUT_PROTO_VERSION):
|
||||||
if overwintered:
|
self.nVersion = protocol_version
|
||||||
self.nVersion = OVERWINTER_PROTO_VERSION
|
|
||||||
else:
|
|
||||||
self.nVersion = MY_VERSION
|
|
||||||
|
|
||||||
self.nServices = 1
|
self.nServices = 1
|
||||||
self.nTime = time.time()
|
self.nTime = time.time()
|
||||||
self.addrTo = CAddress()
|
self.addrTo = CAddress()
|
||||||
|
@ -1334,7 +1330,7 @@ class NodeConnCB(object):
|
||||||
def on_version(self, conn, message):
|
def on_version(self, conn, message):
|
||||||
if message.nVersion >= 209:
|
if message.nVersion >= 209:
|
||||||
conn.send_message(msg_verack())
|
conn.send_message(msg_verack())
|
||||||
conn.ver_send = min(MY_VERSION, message.nVersion)
|
conn.ver_send = min(SPROUT_PROTO_VERSION, message.nVersion)
|
||||||
if message.nVersion < 209:
|
if message.nVersion < 209:
|
||||||
conn.ver_recv = conn.ver_send
|
conn.ver_recv = conn.ver_send
|
||||||
|
|
||||||
|
@ -1395,7 +1391,7 @@ class NodeConn(asyncore.dispatcher):
|
||||||
"regtest": "\xaa\xe8\x3f\x5f" # regtest
|
"regtest": "\xaa\xe8\x3f\x5f" # regtest
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", overwintered=False):
|
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", protocol_version=SPROUT_PROTO_VERSION):
|
||||||
asyncore.dispatcher.__init__(self, map=mininode_socket_map)
|
asyncore.dispatcher.__init__(self, map=mininode_socket_map)
|
||||||
self.log = logging.getLogger("NodeConn(%s:%d)" % (dstaddr, dstport))
|
self.log = logging.getLogger("NodeConn(%s:%d)" % (dstaddr, dstport))
|
||||||
self.dstaddr = dstaddr
|
self.dstaddr = dstaddr
|
||||||
|
@ -1412,7 +1408,7 @@ class NodeConn(asyncore.dispatcher):
|
||||||
self.disconnect = False
|
self.disconnect = False
|
||||||
|
|
||||||
# stuff version msg into sendbuf
|
# stuff version msg into sendbuf
|
||||||
vt = msg_version(overwintered)
|
vt = msg_version(protocol_version)
|
||||||
vt.addrTo.ip = self.dstaddr
|
vt.addrTo.ip = self.dstaddr
|
||||||
vt.addrTo.port = self.dstport
|
vt.addrTo.port = self.dstport
|
||||||
vt.addrFrom.ip = "0.0.0.0"
|
vt.addrFrom.ip = "0.0.0.0"
|
||||||
|
|
Loading…
Reference in New Issue