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

Posted

技术标签:

【中文标题】从 Java 应用程序调用智能合约函数,无需监听事件【英文标题】:invoke a smart contract function from java application without need to listen to events 【发布时间】:2018-08-01 00:31:33 【问题描述】:

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

EventValues eventValues = contract.processEVENT_NAMEEvent(transactionReceipt);

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

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

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

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

但是出现了这个错误:

Error processing transaction request: Error: Exceeds block gas limit

如果没有看到用于调用该函数的合约和代码,我将无能为力。

【讨论】:

谢谢你的回答,其实我不是一个电话注册了很多账号,我的意思是,比如我有账号a,b,c,我怎么能让他们都注册自己呢?我可以定义 credential 1 、 credential 2 和 credential 3 ,然后在 register 调用中使用它。如果是,我必须把他们的地址放在哪里,TransactionReceipt 只接受函数“注册”的参数,没有参数到气体限制,来自哪个帐户,......等等)谢谢 感谢您的回答,您的 cmets 总是有帮助且清晰,再次感谢

以上是关于从 Java 应用程序调用智能合约函数,无需监听事件的主要内容,如果未能解决你的问题,请参考以下文章

如何调用 Solidity 函数从智能合约中返回以太币?

是否可以仅从应用程序提供对智能合约的访问并阻止直接访问?

从 sCrypt 智能合约中访问区块链数据(无需预言机)

使用 web3 js 调用智能合约函数

持续监听智能合约事件

java调用智能合约