Update to Core 0.12.2

This commit is contained in:
lateminer
2018-10-14 19:07:51 +03:00
parent 96498e3c6d
commit f7422db2f7
103 changed files with 4658 additions and 3365 deletions

View File

@@ -1,7 +1,12 @@
# mininode.py - Bitcoin P2P network half-a-node
#
# Distributed under the MIT/X11 software license, see the accompanying
#!/usr/bin/env python3
# Copyright (c) 2010 ArtForz -- public domain half-a-node
# Copyright (c) 2012 Jeff Garzik
# Copyright (c) 2010-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
# mininode.py - Bitcoin P2P network half-a-node
#
# This python code was modified from ArtForz' public domain half-a-node, as
# found in the mini-node branch of http://github.com/jgarzik/pynode.
@@ -20,10 +25,10 @@
import struct
import socket
import asyncore
import binascii
import time
import sys
import random
from binascii import hexlify, unhexlify
from io import BytesIO
from codecs import encode
import hashlib
@@ -34,11 +39,13 @@ import copy
BIP0031_VERSION = 60000
MY_VERSION = 60001 # past bip-31 for ping/pong
MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
MY_SUBVERSION = b"/python-mininode-tester:0.0.3/"
MAX_INV_SZ = 50000
MAX_BLOCK_SIZE = 1000000
COIN = 100000000 # 1 btc in satoshis
# Keep our own socket map for asyncore, so that we can track disconnects
# ourselves (to workaround an issue with closing an asyncore socket when
# using select)
@@ -71,44 +78,42 @@ def deser_string(f):
nit = struct.unpack("<Q", f.read(8))[0]
return f.read(nit)
def ser_string(s):
if len(s) < 253:
return struct.pack("B", len(s)) + s
elif len(s) < 0x10000:
return struct.pack("B", 253) + struct.pack("<H", len(s)) + s
elif len(s) < 0x100000000L:
return struct.pack("B", 254) + struct.pack("<I", len(s)) + s
return struct.pack("B", 255) + struct.pack("<Q", len(s)) + s
return struct.pack("<BH", 253, len(s)) + s
elif len(s) < 0x100000000:
return struct.pack("<BI", 254, len(s)) + s
return struct.pack("<BQ", 255, len(s)) + s
def deser_uint256(f):
r = 0L
for i in xrange(8):
r = 0
for i in range(8):
t = struct.unpack("<I", f.read(4))[0]
r += t << (i * 32)
return r
def ser_uint256(u):
rs = ""
for i in xrange(8):
rs += struct.pack("<I", u & 0xFFFFFFFFL)
rs = b""
for i in range(8):
rs += struct.pack("<I", u & 0xFFFFFFFF)
u >>= 32
return rs
def uint256_from_str(s):
r = 0L
r = 0
t = struct.unpack("<IIIIIIII", s[:32])
for i in xrange(8):
for i in range(8):
r += t[i] << (i * 32)
return r
def uint256_from_compact(c):
nbytes = (c >> 24) & 0xFF
v = (c & 0xFFFFFFL) << (8 * (nbytes - 3))
v = (c & 0xFFFFFF) << (8 * (nbytes - 3))
return v
@@ -121,7 +126,7 @@ def deser_vector(f, c):
elif nit == 255:
nit = struct.unpack("<Q", f.read(8))[0]
r = []
for i in xrange(nit):
for i in range(nit):
t = c()
t.deserialize(f)
r.append(t)
@@ -129,15 +134,15 @@ def deser_vector(f, c):
def ser_vector(l):
r = ""
r = b""
if len(l) < 253:
r = struct.pack("B", len(l))
elif len(l) < 0x10000:
r = struct.pack("B", 253) + struct.pack("<H", len(l))
elif len(l) < 0x100000000L:
r = struct.pack("B", 254) + struct.pack("<I", len(l))
r = struct.pack("<BH", 253, len(l))
elif len(l) < 0x100000000:
r = struct.pack("<BI", 254, len(l))
else:
r = struct.pack("B", 255) + struct.pack("<Q", len(l))
r = struct.pack("<BQ", 255, len(l))
for i in l:
r += i.serialize()
return r
@@ -152,22 +157,22 @@ def deser_uint256_vector(f):
elif nit == 255:
nit = struct.unpack("<Q", f.read(8))[0]
r = []
for i in xrange(nit):
for i in range(nit):
t = deser_uint256(f)
r.append(t)
return r
def ser_uint256_vector(l):
r = ""
r = b""
if len(l) < 253:
r = struct.pack("B", len(l))
elif len(l) < 0x10000:
r = struct.pack("B", 253) + struct.pack("<H", len(l))
elif len(l) < 0x100000000L:
r = struct.pack("B", 254) + struct.pack("<I", len(l))
r = struct.pack("<BH", 253, len(l))
elif len(l) < 0x100000000:
r = struct.pack("<BI", 254, len(l))
else:
r = struct.pack("B", 255) + struct.pack("<Q", len(l))
r = struct.pack("<BQ", 255, len(l))
for i in l:
r += ser_uint256(i)
return r
@@ -182,22 +187,22 @@ def deser_string_vector(f):
elif nit == 255:
nit = struct.unpack("<Q", f.read(8))[0]
r = []
for i in xrange(nit):
for i in range(nit):
t = deser_string(f)
r.append(t)
return r
def ser_string_vector(l):
r = ""
r = b""
if len(l) < 253:
r = struct.pack("B", len(l))
elif len(l) < 0x10000:
r = struct.pack("B", 253) + struct.pack("<H", len(l))
elif len(l) < 0x100000000L:
r = struct.pack("B", 254) + struct.pack("<I", len(l))
r = struct.pack("<BH", 253, len(l))
elif len(l) < 0x100000000:
r = struct.pack("<BI", 254, len(l))
else:
r = struct.pack("B", 255) + struct.pack("<Q", len(l))
r = struct.pack("<BQ", 255, len(l))
for sv in l:
r += ser_string(sv)
return r
@@ -212,41 +217,41 @@ def deser_int_vector(f):
elif nit == 255:
nit = struct.unpack("<Q", f.read(8))[0]
r = []
for i in xrange(nit):
for i in range(nit):
t = struct.unpack("<i", f.read(4))[0]
r.append(t)
return r
def ser_int_vector(l):
r = ""
r = b""
if len(l) < 253:
r = struct.pack("B", len(l))
elif len(l) < 0x10000:
r = struct.pack("B", 253) + struct.pack("<H", len(l))
elif len(l) < 0x100000000L:
r = struct.pack("B", 254) + struct.pack("<I", len(l))
r = struct.pack("<BH", 253, len(l))
elif len(l) < 0x100000000:
r = struct.pack("<BI", 254, len(l))
else:
r = struct.pack("B", 255) + struct.pack("<Q", len(l))
r = struct.pack("<BQ", 255, len(l))
for i in l:
r += struct.pack("<i", i)
return r
# Deserialize from a hex string representation (eg from RPC)
def FromHex(obj, hex_string):
obj.deserialize(BytesIO(binascii.unhexlify(hex_string)))
obj.deserialize(BytesIO(unhexlify(hex_string.encode('ascii'))))
return obj
# Convert a binary-serializable object to hex (eg for submission via RPC)
def ToHex(obj):
return binascii.hexlify(obj.serialize()).decode('utf-8')
return hexlify(obj.serialize()).decode('ascii')
# Objects that map to bitcoind objects, which can be serialized/deserialized
class CAddress(object):
def __init__(self):
self.nServices = 1
self.pchReserved = "\x00" * 10 + "\xff" * 2
self.pchReserved = b"\x00" * 10 + b"\xff" * 2
self.ip = "0.0.0.0"
self.port = 0
@@ -257,7 +262,7 @@ class CAddress(object):
self.port = struct.unpack(">H", f.read(2))[0]
def serialize(self):
r = ""
r = b""
r += struct.pack("<Q", self.nServices)
r += self.pchReserved
r += socket.inet_aton(self.ip)
@@ -275,7 +280,7 @@ class CInv(object):
1: "TX",
2: "Block"}
def __init__(self, t=0, h=0L):
def __init__(self, t=0, h=0):
self.type = t
self.hash = h
@@ -284,7 +289,7 @@ class CInv(object):
self.hash = deser_uint256(f)
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.type)
r += ser_uint256(self.hash)
return r
@@ -304,7 +309,7 @@ class CBlockLocator(object):
self.vHave = deser_uint256_vector(f)
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += ser_uint256_vector(self.vHave)
return r
@@ -324,7 +329,7 @@ class COutPoint(object):
self.n = struct.unpack("<I", f.read(4))[0]
def serialize(self):
r = ""
r = b""
r += ser_uint256(self.hash)
r += struct.pack("<I", self.n)
return r
@@ -334,7 +339,7 @@ class COutPoint(object):
class CTxIn(object):
def __init__(self, outpoint=None, scriptSig="", nSequence=0):
def __init__(self, outpoint=None, scriptSig=b"", nSequence=0):
if outpoint is None:
self.prevout = COutPoint()
else:
@@ -349,7 +354,7 @@ class CTxIn(object):
self.nSequence = struct.unpack("<I", f.read(4))[0]
def serialize(self):
r = ""
r = b""
r += self.prevout.serialize()
r += ser_string(self.scriptSig)
r += struct.pack("<I", self.nSequence)
@@ -357,12 +362,12 @@ class CTxIn(object):
def __repr__(self):
return "CTxIn(prevout=%s scriptSig=%s nSequence=%i)" \
% (repr(self.prevout), binascii.hexlify(self.scriptSig),
% (repr(self.prevout), hexlify(self.scriptSig),
self.nSequence)
class CTxOut(object):
def __init__(self, nValue=0, scriptPubKey=""):
def __init__(self, nValue=0, scriptPubKey=b""):
self.nValue = nValue
self.scriptPubKey = scriptPubKey
@@ -371,15 +376,15 @@ class CTxOut(object):
self.scriptPubKey = deser_string(f)
def serialize(self):
r = ""
r = b""
r += struct.pack("<q", self.nValue)
r += ser_string(self.scriptPubKey)
return r
def __repr__(self):
return "CTxOut(nValue=%i.%08i scriptPubKey=%s)" \
% (self.nValue // 100000000, self.nValue % 100000000,
binascii.hexlify(self.scriptPubKey))
% (self.nValue // COIN, self.nValue % COIN,
hexlify(self.scriptPubKey))
class CTransaction(object):
@@ -408,7 +413,7 @@ class CTransaction(object):
self.hash = None
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += ser_vector(self.vin)
r += ser_vector(self.vout)
@@ -422,12 +427,12 @@ class CTransaction(object):
def calc_sha256(self):
if self.sha256 is None:
self.sha256 = uint256_from_str(hash256(self.serialize()))
self.hash = encode(hash256(self.serialize())[::-1], 'hex')
self.hash = encode(hash256(self.serialize())[::-1], 'hex_codec').decode('ascii')
def is_valid(self):
self.calc_sha256()
for tout in self.vout:
if tout.nValue < 0 or tout.nValue > 21000000L * 100000000L:
if tout.nValue < 0 or tout.nValue > 21000000 * COIN:
return False
return True
@@ -472,7 +477,7 @@ class CBlockHeader(object):
self.hash = None
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += ser_uint256(self.hashPrevBlock)
r += ser_uint256(self.hashMerkleRoot)
@@ -483,7 +488,7 @@ class CBlockHeader(object):
def calc_sha256(self):
if self.sha256 is None:
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += ser_uint256(self.hashPrevBlock)
r += ser_uint256(self.hashMerkleRoot)
@@ -491,7 +496,7 @@ class CBlockHeader(object):
r += struct.pack("<I", self.nBits)
r += struct.pack("<I", self.nNonce)
self.sha256 = uint256_from_str(hash256(r))
self.hash = encode(hash256(r)[::-1], 'hex')
self.hash = encode(hash256(r)[::-1], 'hex_codec').decode('ascii')
def rehash(self):
self.sha256 = None
@@ -514,7 +519,7 @@ class CBlock(CBlockHeader):
self.vtx = deser_vector(f, CTransaction)
def serialize(self):
r = ""
r = b""
r += super(CBlock, self).serialize()
r += ser_vector(self.vtx)
return r
@@ -526,7 +531,7 @@ class CBlock(CBlockHeader):
hashes.append(ser_uint256(tx.sha256))
while len(hashes) > 1:
newhashes = []
for i in xrange(0, len(hashes), 2):
for i in range(0, len(hashes), 2):
i2 = min(i+1, len(hashes)-1)
newhashes.append(hash256(hashes[i] + hashes[i2]))
hashes = newhashes
@@ -569,9 +574,9 @@ class CUnsignedAlert(object):
self.nMaxVer = 0
self.setSubVer = []
self.nPriority = 0
self.strComment = ""
self.strStatusBar = ""
self.strReserved = ""
self.strComment = b""
self.strStatusBar = b""
self.strReserved = b""
def deserialize(self, f):
self.nVersion = struct.unpack("<i", f.read(4))[0]
@@ -589,7 +594,7 @@ class CUnsignedAlert(object):
self.strReserved = deser_string(f)
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += struct.pack("<q", self.nRelayUntil)
r += struct.pack("<q", self.nExpiration)
@@ -614,15 +619,15 @@ class CUnsignedAlert(object):
class CAlert(object):
def __init__(self):
self.vchMsg = ""
self.vchSig = ""
self.vchMsg = b""
self.vchSig = b""
def deserialize(self, f):
self.vchMsg = deser_string(f)
self.vchSig = deser_string(f)
def serialize(self):
r = ""
r = b""
r += ser_string(self.vchMsg)
r += ser_string(self.vchSig)
return r
@@ -634,12 +639,12 @@ class CAlert(object):
# Objects that correspond to messages on the wire
class msg_version(object):
command = "version"
command = b"version"
def __init__(self):
self.nVersion = MY_VERSION
self.nServices = 1
self.nTime = time.time()
self.nTime = int(time.time())
self.addrTo = CAddress()
self.addrFrom = CAddress()
self.nNonce = random.getrandbits(64)
@@ -670,7 +675,7 @@ class msg_version(object):
self.nStartingHeight = None
def serialize(self):
r = ""
r = b""
r += struct.pack("<i", self.nVersion)
r += struct.pack("<Q", self.nServices)
r += struct.pack("<q", self.nTime)
@@ -689,7 +694,7 @@ class msg_version(object):
class msg_verack(object):
command = "verack"
command = b"verack"
def __init__(self):
pass
@@ -698,14 +703,14 @@ class msg_verack(object):
pass
def serialize(self):
return ""
return b""
def __repr__(self):
return "msg_verack()"
class msg_addr(object):
command = "addr"
command = b"addr"
def __init__(self):
self.addrs = []
@@ -721,7 +726,7 @@ class msg_addr(object):
class msg_alert(object):
command = "alert"
command = b"alert"
def __init__(self):
self.alert = CAlert()
@@ -731,7 +736,7 @@ class msg_alert(object):
self.alert.deserialize(f)
def serialize(self):
r = ""
r = b""
r += self.alert.serialize()
return r
@@ -740,7 +745,7 @@ class msg_alert(object):
class msg_inv(object):
command = "inv"
command = b"inv"
def __init__(self, inv=None):
if inv is None:
@@ -759,7 +764,7 @@ class msg_inv(object):
class msg_getdata(object):
command = "getdata"
command = b"getdata"
def __init__(self, inv=None):
self.inv = inv if inv != None else []
@@ -775,11 +780,11 @@ class msg_getdata(object):
class msg_getblocks(object):
command = "getblocks"
command = b"getblocks"
def __init__(self):
self.locator = CBlockLocator()
self.hashstop = 0L
self.hashstop = 0
def deserialize(self, f):
self.locator = CBlockLocator()
@@ -787,7 +792,7 @@ class msg_getblocks(object):
self.hashstop = deser_uint256(f)
def serialize(self):
r = ""
r = b""
r += self.locator.serialize()
r += ser_uint256(self.hashstop)
return r
@@ -798,7 +803,7 @@ class msg_getblocks(object):
class msg_tx(object):
command = "tx"
command = b"tx"
def __init__(self, tx=CTransaction()):
self.tx = tx
@@ -814,7 +819,7 @@ class msg_tx(object):
class msg_block(object):
command = "block"
command = b"block"
def __init__(self, block=None):
if block is None:
@@ -833,7 +838,7 @@ class msg_block(object):
class msg_getaddr(object):
command = "getaddr"
command = b"getaddr"
def __init__(self):
pass
@@ -842,14 +847,14 @@ class msg_getaddr(object):
pass
def serialize(self):
return ""
return b""
def __repr__(self):
return "msg_getaddr()"
class msg_ping_prebip31(object):
command = "ping"
command = b"ping"
def __init__(self):
pass
@@ -858,23 +863,23 @@ class msg_ping_prebip31(object):
pass
def serialize(self):
return ""
return b""
def __repr__(self):
return "msg_ping() (pre-bip31)"
class msg_ping(object):
command = "ping"
command = b"ping"
def __init__(self, nonce=0L):
def __init__(self, nonce=0):
self.nonce = nonce
def deserialize(self, f):
self.nonce = struct.unpack("<Q", f.read(8))[0]
def serialize(self):
r = ""
r = b""
r += struct.pack("<Q", self.nonce)
return r
@@ -883,16 +888,16 @@ class msg_ping(object):
class msg_pong(object):
command = "pong"
command = b"pong"
def __init__(self, nonce=0L):
def __init__(self, nonce=0):
self.nonce = nonce
def deserialize(self, f):
self.nonce = struct.unpack("<Q", f.read(8))[0]
def serialize(self):
r = ""
r = b""
r += struct.pack("<Q", self.nonce)
return r
@@ -901,7 +906,7 @@ class msg_pong(object):
class msg_mempool(object):
command = "mempool"
command = b"mempool"
def __init__(self):
pass
@@ -910,13 +915,13 @@ class msg_mempool(object):
pass
def serialize(self):
return ""
return b""
def __repr__(self):
return "msg_mempool()"
class msg_sendheaders(object):
command = "sendheaders"
command = b"sendheaders"
def __init__(self):
pass
@@ -925,21 +930,22 @@ class msg_sendheaders(object):
pass
def serialize(self):
return ""
return b""
def __repr__(self):
return "msg_sendheaders()"
# getheaders message has
# number of entries
# vector of hashes
# hash_stop (hash of last desired block header, 0 to get as many as possible)
class msg_getheaders(object):
command = "getheaders"
command = b"getheaders"
def __init__(self):
self.locator = CBlockLocator()
self.hashstop = 0L
self.hashstop = 0
def deserialize(self, f):
self.locator = CBlockLocator()
@@ -947,7 +953,7 @@ class msg_getheaders(object):
self.hashstop = deser_uint256(f)
def serialize(self):
r = ""
r = b""
r += self.locator.serialize()
r += ser_uint256(self.hashstop)
return r
@@ -960,7 +966,7 @@ class msg_getheaders(object):
# headers message has
# <count> <vector of block headers>
class msg_headers(object):
command = "headers"
command = b"headers"
def __init__(self):
self.headers = []
@@ -980,26 +986,29 @@ class msg_headers(object):
class msg_reject(object):
command = "reject"
command = b"reject"
REJECT_MALFORMED = 1
def __init__(self):
self.message = ""
self.code = ""
self.reason = ""
self.data = 0L
self.message = b""
self.code = 0
self.reason = b""
self.data = 0
def deserialize(self, f):
self.message = deser_string(f)
self.code = struct.unpack("<B", f.read(1))[0]
self.reason = deser_string(f)
if (self.message == "block" or self.message == "tx"):
if (self.code != self.REJECT_MALFORMED and
(self.message == b"block" or self.message == b"tx")):
self.data = deser_uint256(f)
def serialize(self):
r = ser_string(self.message)
r += struct.pack("<B", self.code)
r += ser_string(self.reason)
if (self.message == "block" or self.message == "tx"):
if (self.code != self.REJECT_MALFORMED and
(self.message == b"block" or self.message == b"tx")):
r += ser_uint256(self.data)
return r
@@ -1074,10 +1083,10 @@ class NodeConnCB(object):
time.sleep(deliver_sleep)
with mininode_lock:
try:
getattr(self, 'on_' + message.command)(conn, message)
getattr(self, 'on_' + message.command.decode('ascii'))(conn, message)
except:
print "ERROR delivering %s (%s)" % (repr(message),
sys.exc_info()[0])
print("ERROR delivering %s (%s)" % (repr(message),
sys.exc_info()[0]))
def on_version(self, conn, message):
if message.nVersion >= 209:
@@ -1115,6 +1124,7 @@ class NodeConnCB(object):
def on_mempool(self, conn): pass
def on_pong(self, conn, message): pass
def on_feefilter(self, conn, message): pass
def on_sendheaders(self, conn, message): pass
# More useful callbacks and functions for NodeConnCB's which have a single NodeConn
class SingleNodeConnCB(NodeConnCB):
@@ -1147,28 +1157,29 @@ class SingleNodeConnCB(NodeConnCB):
# This class provides an interface for a p2p connection to a specified node
class NodeConn(asyncore.dispatcher):
messagemap = {
"version": msg_version,
"verack": msg_verack,
"addr": msg_addr,
"alert": msg_alert,
"inv": msg_inv,
"getdata": msg_getdata,
"getblocks": msg_getblocks,
"tx": msg_tx,
"block": msg_block,
"getaddr": msg_getaddr,
"ping": msg_ping,
"pong": msg_pong,
"headers": msg_headers,
"getheaders": msg_getheaders,
"reject": msg_reject,
"mempool": msg_mempool,
"feefilter": msg_feefilter
b"version": msg_version,
b"verack": msg_verack,
b"addr": msg_addr,
b"alert": msg_alert,
b"inv": msg_inv,
b"getdata": msg_getdata,
b"getblocks": msg_getblocks,
b"tx": msg_tx,
b"block": msg_block,
b"getaddr": msg_getaddr,
b"ping": msg_ping,
b"pong": msg_pong,
b"headers": msg_headers,
b"getheaders": msg_getheaders,
b"reject": msg_reject,
b"mempool": msg_mempool,
b"feefilter": msg_feefilter,
b"sendheaders": msg_sendheaders
}
MAGIC_BYTES = {
"mainnet": "\xf9\xbe\xb4\xd9", # mainnet
"testnet3": "\x0b\x11\x09\x07", # testnet3
"regtest": "\xfa\xbf\xb5\xda" # regtest
"mainnet": b"\xf9\xbe\xb4\xd9", # mainnet
"testnet3": b"\x0b\x11\x09\x07", # testnet3
"regtest": b"\xfa\xbf\xb5\xda" # regtest
}
def __init__(self, dstaddr, dstport, rpc, callback, net="regtest", services=1):
@@ -1177,8 +1188,8 @@ class NodeConn(asyncore.dispatcher):
self.dstaddr = dstaddr
self.dstport = dstport
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.sendbuf = ""
self.recvbuf = ""
self.sendbuf = b""
self.recvbuf = b""
self.ver_send = 209
self.ver_recv = 209
self.last_sent = 0
@@ -1195,8 +1206,8 @@ class NodeConn(asyncore.dispatcher):
vt.addrFrom.ip = "0.0.0.0"
vt.addrFrom.port = 0
self.send_message(vt, True)
print 'MiniNode: Connecting to Bitcoin Node IP # ' + dstaddr + ':' \
+ str(dstport)
print('MiniNode: Connecting to Bitcoin Node IP # ' + dstaddr + ':' \
+ str(dstport))
try:
self.connect((dstaddr, dstport))
@@ -1215,8 +1226,8 @@ class NodeConn(asyncore.dispatcher):
self.show_debug_msg("MiniNode: Closing Connection to %s:%d... "
% (self.dstaddr, self.dstport))
self.state = "closed"
self.recvbuf = ""
self.sendbuf = ""
self.recvbuf = b""
self.sendbuf = b""
try:
self.close()
except:
@@ -1250,43 +1261,48 @@ class NodeConn(asyncore.dispatcher):
self.sendbuf = self.sendbuf[sent:]
def got_data(self):
while True:
if len(self.recvbuf) < 4:
return
if self.recvbuf[:4] != self.MAGIC_BYTES[self.network]:
raise ValueError("got garbage %s" % repr(self.recvbuf))
if self.ver_recv < 209:
if len(self.recvbuf) < 4 + 12 + 4:
try:
while True:
if len(self.recvbuf) < 4:
return
command = self.recvbuf[4:4+12].split("\x00", 1)[0]
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
checksum = None
if len(self.recvbuf) < 4 + 12 + 4 + msglen:
return
msg = self.recvbuf[4+12+4:4+12+4+msglen]
self.recvbuf = self.recvbuf[4+12+4+msglen:]
else:
if len(self.recvbuf) < 4 + 12 + 4 + 4:
return
command = self.recvbuf[4:4+12].split("\x00", 1)[0]
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
checksum = self.recvbuf[4+12+4:4+12+4+4]
if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
return
msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
th = sha256(msg)
h = sha256(th)
if checksum != h[:4]:
raise ValueError("got bad checksum " + repr(self.recvbuf))
self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
if command in self.messagemap:
f = BytesIO(msg)
t = self.messagemap[command]()
t.deserialize(f)
self.got_message(t)
else:
self.show_debug_msg("Unknown command: '" + command + "' " +
repr(msg))
if self.recvbuf[:4] != self.MAGIC_BYTES[self.network]:
raise ValueError("got garbage %s" % repr(self.recvbuf))
if self.ver_recv < 209:
if len(self.recvbuf) < 4 + 12 + 4:
return
command = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
checksum = None
if len(self.recvbuf) < 4 + 12 + 4 + msglen:
return
msg = self.recvbuf[4+12+4:4+12+4+msglen]
self.recvbuf = self.recvbuf[4+12+4+msglen:]
else:
if len(self.recvbuf) < 4 + 12 + 4 + 4:
return
command = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
checksum = self.recvbuf[4+12+4:4+12+4+4]
if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
return
msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
th = sha256(msg)
h = sha256(th)
if checksum != h[:4]:
raise ValueError("got bad checksum " + repr(self.recvbuf))
self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
if command in self.messagemap:
f = BytesIO(msg)
t = self.messagemap[command]()
t.deserialize(f)
self.got_message(t)
else:
self.show_debug_msg("Unknown command: '" + command + "' " +
repr(msg))
except Exception as e:
print('got_data:', repr(e))
# import traceback
# traceback.print_tb(sys.exc_info()[2])
def send_message(self, message, pushbuf=False):
if self.state != "connected" and not pushbuf:
@@ -1296,7 +1312,7 @@ class NodeConn(asyncore.dispatcher):
data = message.serialize()
tmsg = self.MAGIC_BYTES[self.network]
tmsg += command
tmsg += "\x00" * (12 - len(command))
tmsg += b"\x00" * (12 - len(command))
tmsg += struct.pack("<I", len(data))
if self.ver_send >= 209:
th = sha256(data)
@@ -1308,11 +1324,11 @@ class NodeConn(asyncore.dispatcher):
self.last_sent = time.time()
def got_message(self, message):
if message.command == "version":
if message.command == b"version":
if message.nVersion <= BIP0031_VERSION:
self.messagemap['ping'] = msg_ping_prebip31
self.messagemap[b'ping'] = msg_ping_prebip31
if self.last_sent + 30 * 60 < time.time():
self.send_message(self.messagemap['ping']())
self.send_message(self.messagemap[b'ping']())
self.show_debug_msg("Recv %s" % repr(message))
self.cb.deliver(self, message)