4

我是 Solidity 的新手,这是我正在测试和混音的代码

browser/Untitled.sol:1:1: : 源文件未指定所需的编译器版本!考虑添加“pragma solidity ^0.4.12 contract C { ^ 跨越多行。

希望有人可以给予一些指导。

contract C {
    function bytes32ToString(bytes32 x) constant returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    function bytes32ArrayToString(bytes32[] data) returns (string) {
        bytes memory bytesString = new bytes(data.length * 32);
        uint urlLength;
        for (uint i=0; i<data.length; i++) {
            for (uint j=0; j<32; j++) {
                byte char = byte(bytes32(uint(data[i]) * 2 ** (8 * j)));
                if (char != 0) {
                    bytesString[urlLength] = char;
                    urlLength += 1;
                }
            }
        }
        bytes memory bytesStringTrimmed = new bytes(urlLength);
        for (i=0; i<urlLength; i++) {
            bytesStringTrimmed[i] = bytesString[i];
        }
        return string(bytesStringTrimmed);
    }     }
4

4 回答 4

4

在源文件的最顶部包含一个版本编译指示以消除警告。

pragma solidity ^0.4.0;

contract MyContract {

}

来自Solidity 文档

版本编译指示

可以(并且应该)使用所谓的版本编译指示对源文件进行注释,以拒绝使用可能引入不兼容更改的未来编译器版本进行编译。我们试图将此类更改保持在绝对最低限度,特别是引入更改,使语义更改也需要语法更改,但这当然并不总是可能的。因此,至少对于包含重大更改的版本,通读更改日志总是一个好主意,这些版本将始终具有表单 0.x.0x.0.0.

版本编译指示使用如下:

pragma solidity ^0.4.0;

这样的源文件不能用 0.4.0 之前的编译器编译,也不能在 0.5.0 开始的编译器上工作(这第二个条件是用 ^ 添加的)。这背后的想法是在 0.5.0 版本之前不会有重大更改,因此我们始终可以确保我们的代码将按照我们预期的方式进行编译。我们不修复编译器的确切版本,因此仍然可以发布错误修复版本。

于 2017-07-10T06:00:02.497 回答
2

上面大家都提到了,需要在solidity代码的第一行指定编译器版本:

编译指示 ^0.4.0;

于 2017-07-19T05:47:48.560 回答
1

请参阅此处给出的回复,并希望了解编译器版本:

pragma solidity 0.4.11;在这种情况下,如果那是您一直在测试并打算从中部署的编译器版本,则应使用该版本。如果您添加^您不锁定版本,那么出现错误的风险将大大提高,特别是如果作者以外的任何人将部署该合约。如果您锁定编译器版本,您可以确保代码不会被另一个版本和您想要的版本编译。

请注意,Solidity 在这里有一个新的代码模式:pragma solidity >=0.4.24 <0.6.0;但您仍然可以锁定版本pragma solidity 0.5.2;

于 2018-12-28T08:44:08.477 回答
1

这段代码实际上是编译的,警告就是:警告。

solidity 文档中建议指定编译器版本,以拒绝可能引入破坏性更改的编译器版本进行编译。

尝试将pragma solidity ^0.4.11;(或其他版本)添加到文件顶部,您会看到警告消失。

您的完整文件现在将是:

pragma solidity ^0.4.11;

contract C {
    function bytes32ToString(bytes32 x) constant returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    function bytes32ArrayToString(bytes32[] data) returns (string) {
        bytes memory bytesString = new bytes(data.length * 32);
        uint urlLength;
        for (uint i=0; i<data.length; i++) {
            for (uint j=0; j<32; j++) {
                byte char = byte(bytes32(uint(data[i]) * 2 ** (8 * j)));
                if (char != 0) {
                    bytesString[urlLength] = char;
                    urlLength += 1;
                }
            }
        }
        bytes memory bytesStringTrimmed = new bytes(urlLength);
        for (i=0; i<urlLength; i++) {
            bytesStringTrimmed[i] = bytesString[i];
        }
        return string(bytesStringTrimmed);
    }     
}
于 2017-07-06T15:21:14.360 回答