Вызов Java-функции Web3j возвращает пустой список по договору солидности - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь вызвать функцию 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();

Затем, как указано в ответах, вызов может быть вызван с использованием оболочки контракта или с использованием ранее описанного подхода, передавая адрес контракта ине хэш транзакции в качестве параметра .

1 Ответ

0 голосов
/ 27 августа 2018

Если ваша цель состоит в том, чтобы просто получить цену от последнего блока, вы делаете ее более сложной, чем она должна быть.Предполагая, что DataExchangeOfferContract является вашей сгенерированной заглушкой (ваш код Solidity просто говорит Contract), вы уже определили метод getPrice.Чтобы использовать его, ваш код должен выглядеть примерно так:

Web3j web3j = Web3j.build(new HttpService());

TransactionManager manager = new ReadonlyTransactionManager(web3j, "YOUR_ADDRESS");
DataExchangeOfferContract contract = DataExchangeOfferContract.load("CONTRACT_ADDRESS", web3j, 
                                                                    manager, Contract.GAS_PRICE,
                                                                    Contract.GAS_LIMIT);
RemoteCall<BigInteger> remoteCall = contract.getPrice();
BigInteger price = remoteCall.send();
...