从智能合约获取字符串值而不是十六进制

时间:2019-06-17 08:53:05

标签: solidity web3

我有一个smarcontract函数,将其中的几个值作为字符串返回

我正在尝试使用web3将此数字转换为UTF,但无法正常工作。 如果我在调用智能合约的remix上尝试使用它,效果很好...但是JS没有提供

我在智能合约中的当前代码是

    function getToken(uint256 _tokenId) public view returns (
        string _tokenName,
        string _cryptoCardID,
        uint256 _price,
        uint256 _nextPrice,
        address _owner
    ) {
        _tokenName = doggies[_tokenId].name;
        _cryptoCardID = doggies[_tokenId].cryptoCardID;
        _price = tokenIdToPrice[_tokenId];
        _nextPrice = nextPriceOf(_tokenId);
        _owner = tokenIdToOwner[_tokenId];
    }

from JS


 for ( var i = 0; i < result; i++){

  myfunction.getToken.call(  i ,  function (error, resultGetAll) {
  console.log("Token ID:"+i+ "Data:"+JSON.stringify(resultGetAll)); //here i get _cryptoCardID as hex 0x000000...


   }) // each one

}// for

我期望的是可读形式(utf8)的字符串

1 个答案:

答案 0 :(得分:1)

合同将存储二进制数据,因此以十六进制形式返回数据是查看此数据的更有效方法。

您始终可以使用web3库中的实用程序功能将十六进制解码为utf-8。

注意:根据您的Web3版本,此方法可能有所不同,请参见here作为const exp = "x == 3"; const x = 3; if (eval(exp)) { console.log("True"); } else { console.log("False"); }的替代方法。

示例:

web3.utils.hexToUtf8

在web3版本上进行了测试: $ web3.toUtf8("0x68656c6c6f20776f726c640000000000000000000000000000000000000000") $ "hello world"