У меня есть список кошельков, и я хочу, чтобы функция контракта вызывалась только один раз. Чтобы добиться этого, я перебираю кошельки, проверяю, вызывал ли уже каждый кошелек эту функцию, и если нет, продолжаю вызывать ее. (Я тестирую блокчейны Linea и Base и ищу универсальное решение для блокчейнов EVM.)
Объяснение
Мне нужно проверить, была ли вызвана определенная функция контракта по адресу кошелька после заданного номера блока. Вот данные, которые у меня есть:
- startblock: блок, с которого я хочу начать проверку.
- contract_address: Адрес контракта.
- wallet_address: адрес кошелька.
- contract_abi: ABI контракта.
- contract_function_name: имя контрактной функции, которую я хочу проверить.
< h3>Использование API для получения транзакций:
Я использовал API Lineascan/Basescan для получения транзакций с помощью следующего кода:
Код: Выделить всё
url = (f"{self.scan_api_url}"
f"?module=account"
f"&action=txlist"
f"&address={wallet_address if wallet_address is not None else self.wallet_address}"
f"&startblock={self.quest.start_block}"
f"&endblock=99999999"
f"&page=1"
f"&offset=10000"
f"&sort=asc"
f"&apikey={self.scan_api_key}")
Однако этот подход часто не может вернуть последние блоки из-за задержек в API. >
Итерация по блокам:
Я попробовал выполнить итерацию от последнего блока обратно к startblock и проверить адрес_кошелька.
Код: Выделить всё
block = self.w3.eth.get_block(block_num, full_transactions=True)Использование get_logs():Я пытался использовать метод get_logs(), но столкнулся с ограничениями:
Код: Выделить всё
logs = self.w3.eth.get_logs()Что я ищу:
Предпочтительное решение: Способ эффективной проверки того, вызвал ли Wallet_address контракт_имя_функции по контракту после start_block. В идеале это решение должно фильтровать как по адресу кошелька, так и по функции контракта.
Альтернативное решение: Если фильтрация и по адресу кошелька, и по функции контракта невозможна, существует решение это просто проверяет, допустимо ли взаимодействие Wallet_address с Contract_address.
Любая помощь или рекомендации о том, как эффективно добиться этого, будут очень признательны!
Подробнее здесь: https://stackoverflow.com/questions/787 ... evm-contra