Solidity 合约结构

本章节主要讲述智能合约中合约的基本结构,及基本关键字的使用。


合约中可包含内容:

usingFor声明,状态变量(State Variables),结构类型(Structs Types),构造函数,函数修饰符(Function Modifiers),函数(Functions),事件(Events),枚举类型(Enum Types)

智能合约 Test

pragma solidity ^0.4.0;    //版本声明
import "./A.sol";   //导入声明
contract SolidityStructure{   //合约声明

   uint balance;//状态变量

   address owner;

    struct Hello { // 结构类型
        uint helloNum;
        address hello;

    constructor() public{  //构造函数
        owner = msg.sender;
    }
    //function HelloWorld(){
    //} 这种方式也可以

    modifier onlySeller() { // 修饰器
        require(
            msg.sender != owner
        );
        _;
    }

    function test() public {  //函数
       uint step = 10;
       if (owner == msg.sender) {
          balance = balance + step;
       }
    }

    function update(uint amount) constant returns (address, uint){ //带返回值的函数
        balance += amount;
        return (msg.sender, balance);
    }

   using LibraryTest for uint; //using声明 

   uint a = 1;

   function getNewA()returns (uint){ 
       return a.add();
   }

    function kill() {   //析构函数
        if (owner == msg.sender) { 
             selfdestruct(owner);
         }
     }     

    event HighestBidIncreased(address bidder, uint amount);//事件 log日志打印

    function bid() public payable {
        emit HighestBidIncreased(msg.sender, msg.value); // 触发事件打印相关日志
    }

     enum State { Created, Locked, Inactive } // 枚举
 }

状态变量

uint balance;

类似java中类的属性变量,状态变量是永久的存储在合约中的值(强制是storage类型)
状态变量可以被定义为constant即常量,例如:uint constant x = 1;

结构类型

struct Hello { // 结构类型
        uint helloNum;
        address hello;
}

自定义的将几个变量组合在一起形成的类型,有点类似javabean

构造函数

constructor() public{
   owner = msg.sender;
}

构造函数可用constructor关键字进行声明,也可用function HelloWorld(){} 这种方式声明,当合约对象创建时会先调用构造函数对数据进行初始化操作,构造函数只允许存在一个

函数修饰符(函数修改器)

modifier onlySeller() { // 修饰器
    require(
        msg.sender != owner
    );
    _;
 }

函数修饰符用于’增强语义’,可以用来轻易的改变一个函数的行为,比如用于在函数执行前检查某种前置条件。修改器是一种合约属性,可被继承,同时还可被派生的合约重写。_表示使用修改符的函数体的替换位置。当然函数修饰器可以传参数

成员函数

function test() public    /    function update(uint amount) constant returns (address,uint) 

这两种都可以为合约的成员函数,成员函数类似java中基本函数,但是略有不同,不同点在于有返回值时在函数上指定返回值returns(uint),函数调用方式可以设置为内部(Internal)的和外部(External)的,在权限章节会进行介绍
注意:constant只是一个承诺,承诺该函数不会修改区块链上的状态
###using for
使用方式是using A for B
用来把A中的函数关联到到任意类型B,B类型的对象调用A里面的函数,被调用的函数,将会默认接收B类型的对象的实例作为第一个参数。

pragma solidity ^0.4.0;    
library LibraryTest{
function use(uint a) returns(uint){
    return a+1;
    }
}

contract usingTest{
    using LibraryTest for uint;//把LibraryTest中的函数关联到uint类型
    uint test = 1;
    function testusing() returns (uint){
        return test.use();//uint类型的对象实例test调用LibraryTest里的函数add();add()会默认接收test作为第一个参数。
    }
}

析构函数

selfdestruct()

所谓的析构函数是和构造函数相对应,构造函数是初始化数据,而析构函数是销毁数据

事件

event HighestBidIncreased(address bidder, uint amount);//事件 log日志打印
function bid() public payable {
    emit HighestBidIncreased(msg.sender, msg.value); // 触发事件打印相关日志
} 

事件是以太坊虚拟机(EVM)日志基础设施提供的一个便利接口。用于获取当前发生的事件。事件在合约中可被继承。

枚举

enum State { Created, Locked, Inactive } // 枚举

他可以显式的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。 枚举类型应至少有一名成员。

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