【Solidity智能合约开发第3篇】3分钟了解Solidity源文件结构

一、 Solidity 源文件布局

源文件可以包含任意数量的contract定义,import指令,pragma指令、 structenum定义 。

二、 SPDX License 标识

智能合约信任的基础是建立在合约代码可见透明的基础上,但这里就涉及到一个版权的问题,如果你的合约代码开源可见,你可以在文件头顶部添加如下注释:

// SPDX-License-Identifier: MIT

如果你不希望你的代码被其他人改编或者直接拷贝,可作如下配置:

// SPDX-License-Identifier: UNLICENSED

备注:如果想了解更多关于SPDX license 标识的用法,请移步到SPDX website

版本声明

版本声明代码格式如下:

pragma solidity ^0.5.2;

这段代码的声明表示,源文件不会被0.5.2以下版本的编译器编译。当然同时也不会被0.6.0以上版本的编译器起作用(这是由^符号来决定的)。

0.5.0 ~ 0.5.9 这些版本支持上面代码声明的源码编译,这样处理的好处是,如果0.5.0编译器有问题,可以随时修复bug,将其调整为0.5.1

导入其他源文件

语法和语义

尽管Solidity中没有默认导出的概念,但是Solidity支持ES6中可用的导入声明。

全局引入,您可以使用以下形式的导入语句:
import "filename";

这个声明可以将filename文件中可导出的所有的全局变量导入到当前文件的全局作用域中。

自定义导入变量名
import * as symbolName from "filename";

创建一个全局的变量名symbolNamesymbolName里面包含filename这个文件中所有的全局变量。

自定义别名
import {symbol1 as alias, symbol2} from "filename";

alias等价于filename文件中的symbol1symbol2等价于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);
    }
}

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/25021

联系我们

aliyinhang@gmail.com