摘要: 现在智能合约通常用来泛指区块链上运行的程序或脚本。智能合约应用的一个里程碑事件 DAO,实现了以智能合约进行风险投资。  
 
区块链1.0时代的应用以比特币为代表,为解决货币和支付手段的去中心化,而区块链2.0时代则是更宏观的对整个市场的去中心化,利用区块链技术来转换许多不同的资产而不仅仅是比特币,通过转让来创建不同资产单元的价值。智能合约便是这样一种应用。
 
什么是智能合约?追本溯源,智能合约是由法律学者 Nick Szabo 在1995 提出:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。”合约隶属于法律范畴的概念,智能合约从提出之初,便有未来的银行和律师之称。
 
现在智能合约通常用来泛指区块链上运行的程序或脚本。智能合约应用的一个里程碑事件 DAO,实现了以智能合约进行风险投资。
 
智能合约
 
智能合约运行在区块链的多个节点上,新建/调用都由区块链的 Transactions 触发,它在一个分布式环境中运行,只有在给定输入,智能合约任一接口都能返回同样输出的情况下,各节点才可能达成共识。换言之,设计智能合约时,我们要保证写操作的确定性,读操作的幂等性。
 
目前智能合约并没有明确的行业规范,Ethereum 和 Hyperledger Fabric 都各自有独立一套智能合约的设计。但 Ethereum 相比 Fabric 适用的区块链平台更多。目前大多数智能合约,包括DAO,都是基于 Ethereum 设计实现。
 
1)Ethereum
 
Ethereum 给出的解决方案是只支持特定语言生成的智能合约。Solidity 是其中之一,它是一种语法类似 Javascript 的面向对象编程语言,也是目前最受欢迎的智能合约编程语言。为了保证确定性,Solidity 在设计时,也作出了一些权衡:
 
• 去随机
 
Solidity 在设计时,系统函数库中将产生随机数一类的函数排除在外。实际应用中,如果需要能产生随机值的功能,大多是采用类似像对发送方的哈希地址取模这种方式获得。
 
• 去网络访问
 
目前来说,智能合约中禁止访问外部链接,能访问的数据仅限于接口调用传入的参数以及本地数据库中的信息。
 
2)Fabric
 
Fabric 允许采用 Go 和 Java 实现智能合约,对确定性智能合约的支持更多在于指导建议。shim 是 Fabric 官方提供的库,支持区块链上数据访问,对应 Transaction 数据访问以及跨合约调用。shim 库能保证程序确定性,但在实际操作中任何 Go 的类库都可以使用。
 
运行环境
 
Ethereum
 
Ethereum 设计的智能合约运行环境为 EVM(Ethereum Virtual Machine)。EVM 设计为256位虚拟机,可以支持对256位哈希进行操作,它有两种实现方式:一种是字节码虚拟机,另一种则是 JIT 虚拟机。
 
1、字节码虚拟机
 
智能合约编译后,会生成字节码指令序列。字节码虚拟机在一个循环中逐条执行这些指令序列。每条指令包含指令码和操作数。字节码虚拟机的指令集支持跳转指令。在执行智能合约指令前,EVM 会首先遍历查找所有的跳转指令的目标地址,缓存下来,验证是否有效。整个代码的处理逻辑与汇编语言非常相似。
 
2、JIT 虚拟机
 
JIT虚拟机是对字节码虚拟机的一种优化。JIT 虚拟机将解析的指令结果缓存下来,根据智能合约编译后的哈希值来确定是否已缓存了解析结果,从而提高执行效率。和常见的 JVM 的 JIT 有原理上的类似。
 
3、Fabric
 
Fabric 的智能合约运行环境选择的是 Docker。对可以执行智能合约的 Peer 节点,每一个新部署的智能合约都将在一个独立的 Docker 中运行。虽然在设计上 Fabric 大大提升智能合约可支持的业务复杂度,但鱼与熊掌不可兼得,它也将智能合约的执行确定性保证彻底推向了开发者。
 
为每一个智能合约都创建一个 Docker 也是 Fabric 设计存在争议的地方。目前 Fabric 并不支持对智能合约运行 Docker 的 Lifecycle 管理,这也属于商业应用中缺失的一环。
 
小结
 
智能合约虽然广受关注,但目前成熟度依然偏低。Ethereum 需要重新完善其自研语言的开发生态链,即使其社区足够活跃,也不可能在短期内有所突破。而Fabric的后发优势更为明显,Go的生态圈将是其开发友好性的重要助力。
 
本文系共享财经专栏作家点融黑帮所著。
区块链
智能合约