以太坊常见问题和错误

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

web3j发送异步交易时不能解析方法executeTransactionAsync

我正试图用web3j库发送一个交易到以太坊区块链,得到一个错误,我必须用异步发送它。当用异步发送它时,会得到一个函数不存在的错误。我使用的是Android Studio、Java和web3j库。

当我调用web3.abi.datatypes.FunctionexecuteTransactionAsync方法时,我得到以一个错误提示说web3j库中没有这个方法executeTransactionAsync。但是官方文件又说可以使用这个方法,我看的web3j文档是3.1.1版的。

如果删掉异步的方式使用executeTransaction发送的话,又会提示我交易需要异步发送。

我有什么办法把这个交易发送出去吗?也许我的web3j代码写错了:

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

问题的解决

你需要使用executeTransaction封装包中的RemoteCall:

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

你可以通过使用web3j的代码生成工具为你的以太坊智能合约创建简单的封装包,从而使你的开发更轻松。有关如何生成代码的Web3J文档的这一部分。通过生成的类处理远程调用(以及对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