小调查:你对哪种区块链上的智能合约开发感兴趣?8 y0 d+ ]% v U5 t' w3 l
比特币& }& X# m( ^' V0 V; n
Fabric
以太坊
比特币: W( h) l" L* o" k6 W* g
比特币是第一个真正意义上的区块链,不过,从严格意义上来讲,它对智能合约的开发者是不友好的。
可以用一种低门槛的编程语言Bitcoin Script在比特币系统上编写智能合约。每个比特币地址都对应着一个Bitcoin Script程序。看起来是这样:+ P2 s7 g" y# M, r( w, y, i5 L' m
( A3 D- b, w! V+ E3 O1 Q
- IF. \2 p) q; B0 y: O* e3 X; y: l
- 2 [B] 3 CHECKMULTISIG
- ELSE2 v) q% Z H( i3 ]9 s
- "30d" CHECKSEQUENCEVERIFY DROP
- CHECKSIG
- ENDIF
另一种较高级别的语言是Ivy,它可以编译成Bitcoin Script。Ivy能够帮助你编写自定义的比特币地址,这种地址与隔离见证(SegWit)兼容,在比特币协议(包括签名检查、hash特征值(commitment)和时间锁)的支持下,可以执行任意条件组合。例如:
- contract EscrowWithDeplay{
- ) ~& ?3 i" T9 K( i( u
- sender: PublicKey: f3 x ^. F, a X) ]
- recipient: PublicKey,# p1 i+ P F+ f7 o
- escrow: PublicKey,! n! p1 j* ]2 Z9 t
- delay: Duration,3 h3 \# _0 U( V* r% L
- val: Value3 O, D( |2 a2 p
- }{
- clause transfer(sig1: Signature, sig2: Signature){
- verify checkMultiSig([sender, recipient, escrow],[sig1, sig2])" I* M; t/ |; s+ S! L
- unlock val/ J' V* E8 _1 W! q
- }
- clause timeout(sig: Signature){0 q: |0 n9 @- S" S( Q- @
- verify checkSig(sender, sig)' P$ K5 I8 m& y3 {. X
- verify older(delay), s5 ^/ u& S: Y& o
- unlock val
- }( M! B- y" v1 t' T
- }
* s) J7 a( D# j1 l, {! B) O+ E9 s* i
Ivy的github地址:https://github.com/ivy-lang/ivy-bitcoin
比特币“虚拟机”——协议中负责执行Bitcoin Script程序的一部分——与以太坊或者Chain Protocol等其它智能合约平台的虚拟机相比(功能)更加有限,其指令系统甚至不是图灵完备的。但Bitcoin Script的确提供了一组很有用的基础原语(primitives)——签名校验、哈希计算以及相对和绝对的时间锁——另外还能对这些原语进行自由组合。
超级账本fabric
fabric是超级账本大家庭中最成熟的一个区块链项目,主要用于行业链、联盟联或私有链,它不需要通过挖矿来形成共识,因此可以达到很高的交易速度。
. l. B% n# x( k
在fabric中,智能合约被称为链码(Chaincode),实质上是控制区块链网络中的不同实体或相关方如何相互交互或交易的业务逻辑。简言之,链代码将业务网络交易封装在代码中。可以调用链代码来设置和获取账本或 world state。
# n6 q9 m! R; w. ~6 ?! S
超级账本可以使用go、java或者nodejs来开发智能合约,不过支持最好的还是go语言。下面是使用go开发的一个简单地fabric智能合约:
- package main
- 2 L" ]6 i1 A0 b
- import "fmt"
- import "github.com/hyperledger/fabric/core/chaincode/shim"' g. k- R) n' H
- type SampleChaincode struct {
- }
- func (t *SampleChaincode) Init(stub shim.ChaincodeStubInterface, function J2 l8 \0 U5 S: U% X. x
- string, args []string) ([]byte, error) {
- return nil, nil
- }( U N: q3 Y( s$ ?/ R3 M" ~
- func (t *SampleChaincode) Query(stub shim.ChaincodeStubInterface, function
- string, args []string) ([]byte, error) {
- return nil, nil% v% t! M: x/ x# n
- }3 G5 v6 Z5 u3 c" L5 Y5 w9 P
- func (t *SampleChaincode) Invoke(stub shim.ChaincodeStubInterface, function+ c/ \' I7 M0 c' E6 i
- string, args []string) ([]byte, error) {
- return nil, nil4 R! {" n' o ^5 T! k) U' _3 ?
- }
- func main() { e6 s4 ?, s& }0 }, _5 b2 L
- err := shim.Start(new(SampleChaincode))- N5 B) G' E {2 |
- if err != nil {
- fmt.Println("Could not start SampleChaincode")
- } else {& N$ Q' |7 ]5 e) B
- fmt.Println("SampleChaincode successfully started")) Q0 p$ Y' B: M6 E# I8 ^; H8 z# o
- }3 O! |" l+ G$ o% Y( z' x1 c
- }
frabric的智能合约可以使用一个go中的类实现,它必须要实现约定的借口Init和Query。( P# i. j: O! w% K+ q* y/ a
3 r/ g% f/ r" h/ [) U; Q
Init 方法 在链代码首次部署到区块链网络时调用,将由部署自己的链代码实例的每个对等节点执行。而只要在区块链状态上执行任何读取/获取/查询操作,就会调用 Query 方法。6 v2 J3 j5 ?6 @1 i+ l
访问这里了解更多关于fabric的智能合约开发的相关信息:Fabric Chaincode
/ o; `$ c9 g( _' ]0 Z% j8 _, A
以太坊
以太坊是第一个提供完善的智能合约开发框架的区块链,因此它也被称为区块链2.0的代表。事实上,目前绝大多数的区块链应用,包括ICO代币发行,都是基于以太坊来实现的智能合约应用。3 F" \7 @$ a( m; F
以太坊有四种专用语言可以用来开发智能合约: y3 J6 l3 `! |; j! d `
Solidity ,受JavaScript 启发
Serpent ,受Python启发
Mutan,受Go 启发- w1 C7 i$ B9 A1 Y; a; g
LLL 受Lisp 启发
) [- _+ O% `0 `! u3 w1 N$ b, s: P) L
这四种语言都是为面向合约编程而从底层开始设计的语言,但从目前的发展来看,Solidity已经称为以太坊智能合约开发当之无愧的首选语言。2 j4 D4 r( R5 d8 B1 L6 l: z
Solidity的语法类似于JavaScript,这降低了学习门槛,易于被掌握和使用,因为JavaScript是Web开发者的常用语言。例如,下面是一个使用Solidity开发的简单但完整的智能合约:
- pragma solidity ^0.4.21;- m# v% O; A! a3 `; a8 q
- contract HelloWorld {+ G0 ~" M+ b; m$ w; i1 S
- string hello = "Hello World!!!";, F0 b+ e$ B: u' g) g7 y
- event say(string _value);- w+ S2 `: ?# w$ ]1 z
- function sayHello() public {- C/ X8 T7 k8 e T
- emit say(hello);
- }
- }
3 y/ F' q3 }# G `# x) Q) z. ?
合约代码第一行指定该合约使用的Solidity版本为0.4.21,不支持高于0.4.21版本的Solidity特性。4 b4 V7 }' b3 Q& S7 N( }
在Solidity中,contract关键字包含的代码段即表示一个智能合约,它拥有一些成员变量和函数,看起来非常类似于传统的面向对象开发中的类。