安比(SECBIT)实验室与 Consensys 中国、轻信科技等团队联手,在智能合约安全的形式化证明领域展开深度合作。
智能合约安全问题始终是萦绕在数字货币各个项目方、开发者和投资者心头的一颗定时炸弹。越来越多的安全团队积极参与,试图通过更完备手段来解决合约安全问题。安比(SECBIT)实验室认为,形式化验证与传统的“测试+审计”方式相结合,将会是保证智能合约安全强有力的手段。
7月7日,安比(SECBIT)实验室联合ConsenSys正式发布 ERC20 合约的形式化证明源码。该合约代码来源于 ConsenSys 官方提供的 ERC20 合约模板,形式化证明代码已上传至 Github 仓库(tokenlibs-with-proofs),地址如下:
ConsenSys 官方源码地址:
https://github.com/ConsenSys/Tokens/blob/master/contracts/eip20
我们针对 ERC20 合约常见问题和特性展开了证明,证明性质分为以下几个部分
- 漏洞溢出
- 合约中 Token 总量
- 转账操作对任意账户的影响
我们希望以本项目为切入点,展示形式化验证是如何应用到智能合约领域的,进而帮助更多的技术人员学习或参与到智能合约的形式化验证中。
我们也希望利用形式化证明,剔除漏洞合约,为大家筛选出更多较为安全的合约模板。
同时,安比实验室也将致力于使用形式化验证的方法,从业务实现,技术安全和经济学等维度,构建更加可信安全的智能合约。
什么是形式化验证?
下面是来自维基百科的一个形式化验证的定义:
In the context of hardware and software systems, formal verification is the act of proving or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics.
The verification of these systems is done by providing a formal proof on an abstract mathematical model of the system, the correspondence between the mathematical model and the nature of the system being otherwise known by construction. Examples of mathematical objects often used to model systems are: finite state machines, labelled transition systems, Petri nets, vector addition systems, timed automata, hybrid automata, process algebra, formal semantics of programming languages such as operational semantics, denotational semantics, axiomatic semantics and Hoare logic.
从上述定义,我们可以看到,形式化验证事实上包含了各种不同的验证理论技术。但是,万变不离其宗,形式化验证简单说就是一个基于数学模型的验证。验证的过程是为了保证这个数学模型满足一定的性质。
本文后面所采用的形式化验证理论技术,是将智能合约语言编写的代码作为数学模型,将智能合约所需要满足的要求作为性质进行证明。通俗的来讲,就是使用数学语言来描述合约代码,并证明其具有一些好的性质,例如不存在整数溢出漏洞。
更深一步讲,我们是通过形式化的程序逻辑(Program Logic),来证明一个智能合约程序(Code)是否满足已给定的形式化规范(Formal Specification),然后,在规范的基础上,证明智能合约的行为始终满足一些高层性质(High-level Property),并且通过显式的证明(Proof Object)来使用户确信验证结果的正确性。
当我们在讨论任何形式化验证理论或者技术时,都绕不开下面三个关键点:
- 任何证明都是在一定的前提假设下的证明;
- 证明过程是依赖形式化逻辑理论的正确推理;
- 证明的最终结果(定理)是大家能够取得共识的结论;
安比实验室(SECBIT)所采用的形式化验证方法中,第一点需要保证一些基本的定义是正确的;第二点需要保证证明过程的合法性,这里我们采用流行的证明辅助工具 Coq 来表示证明和检查证明;第三点我们证明的结论正确表达了大家共同关心的 ERC20 性质。
注意:这三点内容是形式化证明的前提条件,是我们对保证合约安全的必须信任的前提条件,是智能合约形式化证明的信任基础(Trusted Computing Base)。任何安全都必须基于一定的信任基础,一个系统的信任基础越小,那么它就越安全。本文所采用的形式化证明方法将信任基础降到了最小集合。
智能合约为何需要形式化证明
以比特币为首的区块链技术将智能合约的构想落地,随之以太坊将智能合约发扬光大。以太坊将比特币交易中的脚本变成了一种通用的图灵完备的编程语言。(注:所谓图灵完备是指编程语言的表达能力得到了最大程