Solidity Remix 简单问题
Posted
技术标签:
【中文标题】Solidity Remix 简单问题【英文标题】:Solidity Remix simple questions 【发布时间】: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);
【问题讨论】:
【参考方案1】:在源文件的最顶部包含版本编译指示以消除警告。
pragma solidity ^0.4.0;
contract MyContract
来自Solidity documentation:
版本编译指示
源文件可以(并且应该)使用所谓的版本进行注释 pragma 拒绝使用未来的编译器版本编译 可能会引入不兼容的更改。我们试图保持这样的变化 绝对最小值,尤其是引入变化的方式 语义的变化也需要语法的变化,但这 当然并不总是可能的。正因为如此,它总是一个好 至少对于包含以下内容的版本阅读更改日志的想法 重大更改,这些版本将始终具有表单的版本
0.x.0
或x.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 >=0.4.24 <0.6.0;
,但您仍然可以锁定版本 pragma solidity 0.5.2;
。
【讨论】:
以上是关于Solidity Remix 简单问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Ethereum Remix JavaScript VM 上从特定账户执行solidity合约方法