Solidity官方教程学习(二)

Learn Solidity tutorial

Posted by AlbertWu on January 15, 2018

Solidity的下载

个人推荐新手可以优先使用Remix练手

Remix

如果你想要尝试利用Solidity编写智能合约,可以尝试使用Remix,因为其不需要任何安装。

Solidity语法详解

Solidity源文件结构

源文件包含了关于合约定义的所有内容,包括指令集和版本指令。

版本注释

源文件需要在开头指明版本号,预防在更新的编译器中无法正常编译。版本注释长成这样:

pragma solidity ^0.4.14;

此类源文件可以被0.4.x版本的编译器编译,无法在0.4.0之前或0.5.0之后的编译器中编译。

引入外部源文件

语法结构

Solidity支持import,非常像js中的引入操作,但是Solidity没有类似default export这样的操作。对于import的举例如下:

import ("filename");

或者只引入部分成员函数

import * as symbolName from "filename";
// which is equal to
import "filename" as symbolName;

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

注释的写法

单行注释可以用\\,多行注释用\*...*\

// This is a single-line comment.

/*
This is a 

multi-line comment.
*/

另外还有一种称为Natspec注释,表示该文档尚未写入。用\\\或者\**...*\表示,直接在函数声明或者语句上方使用。你可以用Doxygen-style 标记来记录该功能,注释条件以进行正式的验证,并提供说明,当用户尝试调用此功能时,将该文本返回给用户。

下面的例子我们记录了合约的标题,两个输入参数及返回值的解释。

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);
    }
}

合约的数据结构

Solidity中的合约类似于面向对象语言中的类。每个合约包含状态变量(State Variables),函数(Functions),函数修饰器(Function Modifiers),事件(Events),结构体类型(Structs Types),枚举类型(Enum Types)的声明。

状态变量

状态变量是始终存在于合约存储器(Storage)中的值。

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData; // State variable
    // ...
}

状态变量类型(Types),常用的包括布尔型(bool),整型(int/uint),地址(address)等。状态变量的可见度(Visibility and Getters),主要是external(内不可见外可见),public(内外可见),internal(内可见外不可见),private(内外不可见)。

值类型

布尔型 (Booleans)

bool: 取值为常量truefalse

操作符:

  • ! 逻辑取反
  • && 逻辑与
  • || 逻辑或
  • == 相等
  • != 不等
整型 (Integers)

int/ uint:可变长度的有符号和无符号整型数。关键词uint8uint256的位数按照8位逐渐增长至256位。int和uint分别为int256和uint256的别名。

操作符:

  • 比较操作:<=,<,==,!=,>,>=,结果类型为bool
  • 位操作:&,|,^ (按位异或),~ (按位取反)
  • 算数符操作:+, -, 一元 -, 一元 +, *, /, % (取余), ** (求幂), << (左移), >> (右移)
地址成员 (Member of Address)

address:是一个20字节长度的值。其有balancetransfer两个成员,可以通过balance来查询地址余额,以及通过transfer来给某个地址打钱。对于Address的详解参见 Address Related

address x = 0x123;
address myAddress = this;
// 如果地址x的钱少于10wei且我的地址myAddress的余额多于10wei,则我给x打10wei。
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

函数

函数是智能合约中可执行代码单元

pragma solidity ^0.4.0;

contract SimpleAuction {
    function bid() payable { // Function
        // ...
    }
}

可在合约内部或者外部调用函数(Function Calls),并且也拥有不同的可见度(Visibility and Getters)。

函数修饰器

函数修饰器可以通过声明方式修改函数的语义(详见Function Modifiers)

pragma solidity ^0.4.11;

contract Purchase {
    address public seller;

    modifier onlySeller() { // Modifier
        require(msg.sender == seller);
        _;
        // _;可以理解为将require(msg.sender == seller)在被修饰函数中优先执行。
    }

    function abort() onlySeller { // Modifier usage
        // ...
    }
}

事件

事件是以太坊虚拟机日志工具的便利接口。

pragma solidity ^0.4.0;

contract SimpleAuction {
    event HighestBidIncreased(address bidder, uint amount); // Event

    function bid() payable {
        // ...
        HighestBidIncreased(msg.sender, msg.value); // Triggering event
    }
}

详解请参阅智能合约章节中的事件小结(Events),了解有关事件如何声明以及如何在dapp中的使用。

结构体类型

结构体是用户自定义的数据结构,可以将几个变量组委一体,详解请参阅结构体小节(Structs)。

pragma solidity ^0.4.0;

contract Ballot {
    struct Voter { // Struct
        uint weight;
        bool voted;
        address delegate;
        uint vote;
    }
}

枚举类型

枚举用于创建有限值集的自定义类型,详解请参阅结构体小节(Structs)。

pragma solidity ^0.4.0;

contract Purchase {
    enum State { Created, Locked, Inactive } // Enum
}

Creative Commons License
This work is licensed under a CC A-S 4.0 International License.