web3j无法使用合同功能?

时间:2017-06-23 11:01:26

标签: java ethereum web3-java

这是我在私人网络中的简单合约

contract AB {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function AB () {
        balanceOf[msg.sender] = 1200;              // Give the creator all initial tokens
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) {
        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough
        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
        balanceOf[msg.sender] -= _value;                     // Subtract from the sender
        balanceOf[_to] += _value;                            // Add the same to the recipient
    }

    function gettokenBalance(address to)constant returns (uint256){
          return balanceOf[to];
       }
}

我使用web3J生成了智能合约包装器,并且有像

这样的功能
public Future<Uint256> gettokenBalance(Address to) {
        Function function = new Function("gettokenBalance", 
                Arrays.<Type>asList(to), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallSingleValueReturnAsync(function);
    }

当我试图访问我的合同函数时,如

AB newAB = AB.load(contractaddress, web3j, credentials, gasprice, gaslimit);
        Future<Uint256> result = newAB.gettokenBalance(new Address(address));
        LOGGER.info("result:::"+result.get());

它给了我一个像

这样的例外
 java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 0
    at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) ~[na:1.8.0_91]
    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895) ~[na:1.8.0_91]
    at com.belrium.service.UserWalletService.check(UserWalletService.java:197) ~[classes/:na]
    at com.belrium.controller.UserController.check(UserController.java:119) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]

请帮忙。

1 个答案:

答案 0 :(得分:0)

期货是异步的,因此get()将尝试获取当前仍在计算的结果值。它只在计算完成后才有效。

我认为Java Future API不支持你想要的东西。相反,我建议使用CompletableFuture,其join()方法可以完全按照您的要求执行:等待和获取。

当我从合同中生成代码时,我遇到了同样的问题。所以我抛弃了生成器并用Future s替换了生成的代码中的所有CompletableFuture。我认为这是对web3j的疏忽,虽然可能有不同的方法来处理我不知道的这个问题!