Web3j

Web3j 通過 eth_call 直接從合約中獲取字元串

  • July 10, 2018

我只有一個簡單的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()。(您需要有可用的輸出參數類型列表,因此您需要稍微重構一下程式碼。)

引用自:https://ethereum.stackexchange.com/questions/53083