Как разбирать блоки с помощью Python?

Я создаю базовую аналитическую структуру для блокчейна Ethereum. В качестве первого шага мне нужно извлечь данные, и я хотел бы сделать это на Python. Я использую Geth в качестве клиента на OSX, поэтому, насколько я понимаю, блокчейн хранится локально ~/Library/Ethereum/chaindataв LevelDB, то есть в бинарных файлах типа 496355.ldb.

  1. Как разобрать .ldbфайлы? Есть ли библиотека Python, которую я могу использовать для этого? Я просмотрел pyethereum, но не знаю, где искать, так как документации довольно мало.

  2. Я могу использовать API etherchain.org, но это повлечет за собой много вызовов API и, вероятно, расстроит хороших людей на etherchain.org. Вот почему я предпочитаю анализировать блокчейн, хранящийся локально на моей машине. Но если на мгновение проигнорировать эту проблему, кто-нибудь знает краткое руководство по результату вызова API для данных транзакции, в результате чего получаются такие данные:

{'accountNonce': '200642',
   «сумма»: 2678970350000000000,
   'blockHash': '0x47525d00eab0dcd87e9f8b0e9de2fe9f553f72576ef4f892ace49b2832e985bd',
   'block_id': 1039153,
   'газЛимит': 21000,
   «хеш»: «0x41bb75d8b20ae7e23fa7457d21a30a4007d0eb97fdb887caac834b759eeb3572»,
   'isContractTx': Нет,
   'новый контракт': 0,
   'parentHash': '0x41bb75d8b20ae7e23fa7457d21a30a4007d0eb97fdb887caac834b759eeb3572',
   'цена': 50000000000,
   «получатель»: «0x30906581413d556de1a018adbe6cc63c88d58512»,
   «отправитель»: «0x2a65aca4d5fc5b5c859090a6c34d164135398226»,
   «время»: «2016-02-21T18:53:56.000Z»,
   'txIndex': Нет}

Я считаю, что понимаю большую часть этих данных, но был бы очень признателен за дополнительную информацию, чтобы заполнить пробелы в моем понимании.

Ответы (3)

Я реализовал парсер биткойн-блокчейна после того, как прочитал этот пост в блоге . Я не пытался изменить его для работы с блокчейном Ethereum, но, возможно, он может дать вам некоторые рекомендации. Вот синтаксический анализатор, реализованный в Go , который, мы надеемся, даст вам некоторые конкретные примеры Ethereum, от которых можно отталкиваться.

Ранее я видел ваши сообщения в блогах и электронную книгу по разбору блогов о биткойнах и многому научился у них!
Ссылка на блог уже не работает :-(

Ваш узел geth также будет действовать как сервер JSON-RPC. Вы можете использовать вики-страницу API для обхода блокчейна и извлечения данных блока. Вот интересный репозиторий git , который вы можете разветвить. Однако это небольшое шоу требует некоторых модификаций кода, поскольку владелец больше не поддерживает его. В этом репозитории вы найдете запрос на вытягивание, который работает значительно быстрее, однако для его работы требуется больше модификаций.

Поскольку вам нужны результаты в python, вы можете подключиться к своему экземпляру geth через IPC с помощью web3.py *. Это будет выглядеть примерно так :

>>> from web3.auto import w3

>>> w3.eth.getBlock(2000000)
AttributeDict({
    'difficulty': 49824742724615,
    'extraData': '0xe4b883e5bda9e7a59ee4bb99e9b1bc',
    'gasLimit': 4712388,
    'gasUsed': 21000,
    'hash': '0xc0f4906fea23cf6f3cce98cb44e8e1449e455b28d684dfa9ff65426495584de6',
    'logsBloom': '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
    'miner': '0x61c808d82a3ac53231750dadc13c777b59310bd9',
    'nonce': '0x3b05c6d5524209f1',
    'number': 2000000,
    'parentHash': '0x57ebf07eb9ed1137d41447020a25e51d30a0c272b5896571499c82c33ecb7288',
    'receiptRoot': '0x84aea4a7aad5c5899bd5cfc7f309cc379009d30179316a2a7baa4a2ea4a438ac',
    'sha3Uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
    'size': 650,
    'stateRoot': '0x96dbad955b166f5119793815c36f11ffa909859bbfeb64b735cca37cbf10bef1',
    'timestamp': 1470173578,
    'totalDifficulty': 44010101827705409388,
    'transactions': ['0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef'],
    'transactionsRoot': '0xb31f174d27b99cdae8e746bd138a01ce60d8dd7b224f7c60845914def05ecc58',
    'uncles': [],
})

* Попробуйте бета-версию (v4), установленную вместе с:

pip install --pre web3