Solidity语言学习笔记————31、智能合约的基本文件结构概述

Solidity智能合约文件结构

编译器版本声明:

pragma solidity ^0.4.0;

说明:

pragma是一个版本杂注的编译命令,它告知编译器如何处理源代码的指令,这里告诉编译器源码使用的是不低于solidity04.0的但不高于0.5.0版本的编译器编写的。

引用其他源文件

  • 全局引入
import “filename”;
  • 自定义命名空间引入
import * as symbolName from “filename”
  • 分别定义引入
import  {symbol1 as alias, symbol2} from “filename”

非es6兼容的简写语法

import “filename” as symbolName

等同于上述

import * as symbolName from “filename”

关于路径

引入文件路径时需要注意,非“ .  ”开头的路径会被认为是绝对路径,所以要引用同目录下的文件使用。

import “./x” as x

也不要使用下述方式,这样会是在一个全局的目录下

import “x” as x;

为什么会有这个区别,是因为这取决于编译器,如果解析路径,通常来说目录层级结构并不与我们本地的文件一一对应,它非常有可能是通过ipfs,http,或git建立的一个网络上的虚拟目录。

编译器解析引用文件机制

各编译器提供了文件前缀映射机制。

  • 可以将一个域名下的文件映射到本地,从而从本地的某个文件中读取
  • 提供对同一实现的不同版本的支持(可能是某版本的实习前后不兼容,需要区分)
  • 如果前缀相同,取最长
  • 有一个“faceback-remapping”机制,空串会映射到“/usr/local/include/solidity”

Solc编译器

命令行编译器,通过下述命令命名空间映射提供支持

context:prefix=target

上述的context:=target是可选的。所有context目录下的以prefix开头的都会被替换成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”,那么,可以使用下述命令编译:

solc module1:github.com/ethereum/dapp-bin=/usr/local/dapp-bin  \
        modeule2:github.com/ethereum/dapp-bin=/usr/local/dapp-bin_old \
        source.sol

需要注意的是solc仅仅允许包含实际存在的文件。他必须存在于你重映射后目录里,或其子目录里。如果你想包含直接的绝对路径,那么可以将命名空间重新映射为“=/”

备注:如果有多个重映射指向了同一个文件,那么取最长的那个文件即可。

Browser-solidity编译器

browser-solidity编译器默认会自动映射到GitHub上,然后会自动从网络上检索文件。例如:你可以通过下述方式引入一个迭代包:

import “github.com/ethereum/dapp-bin/library/iterable_mapping.sol” as it_mapping

备注:未来可能会支持其他的源代码。

代码注释

两种方式,单行注释(//),多行注释(/*.........*/)

例如:

// this is a single-line comment
/*
    this is a
    mulit-line comment
*/

文档注释

写文档用。三个斜杠(///)或(/**.......*/),可以使用Doxygen语法,以支持生成对文档的说明,参数验证的注释或者是在用户调用这个函数时,弹出来的确认内容:

代码实例

pragma solidity ^0.4.0;
/** @title Shape calculator.*/
contract shapeCalculator{
    /**
    *@dev calculate a rectangle's suface and perimeter
    *@param w width of the rectangles
    *@param h height of the rectangles
    *@return s surface of the rectangles
    *@return p perimeter of the rectangles
    */

    function rectangles(uint w, uint h) returns (uint s, uint p){
        s = w * h;
        p = 2 * ( w + h) ;
    }
}

智能合约源文件的基本要素

  • 合约类似面向对象语言中的类。
  • 支持继承

每个合约中可包含状态变量(State Variables),函数(function)、函数修饰符(Function modifiers)、事件(Event)、结构类型(struct types)、枚举类型(Enum Types)

状态变量(state Variable)

变量值会永远存在在合约中的存储空间中。

pragma solidity ^0.4.0;

// simple store example
contract simpleStorage{
    uint valueStore;   //state variable

}

详情见“类型(type)”一节,关于所有支持的类型和变量相关的可见性(Visibility and Accessors).

函数(Function)

智能合约中的一个可执行单元

pragma solidity ^0.4.0;

contract simpleMath{
    //Simple add function,try a divide action?
    function add(uint x, uint y) returns (uint z){
        z = x + y;
    }
}

上述实例展示了一个简单的加法函数。

函数调用可以设置为内部(internal)和外部(External)的。同时对于其他合同的不同级别的可见性和访问控制(Visibility and  Accessors)。具体的情况详见后面类型中关于函数的章节。

函数修饰符(Function Modifiers)

函数修饰符用于增强语义。主要有public、private、internal、external等,在之后的内容中会细细讲述的。

事件(Events)

事件是以太坊虚拟机(EVM)日志基础设施的一个便利接口。用于获取当前发生的事件。

实例:

pragma solidity ^0.4.0;
contract SimpleAuction {

    event aNewHigherBid(address bidder, uint amount);
 
    function  bid(uint bidValue) external {
        aNewHigherBid(msg.sender, msg.value);
    }
}

关于事件如何声明以及如何使用,在之后的内容中会详细的介绍到。

结构体类型(Struct types)

自定义的将几个变量组合在一起形成的新的数据类型。

实例:

pragma solidity ^0.4.0;
contract Company {
    //user defined `Employee` struct type
    //group with serveral variables
    
   struct employee{
        string name;
        uint age;
        uint salary;
    }
    
    //User defined `manager` struct type
    //group with serveral variables
    struct manager{
        employee employ;
        string title;
    }
}

枚举类型

特殊的自定义类型,类型的所有值可以枚举的情况。详见后续的章节。

实例:

pragma solidity ^0.4.0;

contract Home {
    enum Switch{On,Off}
}

参考内容:Solidity翻译文档

你可能感兴趣的:(【区块链】,————Solidity)