feat: implement bitcoin core block hash zmq sub

Block data will be published to sse/subscribe SSE endpoint
This commit is contained in:
Stefan Stammberger 2021-06-25 18:40:27 +02:00
parent f037854748
commit 97458fb3f8
No known key found for this signature in database
GPG key ID: 645FA807E935D9D5
3 changed files with 25 additions and 3 deletions

View file

@ -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())

View file

@ -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

View file

@ -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')