【问题标题】:Sending A Transaction Async | Cannot Resolve Method 'executeTransactionAsync'发送事务异步 |无法解决方法“executeTransactionAsync”
【发布时间】:2018-04-02 16:33:54
【问题描述】:

我正在尝试使用 Web3j 库将交易发送到以太坊区块链,我收到一个错误,我必须使用异步发送它。当我使用 Async 发送它时,我收到一个错误,指出该函数不存在。 我正在使用 Android Studio、Java 和 Web3j 库。

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

如果我删除 Async 以使方法为 executeTransaction,我会收到一个错误,即 Transaction 需要通过 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

【问题讨论】:

    标签: java android realm ethereum web3-java


    【解决方案1】:

    您需要使用包裹在RemoteCall 中的executeTransaction

    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 的用法。

    【讨论】:

    • 我目前正在使用 infura。这是必需的吗?
    • 我也试过自动生成器,代码有很多错误。
    • 我收到错误 Lamda 表达式在此级别不支持。
    • 错误在线return executeTransaction(function);
    • 我添加了一个使用 solc + web3j 生成包装器的示例。要连接到 Infura,请将默认的 HttpService 替换为 Infura URL + 您的 API 密钥(请参阅 web3j.readthedocs.io/en/latest/infura.html)。此外,请确保您使用 Java 8+ 以获得 lambda 支持。如果你不能在你的项目中使用 lambdas,你可能需要编辑生成的代码来重写 lambdas(应该很容易)。
    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2019-03-19
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多