智能合约
一提到智能合约,大家有可能首先想到的是以太坊,以太坊创新性的在区块链技术上加上智能合约,丰富了链上功能。然而,智能合约的概念却由来已久,并不是以太坊的“专利”。
传统合约与智能合约的比较
早在1995年,跨领域学者 Nick Szabo 就提出了智能合约的概念,他对智能合约的定义为:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议。”简单来说,智能合约是一种在满足一定条件时,就自动执行的计算机程序。
例如自动售货机,就可以视为一个智能合约系统。客户需要选择商品,并完成支付,这两个条件都满足后售货机就会自动吐出货物。合约在生活中处处可见:租赁合同、借条等。传统合约依靠法律进行背书,当产生违约及纠纷时,往往需要借助法院等政府机构的力量进行裁决。智能合约,不仅仅是将传统的合约电子化,它的真正意义在革命性地将传统合约的背书执行由法律替换成了代码。俗话说,“规则是死的,人是活的”,程序作为一种运行在计算机上的规则,同样是“死的”。但是“死的”也不总是贬义词,因为它意味着会严格执行。
尽管智能合约这个如此前卫的理念早在1995年就被提出,但是一直没有引起广泛的关注。虽然这个理念很美好,但是缺少一个良好的运行智能合约的平台,确保智能合约一定会被执行,执行的逻辑没有被中途修改。
区块链这种去中心化、防篡改的平台,完美地解决了这些问题。智能合约一旦在区块链上部署,所有参与节点都会严格按照既定逻辑执行。基于区块链上大部分节点都是诚实的基本原则,如果某个节点修改了智能合约逻辑,那么执行结果就无法通过其他节点的校验而不会被承认,即修改无效。这样智能合约就可以按照既定指令运营下去。区块链成为了智能合约可执行的”最佳拍档“。
那么智能合约的原理是怎样的呢?一个基于区块链的智能合约需要包括事务处理机制、数据存储机制以及完备的状态机,用于接收和处理各种条件。并且事务的触发、处理及数据保存都必须在链上进行。当满足触发条件后,智能合约即会根据预设逻辑,读取相应数据并进行计算,最后将计算结果永久保存在链式结构中。
智能合约在区块链中的运行逻辑
因为合约是严肃的事情,传统的合约往往需要专业的律师团队来撰写。古语有云:“术业有专攻。”当前智能合约的开发工作主要由软件从业者来完成,其所编写的智能合约在完备性上可能有所欠缺,因此相比传统合约,更容易产生逻辑上的漏洞。
另外,由于现有的部分支持智能合约的区块链平台提供了利用如Go语言、Java语言等高级语言编写智能合约的功能,而这类高级语言不乏一些具有“不确定性”的指令,可能会造成执行智能合约节点的某些内部状态发生分歧,从而影响整体系统的一致性。
2016年著名的The DAO事件,就是因为智能合约漏洞导致大约几千万美元的直接损失。The DAO 是当时以太坊平台最大的众筹项目,上线不到一个月就筹集了超过1000万个以太币,当时价值一亿多美元。但是该智能合约的转账函数存在漏洞,攻击者利用该漏洞,盗取了360万个以太币。由于此事件影响过大,以太坊最后选择进行回滚硬分叉挽回损失。
区块链科普之The DAO 事件
2016年6月17日,心情焦躁的以太坊创始人V神在Reddit上发了一篇帖子“DAO遭到攻击,请交易平台暂停ETH/DAO的交易,充值以及提现,等待进一步的通知。新消息会尽快更新。”著名的The DAO事件拉开序幕。
DAO(Decentralized Autonomous Organization)是分布式自治组织。The DAO是一个基于以太坊区块链平台的迄今为止世界上最大的众筹项目。其目的是让持有The DAO的参与者通过投票的方式共同决定被投资项目, 整个社区完全自制,并且通过代码编写的智能合约来实现。于2016年5月28日完成众筹,共募集1150万ETH,在当时的价值达到1.49亿美元。
不久,The DAO就受到黑客攻击,原因是The DAO编写的智能合约中有一个 splitDAO 函数,攻击者利用此函数的漏洞,不断从The DAO项⽬的资产池中分离出The DAO资产并转到黑客自己建立的子DAO。3个小时300多万枚ETH,六千万美元资产被黑客转移,血流成河。以太坊智能合约受到了最严重的质疑,究竟该如何防止此类事件再次发生?
让我们看看安全预防策略。
充分测试
测试用例设计:对业务进行全方位分析,通过等价类划分法、边界值分析法、正交实验法等方法设计出尽可能全面的测试用例,编写成测试代码,做自动化回归测试。
多人交叉测试:一个人的思维是局限的,我们需要通过多人的跳跃性思维,将尽可能多的情况覆盖在内。
回归测试:每一次修改都必须做整套回归测试。
工具监控
以太坊的所有交易都是公开透明可查的。我们可以通过工具将某一个智能合约交易数据实时爬取出来,并对可能的异常交易做短信和邮件告警。这样我们能第一时间发现问题,并采取措施。
第三方审计
可以找一些专业的智能合约开发工程师做审计。审计可以从另一个角度去发现智能合约可能存在的潜在问题.可能做审计的人的专业能力没有开发者的专业能力强大。