获取合约返回值的方法

1. solidity的合约中,设定函数为view类型,如

function getAgent(address _agentAddress) public view returns(address _parentAddress, address _grandpaAddress){
    require(agents[_agentAddress].isUsed, "address_none");

    return (agents[_agentAddress].parentAddress, agents[_agentAddress].grandpaAddress);
}

这样通过web3j生成的java函数为

public RemoteCall<Tuple2<Address, Address>> getAgent(Address _agentAddress) {
    final Function function = new Function("getAgent", 
            Arrays.<Type>asList(_agentAddress), 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}));
    return new RemoteCall<Tuple2<Address, Address>>(
            new Callable<Tuple2<Address, Address>>() {
                @Override
                public Tuple2<Address, Address> call() throws Exception {
                    List<Type> results = executeCallMultipleValueReturn(function);
                    return new Tuple2<Address, Address>(
                            (Address) results.get(0), 
                            (Address) results.get(1));
                }
            });
}

接着,使用的话如下:

RemoteCall<Tuple2<Address, Address>> tuple2RemoteCall = MainContractController.mainContract.getAgent(_agentAddress);
Tuple2<Address, Address> addressAddressTuple2 = tuple2RemoteCall.send();

2. 如果函数不能是View类型,则solidity中只能通过emit事件了。

emit eventName(…)