用于字节操作的 Solidity 代码无法使用 Solidity 0.8.0 的安全帽编译器进行编译

Posted

技术标签:

【中文标题】用于字节操作的 Solidity 代码无法使用 Solidity 0.8.0 的安全帽编译器进行编译【英文标题】:Solidity code for byte manipulation fail to compile using hardhat compiler with solidity 0.8.0 【发布时间】:2021-07-11 18:23:21 【问题描述】:

我正在使用0.8.0 编译器从用Sol 0.5.0 编写的OpenSea 项目编译代码,但出现错误:

  ParserError: Expected primary expression.
--> contracts/Strings.sol:53:25:
 |
53 |             bstr[k--] = byte(uint8(48 + _i % 10));
 |                         ^^^^


Error HH600: Compilation failed

原始代码位于:https://github.com/ProjectOpenSea/opensea-creatures/blob/master/contracts/Strings.sol,它使用Sol 0.5.0,大概是用松露编译的。我正在尝试使用Hardhat0.8.0。代码转载如下:

pragma solidity ^0.8.0;

library Strings 
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) 
      bytes memory _ba = bytes(_a);
      bytes memory _bb = bytes(_b);
      bytes memory _bc = bytes(_c);
      bytes memory _bd = bytes(_d);
      bytes memory _be = bytes(_e);
      string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
      bytes memory babcde = bytes(abcde);
      uint k = 0;
      for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
      for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
      for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
      for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
      for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i];
      return string(babcde);
    

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) 
        return strConcat(_a, _b, _c, _d, "");
    

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) 
        return strConcat(_a, _b, _c, "", "");
    

    function strConcat(string memory _a, string memory _b) internal pure returns (string memory) 
        return strConcat(_a, _b, "", "", "");
    

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) 
        if (_i == 0) 
            return "0";
        
        uint j = _i;
        uint len;
        while (j != 0) 
            len++;
            j /= 10;
        
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) 
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        
        return string(bstr);
    

请注意,我在顶部更改了 pragma。对我来说一切都很好,所以我不确定问题出在哪里,除了它在这条线上: bstr[k--] = byte(uint8(48 + _i % 10));

【问题讨论】:

【参考方案1】:

使用bytes1 而不是byte


类型byte 已被删除。它是bytes1 的别名。

来源:https://docs.soliditylang.org/en/v0.8.3/080-breaking-changes.html#silent-changes-of-the-semantics

【讨论】:

以上是关于用于字节操作的 Solidity 代码无法使用 Solidity 0.8.0 的安全帽编译器进行编译的主要内容,如果未能解决你的问题,请参考以下文章

Solidity实现简单的智能合约

在json里查看Solidity的版本

Solidity的delete操作

智能合约从入门到精通:Solidity汇编语言

solidity address(this)是什么意思

solidity address(this)是什么意思