在区块链的相关讨论中,“智能合约”是一个出现频率极高的词汇。“智能合约”是区块链技术的重要组成部分,也是区块链技术实现核心价值“信用”的重要环节之一。然而人们往往通过“智能合约”的字面意思对其做出简单的解读,将之描绘为一种能够在未来取代“合约”和“公证”的技术。在各类媒体报道文章中,“智能合约”被大量的曲解和误读着。笔者特在此围绕“智能合约”概念对以下问题逐一展开解读:“智能合约”到底是什么?“智能合约”和传统意义上的合约有什么区别?“智能合约”到底能否取代法律概念上的“合约”和“公证”?
“智能合约”到底是什么?
对于“智能合约”的定义是各种各样的。有的文件将“智能合约”定义为“一种用计算机语言取代法律语言去记录条款的合约”。作为法律从业人员而言,这种定义方法是完全错误的。
还有文件将“智能合约”定义为“基于区块链的图灵完备的编程脚本语言,适合各种区块链数据结构和共识协议”。这种定义方法也不准确。比特币所采用的语言是“图灵不完备”的,但是比特币语言中同样植入了“智能合约”。
中国电子技术标准化研究院联合数十家单位于2017年5月16日发布的《中国区块链技术和产业发展论坛标准 CBD-Forum-001-2017》中,将智能合约(smart contract)定义为“以数字形式定义的能够自动执行条款的合约 ”,“注:在区块链技术领域,智能合约是指基于预定事件触发、不可篡改、自动执行的计算机程序。”
备注里的这句话揭示了“智能合约”的本质。“智能合约”本质上是一种“计算机程序”,而不是“合约”。不要通过“合约”的基本特征去理解“智能合约”,而要通过“计算机程序”的基本特征去理解“智能合约”。
不过这种定义仍然没有清楚的解释“智能合约”到底是什么。
要理解“智能合约”,得从中本聪设计比特币的转账功能说起。
假如你是2009年的中本聪,你已经找到了解决双重支付的方法,现在要设计比特币的转账功能了。你会怎么做呢?通常的设计方案会是这样:
发送方向比特币网络发一份广播,其内容是这样的:“从A地址转账1 BTC给B地址。同时附上A地址私钥的签名”。网络各节点收到广播,校验签名合法。于是从A地址扣掉1 BTC,给B地址加上1 BTC。
简洁明了对不对?但是如果是这样的设计,我们就无法看到今天区块链技术在各领域的落地扎根、欣欣向荣。中本聪的设计方案是这样的:
发送方向比特币网络发一份广播,其内容是这样的:“我要转账1 BTC,并且我提供了一段脚本,这段脚本作为钥匙可以打开这1 BTC上的锁;同时,我根据接收方的要求为这1 BTC加个新的锁”。
网络各节点收到广播,运行脚本,发现确实能“开锁”,于是根据发送方的指令给这笔比特币换上一把“新锁”,这笔比特币也就有了新的主人。当接收方想使用这1 BTC时,只要能提供一段新的脚本作为钥匙打得开这把新锁就行。
乍一看,中本聪的设计似乎非常繁琐和反直觉,然而这样的设计却另辟蹊径,打开了一个全新的天地。脚本是一种简单的计算机语言,比如Java就是一种脚本。比特币的脚本可以表述的内容非常灵活,远远超出了一对一转账的范畴。例如:A可以按照约定加锁,设置必须由收款人B和担保人C同时签名才能支配某笔比特币(担保交易),也可以设置B、C、D中任意两人签名就能支配(联名账户);也可以设置B必须在一年后才能动用某笔比特币(延时支付),也可以设置任何人都能支配(撒钱)或者都不能支配(烧钱)。通过这套内置的脚本编程语言,你可以灵活地编写出各种各样的约定——而这其实就是“智能合约”的来源。用比特币脚本编写的合约系统,使得比特币成为了人类历史上第一种可编程的货币。
注意,中本聪这种设计思路和传统方式最大的变化就是,货币移交的重心不在于从一方转移到另一方,而是在权属变化的同时预设了“开启条件”。这个“开启条件”的预设思路是根植于区块链技术的本身设计思想的。因为区块链去中心化,分布式存储,所有数据每个参与节点都有相同的一份,那么大家拥有同样的数据,怎么才能分清各自的权益呢?方法就是给所有的数据都加上对应的“锁”,某个人或某组人用自己的专属钥匙才能开启对应的“锁”,从而获得对自己权益的处分权。传统货币动用前也会验证签名和密码,但是验证的目的仅仅在于校验身份。比特币则不仅仅是校验身份,而且还校验是否符合“开启条件”。这个预设的“开启条件”就是区块链所说的“智能合约”。
对于区块链技术应用的其他领域,此处的比特币转账替换成价值的传递、转移、交换即可