据我所知,如果我们想要提取事件,我们必须使用TransactionReceipt。
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
但是,例如,如果我有一个名为“register”的函数,并且需要许多帐户来通过调用函数寄存器来注册自己。
如果TransactionReceipt没有参数(来自哪个帐户,气体限制,..等),我如何定义帐户(许多凭证)。
我使用TransactionReceipt调用“register”函数还有以下几点:
TransactionReceipt transactionReceipt = contract.register("John",BigInteger.valueOf(101)).send();
但出现此错误:
Error processing transaction request: Error: Exceeds block gas limit
谢谢
答案 0 :(得分:1)
据我所知,如果我们想要提取事件,我们必须使用TransactionReceipt。
TransactionReceipt
不是监听事件的唯一方式。您还可以设置Observable过滤器:
contract.someEventObservable(startBlock, endBlock).subscribe(event -> ...);
TransactionReceipt
是访问为特定事务抛出的事件的好方法。交易期间抛出的所有事件都包含在收据中。但是,如果要在多个事务中处理事件和/或使用过滤器,则需要使用Observable过滤器。关于事件过滤器的整个部分包含示例here。
如果TransactionReceipt没有(来自哪个帐户,气体限制,..等)的参数,我如何定义帐户(许多凭证)。
如果我正确理解了这个问题,您想知道如何处理TransactionReceipt
的事件部分? Web3j在合同实例中提供了一个帮助方法,它将处理来自TransactionReceipt
的日志。
EventValues eventValues = contract.processEVENT_NAMEEvent(transactionReceipt);
将EVENT_NAME替换为您感兴趣的事件类型。您需要识别所需事件所需的任何帐户特定信息(地址,姓名等)都应包含在事件本身中。
编辑:根据您的评论,我似乎误解了您的问题的这一部分。我将在此处留下我之前的答案,以防它对处理事件和解决您的问题非常有用。
创建合同实例后(通过deploy
或load
),您可以更改天然气限价和天然气价格。两者都在包装器的父类中有setter。因此,您可以使用相同的包装器,使用适合该特定函数的气体参数调用合同中的不同函数。
但是,您无法更改基础Credentials
(至少,不能没有子类化或更改生成的包装器)。对于不同的凭据,使用.load
创建不同的包装器对象。
但出现此错误:
Error processing transaction request: Error: Exceeds block gas limit
如果没有看到用于调用该函数的合同和代码,我无法提供帮助。