第一章 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
  • 「区块链部落」官方公众号

目录
相关文章
|
16天前
|
XML 开发框架 .NET
学习Visual Basic语言的函数和过程编写技巧
【4月更文挑战第27天】本文探讨了Visual Basic语言中函数和过程的编写技巧,旨在帮助读者掌握高效、规范的编程方法。内容包括函数与过程的基础概念,如定义函数和过程的语法;编写高效函数和过程的技巧,如参数传递、可选参数、参数数组、异常处理和重载;最佳实践与风格指南,如命名规范、注释、单一职责原则和模块化设计;以及进阶技巧,如Lambda表达式、LINQ、并行与异步编程及内存管理。通过学习这些技巧,开发者能写出更清晰、高效的VB.NET代码。
|
9月前
|
Java 编译器 C语言
编译原理 (一) 编译和编译系统的结构
编译原理 (一) 编译和编译系统的结构
104 0
|
IDE Unix 编译器
关于编译的重要概念总结
关于编译的重要概念总结
3343 0
关于编译的重要概念总结
|
编译器 C语言
C学习笔记(1)-结构体、预处理与多文件结构程序设计
一、结构体的定义与使用 #include //定义结构体(类似模板) typedef struct { char name[50]; int age; char address[100]; } nvgui; void main() { nvgui ...
1017 0
|
数据安全/隐私保护
Solidity 文档--第三章:Solidity 编程实例
Solidity 文档--第三章:Solidity 编程实例
86 0
|
Ubuntu JavaScript 前端开发
Solidity 文档--第二章:安装 Solidity
Solidity 文档--第二章:安装 Solidity
409 0