这些智能合约漏洞,可能会影响你的账户安全!
什么是形式化验证?
维基百科对形式化验证的解释是这样的: 在计算机硬件(特别是集成电路)和软件系统的设计过程中,形式化验证的含义是根据某个或某些形式化规范或属性,使用数学的方法证明其正确性或非正确性。传统上在硬件设计领域比较常用。主要原因就是硬件设计周期长,成本高,一旦生产出来就很难改动了。例如一个 CPU 设计如果已经出芯片了,那么出了问题就是大事。形式验证可以分为三大类:抽象解释(Abstract Interpretation)、形式模型检查(Formal Model Checking,也被称作特性检查)和定理证明(Theory Prover)。
区块链智能合约为什么需要形式化验证?
在区块链系统中可以编程且自动运行的程序被称为智能合约。智能合约最早在以太坊区块链平台上应用,如Solidity就是一种智能合约编程语言,以使传统应用程序开发人员能够编写智能合约。初期会Solidity语言的全球只有几百人,后来随着以太坊与区块链的火热,参与Solidity智能合约的人才开始逐渐增加,但是跟整个IT市场的从业人群比起来,会编写智能合约的人还是太少,大量的IT从业者要想开发智能合约只能去学习Solidity。为了让更多的IT从业者可以参与智能合约的编写与业务规则的实现,智能合约平台在原有Solidity的基础上扩展了对更多主流语言,甚至高级语言的支持,这样可以让多普通It从业人员也有了可以进行智能合约编写的可能性,大量熟悉Java、Go、Php等技术编程的开发人员都可以参与智能合约的开发。
然而,由于区块链交易是不可变的,智能合约代码中的错误会产生毁灭性的后果,破坏了对底层区块链技术的信任。例如,臭名昭著的TheDAO漏洞导致价值近6000万美元的以太损失,奇偶校验钱包漏洞导致价值1.69亿美元的以太永远被锁定。解决这些事件的唯一补救办法是硬分叉区块链,并将其中一个分叉恢复到事件发生前的状态。然而,这种补救办法本身是毁灭性的,因为它摧毁了区块链的核心价值,如不可变性和分散信任。但是智能合约的编写目的是为了行业应用,一旦应用到实际中必须考虑智能合约的安全性,智能合约要达到机器可信,就必须首先排除掉因人为因素而造成的智能合约破坏情形。智能合约形式化验证提供了一种可以证明的安全检验机制,通过形式化语言把合约中的概念、判断、推理转化成智能合约模型,可以消除自然语言的歧义性、不通用性,进而采用形式化工具对智能合约建模、分析和验证,进行一致性测试,最后自动生成验证过的合约代码,形成智能合约生产的可信全生命周期。可以把市场上已经出现的安全风险进行排查与审计,经过审计后的智能合约代码自然安全性就得到增强,同时智能合约形式化验证也是目前对智能合约进行安全保证最可靠的措施。行业应用区块链与智能合约,就需要进行智能合约 的形式化验证,消除安全隐患。
智能合约形式化验证方法分类
业界通常对智能合约进行形式化验证都有一些通用的方法,大体上分为下面几种通用的方法,每种方法都有一些工具和框架进行支撑。
1. 定理证明