【提问】web3j调用合约方法返回值怎么得到


#1

智能合约: contract UserInfo1 is owned { mapping (uint => UserInfo) public users; function getUserAge(uint id) onlyOwner constant returns (string aa) { return users[id].age; } }

合约编译的java代码: public Future<TransactionReceipt> getUserAge(Uint256 id) { Function function = new Function(“getUserAge”, Arrays.<Type> asList(id), Collections.<TypeReference<?>> emptyList()); return executeTransactionAsync(function); }

java中调用合约方法: public static void getUser() throws Exception { Future<TransactionReceipt> userAge = loadContract().getUserAge( new Uint256(BigInteger.valueOf(2017011900))); TransactionReceipt transactionReceipt = userAge.get(); }

public static void getSymbol() throws Exception { Utf8String symbol = loadContract().symbol().get(); System.out.println("symbol: " + symbol); }

请问调用这俩方法怎么得到合约里面对应方法的返回值? 第一个transactionReceipt怎么得到合约返回值aa?


#2

你写的有误,getUserAge函数是调用合约方法,使用的是异步调用方式,用到了java中的future机制,你可以百度了解一下future原理;getUser函数中调用getUserAge产生一个交易而已,userAge.get()是阻塞等待交易处理完毕,就是future机制中的get方法。
调用合约constant方法获取结果可以使用executeCallSingleValueReturn(只有一个返回值)或者executeCallMultipleValueReturn(多个返回值),不必产生交易的。若是非consta触发方法,只能在合约函数里面出发一个event,java侧通过event获取返回结果


#3

非常量调用方法无法返回值,因为需要全网节点共识,是一笔交易,不是消息调用,调用完成后可以通过交易hash来查询交易收据,如果想查看该交易改变合约状态后的值,可以添加evm的event,通过日志来监控合约状态。