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

简介: 索引【Solidity】1.一个Solidity源文件的布局【Solidity】2.合约的结构体 【Solidity】3.类型 【Solidity】4.单位和全局可变量 【Solidity】5.表达式和控制结构 【Solidity】6. 合约 【Solidity】7. 部件 【Solidity】8. 杂项 一个Solidity源文件的布局源文件可以包含任意数量的合约定义,include指令和pragma伪指令。

索引

一个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);
    }
}
目录
相关文章
|
1月前
|
存储 区块链
Solidity语言详解
Solidity语言详解
13 0
|
4月前
solidity 学习
solidity 学习
|
数据可视化 JavaScript 前端开发
Solidity编码规范
1、命名规范 避免使用 小写的L,大写的I,大写的O 应该避免在命名中单独出现,因为很容易产生混淆。 合约、库、事件、枚举及结构体命名——大驼峰 合约、库、事件及结构体命名应该使用单词首字母大写的方式。 比如:SimpleToken, SmartBank, CertificateHashRepository,Player。 函数、参数、变量及修饰器 函数、参数、变量及修饰器应该使用首单词小写后面单词大写的方式,
Solidity编码规范
|
编译器 区块链
Solidity函数学习
Solidity函数学习
166 0
Solidity函数学习
|
Ubuntu JavaScript 前端开发
Solidity 文档--第二章:安装 Solidity
Solidity 文档--第二章:安装 Solidity
448 0
|
数据安全/隐私保护
Solidity 文档--第三章:Solidity 编程实例
Solidity 文档--第三章:Solidity 编程实例
106 0
|
区块链
solidity源文件布局
源文件的布局 源文件包括任意数量的合约定义和 include指令 引入其他源文件 语法和语义 Solidity支持 import语句,非常类似于JavaScript(ES6),虽然Solidity不知道“缺省导出”的概念。
1039 0
深入理解 Solidity
深入理解 Solidity 此节将帮助你深入理解Solidity,如果有遗漏,请和我们联系Gitter或者在Githhub上发pull request Layout of a Solidity Source File ...
959 0
|
新零售 Web App开发 开发工具
安装Solidity
安装Solidity 基于浏览器的Solidity 如果你只是想尝试一个使用Solidity的小合约,你不需要安装任何东西,只要访问 基于浏览器的Solidity。
1663 0
|
区块链 Python 程序员
solidity编程规范
编程规范 概述 本指南用于提供编写Solidity的编码规范,本指南会随着后续需求不断修改演进,可能会增加新的更合适的规范,旧的不适合的规范会被废弃。
1475 0