从 java 应用程序调用智能合约功能,无需监听事件
invoke a smart contract function from java application without need to listen to events
据我所知,如果我们想提取事件,我们必须使用 TransactionReceipt..
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
但是如果我有一个名为 "register" 的函数并且需要许多帐户通过调用函数 register 来注册他们自己呢?
如果 TransactionReceipt 没有参数(来自哪个帐户、气体限制等),我如何定义帐户(许多凭据)。
还有一件事我使用 TransactionReceipt 调用了 "register" 函数,如下所示:
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
是访问为特定事务引发的事件的好方法。交易期间抛出的所有事件都包含在收据中。然而,如果你想处理一般跨多个事务的事件 and/or 使用过滤器,你想要使用 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 替换为您感兴趣的活动类型。您需要用于识别您想要的活动的任何帐户特定信息(地址、姓名等)都应包含在活动本身中。
编辑: 根据您的评论,我似乎误解了您问题的这一部分。我会在这里留下我之前的回答,以防它对处理事件有用并在下面解决您的问题。
创建合约实例后(通过 deploy
或 load
),您可以更改 gas limit 和 gas price。两者在包装器的父级 class 中都有设置器。因此,您可以使用适用于该特定函数的适当 gas 参数,重用相同的包装器来调用合约中的不同函数。
但是,您不能更改基础 Credentials
(至少,不能不使用子class 或更改生成的包装器)。对于不同的凭据,使用 .load
.
创建不同的包装器对象
but this error appears:
Error processing transaction request: Error: Exceeds block gas limit
如果没有看到用于调用该函数的合同和代码,我无法提供帮助。
据我所知,如果我们想提取事件,我们必须使用 TransactionReceipt..
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
但是如果我有一个名为 "register" 的函数并且需要许多帐户通过调用函数 register 来注册他们自己呢?
如果 TransactionReceipt 没有参数(来自哪个帐户、气体限制等),我如何定义帐户(许多凭据)。
还有一件事我使用 TransactionReceipt 调用了 "register" 函数,如下所示:
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
是访问为特定事务引发的事件的好方法。交易期间抛出的所有事件都包含在收据中。然而,如果你想处理一般跨多个事务的事件 and/or 使用过滤器,你想要使用 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 替换为您感兴趣的活动类型。您需要用于识别您想要的活动的任何帐户特定信息(地址、姓名等)都应包含在活动本身中。
编辑: 根据您的评论,我似乎误解了您问题的这一部分。我会在这里留下我之前的回答,以防它对处理事件有用并在下面解决您的问题。
创建合约实例后(通过 deploy
或 load
),您可以更改 gas limit 和 gas price。两者在包装器的父级 class 中都有设置器。因此,您可以使用适用于该特定函数的适当 gas 参数,重用相同的包装器来调用合约中的不同函数。
但是,您不能更改基础 Credentials
(至少,不能不使用子class 或更改生成的包装器)。对于不同的凭据,使用 .load
.
but this error appears:
Error processing transaction request: Error: Exceeds block gas limit
如果没有看到用于调用该函数的合同和代码,我无法提供帮助。