X-Git-Url: https://git.novaco.in/?p=electrum-server.git;a=blobdiff_plain;f=modules%2Fpython_bitcoin%2F__init__.py;h=361b7dc4240995950df49c3c4c9a8f8165ae8713;hp=cd9a4dbfa26a9f06935d860ac1a5f77b20cc446a;hb=cb1ebe091b58cb616458c1afd1b97251d61eabed;hpb=23de59ae6d8da801586cb2992a76e651fa72c0c4 diff --git a/modules/python_bitcoin/__init__.py b/modules/python_bitcoin/__init__.py index cd9a4db..361b7dc 100644 --- a/modules/python_bitcoin/__init__.py +++ b/modules/python_bitcoin/__init__.py @@ -1,5 +1,5 @@ import bitcoin -import stratum +from processor import Processor import threading import time @@ -102,13 +102,6 @@ class NumblocksSubscribe: self.backend.blockchain.subscribe_reorganize(self.reorganize) self.backend.blockchain.fetch_last_depth(self.set_last_depth) self.latest = GhostValue() - self.subscribed = [] - - def subscribe(self, session, request): - last = self.latest.get() - self.push_response(session,{"id": request["id"], "result": last}) - with self.lock: - self.subscribed.append((session, request)) def set_last_depth(self, ec, last_depth): if ec: @@ -119,74 +112,72 @@ class NumblocksSubscribe: def reorganize(self, ec, fork_point, arrivals, replaced): latest = fork_point + len(arrivals) self.latest.set(latest) - subscribed = self.spring_clean() - for session, request in subscribed: - self.push_response(session,{"id": request["id"], "result": latest}) + self.push_response({"method":"numblocks.subscribe", "result": latest}) self.backend.blockchain.subscribe_reorganize(self.reorganize) - def spring_clean(self): - with self.lock: - self.subscribed = [sub for sub in self.subscribed - if not sub[0].stopped()] - return self.subscribed[:] class AddressGetHistory: def __init__(self, backend): self.backend = backend - def get(self, session, request): + def get(self, request): address = str(request["params"]) composed.payment_history(self.backend.blockchain, address, - bitcoin.bind(self.respond, session, request, bitcoin._1)) + bitcoin.bind(self.respond, request, bitcoin._1)) - def respond(self, session, request, result): - self.push_response(session,{"id": request["id"], "result": result}) + def respond(self, request, result): + self.push_response({"id": request["id"], "method":request["method"], "params":request["params"], "result": result}) -class LibbitcoinProcessor(stratum.Processor): +class LibbitcoinProcessor(Processor): def __init__(self): self.backend = Backend() self.numblocks_subscribe = NumblocksSubscribe(self.backend) self.address_get_history = AddressGetHistory(self.backend) - stratum.Processor.__init__(self) + Processor.__init__(self) def stop(self): self.backend.stop() - def process(self, session, request): + def process(self, request): print "New request (lib)", request if request["method"] == "numblocks.subscribe": self.numblocks_subscribe.subscribe(session, request) elif request["method"] == "address.get_history": - self.address_get_history.get(session, request) + self.address_get_history.get(request) elif request["method"] == "server.banner": - self.push_response(session, {"id": request["id"], + self.push_response({"id": request["id"], "method": request["method"], "params":request["params"], "result": "libbitcoin using python-bitcoin bindings"}) elif request["method"] == "transaction.broadcast": - self.broadcast_transaction(session, request) + self.broadcast_transaction(request) # Execute and when ready, you call - # self.push_response(session,response) + # self.push_response(response) - def broadcast_transaction(self, session, request): + def broadcast_transaction(self, request): raw_tx = bitcoin.data_chunk(str(request["params"])) exporter = bitcoin.satoshi_exporter() try: tx = exporter.load_transaction(raw_tx) except RuntimeError: - response = {"id": request["id"], "result": None, + response = {"id": request["id"], "method": request["method"], "params":request["params"], "result": None, "error": {"message": "Exception while parsing the transaction data.", "code": -4}} else: self.backend.protocol.broadcast_transaction(tx) tx_hash = str(bitcoin.hash_transaction(tx)) - response = {"id": request["id"], "result": tx_hash} - self.push_response(session,response) + response = {"id": request["id"], "method": request["method"], "params":request["params"], "result": tx_hash} + self.push_response(response) + + -def run(stratum): +def run(processor): + #processor = LibbitcoinProcessor() print "Warning: pre-alpha prototype. Full of bugs." - processor = LibbitcoinProcessor() - stratum.start(processor) + while not processor.shared.stopped(): + if raw_input() == "quit": + shared.stop() + time.sleep(1)