发送事务异步|无法解决方法' executeTransactionAsync'

时间:2018-04-02 16:33:54

标签: java android realm ethereum web3-java

我正在尝试使用Web3j库向Ethereum区块链发送一个事务,我得到一个错误,我必须使用Async发送它。当我用Async发送它时,我得到一个错误,该函数不存在。 我使用的是Android Studio,Java和Web3j库。

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

如果删除Async,方法为executeTransaction,则会收到错误,需要通过Async发送事务。

有没有办法可以用Realm或其他东西发送这个交易?或者也许我使用Web3j是错误的,我需要以另一种方式使用它?

发送交易的代码:

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

Web3j API

1 个答案:

答案 0 :(得分:2)

您需要使用executeTransaction中包含的RemoteCall

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

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

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

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