密码学家Nick Szabo于1994年首次提出“智能合约”概念:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。”智能合约将一般合同以代码形式嵌入区块链,这种按照约定条件自动执行、无需监督的合约形式可极大提升运行效率,大幅降低运维成本,具有重大商业应用价值。此外,由于智能合约是一种可依据商业环境特点,通过一系列嵌入其代码中的规则进行自我编写的合约,众多技术团队纷纷引入智能合约开发各类平台或应用 。
『智能合约的前世今生』
目前为止,智能合约技术的应用与发展可大致分为三个阶段。区块链1.0时代可视为电子货币阶段,依托比特币、瑞波币等数字货币,市场上可以做最简单的去中心化交易;目前,我们正处于智能合约时代,这是一个以区块链为重要标的的阶段,最重要的是智能合约、数字资产以及去中心化的各类商业应用;而区块链3.0时代将是一个重塑与变革的阶段,在即将到来的数字经济时代,我们都希望能形成一个去中心化的网络,这也意味着我们将以极低的成本形成社会的信任关系,从而使整个社会运行成本大幅下降。
比特币在交易(Transaction)中使用类似FORTH(一种编译语言)的脚本(Script)系统。比特币脚本可视作区块链系统中智能合约的雏形,可用来构造各类支付条件,实现不同条件下的所有权转移,这也是智能合约在区块链上的最早应用。出于安全性和系统复杂度考虑,中本聪在设计之初对比特币脚本功能实行了较大限制,导致其在表达能力上较为不足。此后,以太坊看到智能合约与区块链结合的机遇,设计出更为强大的脚本语言,让开发者可方便地在该脚本上开发和发布合约,实现了一个去中心化应用平台。以太坊的智能合约脚本语言表达能力非常强,且允许进行任意计算。但如此强大的表达能力有利也有弊。比如,并不存在一个通用算法能确定执行一个智能合约的最大成本,导致以太坊上一些资金被智能合约锁定,且因为成本太昂贵而无法执行智能合约。另外,除智能合约系统本身设计问题外,开发者编写出来的智能合约代码,也不可避免地有存在缺陷的可能。
『智能合约的安全现状』
以太坊主张“代码即法律(Code is law)”,即智能合约一旦发布,大家即刻遵从合约进行协作。显然这一规则被贯彻的前提是:智能合约不存在bug。然而研究表明,约28%以上的以太坊智能合约存在不同程度的安全漏洞。除智能合约系统本身设计问题外,开发者编写出来的智能合约代码,也不可避免地有存在缺陷的可能。因此,智能合约开发者面临一个艰巨的任务,由于他们编写的代码是不可改变的,因此其漏洞是永久性的,极易引发不可挽回的灾难。智能合约发展历史中就不乏被黑客攻击的事例。
智能合约常见的安全漏洞有以下五类。
上述智能合约的常见漏洞与安全问题的原因大致可归结为以下几个方面:
其一、智能合约语言语义复杂。
其二、智能合约在极端情况下的行为复杂(如下极端情况)。
a.执行步相关的GAS使用
b.虚拟机调用栈
c.交易发送中的异常处理
d.相关交易的执行顺序不可预测
其三、智能合约缺少审计流程。
『智能合约的挑战』
智能合约作为区块链的“杀手级应用程序”将为传统市场提供强劲的上升空间毋庸置疑,但智能合约本身存在的安全问题制约了其落地与推广也必须正视。形式化验证将是未来智能合约突破和发展的重大技术挑战。形式化验证,指的是用数学算法验证软件程序,作为solidity语言的补充,它有强化区块链智能合约安全性的潜力,能有效防止类似DAO攻击事件的发生。
但就目前而言,智能合约的形式化验证还面临诸多挑战。
挑战一:合约代码的验证目标确定
挑战二:形式化验证的方法选择
挑战三:形式化验证的成本定位
关于智能合约形式化验证的道路探索,已有相关学者进行了研究。
1.COMPCERT——C语⾔⼦集编译器(POPL 2006,INRIA, Leroy)(6 person/year);
2.seL4是第⼀个经过完全形式化的微内核操作系统(SOSP 2009,NICTA, Klein)(25 person/year);
3.SHA256算法经过形式化证明(2015,Princeton, Appel)(2.5person/year);
4.FSCQ是第⼀个经过完全形式化的文件系统(SOSP2015)(MIT,Chen et al.);
5.CertiKOS是第⼀个经过完全形式化的并发多核操作系统(OSDI2016, Yale, Shao) (2 person/year);
『智能合约的未来物语』
未来共识社会数字经济的发展需要一套安全可信的智能合约。
通过携证明代码的技术来保证智能合约的可信,为智能合约附加上安全证明。
携证明的代码框架理论(Proof-Carrying Code)最早由G. Necula等人提出,经由学界的多年研究,已经取得了长足的进步。其基本核心思想是采用类型化Lambda演算来显式地表达证明,因为证明与代码之间有严格的对应关系,一旦黑客更改过代码之后,其携带证明就将失效,除非黑客要重新证明修改过后的代码仍然满足安全策略。
一类形式化验证的方法是:将代码的安全性证明显式地表达出来,显式的证明可以作为充分的理由来说明代码的安全性,并且不再依赖除证明检查器之外的工具。携证明代码技术支持深度规范,模块化证明等理论,可以将一个智能合约的代码通过语义抽象层进行分解,通过模块化的证明手段来降低代码整体的安全性。合约代码的证明可以通过工具辅助产生,如逻辑推理引擎,证明策略脚本语言,或定理证明器(如 Z3)等。
未来可信智能合约需满足以下三个基本条件:
第一、智能合约本身没有安全漏洞,这一条是针对所有智能合约编写者;第二、智能合约语言语义明确,这一条是对智能合约语音的理论设计者而言;第三、智能合约引擎没有安全漏洞,这一条是针对智能合约的工程实现者。
要实现安全可信的智能合约还需要客服诸多困难,首先要实现安全可信的智能合约语言,这一语言应具备如下特点:
a.非图灵完备,保证终止性(受限制的循环)
b.语义简洁明晰——轻量级
c.内建形式化状态描述语言
d.具有形式化语义规范的虚拟机操作码
e.附带智能合约验证编译器(Certifying Compiler)
f.辅助证明产生工具
其次,需要开发一系列的合约验证工具集,主要包括:
a.开发相关的验证⼯具,提前辅助合约开发者发现问题
b.开发证明辅助生成⼯具,提⾼形式化验证的⾃动化⽔平
c.在区块链共识协议中引⼊必要的形式化证明验证流程
d.支持链下的证明检查流程
形式化验证可严格保证智能合约能够按照预期来执⾏,包括所有可能的错误处理,对恶意调⽤⾏为的反应等。目前智能合约和区块链都存在安全问题,因此形式化验证的重要性将会越来越大。
…formalverification is what we need. It's a learning curve, but it must be embraced,and that's exciting...
—— Grant Passmore
领取专属 10元无门槛券
私享最新 技术干货