Как проверить баланс Ethereum и количество уникальных транзакций смарт-контракта за определенный период времени?

По сути, я хочу иметь возможность отслеживать баланс смарт-контрактов и уникальные транзакции за определенный период времени, например, последние 24 часа, последний час и так далее.

Каков наилучший подход к этому? Как мне хранить данные, которые я получаю, чтобы создать свой API, SQL/NoSQL db?

Заранее спасибо!

Ответы (1)

Вы можете получить баланс эфира смарт-контракта в любом блоке, используя Web3 JSON RPC, который доступен через библиотеки Web3, такие как Web3.js:

получитьбаланс

web3.eth.getBalance(address [, defaultBlock] [, callback])

Как видите, вызов этой функции поддерживает вход «блок», который можно использовать для получения баланса эфира по указанному адресу в определенном блоке.

Блоки не создаются с идеальными интервалами, но вы должны быть в состоянии приблизиться к нужному блоку, предполагая, что среднее время блока составляет ~ 15 секунд.

Затем вы можете подтвердить, что у вас есть правильный блок, получив значение timestampиз блока ( web3.eth.getBlock()) и отрегулировав его при необходимости.

Такая логика интегрирована в это приложение JavaScript: График баланса ETH ( код )


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

Мои предложения заключались бы в отслеживании транзакций, которые генерируют Event .

Получить все прошедшие события для контракта можно с помощью:

getPastEvents

myContract.getPastEvents(event[, options][, callback])

Исходя из этого, вы должны получить довольно хорошее представление об активности смарт-контракта с течением времени. Особенно, если контракт представляет собой токен ERC20, который должен генерировать Transferсобытие всякий раз, когда токены передаются, и должен генерировать такое же событие при создании токенов.

Однако, чтобы действительно получить все внутренние и внешние транзакции, вам нужно будет просмотреть каждый блок с момента создания контракта и найти эти транзакции (насколько мне известно). Это то, что делает Etherscan, и это нетривиальная задача.

Если я хочу отслеживать определенный контракт, могу ли я использовать подписку на что-то похожее на задание cron? Кроме того, если смарт-контракт не генерирует событие, единственным решением для отслеживания его транзакций является их сохранение?
Самое грубое, что вы можете сделать, это отслеживать каждый блок, просматривать каждую транзакцию в этом блоке и искать те, которые вызывают интересующий вас контракт. Это можно сделать, начиная с подписки, которая может уведомлять вас о появлении новых блоков. созданный.
Есть ли другой способ отслеживания событий в более общем виде? Например, определить мое собственное общее событие и использовать его для каждого смарт-контракта, который я хочу отслеживать?
Вы должны быть разработчиком контракта, чтобы определить событие, которое генерирует ваш контракт. Это часть контрактного кодекса. Если вы являетесь разработчиком контракта, то да, вы можете генерировать любые произвольные события практически в любое время.
Я всего лишь третье лицо, которое хочет отслеживать контракты других людей :\