как разобрать блокчейн Ethereum и сохранить результат в файл? Консоль geth не является узлом, верно?

Я пытаюсь проанализировать блокчейн и извлечь в текстовый файл часть транзакций и адресов для конкретного контракта (DAO) для последующего анализа. Я хотел бы сохранить вывод в файл (.txt), чтобы использовать его позже.


2 метода

Привет, мне удалось проанализировать блокчейн Ethereum с помощью Web3.js, используя просто консоль geth.

$ cd /path/to/file
$ geth --exec 'loadScript("myEthereumBlockchainParses.js")' attach

а также подключить его к экземпляру Node.js с помощью rpc

$ geth --rpc

$ node myEthereumBlockchainParses.js

Проблемы

У меня 2 разные проблемы:

  1. если я использую метод консоли geth, я не могу использовать модуль fs файловой системы Node для записи в текстовый файл

ошибка: не удается найти модуль «fs»

  1. если я использую метод Node.js, я могу сохранить в локальный файл, но скрипт очень медленный и зависает мой компьютер примерно через 1000 блоков (даже если я минимизирую код и упрощаю его - не забывайте, что это то же самое код синтаксического анализа, который отлично работает в консоли geth

первый метод в консоли geth намного быстрее .


Вопросы

  1. есть ли более быстрый/лучший способ сделать то, что я пытаюсь сделать (разобрать и извлечь в файловую систему часть блокчейна)?
  2. есть ли способ использовать модули узла и этот синтаксис в консоли geth (что быстрее, чем --rpc)?
  3. есть ли способ сделать --rpc быстрее?
  4. Первоначально я думал о сохранении в файле simple.txt, но, может быть, лучше хранить этот объем информации в базе данных, такой как MongoDB?

РЕШЕНИЕ

после отличных ответов @BoppyKooBah вот код https://github.com/lyricalpolymath/Ethereum_DaoExtraBalanceOwners/blob/master/extraBalanceRunScript

Добро пожаловать в Эфириум! Желательно, чтобы вы могли публиковать отдельные вопросы, а не объединять их в один. Таким образом, это поможет людям, отвечающим на ваш вопрос, а также тем, кто ищет хотя бы один из ваших вопросов. Спасибо!
@5chdn . Спасибо. Сделаю. дело в том, что вопросы как вишенки: одно всегда ведет к другому :)
Хороший материал на гитхабе. Данные, которые я сгенерировал для владельцев extraBalance, можно найти в разделе Какие учетные записи внесли вклад в учетную запись ExtraBalance DAO? . @BoppyKooBah.
@BokkyPooBah, у тебя все отлично. Я видел другой ваш пост, но не могу комментировать или задавать вам вопросы (учетная запись новичка). У меня есть еще много других, например, как вы читаете стек и как вы узнали, что такое ссылка на байт-код функции (я просматриваю желтую бумагу, чтобы решить эту проблему, но у меня еще нет всех ответов) :) в любом случае спасибо за эти советы

Ответы (2)

Из Сколько атак уязвимости рекурсивных вызовов The DAO произошло на сегодняшний день? , вот что я делаю, чтобы получить простые скрипты для извлечения и сохранения данных:

Скопируйте следующий скрипт в getTheDAOTransferEvents:

#!/bin/sh

# First search from 1428757 (The DAO creation) to 1736131
# First Transfer event in block 1599207

FIRSTBLOCK=${1:-1599207}
LASTBLOCK=${2:-"'latest'"}

echo "Searching for The DAO Transfer events to address 0x0000000000000000000000000000000000000000 between blocks $FIRSTBLOCK and $LASTBLOCK"


geth attach << EOF | egrep -e ",0x"

var theDAOABI = [{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"}];

var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";

var theDAO = web3.eth.contract(theDAOABI).at(theDAOAddress);

var theDAOTransferEvent = theDAO.Transfer({}, {fromBlock: $FIRSTBLOCK, toBlock: $LASTBLOCK});

console.log("No,From,Block,DAOs");
var i = 0;
theDAOTransferEvent.watch(function(error, result){
  var args = result.args;
  if (args._to == "0x0000000000000000000000000000000000000000") {
    i++;
    var daos = args._amount / 1e16;
    console.log(i + "," + args._from + "," + result.blockNumber + "," + daos);
  }
});
theDAOTransferEvent.stopWatching();

EOF

Установите исполняемый бит файла с помощью chmod 700 getTheDAOTransferEvents.

Затем запустите скрипт в отдельном окне терминала, чтобы извлечь все интересующие события Transfer, используя

./getTheDAOTransferEvents > output.txt


В : есть ли более быстрый/лучший способ сделать то, что я пытаюсь сделать (разобрать и извлечь в файловую систему часть блокчейна)?

Скорее всего. Вам просто нужно протестировать различные методы для ваших вариантов использования.

В : Есть ли способ использовать модули узла и этот синтаксис в консоли geth (которая быстрее, чем --rpc)?

Я не оценивал это.

Q : Есть ли способ сделать --rpc быстрее?

Вы можете запустить несколько копий сценария оболочки одновременно, например:

./getTheDAOTransferEvents 0 999999 > output0.txt &
./getTheDAOTransferEvents 1000000 1999999 > output1.txt &
./getTheDAOTransferEvents 2000000 2999999 > output2.txt &
./getTheDAOTransferEvents 3000000 3999999 > output3.txt &
...

В : Сначала я думал о сохранении в файле simple.txt, но, может быть, лучше хранить такой объем информации в базе данных, такой как MongoDB?

Полезно, если вы хотите получить доступ, используя индексы. Redis тоже хорош.

Мне нравится философия Unix , «которая делает упор на создание простого, короткого, ясного, модульного и расширяемого кода, который может легко поддерживаться и перепрофилироваться другими разработчиками, а не его создателями».

Я начинаю просто создавать файлы значений, разделенные запятыми (или табуляцией), а затем использую другие процессы для перемещения данных в базу данных SQL/NoSQL.

Затем, если мне нужно больше скорости/логики/связи, я пытаюсь улучшить процесс.



РЕДАКТИРОВАТЬ 23/07/2016 - Ответ на комментарии ниже

позвольте мне сказать, что "get attach << EOF | egrep -e ",0x" == MAGIC! :) это какой-то хардкорный мамбо-джамбо :) Однако мне нужно изменить регулярное выражение, чтобы оно соответствовало моим потребностям. Я поиграю с это и опубликовать полное решение. Единственное, это сохраняется только в один файл. Есть ли способ сохранить разные части вывода консоли в разные файлы? - также. это не дает визуальной обратной связи о выполнении Команда. Есть ли способ показать прогресс? Спасибо!

В : Есть ли способ сохранить разные части вывода консоли в разные файлы?

Я grepиногда использую для разделения данных. Вот пример использования theDAOVoterhttps://github.com/bokkypoobah/TheDAOVoter для перечисления разделений DAO.

# Generate list of DAO splits
user@Kumquat:~$ theDAOVoter --sumsplits > sumSplits

# Extract data for account 0x1368
user@Kumquat:~$ egrep "0x1368|Status" sumSplits 
       Prop Status                Yea             Nay Recipient                                  Description            
      1 Expired         967598.22      4276278.60 0x13680fa2a60fd551894199f009cca20fb63a3e31                                         
     18 Expired           2200.20      3913649.01 0x13680fa2a60fd551894199f009cca20fb63a3e31                                    

 # Extract data for account 0x3d55
user@Kumquat:~$ egrep "0x3d55|Status" sumSplits 
       Prop Status                Yea             Nay Recipient                                  Description            
      4 Expired           5279.34      4322941.58 0x3d5507b53d1613d8491a606ecf5c9268301095dd split                                   

# Extract data for accounts other than 0x1368 and 0x3d55
user@Kumquat:/tmp$ egrep -v -e "0x1368|0x3d55" sumSplits
   Prop Status                Yea             Nay Recipient                                  Description            

      6 Expired              1.99       175453.91 0xbeb0b93c01297146782a5581370489a36b24deca Original intent, non-interventionist cur

      7 Expired         118006.68      3967413.62 0xe82d5b10ad98d34df448b07a5a62c1affbef758f Leave me alone         

      8 Expired         199999.99      3931880.95 0xa72ded5c1122312d9f4ed66bf4a396139eadaf56                        

   ...

В : это не дает визуальной обратной связи о выполнении команды. есть ли способ показать прогресс?

Я использую команду Unix watchдля отображения изменений. -dподчеркивает различия. -n5например обновляет дисплей каждые 5 секунд.

# Watch the file size growing as the data gets written
watch -d -n5 'ls -al'

# Watch the number of lines in the file as the data gets written
watch -d -n5 'wc -l sumSplits'

# Watch the last 3 lines in the file changes as the data gets written
watch -d -n5 'tail -n3 sumSplits'

Или используйте tail -f sumSplitsдля отображения содержимого файла по мере записи данных.

позвольте мне сказать, что "get attach << EOF | egrep -e ",0x" == MAGIC! :) это какой-то хардкорный мамбо-джамбо :) Однако мне нужно изменить регулярное выражение, чтобы оно соответствовало моим потребностям. Я поиграю с это и опубликовать полное решение. Единственное, это сохраняется только в один файл . Есть ли способ сохранить разные части вывода консоли в разные файлы? - также. это не дает визуальной обратной связи о выполнении Команда. Есть ли способ показать прогресс? Спасибо!
См. правку выше.
Потрясающие! Спасибо. будет играть с ними, а также. Тем временем я нашел чистый способ для моего случая благодаря этим советам. очистит код и опубликует решение здесь. Удивительно, насколько медленный node/rpc можно сравнить с запуском команд прямо в консоли geth (мой код занимает 2 часа в geth и 7,5 часов в Node)

Возможно, это не тот подробный ответ, который вы искали, и он, конечно же, не охватывает ваши конкретные запросы, но инструмент EthSlurp может оказаться полезным.

Это позволяет вам:

... «захлестнуть» блокчейн Ethereum, извлекая транзакции с любого адреса Ethereum, включая смарт-контракты, и сохранять эти транзакции в знакомых форматах файлов, таких как .csv (MS Excel) или .txt.

Автор инструмента проводит непрерывные ежедневные исследования TheDAO с момента его запуска, данные из которых доступны на веб-сайте DAO Deep Dive .

Спасибо. Я проверю это. однако я хотел бы научиться делать это сам :) кажется странным, что у нас есть «универсально доступная» и распределенная база данных, но тогда нет простого способа разобрать ее и провести анализ данных поверх нее :)