使用string数据类型表示文本数据而非bytes32的好处是什么呢? 当我将数据结构从bytes32切换到string时,似乎我的合约遇到了gas耗尽异常。

原文地址

2 人回答 0

2 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-07 21:34:00

为什么用string替代bytes32?

对于那些长度超过32个字节的任意长度字符串(UTF-8)数据使用string。 前端使用web3.toAscii或UTF-8等方法(当问题得到解决时)将更容易解码长字符串,而不是实现UTF-8解码一系列bytes32的逻辑。

来自Solidity文档

根据经验,对任意长度的原始字节数据使用bytes,对任意长度的字符串(UTF-8)数据使用string。 如果你可以将长度限制为特定的字节数,请始终使用bytes1bytes32其中之一,因为它们要便宜得多。

String literals也可能有用或很方便:

String literals用双引号或单引号写成(“foo”或'bar')......

String literals支持转义字符,例如\ n,\ xNN和\ uNNNN。 \ xNN采用十六进制值并插入适当的字节,而\ uNNNN采用Unicode codepoint并插入UTF-8序列。


为什么用 bytes32替代string

Why do Solidity examples use bytes32 type instead of string?(为什么Solidity示例使用bytes32类型而不是字符串?)上的回答。

bytes32使用较少的gas,因为它适合EVM的单个单词,而string是大小动态变化的类型,其具有Solidity的当前限制(例如无法从函数返回到合约)。

||
||

回答发布于 2018-09-07 21:33:59

就像其他帖子所说的那样,只在想动态分配数据的时候使用string,否使用Bytes32会更好。

Bytes32在gas消耗方面也较有优势。 如果你想试一下,我建立了一个小小的示例https://ethfiddle.com/70ipaEIFdk

使用Byte消耗了21465gas;

使用String消耗了21897gas;

pragma solidity ^0.4.18;

contract SampleOverflow {
  string constant statictext = "HelloStackOverFlow";
  byt`es32 constant byteText = "HelloStackOverFlow";
  function  getString() payable public  returns(string){
    return statictext;
  }

  function  getByte() payable public returns(bytes32){
    return byteText;
  }
}

获取Byte

获取String

https://ethfiddle.com/70ipaEIFdk

||
||

回答发布于 2018-09-07 21:33:59

就像其他帖子所说的那样,只在想动态分配数据的时候使用string,否使用Bytes32会更好。

Bytes32在gas消耗方面也较有优势。 如果你想试一下,我建立了一个小小的示例https://ethfiddle.com/70ipaEIFdk

使用Byte消耗了21465gas;

使用String消耗了21897gas;

pragma solidity ^0.4.18;

contract SampleOverflow {
  string constant statictext = "HelloStackOverFlow";
  byt`es32 constant byteText = "HelloStackOverFlow";
  function  getString() payable public  returns(string){
    return statictext;
  }

  function  getByte() payable public returns(bytes32){
    return byteText;
  }
}

获取Byte

获取String

https://ethfiddle.com/70ipaEIFdk

||
||

回答发布于 2018-09-07 21:34:00

为什么用string替代bytes32?

对于那些长度超过32个字节的任意长度字符串(UTF-8)数据使用string。 前端使用web3.toAscii或UTF-8等方法(当问题得到解决时)将更容易解码长字符串,而不是实现UTF-8解码一系列bytes32的逻辑。

来自Solidity文档

根据经验,对任意长度的原始字节数据使用bytes,对任意长度的字符串(UTF-8)数据使用string。 如果你可以将长度限制为特定的字节数,请始终使用bytes1bytes32其中之一,因为它们要便宜得多。

String literals也可能有用或很方便:

String literals用双引号或单引号写成(“foo”或'bar')......

String literals支持转义字符,例如\ n,\ xNN和\ uNNNN。 \ xNN采用十六进制值并插入适当的字节,而\ uNNNN采用Unicode codepoint并插入UTF-8序列。


为什么用 bytes32替代string

Why do Solidity examples use bytes32 type instead of string?(为什么Solidity示例使用bytes32类型而不是字符串?)上的回答。

bytes32使用较少的gas,因为它适合EVM的单个单词,而string是大小动态变化的类型,其具有Solidity的当前限制(例如无法从函数返回到合约)。

||
||

回答发布于 2018-09-07 21:34:00

为什么用string替代bytes32?

对于那些长度超过32个字节的任意长度字符串(UTF-8)数据使用string。 前端使用web3.toAscii或UTF-8等方法(当问题得到解决时)将更容易解码长字符串,而不是实现UTF-8解码一系列bytes32的逻辑。

来自Solidity文档

根据经验,对任意长度的原始字节数据使用bytes,对任意长度的字符串(UTF-8)数据使用string。 如果你可以将长度限制为特定的字节数,请始终使用bytes1bytes32其中之一,因为它们要便宜得多。

String literals也可能有用或很方便:

String literals用双引号或单引号写成(“foo”或'bar')......

String literals支持转义字符,例如\ n,\ xNN和\ uNNNN。 \ xNN采用十六进制值并插入适当的字节,而\ uNNNN采用Unicode codepoint并插入UTF-8序列。


为什么用 bytes32替代string

Why do Solidity examples use bytes32 type instead of string?(为什么Solidity示例使用bytes32类型而不是字符串?)上的回答。

bytes32使用较少的gas,因为它适合EVM的单个单词,而string是大小动态变化的类型,其具有Solidity的当前限制(例如无法从函数返回到合约)。

||
||

回答发布于 2018-09-07 21:33:59

就像其他帖子所说的那样,只在想动态分配数据的时候使用string,否使用Bytes32会更好。

Bytes32在gas消耗方面也较有优势。 如果你想试一下,我建立了一个小小的示例https://ethfiddle.com/70ipaEIFdk

使用Byte消耗了21465gas;

使用String消耗了21897gas;

pragma solidity ^0.4.18;

contract SampleOverflow {
  string constant statictext = "HelloStackOverFlow";
  byt`es32 constant byteText = "HelloStackOverFlow";
  function  getString() payable public  returns(string){
    return statictext;
  }

  function  getByte() payable public returns(bytes32){
    return byteText;
  }
}

获取Byte

获取String

https://ethfiddle.com/70ipaEIFdk

||
||