X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=p2pool%2Fbitcoin%2Fp2p.py;h=d6f50c22b54f2419825c6299a35955ce924115fd;hb=ae8740b9d8a417e6b4fd119f2cc646d86d0ae639;hp=aba9532e406eb5fb9da5edd59f7f4a81e7c05275;hpb=4cf120492b2750b2e81bade672b52393005a0fee;p=p2pool.git diff --git a/p2pool/bitcoin/p2p.py b/p2pool/bitcoin/p2p.py index aba9532..d6f50c2 100644 --- a/p2pool/bitcoin/p2p.py +++ b/p2pool/bitcoin/p2p.py @@ -2,114 +2,23 @@ Implementation of Bitcoin's p2p protocol ''' -from __future__ import division - -import hashlib import random -import struct +import sys import time -import traceback -from twisted.internet import protocol, reactor +from twisted.internet import protocol +import p2pool from . import data as bitcoin_data -from p2pool.util import variable, datachunker, deferral - -class BaseProtocol(protocol.Protocol): - def connectionMade(self): - self.dataReceived = datachunker.DataChunker(self.dataReceiver()) - - def dataReceiver(self): - while True: - start = '' - while start != self._prefix: - start = (start + (yield 1))[-len(self._prefix):] - - command = (yield 12).rstrip('\0') - length, = struct.unpack('= 12: - raise ValueError('command too long') - if self.use_checksum: - checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4] - else: - checksum = '' - data = self._prefix + struct.pack('<12sI', command, len(payload)) + checksum + payload - self.transport.write(data) - #print 'SEND', command, payload2 - - def __getattr__(self, attr): - prefix = 'send_' - if attr.startswith(prefix): - command = attr[len(prefix):] - return lambda **payload2: self.sendPacket(command, payload2) - #return protocol.Protocol.__getattr__(self, attr) - raise AttributeError(attr) +from p2pool.util import deferral, p2protocol, pack, variable -class Protocol(BaseProtocol): +class Protocol(p2protocol.Protocol): def __init__(self, net): - self._prefix = net.BITCOIN_P2P_PREFIX - - version = 0 - - @property - def use_checksum(self): - return self.version >= 209 - - - null_order = '\0'*60 + p2protocol.Protocol.__init__(self, net.P2P_PREFIX, 1000000, ignore_trailing_payload=True) def connectionMade(self): - BaseProtocol.connectionMade(self) - self.send_version( - version=32200, + version=70002, services=1, time=int(time.time()), addr_to=dict( @@ -123,85 +32,72 @@ class Protocol(BaseProtocol): port=self.transport.getHost().port, ), nonce=random.randrange(2**64), - sub_version_num='', + sub_version_num='/P2Pool:%s/' % (p2pool.__version__,), start_height=0, ) - message_version = bitcoin_data.ComposedType([ - ('version', bitcoin_data.StructType('>sys.stderr, 'Bitcoin connection lost. Reason:', reason.getErrorMessage() class ClientFactory(protocol.ReconnectingClientFactory): protocol = Protocol - maxDelay = 15 + maxDelay = 1 def __init__(self, net): self.net = net @@ -263,6 +166,7 @@ class ClientFactory(protocol.ReconnectingClientFactory): self.new_block = variable.Event() self.new_tx = variable.Event() + self.new_headers = variable.Event() def buildProtocol(self, addr): p = self.protocol(self.net) @@ -274,15 +178,3 @@ class ClientFactory(protocol.ReconnectingClientFactory): def getProtocol(self): return self.conn.get_not_none() - -if __name__ == '__main__': - factory = ClientFactory() - reactor.connectTCP('127.0.0.1', 8333, factory) - - @repr - @apply - @defer.inlineCallbacks - def think(): - (yield factory.getProtocol()) - - reactor.run()