从Java应用程序调用智能合约函数,而无需侦听事件

bnlyeluc  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(135)

正如我所理解的,如果我们想提取事件,我们必须使用TransactionReceipt。.

TransactionReceipt transactionReceipt = contract.someMethod(
         <param1>,
         ...).send();

但是,例如,如果我有一个名为“register”的函数,并且需要许多帐户通过调用register来注册它们自己,该怎么办?
如果TransactionReceipt没有参数(从哪个帐户、气体限制、.等)。
还有一件事,我使用TransactionReceipt调用了“register”函数,如下所示:

TransactionReceipt transactionReceipt = contract.register("John",BigInteger.valueOf(101)).send();

但出现此错误:
处理事务请求时出错:错误:超出块气体限制

jum4pzuy

jum4pzuy1#

正如我所理解的,如果我们想提取事件,我们必须使用TransactionReceipt。.
TransactionReceipt不是侦听事件的唯一方法。您还可以设置一个Observable过滤器:

contract.someEventObservable(startBlock, endBlock).subscribe(event -> ...);

TransactionReceipt是访问为一个特定事务抛出的事件的好方法。在事务期间引发的所有事件都包含在收据中。但是,如果您希望跨多个事务处理事件和/或使用过滤器,则需要使用Observable过滤器。有一整节是关于事件过滤器的,其中有here的例子。
如果TransactionReceipt没有参数(从哪个帐户、气体限制、.等)。
如果我理解正确的话,您想知道如何处理TransactionReceipt的事件部分吗?Web 3 j在合约示例中提供了一个helper方法,它将处理来自TransactionReceipt的日志。
EventValues eventValues = contract.processEVENT_NAMEEvent(transactionReceipt);
将EVENT_NAME替换为您感兴趣的事件类型。您需要用来识别所需事件的任何帐户特定信息(地址、名称等)都应包含在事件本身中。

**编辑:**根据您的评论,看起来我误解了您问题的这一部分。我将在这里留下我以前的答案,以防它对处理事件有用,并在下面解决您的问题。

创建合约示例后(通过deployload),您可以更改燃气限制和燃气价格。两者都在 Package 器的父类中有setter。因此,您可以重用相同的 Package 器,使用该特定函数的适当gas参数调用合约中的不同函数。
但是,您不能更改底层的Credentials(至少,在不创建子类或更改生成的 Package 器的情况下不能)。对于不同的凭据,使用.load创建不同的 Package 器对象。
但出现此错误:
Error processing transaction request: Error: Exceeds block gas limit
如果没有看到调用函数的契约和代码,我就无法帮助解决这个问题。

相关问题