У меня есть задание, для которого я должен написать клиента, который может взаимодействовать с развернутым контрактом посредством транзакций и фильтрации журналов событий, но я не могу понять, как успешно заставить либо работать через web3py. У меня есть контракт, скомпилированный и развернутый на Remix, но я не уверен, как найти подходящего поставщика или другую настройку, чтобы он мог правильно взаимодействовать с ним из python программы. До сих пор я пытался установить переменную WEB3_INFURA_PROJECT_ID в ID проекта проекта Infura, который я запустил, затем использовать web3.auto.infura
w3
и использовать WebsocketProvider
с URL, заданным Infura. (Обратите внимание, что w3.eth.accounts
- пустой список)
Затем я получаю контракт, используя w3.eth.contract(abi = <Remix's produced ABI>)(<address of Remix contract>)
. В любом случае, если я попытаюсь выполнить какую-либо транзакцию с contract.functions.<function name>(<params>).transact()
, я получу
ValueError: {'code': -32601, 'message': 'The method eth_sendTransaction does not exist/is not available'}
Я также хочу иметь возможность получить все экземпляры определенного события в моем контракте, которое произошло в блокчейне через эту программу. Итак, если я вызываю функцию через Remix IDE, которая создает журнал событий, то пытаюсь отфильтровать ее, используя
filter = contract.events.<event name>.createFilter(fromBlock='latest')
filter.get_new_entries()
, я получаю пустой список. Если я вместо этого использую filter.get_all_entries()
, то же самое происходит. Это также не изменится, если я сначала создаю фильтр, а затем вызываю функцию в Remix, а затем вызываю get_XXX_entries()
. Если вместо этого при создании фильтра я использую kwargs fromBlock = 0, toBlock = 'latest'
, то get_new_entries()
по-прежнему возвращает пустой список, а get_all_entries()
вызывает
concurrent.futures._base.TimeoutError
По сути, я хочу знать, что я должен делать в Для тестирования и разработки этой программы python, чтобы она могла осуществлять транзакции и извлекать журналы событий с этим контрактом, развернутым через Remix. Есть ли способ сделать это без необходимости покупать / тратить газ?