我尝试从这个可靠的约定中调用函数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();
然后,如响应中所指出的,可以使用约定包装器或使用前面描述的方法调用该调用,将约定地址而不是事务散列作为参数进行传递。
https://stackoverflow.com/questions/52028956
复制相似问题