#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, но я понятия не имею, как это исправить.. В любом случае спасибо за помощь