diff --git a/app/repositories/bitcoin.py b/app/repositories/bitcoin.py index 257bc64..e6b60ca 100644 --- a/app/repositories/bitcoin.py +++ b/app/repositories/bitcoin.py @@ -1,11 +1,12 @@ +import asyncio import binascii import json -from hashlib import sha256 import zmq import zmq.asyncio from app.utils import bitcoin_config, bitcoin_rpc_async from fastapi import Request +from fastapi_plugins import redis_plugin async def handle_block_sub(request: Request, verbosity: int = 1) -> str: @@ -24,3 +25,22 @@ async def handle_block_sub(request: Request, verbosity: int = 1) -> str: hash = binascii.hexlify(body).decode('utf-8') r = await bitcoin_rpc_async('getblock', [hash, verbosity]) yield json.dumps(r["result"]) + + +async def handle_block_sub_redis(verbosity: int = 1) -> str: + ctx = zmq.asyncio.Context() + zmq_socket = ctx.socket(zmq.SUB) + zmq_socket.setsockopt(zmq.RCVHWM, 0) + zmq_socket.setsockopt_string(zmq.SUBSCRIBE, "hashblock") + zmq_socket.connect(bitcoin_config.zmq_url) + + while True: + _, body, _ = await zmq_socket.recv_multipart() + hash = binascii.hexlify(body).decode('utf-8') + r = await bitcoin_rpc_async('getblock', [hash, verbosity]) + await redis_plugin.redis.publish("default", json.dumps(r["result"])) + + +async def register_bitcoin_zmq_sub(): + loop = asyncio.get_event_loop() + loop.create_task(handle_block_sub_redis()) diff --git a/app/utils.py b/app/utils.py index 6edc738..2947197 100644 --- a/app/utils.py +++ b/app/utils.py @@ -1,8 +1,8 @@ -from app.routers import bitcoin +import json from types import coroutine + import aiohttp import requests -import json from decouple import config diff --git a/main.py b/main.py index 9aa0ca2..d49a047 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +from app.repositories.bitcoin import register_bitcoin_zmq_sub from aioredis import Channel, Redis from fastapi import FastAPI, Depends from fastapi_plugins import (get_config, depends_redis, registered_configuration, @@ -25,6 +26,7 @@ app.include_router(system.router) async def on_startup() -> None: await redis_plugin.init_app(app, config=config) await redis_plugin.init() + await register_bitcoin_zmq_sub() @app.on_event('shutdown')