Onionr/static-data/official-plugins/rpc/rpc/blocks/__init__.py

82 lines
2.0 KiB
Python
Raw Normal View History

2022-08-11 19:25:07 +00:00
from secrets import randbits
2023-01-11 04:08:08 +00:00
import base64
2023-01-17 05:29:50 +00:00
from typing import Union
2022-08-11 19:25:07 +00:00
import ujson
2022-08-11 19:25:07 +00:00
from onionrblocks import Block
2023-01-11 04:08:08 +00:00
import onionrblocks
2022-08-11 19:25:07 +00:00
from jsonrpc import dispatcher
from gossip.blockqueues import gossip_block_queues
2023-01-17 05:29:50 +00:00
import blockdb
from utils import multiproc
2022-08-11 19:25:07 +00:00
2023-01-17 05:29:50 +00:00
@dispatcher.add_method
def get_block(block_id: str) -> dict:
bl = blockdb.get_block(block_id)
2022-08-11 19:25:07 +00:00
@dispatcher.add_method
def get_blocks(timestamp):
2023-01-17 05:29:50 +00:00
blocks = []
for block in blockdb.get_blocks_after_timestamp(timestamp):
blocks.append({
'id': block.id,
'raw': base64.b64encode(block.raw).decode('utf-8')
})
return blocks
2022-08-11 19:25:07 +00:00
def _do_create_block(
2023-01-11 04:08:08 +00:00
block_data: 'base64', block_type: str, ttl: int, metadata: dict):
2023-01-17 05:29:50 +00:00
# Wrapper for onionrblocks.create_block
# (take base64 to be compatible with RPC)
bl: Block = multiproc.subprocess_compute(
onionrblocks.create_anonvdf_block,
3600,
base64.b64decode(block_data),
block_type,
ttl,
**metadata
)
2023-01-17 05:29:50 +00:00
try:
block_id = bl.id.decode('utf-8')
except AttributeError:
block_id = bl.id
bl_json = {
'id': block_id,
'raw': base64.b64encode(bl.raw).decode('utf-8')
}
return bl_json
@dispatcher.add_method
def create_block(
block_data: 'base64', block_type: str, ttl: int, metadata: dict):
return _do_create_block(block_data, block_type, ttl, metadata)
2023-01-11 04:08:08 +00:00
2023-01-17 05:29:50 +00:00
@dispatcher.add_method
def create_and_insert_block(
block_data: 'base64',
block_type: str, ttl: int, metadata: dict) -> str:
bl = _do_create_block(block_data, block_type, ttl, metadata)
2023-01-17 05:29:50 +00:00
insert_block(bl)
return bl
2023-01-17 05:29:50 +00:00
# As per dandelion++ spec the edge should be the same.
# We keep it the same for each daemon life time.
2022-08-11 19:25:07 +00:00
queue_to_use = randbits(1)
2023-01-17 05:29:50 +00:00
2022-08-11 19:25:07 +00:00
@dispatcher.add_method
2023-01-17 05:29:50 +00:00
def insert_block(block: Union[dict, Block]):
if isinstance(block, dict):
block = Block(
block['id'], base64.b64decode(block['raw']), auto_verify=False)
2022-08-11 19:25:07 +00:00
gossip_block_queues[queue_to_use].put_nowait(block)
return "ok"