Как просмотреть все транзакции для данной учетной записи?

После того, как я смог проверить баланс учетной записи, я ищу способ перечислить все транзакции для данной учетной записи Ethereum через протокол json-rpc. Я не нашел подходящего метода на https://github.com/ethereum/wiki/wiki/JSON-RPC .

Подобно https://etherscan.io/txs?a=0xbb9bc244d798123fde783fcc1c72d3bb8c189413 , я пытаюсь создать проводник, который показывает все транзакции с данной учетной записи.

Как можно найти все транзакции, отправленные на адрес? задается аналогичный вопрос, но я не ищу решение через третье лицо, а запрашиваю напрямую мой узел ethereum по протоколу json-rpc.

Я что-то упускаю? Возможно ли это сделать через интерфейс json-rpc?

Я подозреваю, что они внешне индексируют транзакции по этому fromсвойству. На самом деле нужно построить массу других индексов. Можете ли вы добавить ссылку на свой код? Звучит как интересный проект.

Ответы (3)

Если вы хотите создать такое исследование etherscan.io, вам нужно просмотреть все данные в сети ethereum и сохранить все txs в базе данных.

Не существует прямого метода rpc для получения всех транзакций, связанных с учетной записью.

Зачем снова сканировать и сохранять в БД? клиенты ethereum уже поддерживают свою базу данных. Нам просто нужно иметь API для получения этих данных. Поэтому было бы лучше выбрать клиент ethereum и добавить желаемый API.

Принятый ответ на вопрос Как найти все транзакции, отправленные на адрес? не предполагает участия третьих лиц.

Сценарий в ответе использует API Javascript Web3, который:

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

Например, где скрипт делает:

var block = eth.getBlock(i, true);

вы можете использовать JSON-RPCeth_getBlockByNumber

Возвращает информацию о блоке по номеру блока.

Параметры

  1. КОЛИЧЕСТВО|ТЕГ — целое число номера блока или строка «самый ранний», «самый последний» или «ожидающий», как в параметре блока по умолчанию.
  2. Boolean — если true, он возвращает полные объекты транзакций, если false — только хэши транзакций.

API Javascript упрощает выполнение запросов JSON-RPC, но вы можете перенести сценарий на другой язык и выполнять запросы JSON-RPC. Кроме того, обратите внимание на комментарий к принятому ответу о том, что для получения «внутренних транзакций» вам понадобится больше, чем скрипт .

То есть вы имеете в виду, что для обнаружения совпадающих транзакций (от или до заданного адреса) мне понадобится скрипт, который полностью сканирует всю цепочку блоков? Разве узел geth не способен отфильтровать совпадающие транзакции, которые я ищу? Разве они не индексируются как-то на блокчейне или самой ноде? Спасибо!
@JuanIgnacioPérezSacristán Нет, Эфириум не заглядывал так далеко вперед ;)
@JuanIgnacioPérezSacristán, Ethereum использует базу данных NoSQL (LevelDB). Он не хранит отношения между таблицами, как реляционная база данных. Использование реляционной базы данных повлияет на производительность, поскольку объем данных велик. Итак, либо вы сканируете всю БД, либо создаете реляционную БД из блокчейна и запрашиваете ее с помощью SQL.
Количество времени, необходимое для анализа всех блоков для данного адреса, довольно велико.
Вы серьезно говорите, что необходимо загрузить весь блок, прежде чем вы сможете проверить транзакции? Что, если транзакции находятся в отдельных блоках?
@MelbourneDeveloper транзакция полностью находится в одном блоке. Если у вас есть мобильный или легкий клиент, он может проверять ваши транзакции без необходимости использования всего блока (он может использовать заголовки блоков).
Да, но мне нужно получить все транзакции. Не только тот.

Известным узлам Ethereum не хватает функциональности для получения списка транзакций для ETH-адреса (аккаунта).

Для решения проблемы существует бесплатное стороннее решение с открытым исходным кодом — индексатор транзакций Ethereum: https://github.com/Adamant-im/ETH-transactions-storage .

Индексатор позволяет исследовать транзакции по адресу Ethereum и получить историю любого пользователя/кошелька одним движением, как это делает Etherscan. Индексатор написан на Python. Он работает как служба в фоновом режиме:

  • подключается к узлу Ethereum (хорошо работает с geth или parity, другие не тестировались)
  • сохраняет все транзакции в базе данных Postgres (включая транзакции смарт-контрактов)
  • предоставляет данные для API для получения транзакций по адресу

Индексатор подключается к узлу Ethereum и извлекает транзакции с помощью JSON RPC, создавая индекс транзакций в базе данных Postgres. Первый индексатор будет хранить транзакции, начиная с указанного вами блока. После этого он будет проверять наличие новых блоков каждые 20 секунд и обновлять индекс. Вы можете изменить интервал.

API для индексатора транзакций Ethereum публикуется инструментом Postgrest. Если вам нужно предоставить общедоступный API, используйте любой веб-сервер, например nginx, и настройте прокси на порт Postgrest в config.

После создания индекса вы можете использовать такие запросы, как

curl -k -X GET "http://localhost:3000/?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25"

или же

https://yourserver.com/ethtxs?and=(contract_to.eq.,or(txfrom.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094,txto.eq.0x6b924750e56a674a2ad01fbf09c7c9012f16f094))&order=time.desc&limit=25

Запрос покажет 25 последних транзакций для адреса Ethereum 0x6b924750e56a674a2ad01fbf09c7c9012f16f094, упорядоченных по отметке времени.