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

时间:2018-02-21 12:15:48

标签: java ethereum solidity web3

据我所知,如果我们想要提取事件,我们必须使用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

谢谢

1 个答案:

答案 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替换为您感兴趣的事件类型。您需要识别所需事件所需的任何帐户特定信息(地址,姓名等)都应包含在事件本身中。

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

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

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

  

但出现此错误:

     

Error processing transaction request: Error: Exceeds block gas limit

如果没有看到用于调用该函数的合同和代码,我无法提供帮助。