本章节主要讲述智能合约中合约的基本结构,及基本关键字的使用
合约中可包含内容:
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 } // 枚举
他可以显式的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。 枚举类型应至少有一名成员。