Solidity编程 三 之 资源文件的组成

Posted shaotine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solidity编程 三 之 资源文件的组成相关的知识,希望对你有一定的参考价值。

3.1 版本语句

源文件可以用版本语句拒绝高版本编译器编译。其中一些高版本可能引入了不兼容的特性,导致编译后出现不可预知的结果。我们希望把这种版本变化控制在最小范围内,同时尽量要求语法和语义同步修改,这个要求很难达到。所以,我们需要去阅读每个版本的修改日志,这些版本都是以 0.X.0或是X.0.0来命名。 版本语句使用如下:

pragma solidity ^0.4.0;

这样的源文件不会被0.4.0以前的编译器编译,同时在0.5.0版本以上(包括0.5.0)编译器上也不能编译(使用了 ^ 进行约束)。这个因为在0.5.0之前,不会出现很大的改变,所以我们可以确信我们的代码可以按照预期的结果执行。

3.2 引入其他资源文件

   3.2.1 语法

       Solidity支持import导入资源文件,这点和javascript(ES6)很像,但是不支持默认导出的功能 import语句格式如下,这是全局有效的:  

import "filename";

  该语句把”filename”全局导入当前工程中,同时也全局导入”filename”里包含的所有全局导入文件。支持向后兼容性

 

 import * as symbolName from "filename";

      新建一个名为 symbolName的全局符号,它包含了”filename”里的所有全局符号

 

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

      从”filename”文件里导入symbol1 和symbol2的全局符号,同时给symbol1取别名为alias

     另外一个不是ES6语法,但是很方便

import "filename" as symbolName;

  这语句等同于

import * as symbolName from "filename";

   3.2.2 路径

  上面提到的”filename”以 / 为目录分隔符,.为当前目录,…为上一级目录。如果.和…后面跟的是除了/之外的字符,不会作为一个文件目录来对待。所以的目录默认都是绝对路径,除非他们以.或是…开头。 导入当前目录下的文件x,可以使用

 import "./x" as x;

  如果使用 

 import "x" as x;

 

  引用的是不同的文件(全局使用”include directory”)。 文件路径的引用取决于不同编译器。一般来说,目录结构是不需要严格对应于你的本地文件系统的,它可以映射到ipfs,http或是git

 

   3.2.3 编译器使用

  编译器的使用不仅可以指定如何查找路径的首个元素,而且还可以指定路径前缀映射。所以如:

 github.com/ethereum/dapp-bin/library 

  路径就可以映射到本地路径

 /usr/local/dapp-bin/library

  编译器就可以从本地路径中读取所需要的文件。如果同时存在多种映射关系,最长路径会被优先使用。这就允许使用备用映射如 "" 映射到 "/usr/local/include/solidity" 这些映射还可以根据不同的情况允许用户配置包,比如导入不同版本的同名library。

     Solc

      对于solc(一种命令行编译器)来说,可以用

 context:prefix=target 

 

  来提供这种映射关系。context:和=target都可选。所有映射成正确的文件都会编译,包括所有依赖文件。这是一种完全向后兼容机制,所有导入的文件中,如果是以 定义好的“prefix”字段开头的,都会被直接替换成 target定义的值。 例如:如果clone github.com/ethereum/dapp-bin/ 到 本地的 /usr/local/dapp-bin,可以使用如下的import语句

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的一些模块代码时,老版本的dapp-bin从 /usr/local/dapp-bin_old check out出来,可以如下使用:

 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的import都指向到老版本,二module1的都指向新的版本。 注意solc只允许包含特定的目录:明确指定文件的目录或是映射目标中的目录。如果想允许绝对包含,可以添加重新映射 =/ 如果多重重新映射指向一个有效文件,优先使用包含最长重新映射前缀

      Remix

     Remix提供了github的自动重映射功能,可以自动从网络上获取所需要的资源文件。可以如下导入映射 

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

 

   3.2.4 注释

  提供了单行注释  (//) 和多行注释 (/*...*/) 

 

  

以上是关于Solidity编程 三 之 资源文件的组成的主要内容,如果未能解决你的问题,请参考以下文章

区块链开发之Solidity编程基础

区块链开发之Solidity编程基础

区块链开发之Solidity编程基础合约数据存储

Solidity编程 二 之Solidity安装

区块链开发之Solidity编程基础运算符

区块链开发之Solidity编程基础运算符