【问题标题】:Solidity Remix simple questionsSolidity Remix 简单问题
【发布时间】:2017-12-10 07:49:55
【问题描述】:

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

browser/Untitled.sol:1:1: : 源文件未指定所需的编译器版本!考虑添加“pragma solidity ^0.4.12 合约 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);
    }     }

【问题讨论】:

    标签: ethereum solidity remix


    【解决方案1】:

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

    pragma solidity ^0.4.0;
    
    contract MyContract {
    
    }
    

    来自Solidity documentation

    版本编译指示

    源文件可以(并且应该)使用所谓的版本进行注释 pragma 拒绝使用未来的编译器版本编译 可能会引入不兼容的更改。我们试图保持这样的变化 绝对最小值,尤其是引入变化的方式 语义的变化也需要语法的变化,但这 当然并不总是可能的。正因为如此,它总是一个好 至少对于包含以下内容的版本阅读更改日志的想法 重大更改,这些版本将始终具有表单的版本 0.x.0x.0.0

    版本编译指示使用如下:

    pragma solidity ^0.4.0;

    这样的源文件不会用 编译器早于 0.4.0 版,它也不能在 从 0.5.0 版本开始的编译器(添加了第二个条件 通过使用 ^)。这背后的想法是不会有中断 更改到 0.5.0 版本,因此我们始终可以确保我们的代码 将按照我们预期的方式进行编译。我们不修复确切的 编译器的版本,因此仍然可以发布错误修复。

    【讨论】:

      【解决方案2】:

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

      pragma solidity ^0.4.0;

      【讨论】:

        【解决方案3】:

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

        suggested in the solidity docs 指定编译器版本,拒绝可能引入重大更改的编译器版本编译。

        尝试将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);
            }     
        }
        

        【讨论】:

          【解决方案4】:

          查看此处给出的回复并希望了解编译器版本:

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

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

          【讨论】:

            猜你喜欢
            • 2019-07-23
            • 2021-10-05
            • 2021-07-25
            • 2018-10-21
            • 1970-01-01
            • 2019-05-03
            • 2022-08-12
            • 2020-08-28
            • 2022-06-03
            相关资源
            最近更新 更多