mirror of
https://github.com/aljazceru/python-teos.git
synced 2025-12-18 06:34:19 +01:00
Refactors tx_watcher and zmq_subscriber
Merges tx_watcher and zmq_subscriber into a single file: watcher. Watcher will handle all the watching process and container two inner classes, the watcher and the ZMQHandler
This commit is contained in:
committed by
Sergi Delgado Segura
parent
39a9a92bdb
commit
21eed576b2
2
.gitignore
vendored
2
.gitignore
vendored
@@ -13,6 +13,6 @@ logs/
|
||||
.idea
|
||||
conf.py
|
||||
bitcoin.conf
|
||||
__pycache__/*
|
||||
*__pycache__
|
||||
.pending*
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
from pisa import shared
|
||||
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
|
||||
from conf import BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT
|
||||
|
||||
|
||||
def watch_txs(debug):
|
||||
bitcoin_cli = AuthServiceProxy("http://%s:%s@%s:%d" % (BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT))
|
||||
|
||||
while True:
|
||||
block_hash = shared.block_queue.get()
|
||||
|
||||
try:
|
||||
block = bitcoin_cli.getblock(block_hash)
|
||||
|
||||
prev_tx_id = block.get('previousblockhash')
|
||||
txs = block.get('tx')
|
||||
|
||||
if debug:
|
||||
# Log shit
|
||||
print(prev_tx_id, txs)
|
||||
|
||||
except JSONRPCException as e:
|
||||
print(e)
|
||||
79
pisa-btc/pisa/watcher.py
Normal file
79
pisa-btc/pisa/watcher.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import zmq
|
||||
import binascii
|
||||
from queue import Queue
|
||||
from threading import Thread
|
||||
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
|
||||
from conf import BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST, BTC_RPC_PORT, FEED_PROTOCOL, FEED_ADDR, FEED_PORT
|
||||
|
||||
|
||||
class ZMQHandler:
|
||||
""" Adapted from https://github.com/bitcoin/bitcoin/blob/master/contrib/zmq/zmq_sub.py"""
|
||||
def __init__(self):
|
||||
self.zmqContext = zmq.Context()
|
||||
self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
|
||||
self.zmqSubSocket.setsockopt(zmq.RCVHWM, 0)
|
||||
self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
|
||||
self.zmqSubSocket.connect("%s://%s:%s" % (FEED_PROTOCOL, FEED_ADDR, FEED_PORT))
|
||||
|
||||
def handle(self, debug, block_queue):
|
||||
msg = self.zmqSubSocket.recv_multipart()
|
||||
topic = msg[0]
|
||||
body = msg[1]
|
||||
|
||||
if topic == b"hashblock":
|
||||
block_hash = binascii.hexlify(body).decode('UTF-8')
|
||||
block_queue.put(block_hash)
|
||||
|
||||
if debug:
|
||||
print("New block received from Core ", block_hash)
|
||||
|
||||
|
||||
class Watcher:
|
||||
def __init__(self, debug):
|
||||
self.appointments = []
|
||||
self.sleep = True
|
||||
self.debug = debug
|
||||
self.block_queue = Queue()
|
||||
|
||||
def add_appointment(self, appointment):
|
||||
# ToDo: Discuss about validation of input data
|
||||
self.appointments.append(appointment)
|
||||
|
||||
if self.sleep:
|
||||
self.sleep = False
|
||||
zmq_subscriber = Thread(target=self.do_subscribe, args=[self.block_queue])
|
||||
zmq_subscriber.start()
|
||||
self.do_watch()
|
||||
|
||||
# Rationale:
|
||||
# The Watcher will analyze every received block looking for appointment matches. If there is no work
|
||||
# to do the watcher can sleep (appointments = [] and sleep = True) otherwise for every received block
|
||||
# the watcher will get the list of transactions and compare it with the list of appointments
|
||||
|
||||
def do_subscribe(self, block_queue):
|
||||
daemon = ZMQHandler()
|
||||
daemon.handle(self.debug, block_queue)
|
||||
|
||||
def do_watch(self):
|
||||
bitcoin_cli = AuthServiceProxy("http://%s:%s@%s:%d" % (BTC_RPC_USER, BTC_RPC_PASSWD, BTC_RPC_HOST,
|
||||
BTC_RPC_PORT))
|
||||
|
||||
while len(self.appointments) > 0:
|
||||
block_hash = self.block_queue.get()
|
||||
|
||||
try:
|
||||
block = bitcoin_cli.getblock(block_hash)
|
||||
|
||||
prev_block_id = block.get('previousblockhash')
|
||||
txs = block.get('tx')
|
||||
|
||||
# ToDo: Check for every tx in txs if there is an appointment that matches (MS 16-bytes)
|
||||
|
||||
if self.debug:
|
||||
print("New block received ", block_hash)
|
||||
print("Prev. block hash ", prev_block_id)
|
||||
print("List of transactions", txs)
|
||||
|
||||
except JSONRPCException as e:
|
||||
print(e)
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
"""
|
||||
Adapted from https://github.com/bitcoin/bitcoin/blob/master/contrib/zmq/zmq_sub.py
|
||||
"""
|
||||
|
||||
import binascii
|
||||
import zmq
|
||||
import conf
|
||||
from pisa import shared
|
||||
|
||||
|
||||
class ZMQHandler:
|
||||
def __init__(self):
|
||||
self.zmqContext = zmq.Context()
|
||||
|
||||
self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
|
||||
self.zmqSubSocket.setsockopt(zmq.RCVHWM, 0)
|
||||
self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
|
||||
|
||||
self.zmqSubSocket.connect("%s://%s:%s" % (conf.FEED_PROTOCOL, conf.FEED_ADDR, conf.FEED_PORT))
|
||||
|
||||
def handle(self, debug):
|
||||
msg = self.zmqSubSocket.recv_multipart()
|
||||
topic = msg[0]
|
||||
body = msg[1]
|
||||
|
||||
if topic == b"hashblock":
|
||||
block_hash = binascii.hexlify(body).decode('UTF-8')
|
||||
shared.block_queue.put(block_hash)
|
||||
|
||||
if debug:
|
||||
# Log shit
|
||||
pass
|
||||
|
||||
|
||||
def run_subscribe(debug):
|
||||
daemon = ZMQHandler()
|
||||
daemon.handle(debug)
|
||||
Reference in New Issue
Block a user