如何在web3py中使用过滤器来获取智能合约的事件日志?

时间:2019-05-05 20:50:37

标签: python ethereum web3

我正在寻找获取智能合约的事件日志,为此我正在使用Infura节点。根据{{​​3}}提供的文档,我尝试运行

new_block_filter = web3.eth.filter('latest')

我认为应该这样

new_block_filter = w3.eth.filter('latest')

w3应该类似于

w3 = Web3(HTTPProvider("https://mainnet.infura.io/v3/infura-project-id"))

,但是文档中有错误。无论如何,我都尝试过此方法,我认为这是创建过滤器以及here中提到的方法的最简单方法。

这两种情况都会导致出现类似

的错误
  

回溯(最近通话最近):     文件“”,第1行,位于     文件“ /home/username/.local/lib/python3.6/site-packages/web3/eth.py”,行333,在过滤器中       [filter_params],     在request_blocking中,文件“ /home/username/.local/lib/python3.6/site-packages/web3/manager.py”第112行       引发ValueError(response [“ error”])

     

ValueError:{'code':-32601,'message':'方法eth_newFilter不存在/不可用'}

有关在主题参数已知的情况下如何创建和使用这些过滤器以及进一步获取智能合约的事件日志的任何想法。

1 个答案:

答案 0 :(得分:0)

该错误消息表示其内容。 Infura不支持HTTPS上的RPC方法class Box<T> { value: T; constructor(value: T) { this.value = value; } } function wrapIfString<T>(fn: (value: T) => string, value: T): Box<string> function wrapIfString<T, TResult>(fn: (value: T) => TResult, value: T): TResult function wrapIfString<T, TResult>(fn: (value: T) => TResult, value: T): TResult | Box<string> { const result = fn(value); if (value instanceof String && typeof result === "string") { return new Box<string>(result); } return result; } const testType = wrapIfString((n) => "", "hello") // Box<string> const testType1 = wrapIfString((n) => n * n, 5) // number ,这是您的代码最终要调用的内容。

我相信,如果您改为通过WebSocket连接,则相同的代码应该可以工作。