第一章 Solidity源文件的结构
源文件可以包含任意数量的智能合约的定义以及任意数量的include指令和pragma伪指令。
版本声明
版本声明代码格式如下:
pragma solidity ^0.4.0;
这段代码的声明表示,源文件不会被0.4.0
以下版本的编译器编译。当然同时也不会被0.5.0
以上版本的编译器起作用(这是由^
符号来决定的)。
0.4.0
~ 0.4.9
这些版本支持上面代码声明的源码编译,这样处理的好处是,如果0.4.0
编译器有问题,可以随时修复bug
,将其调整为0.4.1
。
导入其他源文件
语法和语义
尽管Solidity
中没有默认导出
的概念,但是Solidity
支持ES6
中可用的导入声明。
全局引入,您可以使用以下形式的导入语句:
import "filename";
这个声明可以将filename
文件中可导出的所有的全局变量导入到当前文件的全局作用域中。
自定义导入变量名
import * as symbolName from "filename";
创建一个全局的变量名symbolName
,symbolName
里面包含filename
这个文件中所有的全局变量。
自定义别名
import {symbol1 as alias, symbol2} from "filename";
alias
等价于filename
文件中的symbol1
,symbol2
等价于filename
文件中的symbol2
。
另外一种非ES6
的导入方式
import "filename" as symbolName;
这种写法不是ES6
里面的写法,但是使用非常方便,它等价于import * as symbolName from "filename";
。
路径(Paths)
在上面的filename
中,始终用/
符号来进行路径分离,.
代表当前路径,..
代表上一级路径。当.
和..
后面没有跟随/
符号时,它不能表示当前路径和上一级路径。还有,如果没有.
或者..
时,所有的路径都默认绝对路径而不是相对路径。
从当前路径导入一个x
文件,使用import "./x" as x
;如果你使用import "x" as x
代替上面的代码,它将不能正确引用到x
文件。
在实际编译器中使用
当编译器被调用,它不仅可以指定如何发现路径的起始元素,还可以指定路径前缀映射,例如:将github.com/ethereum/dapp-bin/library
映射到/usr/local/dapp-bin/library
,编译器将从被映射到的新路径中读取文件。如果同一个路径存在多个被映射的路径,key
最长的映射路径先被尝试应用。还允许回滚重新映射,例如:""
映射到/usr/local/include/solidity
。除此以外,这些映射还依赖于导入的不同版本同名的依赖包。
solc:
对于solc
命令行编译工具,这些映射还提供了context:prefix=target
参数,其中context:
和=target
是可选的,在context:prefix=target
参数中,target
默认为当前案例中的前缀。所有重新映射的那些有规律的文件的值都会包涵他们的依赖项一起被编译。只要文件名中不包含=
或者:
,这个机制就完全向后兼容并且不会发生变化。如果一个导入的文件被重新映射,那么在编译的时候,它的前缀将会被替换参数中的target
的值。
举个,如果你想将github.com/ethereum/dapp-bin/
克隆到本地的/usr/local/dapp-bin
这个路径中,你可以在你的源文件中使用下面的代码:
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
。你可以在/usr/local/dapp-bin_old,
中检测出dapp-bin
的比较老的版本。你可以这样使用:
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
指向所有的旧版本,module1
指向所有的新版本。
注意: solc
只允许你从某一目录中包含文件:它们必须是具体指定的源文件中的一个文件的目录或者子目录,或者是一个重新映射目标的目录或者子目录。如果你希望允许包含绝对路径,自需要添加重映射=/
。
如果存在多个有效文件的重映射,那么前缀最长的一个重映射将被应用。
Remix:
Remix provides an automatic remapping for github and will also automatically retrieve the file over the network: You can import the iterable mapping by e.g.
Remix
为github提供自动重映射并且自动通过网络自动取回文件:你可以如下所示使用。
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;.
注释
单行注释
// This is a single-line comment.
多行注释
/*
This is a
multi-line comment.
*/
natspec注释
pragma solidity ^0.4.0;
/* @title Shape calculator. /
contract shapeCalculator {
/** @dev Calculates a rectangle's surface and perimeter.
* @param w Width of the rectangle.
* @param h Height of the rectangle.
* @return s The calculated surface.
* @return p The calculated perimeter.
*/
function rectangle(uint w, uint h) returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
春哥简介
简介: 资深讲师,全栈工程师;区块链、高可用架构技术爱好者。
个人博客:http://liyuechun.org
新浪微博:黎跃春-追时间的人
github:http://github.com/liyuechun
技术交流
- 区块链技术交流QQ群:348924182
- 「区块链部落」官方公众号