概述
智能合约(smart contract)的定义如下:
智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。
以太坊中最大特点是引入了智能合约,智能合约运行平台为脚本提供了更加丰富的表现力,为区块链的应用场景增加了无限的可能性。
智能合约简介
智能合约其实也就是存储在区块链(每个节点)中的一段相同代码,这段代码定义了合约的规则,当输入满足要求的条件后,每个节点中智能合约代码会自动独立执行,并自动交叉检查所有的执行结果是否相同。由于智能合约的代码在所有节点上的每一步的执行结果都必须是一致的,所以智能合约无法访问互联网上的其他应用(可能会随时变化),这一点会大大限制其应用场景,不过未来提供可信任的中介者还是必需的(已经有公司正在开发了),中介者会提供相关的数据给智能合约,这将大大提升智能合约的应用场景。
以太坊中的账户有2种:外部账户和合约账户
-
外部账户:普通用户持有的账户,它的地址由公钥确定,通过公私钥对生成。
-
合约账户:合约账户中除了存储代码(编译后的字节码),其他功能与外部账户完全一样。
合约账户由外部账户调用,之后合约账户也可继续调用合约账户。也就是合约账户最初始只能是外部账户来调用。
智能合约的创建和运行流程
在以太坊中引入了汽油费(Gas)的概念,引入的目的是执行智能合约中可能消耗的资源会很大,所以需要收取交易发起人的汽油费。如下图所示为交易的数据结构:

GasLimit为最大汽油费,当一个全节点收到对智能合约的调用时会先按照最大汽油费一次性从账户扣除掉,再根据实际情况,若最后合约执行完毕有多余的汽油费将退回,若汽油费不够,智能合约将状态回滚,并且汽油费不会退回。
智能合约的运行流程
-
编写智能合约代码,并编译成字节码。
-
部署智能合约。过程是向“0”地址发送一笔带有智能合约字节码数据的交易,这个交易会生成该智能合约的地址,并将字节码存储在该地址下的状态树中。
-
执行智能合约(调用智能合约函数)。向智能合约地址发送一个交易,该交易携带被调用的智能合约函数信息及调用参数,携带的信息遵循ABI编码协议。
-
智能合约地址收到这样的调用合约函数的交易,首先会解码数据,根据结果查找到对应函数的入口,再传入参数执行该函数。
-
执行函数的过程是状态转换的过程,执行完成后会扣除调用者相应的Gas花费。
-
状态转换的过程会全网同步并被再次执行验证,确保执行结果一致,这样通过验证后的交易会记录到区块中,同时更新状态数据。
Solidity语言简介
智能合约有多种编程语言,目前最流行的是solidity,其语法跟JavaScript类似,除了具有一般高级语言的特性外还有针对区块链的一些特殊用法。
声明使用的solidity版本
pragma solidity ^0.4.0;
状态变量(State Variables) 变量值会永久存储在合约的存储空间
contract simpleStorage{
uint valueStore; //state variable
}
函数(Functions)
//Simple add function,try a divide action?
function add(uint x, uint y) returns (uint z){
z = x + y;
}
}函数修饰符Payable 如果一个函数可以接收外部转账,则必须标记为payable。
contract Consumer {
function deposit() payable returns (uint){
return msg.value;
}
}
事件(Events) 事件是以太坊虚拟机(EVM)日志基础设施提供的一个便利接口。用于获取当前发生的事件。
contract SimpleAuction {
event aNewHigherBid(address bidder, uint amount);
function bid(uint bidValue) external {
aNewHigherBid(msg.sender, msg.value);
}
}
结构体类型(Structs Types)
contract Company {
//user defined `Employee` struct type
//group with serveral variables
struct employee{
string name;
uint age;
uint salary;
}
//User defined `manager` struct type
//group with serveral variables
struct manager{
employee employ;
string title;
}
}
枚举类型
contract Home {
enum Switch{On,Off}
}
引用其他源文件
import “filename”;
或
import * as symbolName from “filename”
初识Remix
remix是一个在线的可视化的智能合约编译、部署、调试的平台,大部分的需求这个平台都可实现,网址在这里。下面来介绍下remix的基本使用。