【2022 元宇宙基础NFT之Solidity OOP编程第03篇】Solidity源文件结构
一、 Solidity 源文件布局
源文件可以包含任意数量的contract
定义,import
指令,pragma
指令、 struct
和 enum
定义 。
二、 SPDX License 标识
智能合约信任的基础是建立在合约代码
可见透明的基础上,但这里就涉及到一个版权的问题,如果你的合约代码开源可见,你可以在文件头顶部添加如下注释:
// SPDX-License-Identifier: MIT
如果你不希望你的代码被其他人改编或者直接拷贝,可作如下配置:
// SPDX-License-Identifier: UNLICENSED
备注:如果想了解更多关于SPDX license 标识
的用法,请移步到SPDX website
版本声明
版本声明代码格式如下:
pragma solidity >=0.7.0 <0.9.0;
这段代码的声明表示,源文件不会被0.7.0
以下版本的编译器编译。当然同时也不会对0.9.0
以上版本的编译器起作用。
导入其他源文件
语法和语义
尽管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注释
// SPDX-License-Identifier: GPL-3.0
// 在自由软件所使用的各种许可证之中,最为人们注意的也许是通用性公开许可证(General Public License,简称GPL)
pragma solidity >=0.4.21 <0.7.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) public pure returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}