gpt4 book ai didi

java - 从java应用程序调用智能合约函数,无需监听事件

转载 作者:行者123 更新时间:2023-11-30 06:17:28 25 4
gpt4 key购买 nike

据我所知,如果我们想提取事件,我们必须使用 TransactionReceipt..

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

但是,例如,如果我有一个名为“register”的函数,并且需要许多帐户通过调用函数 register 来注册自己,该怎么办?

如果 TransactionReceipt 没有参数(来自哪个帐户、gas 限制等),我如何定义帐户(许多凭据)。

我使用 TransactionReceipt 调用“注册”函数的另一件事如下:

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

但出现此错误:

Error processing transaction request: Error: Exceeds block gas limit

最佳答案

As I understood that we have to use TransactionReceipt if we want to extract the events..

TransactionReceipt 不是监听事件的唯一方法。您还可以设置 Observable 过滤器:

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

TransactionReceipt 是获取针对某个特定事务引发的事件的好方法。交易期间引发的所有事件都包含在收据中。但是,如果您希望跨多个事务处理一般事件和/或使用过滤器,则需要使用 Observable 过滤器。有一整节关于事件过滤器的示例 here .

how I can define accounts ( many credentials ) if the TransactionReceipt doesn't have parameters for ( from which account, gas limit, ..etc).

如果我正确理解这个问题,您想知道如何处理 TransactionReceipt 的事件部分吗? Web3j 在合约实例中提供了一个辅助方法,该方法将处理来自 TransactionReceipt 的日志。

EventValues eventValues = Contract.processEVENT_NAMEEvent(transactionReceipt);

将 EVENT_NAME 替换为您感兴趣的 Activity 类型。识别所需 Activity 所需的任何帐户特定信息(地址、姓名等)都应包含在 Activity 本身中。

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

创建合约实例后(通过 deployload),您可以更改 Gas 限制和 Gas 价格。两者在包装器的父类中都有 setter 。因此,您可以重复使用相同的包装器,使用该特定函数的适当气体参数来调用合约中的不同函数。

但是,您无法更改底层的Credentials(至少在没有子类化或更改生成的包装器的情况下)。对于不同的凭据,使用 .load 创建不同的包装器对象。

but this error appears:

Error processing transaction request: Error: Exceeds block gas limit

如果没有看到用于调用该函数的契约(Contract)和代码,我无法提供帮助。

关于java - 从java应用程序调用智能合约函数,无需监听事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48905703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com