第一章 Solidity源文件的结构

第一章 Solidity源文件的结构

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

版本声明

版本声明代码格式如下:

pragma solidity ^0.4.0;

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

0.4.0 ~ 0.4.9 这些版本支持上面代码声明的源码编译,这样处理的好处是,如果0.4.0编译器有问题,可以随时修复bug,将其调整为0.4.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注释
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);
    }
}

春哥简介

简介: 资深讲师,全栈工程师;区块链、高可用架构技术爱好者。
个人博客:http://liyuechun.org
新浪微博:黎跃春-追时间的人
github:http://github.com/liyuechun

技术交流

  • 区块链技术交流QQ群:348924182
  • 「区块链部落」官方公众号

时间: 2024-11-03 22:02:47

第一章 Solidity源文件的结构的相关文章

DelphiXE环境认知(第一章 Project Options)

DelphiXE环境认知 作者:帅宏军 时间:2011年4月 说明:根据DelphiXE的自带帮助翻译而来,为作者个人看法,如有翻译不当,仅供参考. shuaihj@163.com http://blog.csdn.net/shuaihj 第一章. Project Options Ø Project > Options 这个页面用来设置当前项目的Delphi编译器选项.Default勾选后可将当前的配置作为新工程的默认配置. 说明: 并不是这里所有的选项适用于所有类型的项目.例如,DCP out

Java初级笔记-第一章

第一章 Java概览 1.1 基本简介 Java是一种理想的面向对象的网络编程语言. 1991年,出现了Oak语言,旨在解决编程语言的选择和跨平台的问题. 1994年,随着Internet的迅猛发展,Sun Microsystems公司发现Oak语言所具有的跨平台.面向对象.高安全性等特点非常适合于互联网的需要,于是就改进了该语言的设计且命名为"Java",并于1995年正式向IT业界推出. 1.2 Java的应用范畴 随着Java2一系列新技术(如JAVA2D.JAVA3D.SWIN

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

索引 [Solidity]1.一个Solidity源文件的布局 [Solidity]2.合约的结构体 [Solidity]3.类型 [Solidity]4.单位和全局可变量 [Solidity]5.表达式和控制结构 [Solidity]6. 合约 [Solidity]7. 部件 [Solidity]8. 杂项 一个Solidity源文件的布局 源文件可以包含任意数量的合约定义,include指令和pragma伪指令. Pragma 版本 源文件可以(并且应该)使用所谓的版本编译指示进行注释,以拒

《C++编程规范:101条规则、准则与最佳实践》——第一章组织和策略问题1.1不要拘泥于小节 (又名:了解哪些东西不应该标准化)

第一章组织和策略问题 C++编程规范:101条规则.准则与最佳实践如果人们按照程序员编程的方式修建房屋,那么一只啄木鸟就能毁灭整个文明. --Gerald Weinberg[1] 为了遵从C和C++的伟大传统,我们从0开始编号.首要的指导原则,也就是第0条,阐明了我们认为对编程规范而言最为基本的建议. 接下来,这个导论性部分的其他条款将主要讲述几个精心选择的基本问题,这些问题大多数与代码本身并没有直接关系,它们讨论的是编写坚实代码所必需的工具和技术. 本部分中我们选出的最有价值条款是第0条:"不

第一章 C#简介(rainbow 翻译) (转自重粒子空间)

<展现 C#> 第一章 C#简介(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch01.shtml 正文: 展现   C#  第一章                      C#    简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言?必须回答

《.net编程先锋C#》第一章 C#简介(转)

编程 第一章 C# 简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言? 必须回答的一个问题:当您已经使用C++或VB从事企业开发时,为什么还要学习另一种语言? 市场式的回答就是:"在企业计算领域,C#将会变成为用于编写"下一代窗口服务"(Next Generation Windows Services,简写为NGWS

实战案例分析网站排名之第一章

这篇<实战案例分析网站排名之第一章>主要是为了和大家一起分析排在百度搜索结果第一位的网站情况,以实例的方式让大家的分析思路更清晰,现在大部分SEO培训教学中所灌输的潜意识都是以内容为皇.外链为王的理论知识,很多SEO导师都是建议网站应该发布原创内容,可有几个网站能够每天都坚持更新原创内容呢?而网站外部链接也是如此,导师都是建议发布高质量的外部链接,可高质量的外部链接怎么可能那么容易就获得呢?那究竟"内容垃圾"."外部链接质量低"的网站能不能获得良好的排名

《.net编程先锋C#》第一章 C#简介

编程 第一章 C# 简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言? 必须回答的一个问题:当您已经使用C++或VB从事企业开发时,为什么还要学习另一种语言? 市场式的回答就是:"在企业计算领域,C#将会变成为用于编写"下一代窗口服务"(Next Generation Windows Services,简写为NGWS

第一章、操作系统基本简介

第一章.操作系统基本简介 1.1 操作系统的目标和作用 操作系统目标 方便性 有效性:提供系统资源利用率:提高系统吞吐量. 可扩充性 开发性 操作系统的作用 作为用户与计算机硬件系统之间的接口 作为计算机系统资源的管理者 实现了对计算机资源的抽象 操作系统的主要工作 执行程序 为用户提供良好的界面 管理整个系统的各种资源 计算机系统的效率和安全问题 1.2 操作系统的发展过程 总括 未配置操作系统的计算机系统--->单道批处理系统-->多道批处理系统-->分时系统-->实时系统--