正如我所理解的,如果我们想提取事件,我们必须使用TransactionReceipt。.
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
但是,例如,如果我有一个名为“register”的函数,并且需要许多帐户通过调用register来注册它们自己,该怎么办?
如果TransactionReceipt没有参数(从哪个帐户、气体限制、.等)。
还有一件事,我使用TransactionReceipt调用了“register”函数,如下所示:
TransactionReceipt transactionReceipt = contract.register("John",BigInteger.valueOf(101)).send();
但出现此错误:
处理事务请求时出错:错误:超出块气体限制
1条答案
按热度按时间jum4pzuy1#
正如我所理解的,如果我们想提取事件,我们必须使用TransactionReceipt。.
TransactionReceipt
不是侦听事件的唯一方法。您还可以设置一个Observable过滤器:TransactionReceipt
是访问为一个特定事务抛出的事件的好方法。在事务期间引发的所有事件都包含在收据中。但是,如果您希望跨多个事务处理事件和/或使用过滤器,则需要使用Observable过滤器。有一整节是关于事件过滤器的,其中有here的例子。如果TransactionReceipt没有参数(从哪个帐户、气体限制、.等)。
如果我理解正确的话,您想知道如何处理
TransactionReceipt
的事件部分吗?Web 3 j在合约示例中提供了一个helper方法,它将处理来自TransactionReceipt
的日志。EventValues eventValues = contract.processEVENT_NAMEEvent(transactionReceipt);
将EVENT_NAME替换为您感兴趣的事件类型。您需要用来识别所需事件的任何帐户特定信息(地址、名称等)都应包含在事件本身中。
**编辑:**根据您的评论,看起来我误解了您问题的这一部分。我将在这里留下我以前的答案,以防它对处理事件有用,并在下面解决您的问题。
创建合约示例后(通过
deploy
或load
),您可以更改燃气限制和燃气价格。两者都在 Package 器的父类中有setter。因此,您可以重用相同的 Package 器,使用该特定函数的适当gas参数调用合约中的不同函数。但是,您不能更改底层的
Credentials
(至少,在不创建子类或更改生成的 Package 器的情况下不能)。对于不同的凭据,使用.load
创建不同的 Package 器对象。但出现此错误:
Error processing transaction request: Error: Exceeds block gas limit
如果没有看到调用函数的契约和代码,我就无法帮助解决这个问题。