Solidity 编写智能合约

要写智能合约有好几种语言可选:有点类似 Javascript 的 Solidity, 文件扩展名是.sol。Python 接近的Serpent, 文件名以.se结尾。还有类似 Lisp 的LLL,但现在最流行而且最稳定的要算是 Solidity 了。

1. solidity Hello World

pragma solidity ^0.4.0;
import "./A.sol";
contract HelloWorld {
  function hello() returns(string){
      return "hello world";
  }
}

solidity文件扩展名为.sol,主合约名要和solidity文件名相同,一份合约包含版本声明,导入声明,合约声明

2. 版本声明

pragma solidity ^0.4.0;

pragmas(编译指令)是告知编译器如何处理源代码的指令,^表示向上兼容,版本操作符可以为:^ ~ >= > < <= = 之一,0.4.0代表solidity版本(版本字面量形如x.x.x),^0.4.0表示solidity的版本在0.4.0 ~ 0.5.0(不包含0.5.0)的版本,这是为了确保合约不会在新的编译器版本中突然行为异常

3. 导入声明

import导入其他源文件,例如:

import "./A.sol";
从"A"中导入所有的全局标志到当前全局范围,`./`表示当前目录

其他方式:

(1). 创建新的全局符号 symbolName,其成员都是来自“A”的全局。

 import * as symbolName from "A";/import "A" as symbolName;

(2).创建新的全局符号“alias”和“symbol2”,它将分别从”A” 引入symbol1 和 symbol2。

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

4. 合约声明

包括:contract,interface,library。

(1).contract

contract HelloWorld

这里HelloWorld指合约名称,contract即为其他语言中的class,HelloWorld即为类名,创建合约实例则用HelloWorld helloworld = new HelloWorld();

(2).interface 接口

 interface A{   
   function testA();
}

函数不允许有函数体。

(3).library 库

库与合约类似,但它的目的是在一个指定的地址,且仅部署一次,然后通过 EVM 的特性来复用代码。

library Set {
    struct Data { mapping(uint => bool) flags; }
    function test(){
    }
}

其他合约调用库文件的内容直接通过库文件名.方法名例如:Set.test()。

注:一份源文件可以包含多个版本声明、多个导入声明和多个合约声明。

下一章:Solidity mapping delete

1. mapping一种键值对的映射关系存储结构。语法:mapping(_Key => _Value),键值对类型,键是唯一的,其赋值方式为:map[a]=test; 意思是键为a,值为 ...