微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决字节操作的 Solidity 代码无法使用具有 Solidity 0.8.0 的安全帽编译器进行编译

我正在使用 Sol 0.5.0 编译器从用 0.8.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 并且大概是用 truffle 编译的。我正在尝试使用 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 _d) internal pure returns (string memory) {
        return strConcat(_a,_b,_c,_d,"");
    }

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

    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));

解决方法

使用 bytes1 而不是 byte


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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?