X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=p2pool%2Fbitcoin%2Fp2p.py;h=83a3403f0f94695db3153d5e8419594e26f21aaf;hb=0a3493d6873cfef4fb189d39e64dfbc6e162e2a7;hp=9ac6e9edbb9808c28f54f4f7f8f0e99f92533e10;hpb=930d0025ae95e70dc2043c90809885f0ef33c0b5;p=p2pool.git diff --git a/p2pool/bitcoin/p2p.py b/p2pool/bitcoin/p2p.py index 9ac6e9e..83a3403 100644 --- a/p2pool/bitcoin/p2p.py +++ b/p2pool/bitcoin/p2p.py @@ -3,16 +3,18 @@ Implementation of Bitcoin's p2p protocol ''' import random +import sys import time -from twisted.internet import defer, protocol, reactor, task +from twisted.internet import protocol +import p2pool from . import data as bitcoin_data from p2pool.util import deferral, p2protocol, pack, variable class Protocol(p2protocol.Protocol): def __init__(self, net): - p2protocol.Protocol.__init__(self, net.P2P_PREFIX, 1000000) + p2protocol.Protocol.__init__(self, net.P2P_PREFIX, 1000000, ignore_trailing_payload=True) def connectionMade(self): self.send_version( @@ -30,7 +32,7 @@ class Protocol(p2protocol.Protocol): port=self.transport.getHost().port, ), nonce=random.randrange(2**64), - sub_version_num='', + sub_version_num='/P2Pool:%s/' % (p2pool.__version__,), start_height=0, ) @@ -51,34 +53,33 @@ class Protocol(p2protocol.Protocol): def handle_verack(self): self.get_block = deferral.ReplyMatcher(lambda hash: self.send_getdata(requests=[dict(type='block', hash=hash)])) self.get_block_header = deferral.ReplyMatcher(lambda hash: self.send_getheaders(version=1, have=[], last=hash)) - self.get_tx = deferral.ReplyMatcher(lambda hash: self.send_getdata(requests=[dict(type='tx', hash=hash)])) if hasattr(self.factory, 'resetDelay'): self.factory.resetDelay() if hasattr(self.factory, 'gotConnection'): self.factory.gotConnection(self) - self.pinger = task.LoopingCall(self.send_ping) + self.pinger = deferral.RobustLoopingCall(self.send_ping) self.pinger.start(30) message_inv = pack.ComposedType([ ('invs', pack.ListType(pack.ComposedType([ - ('type', pack.EnumType(pack.IntType(32), {'tx': 1, 'block': 2})), + ('type', pack.EnumType(pack.IntType(32), {1: 'tx', 2: 'block'})), ('hash', pack.IntType(256)), ]))), ]) def handle_inv(self, invs): for inv in invs: if inv['type'] == 'tx': - self.factory.new_tx.happened(inv['hash']) + self.send_getdata(requests=[inv]) elif inv['type'] == 'block': self.factory.new_block.happened(inv['hash']) else: - print 'Unknown inv type', item + print 'Unknown inv type', inv message_getdata = pack.ComposedType([ ('requests', pack.ListType(pack.ComposedType([ - ('type', pack.EnumType(pack.IntType(32), {'tx': 1, 'block': 2})), + ('type', pack.EnumType(pack.IntType(32), {1: 'tx', 2: 'block'})), ('hash', pack.IntType(256)), ]))), ]) @@ -108,7 +109,7 @@ class Protocol(p2protocol.Protocol): ('tx', bitcoin_data.tx_type), ]) def handle_tx(self, tx): - self.get_tx.got_response(bitcoin_data.hash256(bitcoin_data.tx_type.pack(tx)), tx) + self.factory.new_tx.happened(tx) message_block = pack.ComposedType([ ('block', bitcoin_data.block_type), @@ -136,14 +137,15 @@ class Protocol(p2protocol.Protocol): ('signature', pack.VarStrType()), ]) def handle_alert(self, message, signature): - print 'ALERT:', (message, signature) + pass # print 'ALERT:', (message, signature) def connectionLost(self, reason): if hasattr(self.factory, 'gotConnection'): self.factory.gotConnection(None) if hasattr(self, 'pinger'): self.pinger.stop() - print 'Bitcoin connection lost. Reason:', reason.getErrorMessage() + if p2pool.DEBUG: + print >>sys.stderr, 'Bitcoin connection lost. Reason:', reason.getErrorMessage() class ClientFactory(protocol.ReconnectingClientFactory): protocol = Protocol @@ -168,20 +170,3 @@ class ClientFactory(protocol.ReconnectingClientFactory): def getProtocol(self): return self.conn.get_not_none() - -if __name__ == '__main__': - from . import networks - factory = ClientFactory(networks.BitcoinMainnet) - reactor.connectTCP('127.0.0.1', 8333, factory) - - @repr - @apply - @defer.inlineCallbacks - def think(): - try: - print (yield (yield factory.getProtocol()).get_block(0x000000000000003aaaf7638f9f9c0d0c60e8b0eb817dcdb55fd2b1964efc5175)) - except defer.TimeoutError: - print "timeout" - reactor.stop() - - reactor.run()