gpt4 book ai didi

java - Web3j java 函数调用在 solidity 合约上返回空列表

转载 作者:行者123 更新时间:2023-12-05 05:14:59 35 4
gpt4 key购买 nike

我正在尝试从这个 solidity 合约中调用函数 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 在 Debug模式下运行私有(private)区 block 链客户端,并且我部署了一个具有值的合约。以下是我如何尝试调用已部署的唯一合约的函数:

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();

然后正如响应中所指出的,可以使用合约包装器或使用前面描述的方法调用调用,传递合约地址而不是交易哈希作为参数

最佳答案

如果您的目标只是从最新区 block 中获取价格,那么您就会使它变得比需要的更复杂。假设 DataExchangeOfferContract 是您生成的 stub (您的 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();

关于java - Web3j java 函数调用在 solidity 合约上返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52028956/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com