按照通常的定义,智能合约(Smart Contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。
智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。
我们现在常说的智能合约,就是一段写在区块链上的代码,一旦某个事件触发合约中的条款,代码即自动执行。
智能合约属于区块链上层中的合约层,一般不列入底层范围。
智能合约的出现是对区块链能力的一种扩展。
说到平时使用的转账功能,虽然智能合约也可以操作转账,但不能简单说转账功能都属于智能合约操作。转账是区块链底层最核心的操作之一,属于区块链底层提供的基础服务。
智能合约实现的转账功能也是通过调用区块链底层的转账指令实现的。
在现实社会中,执行合约需要耗费大量社会资源。比方说,A、B两家公司签订合同,后来A违反合同条约,导致B损失重大。B想要拿回属于自己的东西,于是向法院起诉。就算B打官司赢了,判决书生效后,他还需要向法院申请强制执行,包括立案,提供财产线索……,整个流程下来,每个参与人都劳神费力,尤其是本来就是受害方的B。
而智能合约能让这一切变得简单很多。智能合约和上述传统合约的区别,就在于“智能”,不涉及人类主观想法,无需人工参与,一切皆代码。
因此,白墨子认为,智能合约是借助IT技术改造社会治理模式的积极尝试,具有广阔的发展和想象空间。
智能合约的安全
智能合约的安全,是不是可以一句话概括成“代码的安全”?能不能这么理解,因为其自动执行代码,执行过程中的环节少,所以排除了人为因素?不像前两讲中的钱包和交易所,风险环节那么众多?
智能合约本质上就是一段部署在区块链上的代码,并且具有部署之后无法修改的特性,因此智能合约的安全可以简单概括为“代码的安全”,这没有太大问题。这也说明了代码安全在智能合约安全中的极端重要性,当前的智能合约安全工作基本也是围绕着智能合约代码下工夫的。
但是如果说由于智能合约的自动执行排除了人为的因素,所以安全性得到极大提升,则又不然。
首先智能合约无法完全排除人为因素,因为目前而言,智能合约还都是人工编写的。
其次,从信息安全的角度来说,人的作用是两方面的,固然,人的介入经常会给信息系统的运行带来诸多变数和不可预知的因素,但在很多时候,人也是信息安全工作的有效捍卫者,是信息系统有效运作的积极补充。因此在很多信息安全系统中,大量引入人工审核、人工认证、人工审批等模块,不但可以增强信息系统的灵活性,而且可以加强信息系统的安全性。
智能合约的执行过程中排除了人为因素之后,从一个方面来说确实减少了人为因素的负面影响,但是从另外一个方面,这也排除了人为因素在系统运行中的积极作用。
简单来说,限于当前的技术水平,智能合约存在被攻击者攻破和利用的可能,与普通应用不同,目前智能合约部署之后人工干预非常困难,甚至无法干预。
因此完全将人从智能合约中排除出去,真正实现全自动运行和自治操作,有一个很重要的前提条件,那就是智能合约做到百分之百的安全,能够实现百分之百的功能。
但是,在可以预见的相当长时期内,这是不可能的。因此目前智能合约只能被局限于一个非常有限的场景下施展拳脚,距离我们所期待的基于智能合约的自治社会还非常遥远。
智能合约潜在漏洞的比例通常是多少?
一个智能合约的编写初期,假设有20种函数,有潜在漏洞的比例通常是多少?1种?2种?有哪些函数会是高危类型?涉及资产划转之类的吗?白墨子有哪些安全建议?
“世上没有无用的东西,只是放错了地方”。
类似地,我们没法简单地说函数的安全性如何,因为更重要的是你如何使用这个函数。所谓安全的函数,当被错误的使用时,会变得无比危险。而大家一直认为的危险函数,当被正确地使用时,可能会化腐朽为神奇。
涉及资产转移的操作往往是高危操作,确实需要格外的留意和小心,但是大风起于青苹之末,除去此类已经众所周知的敏感操作之外,其他地方也应该受到重视,因为敌人往往从你意想不到的地方发起进攻。隐患险于明火,如果过于关注转账等敏感操作,而忽视了其他方面的安全问题,有可能会忽视真正的潜在危险。
对于智能合约的编写,白墨子简单提以下几个建议,供参考:
- 对智能合约编写工作要真正重视起来,切勿视作普通的程序编写工作;
- 不安全的智能合约等于开门揖盗,有不如无;
- 充分认识到你所编写合约的实际运行环境是一个不可信的分布式环境,尽可能做最坏的安全设定,切勿盲目乐观;
- 在没把握的情况下,尽量使用成熟的算法和框架,创新也要循序渐进;
- 对智能合约开发人员进行足够的安全培训,确保开发中的安全意识;
- 智能合约的设计之初即需要安全人员深度介入,建议最好在设计、开发、测试、部署的整个开发生命周期中保持安全人员全程参与,并高度重视安全人员的意见和建议;
- 要确保在代码审计和安全测试方面的足够人力物力投入;
众筹项目the DAO硬分叉
2016年年中,以太坊上发生了一个重大事件:当时以太坊上最大的众筹项目the DAO (Decentralized Autonomous Organization,分布式自治组织)编写的智能合约出现漏洞,攻击者从the DAO项⽬的资产池转出了300多万枚以太币到自己建立的子DAO里,市值近6千万美元,最终迫使以太坊开发人员执行了“硬分叉”将资产找回。
请白墨子为大家解读一下这一重大事件带来的影响和启示。
DAO是区块链安全史上的里程碑性事件,DAO以及后续的Parity钱包事件都发生在2016年,直接导致了以太坊的安全寒冬。
如果说之前区块链安全还只是传说中的幽灵,并未引起大多数人的注意,从DAO事件之后,区块链安全成为实实在在地笼罩在区块链行业头上的浓重阴影。
实事求是地说,DAO安全事件并不是以太坊底层的安全问题,而是上层智能合约的安全问题。但是这一事件的发生,给ETH社区带来了极大的挑战,最终导致了社区的分裂和以太坊的硬分叉。时至今日,我们再次回顾DAO安全事件,白墨子认为有两件事是值得一提的。
首先,让区块链安全特别是智能合约安全正式步入人们的视野。
智能合约作为区块链发展史上的力量倍增器,从诞生之初安全就一直是躲不开的热门话题,但是在DAO事件发生之前,一直以理论探讨和争论为主,DAO事件发生之后,久悬的靴子终于落地,传说中的噩梦在现实中真实发生。DAO事件及其后续的一系列安全事件以血淋淋的事故现场的形式,使人们真切认识到区块链领域安全事件的严重后果,从此对区块链安全和智能合约安全的研究进入了一个新的阶段。
DAO事件的发生,并没有导致区块链发展的停滞,而是让人们真切地认识到,智能合约不是简单的计算机程序,它应该被视作为严肃的社会契约,重任在身。
因此,智能合约的开发也不能仅仅看作是普通的软件开发,而应当视作是一种严肃的契约的编写,部署之后将要面对形形色色的人,会遇到各种异常,关系千家万户的悲欢,这无疑对智能合约的编写工作提出了极高的要求。
在智能合约的编写阶段,人的重要性前所未有的突出。智能合约的安全关键在于代码,代码的安全关键在于人:写代码的人,测试代码的人,审计代码的人。我们比任何都时候都更加需要高水平的程序开发人员、测试人员和安全审查人员。
DAO事件,开启了智能合约发展的新阶段,使人们在短暂的惊愕之后,更加清醒地面对区块链和智能合约的未来。
其次,在DAO事件处理过程中以太坊的做法值得借鉴和思考。
在区块链安全发展史中,DAO事件只是一个开始,类似的事件将层出不穷,面对此类问题应当如何处理?这是DAO事件留给我们的另一启示。
白墨子认为,以太坊社区在DAO事件的处理过程中,表现出足够的智慧和灵活性。
在事件的真相被充分认识之后,以太坊社区没有“原教旨主义”地坚持合约的完全不可更改(虽然这是智能合约的重要特色),坚决地实施了回滚操作,即使社区分裂也在所不惜。虽然最后导致社区分裂,但是也正是这一分裂,正如同一面镜子,从正反两方面验证了这一做法的正确性。
分叉之后,采取更灵活策略的ETH社区比僵硬坚持“祖宗之法不可变”的ETC社区明显更有生命力,得到更多人的认可,在现实中得到更多应用。
DAO事件发生之后,以太坊社区一度面临非常艰难的局面,但最终使问题得到比较好的解决。DAO事件的发生、处理和结局给后来者很大的启发。新事物的发展过程不可能一帆风顺,在区块链产业的发展过程中,会遇到各种各样的复杂局面,这需要我们在充分认识问题实质之后,做出既有原则性又有灵活性的处理方案。
代码即法律Code is Law
智能合约未来的发展空间很广阔,可能会取代房产中介、律师事务所等职业。随着智能合约越来越深入到生活中,现有的法律系统也有望被颠覆,真正实现“代码即法律Code is Law”。代码安全审计的工作量和重要性也会达到一个前所未有的高度,请白墨子为我们展望一下。
前面我们说过,智能合约是借助IT技术改造社会治理模式的一次积极尝试,其意义已经超出IT领域,不仅仅是一次技术革命,更有可能引发一次社会革命。
人类社会的有序运转很大程度上是由无数人为或者约定俗成的规则来维系的,前者我们经常称之为法律,后者例如风俗习惯等。如果我们能够把这些规则全部以智能合约的方式实现,将人类生产生活全部纳入区块链世界,那么电影《黑客帝国》的场景似乎有望在现实中再现。
但是,理想很丰满,现实很骨感。
问题在于,人类社会无法完全被区块链世界所模拟,编写智能合约的代码表述能力极其有限,许多规则至今无法被量化为代码,很多线下资产还无法被数字化,现实世界的复杂性超出我们的想象,即使最复杂和高级的IT系统也无法完美映射现实世界。
同时,人最终还是要生活在现实世界中,所有在区块链世界中的映射,都是现实社会的一个映像,它不能代替真实存在的现实,对映像的操纵无法等同于对现实的改变。在这种情况下,我们如何创建完全映射现实的智能合约呢?
更为重要的是,代码本身就是人写的,也必定会出现bug,再充分的审计、检查和测试也不敢保证百分之百正确和安全的代码,那这时人们还等待智能合约的最终裁决吗?显然,在涉及到巨大利益冲突时,人们就坐不住了,坚持原则性还是引入灵活性?将成为拷问人性的一个巨大考验,这在DAO事件中被诠释得淋漓尽致。
此外,我们必须面对的一个现实是:智能合约并不智能,更没有智慧。
智能合约的正确运用,在某种程度和一定范围内会改造人类社会的运作机制,提升人类社会的运行效率,但智能合约所能发挥作用的,目前来看还只是一个非常狭小的领域。
并不是人们不想给智能合约更大的空间,而是智能合约自身存在的局限性使其难堪重任。
对于智能合约在现实世界中所能发挥的作用,科幻作家和未来学家们尽可以大开脑洞,但我们作为技术人员,应当有清醒的认识,不宜给予过高的期望。
上帝的归上帝,凯撒的归凯撒。
智能合约被提出的初衷并不是来替代法律的,在特定的领域和范畴之内,智能合约自有其价值和用武之地,超出相关领域和范畴,智能合约的捉襟见肘也是显而易见的。
白墨子认为,在可以预见的将来,智能合约无法替代法律,“代码即法律”只是一种过于理想化的描述罢了。
机器人和人工智能都只是人类社会的附庸,智能合约也不会例外。人类怎会让几行代码主宰自己的命运?作为万物之灵,主宰人类的只能是人类自己。
从智能合约的现状和未来展望来看,《黑客帝国》终究只是电影。
白墨子团队接受了大萌资讯的独家邀请,将为大家带来全面、深度的区块链安全知识系列科普。