Web3j
Web3j 通過 eth_call 直接從合約中獲取字元串
我只有一個簡單的solidity合約:
pragma solidity ^0.4.19; contract SampleContract { string value; function SampleContract() public { value = "hello world"; } function getValue() public view returns (string){ return value; } function setValue(string str) public { value = str; } }
我正在嘗試與 web3j 進行互動。現在我已經成功部署並獲得了地址。
我正在嘗試
getValue()
通過程式碼呼叫方法:static String call(String from, String contractAddress, String callData) throws Exception { Call call = new Call(from, contractAddress, callData); return service.ethCall(call, DefaultBlockParameter.valueOf("latest")).send().getValue(); } String callData = encodeGetValueFuncWithParams(); System.out.println(callData); String result = call(from, contractAddress, callData); System.out.println(result);
我確實得到了結果,但是是十六進制的。我得到的結果是
0x 0000000000000000000000000000000000000000000000000000000000000020 000000000000000000000000000000000000000000000000000000000000000b 68656c6c6f20776f726c64000000000000000000000000000000000000000000
我轉換了這個值,它是“hello world”,但我怎樣才能直接將值作為字元串“hello world”而不是“0xxxxxxxx”獲取。我創建的方式
calldata
如下所示:static String encodeGetValueFuncWithParams(){ Function function = new Function( "getValue", Collections.emptyList(), Arrays.asList(new TypeReference<DynamicBytes>(){}) ); String encodedFunc = FunctionEncoder.encode(function); return encodedFunc; }
我的問題是:
如何構造我的 calldata 以便我可以直接從契約中獲取字元串值而不是十六進制值。
請參閱https://docs.web3j.io/transactions.html#querying-the-state-of-a-smart-contract。我想你需要打電話
FunctionReturnDecoder.decode()
。(您需要有可用的輸出參數類型列表,因此您需要稍微重構一下程式碼。)