【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity

标签: 布局注释Solidity智能合约
498人阅读 评论(0) 收藏 举报
分类:

索引

一个Solidity源文件的布局

源文件可以包含任意数量的合约定义,include指令和pragma伪指令。

Pragma 版本

源文件可以(并且应该)使用所谓的版本编译指示进行注释,以拒绝随后可能引入不兼容更改的编译器版本进行编译。 我们尝试将这些更改保持在绝对最小值,尤其是在语义变化也需要更改语法的情况下引入更改,但这并不总是可能的。 因此,至少对于包含突破性更改的版本,读取更改日志总是一个好主意,这些版本将始终具有0.x.0或x.0.0格式的版本。

版本pragma使用如下:

pragma solidity ^0.4.0;

这样一个源文件不会使用比版本0.4.0之前的编译器编译,并且它也不会在从0.5.0版本开始的编译器(第二个条件通过使用^添加)起作用。 这个想法是,直到版本0.5.0才会有变化,所以我们可以随时确定我们的代码将按照我们打算的方式进行编译。 我们不会修复编译器的确切版本,因此修补程序版本仍然可能。

可以为编译器版本指定更复杂的规则,表达式遵循由npm使用的规则。

导入其他源文件

语法和语义

Solidity支持与JavaScript中可用的导入语句(来自ES6)的引用语句,尽管Solidity不知道“default export”的概念。

在全局层面,您可以使用以下形式的导入语句:

import "filename";

此语句从“filename”(以及导入的符号)导入所有全局符号到当前全局范围(与ES6不同,但与Solidity相反)。

import * as symbolName from "filename";

…创建一个新的全局符号symbolName,其成员都是来自“filename”的全局符号。

import {symbol1 as alias, symbol2} from "filename";

…创建新的全局符号aliassymbol2,分别从“filename”引用symbol1symbol2

另一种语法不是ES6的一部分,但可能很便于:

import "filename" as symbolName;

相当于import * as symbolName from "filename";

路径

在上文中,文件名始终被视为具有/作为目录分隔符的路径. .作为当前目录和..作为父目录。 当...后跟一个字符,除了/,它不被认为是当前或父目录。 所有路径名称都被视为绝对路径,除非它们以当前的路径开头. 或父目录...

要从与当前文件相同的目录导入文件x,请使用导入“./x”作为x ;. 如果使用导入“x”作为x; 相反,可以引用不同的文件(在全局“包含目录”中)。

这取决于编译器(见下文)如何实际解析路径。 一般来说,目录层次结构不需要严格地映射到本地文件系统上,它也可以映射到通过例如文件发现的资源比如 ipfs,http或git。

在实际编译器中使用

当调用编译器时,不仅可以指定如何发现路径的第一个元素,而且可以指定路径前缀重新映射, github.com/ethereum/dapp-bin/library被重新映射到/usr/local/dapp-bin/library,编译器将从那里读取文件。 如果可以应用多重重新映射,则首先尝试使用最长密钥。 这允许一个“回退-重新映射”与例如 “”映射到“/usr/local/ include/solidity”。 此外,这些重新映射可以依赖于上下文,它允许您配置包导入例如 不同版本的同名库。

solc:

对于solc(命令行编译器),这些重新映射作为上下文提供:prefix = target参数,其中context和and = 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为github提供自动重新映射,并且还可以通过网络自动检索文件:您可以通过例如导入迭代映射。

import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;

其他源代码提供者可能会在将来被添加。

注释

单行注释(//)和多行注释(/*...*/)是可行的。

// 单行注释.

/*
多行注释
*/

另外还有另一种类型的评论叫做natspec注释,文档还没有被写入。 它们是用三斜杠(///)或双星号块(/ * … /)编写的,它们应该直接在函数声明或语句上方使用。 您可以在这些注释中使用Doxygen风格的标签来记录功能,注释条件以进行正式验证,并提供确认文本,当用户尝试调用功能时,该文本将显示给用户。

在下面的例子中,我们记录了合同的标题,两个输入参数的说明和两个返回的值。

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);
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:510468次
    • 积分:7735
    • 等级:
    • 排名:第3049名
    • 原创:284篇
    • 转载:13篇
    • 译文:4篇
    • 评论:68条
    博客专栏
    微信订阅号
    欢迎加入QQ群
    玩家老黄历(微信小程序)
    谢谢支持~
    最新评论