关闭

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

标签: 布局注释Solidity智能合约
1177人阅读 评论(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
查看评论

Solidity 文档--第二章:安装 Solidity

安装Solidity基于浏览器的Solidity如果你只是想尝试一个使用Solidity的小合约,你不需要安装任何东西,只要访问基于浏览器的Solidity。如果你想离线使用,你可以保存页面到本地,或者从 http://github.com/chriseth/browser-solidity 克隆一...
  • wo541075754
  • wo541075754
  • 2016-11-18 15:47
  • 2542

ubuntu 14.04中solidity的安装教程

1、nodejs以及npm的安装 在nodejs官网https://nodejs.org/en/下载stable版的nodejs(集成了npm)到你的ubuntu操作系统上 解压文件找到bin目录下的node文件和npm文件使用如下命令建立软链接 ln -s 你的node路径 /usr/local...
  • lp18036194881
  • lp18036194881
  • 2017-06-03 11:47
  • 717

Solidity中文文档----源文件布局以及合约结构

原文地址:http://solidity.readthedocs.io/en/latest/solidity-in-depth.html本节提供您需要了解的有关Solidity的所有信息。 如果这里缺少某些东西,请与Gitter联系或者在Github上发出pull请求。一、纯文件的布局源文件可以包含...
  • ler_123
  • ler_123
  • 2017-01-09 16:54
  • 602

Solidity 文档--目录

Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。在后续内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。 注意 目前尝试Solidity的最好方式是使用基于浏览器的编译器(需要一点时间加载,请耐心等待)。...
  • fidelhl
  • fidelhl
  • 2016-02-22 17:12
  • 6300

【Solidity】4.单位和全局可变量 - 深入理解Solidity

单位和全局可变量Ether单元一个字面上的数字可以带有wei,finney,szabo或者以太网的后缀,可以在以太网的子目录之间进行转换,其中没有后缀的以太网货币号被假定为魏。 2 ether == 2000 finney评估为true。时间单位可以使用文字数字后的秒,分,小时,天,周和年份进行后缀...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-12 10:42
  • 2059

【Solidity】5.表达式和控制结构 - 深入理解Solidity

表达式和控制结构输入参数和输出参数与Javascript一样,函数可以将参数作为输入; 与Javascript和C不同,它们也可以返回任意数量的参数作为输出。输入参数输入参数的声明方式与变量相同。 作为例外,未使用的参数可以省略变量名称。 例如,假设我们希望我们的合约接受一种具有两个整数的外部调用,...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-13 12:54
  • 2012

Solidity 文档--第三章:Solidity 编程实例

Solidity 编程实例Voting 投票接下来的合约非常复杂,但展示了很多Solidity的特性。它实现了一个投票合约。当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵。我们不能解决所有的问题,但至少我们会展示如何委托投票可以同时做到投票统计是自动和完全透明。思路是为每张选票创建一...
  • wo541075754
  • wo541075754
  • 2016-11-21 09:57
  • 2953

『0011』 - Solidity Types - 地址(Address)

孔壹学院:国内区块链职业教育领先品牌 作者:黎跃春,区块链、高可用架构工程师 微信:liyc1215 QQ群:348924182 博客:http://liyuechun.org 以太坊钱包地址位数验证以太坊中的地址的长度为20字节,一字节等于8位,一共160位,所以address...
  • liyuechun520
  • liyuechun520
  • 2017-11-01 09:46
  • 225

【Solidity】7. 部件 - 深入理解Solidity

Solidity 部件Solidity定义了一种也可以在没有Solidity的情况下使用的汇编语言。 此汇编语言也可以用作Solidity源代码中的“内联汇编”。 我们从描述如何使用内联汇编以及它与独立程序集的区别开始,然后指定程序集本身。TODO:编写内联汇编的范围规则有点不一样,例如使用库的内部...
  • diandianxiyu
  • diandianxiyu
  • 2017-09-15 11:03
  • 4031

Solidity番外篇(一)Solidity在线or插件使用

在学习以太坊合约的过程中会需要自己编写智能合约,官方提供了几种方式供大家使用。下面分别简单介绍一下,如果有错误的地方,还留言指正补充。DAPP IDE说实话,这个版本IDE我还没有使用过,只提供一个连接地址供大家参考。 The-DApp-IDE 此连接中有具体的使用描述。在线编程Solidity...
  • wo541075754
  • wo541075754
  • 2016-11-18 11:13
  • 2334
    个人资料
    • 访问:639309次
    • 积分:9021
    • 等级:
    • 排名:第2480名
    • 原创:297篇
    • 转载:13篇
    • 译文:4篇
    • 评论:81条
    博客专栏
    微信订阅号
    欢迎加入QQ群
    玩家老黄历(微信小程序)
    谢谢支持~
    最新评论