Если вы используете Web3.py для развертывания контракта Solidity в блокчейне, вы можете получить хэш транзакции, например:
tx_hash = w3.eth.sendRawTransaction(signed.rawTransaction)
Получив этот tx_hash, вы можете получить квитанцию о транзакции, например:
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
Однако мне не удалось найти простой способ получить эту информацию для контракта, который я не развернул (или развернул в какой-то момент в прошлом и не записал).
Пара заметок:
Я хотел бы получить массив либо:
после того, как контракт был развернут. Это возможно?
Например, давайте представим, что я хотел найти все квитанции о транзакциях для смарт-контракта, развернутого в тестовой сети 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.
Есть ли способ получить номера блоков или хэши транзакций для уже развернутого контракта?
Поскольку вас интересуют произвольные контракты, которые не генерируют события, вам придется сканировать каждый блок. Кроме того, чтобы зафиксировать сценарии, в которых интересующий вас контракт вызывается другим контрактом (а не внешней учетной записью), вам, вероятно, придется запускать трассировку для каждой транзакции.
Трассировки — это нестандартные (специфичные для клиента) механизмы для просмотра внутренней механики транзакции EVM. Infura не поддерживает трассировку, насколько мне известно. Так что вам почти наверняка придется запускать локальный узел.
В настоящее время Web3.py поддерживает только parity
traces , поэтому я, вероятно, начну с него. К сожалению, на данный момент они не задокументированы в документации web3.py. Вы бы примерно сделали что-то вроде:
from web3.auto import w3
from web3.parity import Parity
Parity.attach(w3, 'parity)
trace_results = w3.parity.traceReplayBlockTransactions('latest')
Больше методов трассировки четности вы можете найти в исходниках web3py .
резчик
Крис Брукс