Загрузка данных блокчейна из Hive с помощью python

#python #hive #blockchain

#python #улей #блокчейн

Вопрос:

Я пытаюсь извлечь данные из цепочки блоков Hive с помощью python. Я использую библиотеку hivepy, и у меня возникла проблема. Я использую следующий скрипт:

 import sys
import json
import os
from contextlib import suppress
from hive.blockchain import Blockchain
from hive import Hive
s = Hive()


def get_last_line(filename):
    if os.path.isfile(filename):
        with open(filename, 'rb') as f:
            f.seek(-2, 2)
            while f.read(1) != b"n":
                f.seek(-2, 1)
            return f.readline()


def get_previous_block_num(block):
    if not block:
        return -1

    if type(block) == bytes:
        block = block.decode('utf-8')

    if type(block) == str:
        block = json.loads(block)

    return int(block['previous'][:8], base=16)


def run(filename, start_block, end_block):
    b = Blockchain()
    if start_block == -1:
        # automatically resume from where we left off
        # previous   last   1
        start_block = get_previous_block_num(get_last_line(filename))   2
    with open(filename, 'a ') as file:
        for block in b.stream_from(start_block=start_block, full_blocks=True):
            file.write(json.dumps(block,sort_keys=True)  'n')
            if int(block['block_id'][:8], base=16) == end_block-1:
                return


if __name__ == '__main__':
    if len(sys.argv) != 4 or int(sys.argv[2]) >= int(sys.argv[3]) or int(sys.argv[3]) < 10000000:
        print('usage: python steem.blockchain.download.py <output_file> <start_block_num or -1> <end_block_num>')
        exit()
    output_file = sys.argv[1]
    start_block = int(sys.argv[2])
    end_block = int(sys.argv[3])

    with suppress(KeyboardInterrupt):
        run(output_file, start_block, end_block)
 

но я раздосадован проблемой, которая возникает у меня:

 Unexpected exception! Please report at https://github.com/pharesim/hive-python/issues -- RPCError: unspecified error from api.hive.blog (Request Timeout) in get_block
Traceback (most recent call last):
  File "steem_blockchain_download.py", line 60, in <module>
    run(output_file, start_block, end_block)
  File "steem_blockchain_download.py", line 41, in run
    for block in b.stream_from(start_block=start_block, full_blocks=True):
  File "/home/jager/.local/lib/python3.8/site-packages/hive/blockchain.py", line 95, in stream_from
    yield self.hive.get_block(block_num)
  File "/home/jager/.local/lib/python3.8/site-packages/hive/hived.py", line 405, in get_block
    return self.call('get_block', block_num, api='database_api')
  File "/home/jager/.local/lib/python3.8/site-packages/hivebase/http_client.py", line 321, in call
    raise e
  File "/home/jager/.local/lib/python3.8/site-packages/hivebase/http_client.py", line 296, in call
    raise RPCError(detail)
hivebase.exceptions.RPCError: unspecified error from api.hive.blog (Request Timeout) in get_block

 

Для меня это большая проблема, потому что я пытаюсь получить 10000000 блоков или около того, и если скрипт прерывается в случайное время, я теряю довольно много времени (каламбур не предназначен). Кто-нибудь знает, как это решить? Я искал, но безрезультатно.

Комментарии:

1. Чтобы избежать необходимости повторять весь скрипт, вы можете записывать блок в файл каждый раз, когда вы его увеличиваете. Тогда вы будете знать, на чем остановился ваш скрипт.

2. привет, я знаю, что это stream_from, но я понятия не имею, как это исправить.. В любом случае спасибо за помощь