java - 异步发送交易 |无法解析方法 'executeTransactionAsync'

标签 java android realm ethereum web3-java

我正在尝试使用 Web3j 库将交易发送到以太坊区 block 链,但收到一条错误消息,提示我必须使用异步发送交易。当我使用异步发送它时,出现该函数不存在的错误。 我正在使用 Android Studio、Java 和 Web3j 库。

当调用 executeTransactionAsync 方法(web3.abi.datatypes.Function 的一部分)时,我收到一条错误消息,指出找不到该方法。我发现这意味着 Web3j 库中不存在方法 executeTransactionAsync 。然而,Web3j 文档说要使用该方法。我使用的是最新版本的 Web3j,即 3.1.1。

如果我删除异步,使方法为 executeTransaction,我会收到一条错误,指出事务需要通过异步发送。

有没有办法可以通过 Realm 或其他方式发送此交易?或者也许我错误地使用了 Web3j,我需要以另一种方式使用它?


发送交易的代码:

public TransactionReceipt approve() throws IOException, TransactionException {
    Function function = new Function("approve", Arrays.<Type>asList(), Collections.<TypeReference<?>>emptyList());
    return executeTransactionAsync (function);
}

Web3j API

最佳答案

您需要使用封装在 RemoteCall 中的 executeTransaction

Function function = new Function(...);
RemoteCall<TransactionReceipt> remoteCall = new RemoteCall(() -> {
  //call to executeTransaction
});
TransactionReceipt receipt = remoteCall.send();

您可以使用 web3j 的代码生成工具为您的智能合约创建简单的包装器,从而让自己的生活变得更轻松。请参阅this section有关如何生成代码的 web3j 文档。生成的类处理远程调用(以及常量函数的本地调用)。您的客户端代码如下所示:

Web3j web3j = Web3j.build(new HttpService());
Credentials credentials = Credentials.create(<YOUR_PRIVATE_KEY>);
SimpleContract contract = SimpleContract.load(<CONTRACT_ADDRESS>, web3j, credentials, BigInteger.valueOf(<GAS_PRICE>), BigInteger.valueOf(<GAS_LIMIT));
RemoteCall<TransactionReceipt> remoteCall = contract.setValue(BigInteger.valueOf(5)); // Call to smart contract setValue(5)
TransactionReceipt receipt = remoteCall.send();

编辑以添加代码生成示例

$ solc --version
solc, the solidity compiler commandline interface
Version: 0.4.19+commit.c4cbbb05.Windows.msvc

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

$ solc contracts/SimpleContract.sol --bin --abi --optimize -o build/

$ web3j.bat solidity generate build/SimpleContract.bin build/SimpleContract.abi -o ./src -p mypackage

              _      _____ _     _
             | |    |____ (_)   (_)
__      _____| |__      / /_     _   ___
\ \ /\ / / _ \ '_ \     \ \ |   | | / _ \
 \ V  V /  __/ |_) |.___/ / | _ | || (_) |
  \_/\_/ \___|_.__/ \____/| |(_)|_| \___/
                         _/ |
                        |__/

Generating mypackage.SimpleContract ... File written to .\src

注意 - 我在 Windows 上运行 Cygwin。因此,web3j.bat 用法。

关于java - 异步发送交易 |无法解析方法 'executeTransactionAsync',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49615036/

相关文章:

java - 包装 jframe

java - 在PreparedStatement和ResultSet中操作setter和getter

java - 在 Java/Android 中生成锯齿音

android - 如何为具有不同 cpu 架构的相同 apk 文件创建不同的版本号

ios - Realm iOS : how expensive is it to initiate Realm with a bundled db?

java - touchlistener 代码错误 - Android

java - 将 String 日期转换为 dd/MM/yyyy 格式的 java.util.Date

android - 如何从另一个类调用引用 (TextView)findViewById

swift - 在 Swift 中从捆绑的 Realm 数据库加载数据

ios - 无法将数据保存到 Realm