Как я могу получить хэш транзакции/блока контракта, который уже был развернут?

Если вы используете Web3.py для развертывания контракта Solidity в блокчейне, вы можете получить хэш транзакции, например:

tx_hash = w3.eth.sendRawTransaction(signed.rawTransaction)

Получив этот tx_hash, вы можете получить квитанцию ​​о транзакции, например:

tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

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

Пара заметок:

  • Для этого контракта может быть несколько транзакций в нескольких блоках.
  • Я ищу решение с использованием Web3 — я бы предпочел не просматривать всю цепочку блоков или заходить на Etherscan и искать информацию.

Я хотел бы получить массив либо:

  • все номера блоков, которые содержат транзакцию для данного контракта
  • все транзакционные квитанции для данного контракта

после того, как контракт был развернут. Это возможно?

Например, давайте представим, что я хотел найти все квитанции о транзакциях для смарт-контракта, развернутого в тестовой сети Ropsten.

Давайте воспользуемся контрактом helloWorld, развернутым по этому адресу: 0xb1Afb360F9ba99883166236a4b2DdAa9e3ff397a.

Этот контракт был проверен на Etherscan, поэтому его ABI доступен. Вы можете увидеть это на Etherscan здесь: https://ropsten.etherscan.io/address/0xb1afb360f9ba99883166236a4b2ddaa9e3ff397a#code

Следующий код Python позволит вам создать экземпляр контракта и вызвать функции, определенные в ABI:

abi = '''
[{"constant":false,"inputs":[{"name":"_wordsToSay","type":"string"}],"name":"sayAnything","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"sayHello","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
'''

contract_address = "0xb1Afb360F9ba99883166236a4b2DdAa9e3ff397a"
contract = w3.eth.contract(address=contract_address, abi=abi)

pprint.pprint(contract.functions.sayHello().call())

Единственные другие атрибуты, которые мне удалось получить, — это адрес и ABI.

Есть ли способ получить номера блоков или хэши транзакций для уже развернутого контракта?

Я думаю, вы говорите, что хотите увидеть любую транзакцию, которая взаимодействует с контрактом. Генерация событий в контракте, а затем использование фильтра — хороший способ сделать это. Можете ли вы обновить вопрос, указав, пробовали ли вы события или что-то о событиях не соответствует вашим потребностям?
Спасибо за ответ Карвер. По практическим причинам (Infura, хост, который я использую для доступа к блокчейну, не поддерживает события) я не тестировал события. Однако, насколько я понимаю, события и журналы необязательны, и Web3.py вернет пустой хеш, если программист их не выдал. Я пытаюсь получить доступ либо к номеру блока, либо к хэшу блока, либо к данным транзакции о произвольных контрактах, которые я не писал. Итак, мое впечатление (которое может быть ошибочным) состоит в том, что события не соответствуют моим потребностям. Мысли?

Ответы (1)

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

Трассировки — это нестандартные (специфичные для клиента) механизмы для просмотра внутренней механики транзакции EVM. Infura не поддерживает трассировку, насколько мне известно. Так что вам почти наверняка придется запускать локальный узел.

В настоящее время Web3.py поддерживает только paritytraces , поэтому я, вероятно, начну с него. К сожалению, на данный момент они не задокументированы в документации web3.py. Вы бы примерно сделали что-то вроде:

from web3.auto import w3
from web3.parity import Parity
Parity.attach(w3, 'parity)
trace_results = w3.parity.traceReplayBlockTransactions('latest')

Больше методов трассировки четности вы можете найти в исходниках web3py .

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