3.1 版本语句
源文件可以用版本语句拒绝高版本编译器编译。其中一些高版本可能引入了不兼容的特性,导致编译后出现不可预知的结果。我们希望把这种版本变化控制在最小范围内,同时尽量要求语法和语义同步修改,这个要求很难达到。所以,我们需要去阅读每个版本的修改日志,这些版本都是以 0.X.0或是X.0.0来命名。 版本语句使用如下:
pragma solidity ^0.4.0;
这样的源文件不会被0.4.0以前的编译器编译,同时在0.5.0版本以上(包括0.5.0)编译器上也不能编译(使用了 ^ 进行约束)。这个因为在0.5.0之前,不会出现很大的改变,所以我们可以确信我们的代码可以按照预期的结果执行。
3.2 引入其他资源文件
3.2.1 语法
Solidity支持import导入资源文件,这点和JavaScript(ES6)很像,但是不支持默认导出的功能 import语句格式如下,这是全局有效的:
import "filename";
该语句把”filename”全局导入当前工程中,同时也全局导入”filename”里包含的所有全局导入文件。支持向后兼容性
import * as symbolName from "filename";
新建一个名为 symbolName的全局符号,它包含了”filename”里的所有全局符号
import {symbol1 as alias, symbol2} from "filename";
从”filename”文件里导入symbol1 和symbol2的全局符号,同时给symbol1取别名为alias
另外一个不是ES6语法,但是很方便
import "filename" as symbolName;
这语句等同于
import * as symbolName from "filename";
3.2.2 路径
上面提到的”filename”以 / 为目录分隔符,.为当前目录,…为上一级目录。如果.和…后面跟的是除了/之外的字符,不会作为一个文件目录来对待。所以的目录默认都是绝对路径,除非他们以.或是…开头。 导入当前目录下的文件x,可以使用
import "./x" as x;
如果使用
import "x" as x;
引用的是不同的文件(全局使用”include directory”)。 文件路径的引用取决于不同编译器。一般来说,目录结构是不需要严格对应于你的本地文件系统的,它可以映射到ipfs,http或是git
3.2.3 编译器使用
编译器的使用不仅可以指定如何查找路径的首个元素,而且还可以指定路径前缀映射。所以如:
github.com/ethereum/dapp-bin/library
路径就可以映射到本地路径
/usr/local/dapp-bin/library
编译器就可以从本地路径中读取所需要的文件。如果同时存在多种映射关系,最长路径会被优先使用。这就允许使用备用映射如 "" 映射到 "/usr/local/include/solidity" 这些映射还可以根据不同的情况允许用户配置包,比如导入不同版本的同名library。
Solc
对于solc(一种命令行编译器)来说,可以用
context:prefix=target
来提供这种映射关系。context:和=target都可选。所有映射成正确的文件都会编译,包括所有依赖文件。这是一种完全向后兼容机制,所有导入的文件中,如果是以 定义好的“prefix”字段开头的,都会被直接替换成 target定义的值。 例如:如果clone github.com/ethereum/dapp-bin/ 到 本地的 /usr/local/dapp-bin,可以使用如下的import语句
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;
编译的时候就会变成如下:
solc github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ source.sol
如果你是使用了一个很老版本dapp-bin的一些模块代码时,老版本的dapp-bin从 /usr/local/dapp-bin_old check out出来,可以如下使用:
solc module1:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ \ module2:github.com/ethereum/dapp-bin/=/usr/local/dapp-bin_old/ \ source.sol
这样所有module2的import都指向到老版本,二module1的都指向新的版本。 注意solc只允许包含特定的目录:明确指定文件的目录或是映射目标中的目录。如果想允许绝对包含,可以添加重新映射 =/ 如果多重重新映射指向一个有效文件,优先使用包含最长重新映射前缀
Remix
Remix提供了github的自动重映射功能,可以自动从网络上获取所需要的资源文件。可以如下导入映射
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;
3.2.4 注释
提供了单行注释 (//) 和多行注释 (/*...*/)