我的智能合约有一个功能balanceOf
,它的 ABI 如下:
{
"constant": true,
"inputs": [
{
"name": "_ss",
"type": "string[]"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "result",
"type": "string[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
我使用web3j来调用这个函数,代码片段如下:
@Test
public void testCallBalanceOfHTLC() throws IOException {
Web3j web3j = Web3j.build(new HttpService(
"http://10.100.128.231:8545/"));
Function function =
new Function(
"balanceOf",
Arrays.asList(
new DynamicArray<>(
new Utf8String("0xD3Ac266C12B0f198B1F103Ef87EadAb1162E39ed"))),
Collections.singletonList(new TypeReference<DynamicArray<Utf8String>>() {
}));
String data = FunctionEncoder.encode(function);
Transaction transaction = Transaction.createEthCallTransaction("0xD3Ac266C12B0f198B1F103Ef87EadAb1162E39ed", "0x3e6e547bC917001Cef35a3dDd6376BAd2e4Ab7Db", data);
EthCall ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
System.out.println(((DynamicArray)results.get(0)).getValue().get(0));
}
调用成功但是输出的ABI解码结果((DynamicArray)results.get(0)).getValue().get(0)
是空字符串“”,所以我怀疑是不是new Function
特别是第三个参数有什么问题outputParameters
,但是我已经非常仔细地通过了所有web3j对abi的单元测试并且没有没有发现我的代码有问题。
相反,balanceOf
可以从 remix 中调用函数,它运行良好并返回了正确的值。
那么有没有 web3j 专家可以告诉我我的代码有什么问题?如何解决输出参数解码问题?非常感谢。