Я пытаюсь вызвать функцию getPrice
из этого договора о надежности
pragma solidity ^0.4.0;
contract DataExchangeOfferContract {
uint price;
constructor(uint _price) public {
price = _price;
}
function getPrice() public constant returns (uint) {
return price;
}
}
Я использую частный клиент блокчейна в режиме отладки, используя geth
, и развернул контракт сзначение.Вот как я пытаюсь вызвать функцию единственного развернутого контракта:
EthBlock.Block block = web3j.ethGetBlockByNumber(DefaultBlockParameterName.LATEST, true).send().getBlock();
Transaction transaction = web3j.ethGetTransactionByBlockHashAndIndex(block.getHash(), BigInteger.ZERO).send().getTransaction().get();
String hash = transaction.getHash();
Function function = new Function(DataExchangeOfferContract.FUNC_GETPRICE, Collections.emptyList(), Collections.singletonList(new TypeReference<Uint256>() {}));
String functionEncoder = FunctionEncoder.encode(function);
Transaction transaction = Transaction.createEthCallTransaction(address, functionEncoder, null);
EthCall response = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
List<Type> types = FunctionReturnDecoder.decode(response.getValue(), function.getOutputParameters());
BigInteger price = (BigInteger) types.get(0).getValue();
Здесь types
имеет 0 элементов.Что я делаю не так?
РЕДАКТИРОВАТЬ:
Отсутствует то, что адрес контракта не хэш транзакции.Адрес контракта получается следующим образом:
EthGetTransactionReceipt transactionReceipt = web3j.ethGetTransactionReceipt(hash).send();
String address = transactionReceipt.getTransactionReceipt().get().getContractAddress();
Затем, как указано в ответах, вызов может быть вызван с использованием оболочки контракта или с использованием ранее описанного подхода, передавая адрес контракта ине хэш транзакции в качестве параметра .