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 } // 枚举
他可以显式的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。 枚举类型应至少有一名成员。
下一章:Solidity 编写智能合约
要写智能合约有好几种语言可选:有点类似 Javascript 的 Solidity, 文件扩展名是.sol。Python 接近的Serpent, 文件名以.se结尾。还有类似 Lisp 的LLL,但现在最流行 ...