5 from entangled.kademlia import node, encoding, protocol
6 from twisted.internet import defer
10 class CustomBencode(encoding.Bencode):
11 def __init__(self, prefix=""):
14 def encode(self, data):
15 return self.prefix + encoding.Bencode.encode(data)
17 def decode(self, data):
18 if not data.startswith(self.prefix):
19 raise ValueError("invalid prefix")
20 return encoding.Bencode.decode(data[len(self.prefix):])
22 class Node(node.Node):
25 for bucket in self._routingTable._buckets:
26 for contact in bucket._contacts:
29 def __init__(self, blockCallback, **kwargs):
30 node.Node.__init__(self, networkProtocol=protocol.KademliaProtocol(self, msgEncoder=CustomBencode("p2pool")), **kwargs)
31 self.blockCallback = blockCallback
36 def joinNetwork(self, *args, **kwargs):
37 node.Node.joinNetwork(self, *args, **kwargs)
42 self._joinDeferred.addBoth(go)
47 def get_my_time(self):
48 return time.time() - self.clock_offset
54 @defer.inlineCallbacks
58 clock_deltas = {None: (t_send, t_send)}
59 for peer, request in [(peer, peer.get_time().addCallback(lambda res: (time.time(), res))) for peer in self.peers]:
61 t_recv, response = yield request
62 t = (t_send + t_recv)/2
63 clock_deltas[(peer.id, peer.address, peer.port)] = (t, float(response))
68 self.clock_offset = util.median(mine - theirs for mine, theirs in clock_deltas.itervalues())
70 yield util.sleep(random.expovariate(1/500.))
72 # disable data storage
75 def store(self, key, value, originalPublisherID=None, age=0, **kwargs):
79 def findValue(self, key, value, originalPublisherID=None, age=0, **kwargs):
82 def _republishData(self, *args):
83 return defer.succeed(None)
88 def block(self, block_data):
89 self.blockCallback(block_data)