Мой смарт-контракт имеет одну функцию 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
может быть вызвана из ремикса и он работал хорошо и возвращал соответствующее значение. введите описание изображения здесь
Так есть ли какой-нибудь эксперт по web3j, который может сказать мне, что не так с моим кодом? Как решить проблему декодирования выходных параметров? Большое спасибо.