解析区块链上智能合约的生命周期以及安全性(区块链的智能合约是什么)
合约完成
一旦交易数据被写入区块链的分布式账本,共识机制会验证第一方转移的资产是否已经收到,并为接收方解冻。这标志着智能合约的完成,然后关闭并记录。
智能合约安全性分析
智能合约的安全性通常可以从代码编写、合约虚拟机和区块链特性这三个维度展开,以下分别对这三个方面的安全性漏洞进行了分析。
一、合约隐私泄露
即使在联盟链中,由于区块链交易信息公开,合约代码完全开源,合约从创建、部署到执行的整个过程都会被广播到参与联盟链的全部节点,导致合约参与者的真实身份有很大可能会被有意的攻击方识破。一些机密合约的隐私内容,有时不便公开,如果依然采用原先的部署、执行方式,将导致合约参与者的重要信息受到威胁。
二、合约主体漏洞
智能合約的代码编写不同于以往的项目开发,智能合约在部署后一旦出现问题,所付出的代价是巨大的,对于多种区块链来说都难以简单的解决,因此我们在编写合约代码时要提升安全思维,做好安全准备。
1、函数可重入性
智能合约执行过程中当一个合约调用另一个合约时,当前的执行过程会暂停等待另一个合约的返回值。这会导致一个很严重的问题,如果程序可以在执行过程中被中断,则可以在其先前的调用完成执行之前安全地再次调用,这被称为可重入计算机程序。在调用其他外部函数的操作完成前,这个被调用的函数很有可能会被多次执行,这种多次调用可能会造成难以想象的问题。
2、 函数可见性
以Solidity为例,在使用Solidity编写合约代码时,共提供了4种函数可见性修饰符,在开发者没有指明的情况下,默认为public。当开发者没有明确指明函数可见性时,可能导致部分关键函数的可见性为公开的,这使得任何外部用户都可以调用这一函数,可能会造成巨大损失。
3、误操作异常
在以太坊中,允许一个合约通过send指令或者直接调用的方式去调用另一个合约内的函数。然而在调用过程中可能会出现错误,例如gas不足、超出调用栈限制,调用就会终止,合约就会回退到之前的状态。调用者很可能并未获知调用过程中出现的异常,这主要取决于调用的方式。使用这条指令调用合约后,必须检查返回值驗证合约是否正确执行。根据数据统计,现有合约中约28%的合约在调用后不会检查异常返回值,这在一定程度上会造成许多问题。
三、虚拟机安全漏洞
合约虚拟机运行在区块链的各个节点之上,虚拟机为合约代码提供了一个沙箱式的执行环境,如果合约虚拟机存在漏洞或不完善的地方,则很由可能会受到攻击者的攻击,虚拟机系统相比较于传统的计算机运行环境具有更多的攻击安全隐患,以下列出常见的几种:
(1)逃逸漏洞:虚拟机在运行中,一般进程只能在沙盒的限制中执行相应的代码,逃逸漏洞指的是进程越过虚拟机范围,进入到宿主机的操作系统中,这种漏洞会使攻击者退出沙盒环境,执行其他本不能执行的代码。
(2)逻辑漏洞:虚拟机在发现数据或代码不符合规范时,可能会对数据做一些“容错处理”,这就导致可能会出现一些逻辑问题,最典型的是“以太坊短地址攻击”。
(3)堆栈溢出漏洞:虚拟机的调用栈有确定的最大深度,在一些攻击者的恶意调用下,有可能导致栈的深度超过虚拟机允许的最大深度,或不断占用系统内存导致内存溢出。
(4)资源滥用漏洞:指的是攻击者在虚拟机中执行恶意代码,估计消耗系统的网络资源、存储资源、计算资源、内存资源。所以在虚拟机系统中必须要有一些限制机制来防止系统的资源被滥用。
四、区块链特性导致的漏洞
1、交易顺序依赖
在区块链中一个区块包含多条交易,而一笔交易从被广播出去到被确认并包含在一个区块内需要一定的时间。我们假设有一个区块链目前处于状态σ,新区块中包括两条调用相同合约的交易(deg:Ti,Tj),在这种情况下,用户无法确定合约在执行调用时是什么状态。当合约处于σ[Ti]时执行Tj的调用和处于σ[Tj]时执行Ti的调用可能会造成截然不同的结果,这取决于Ti和Tj之间的顺序,而只有挖掘这一区块的节点才能决定这些交易的顺序,从而决定合约被调用的顺序。如果有攻击者在监听到网络中对应合约的交易后,发出他自己的交易来改变当前的合约状态,则有一定几率使这两笔交易包含在同一个区块下面,并且有可能排在另一个交易之前,完成攻击。合约的最终状态实际上取决节点在确认时的交易顺序, 我们将此类合约称为交易依赖合约或TOD合约。
2、 时间戳依赖
另一个很重要的安全问题是,合约有时会用区块时间戳作为执行一系列关键操作的触发条件。我们把这样的合约称为时间戳依赖合约,在许多合约游戏中都会使用随机数来决定谁赢得头奖,这些合约使用了之前的区块哈希作为随机种子来挑选冠军,区块的选择则取决于当前区块的时间戳。通常来说,当节点确认一个区块时,它会为这个区块设置一个时间戳,这个时间一般是节点的本地系统时间。但是,节点可以在900s的范围之内随意改变这个时间戳,与此同时其他节点仍然会接受并确认它。节点处理一个新的区块时,如果新的区块的时间戳大于上一个区块,并且时间戳之差小于900秒,那么这个新区块的时间戳就是合法的,因此有一些攻击者就可以通过改变时间戳来控制合约的输出结果 。
免责声明:本文内容由互联网用户贡献,不作为任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!如有侵权请联系我们删除,本文链接:http://www.panmou.com/qkl/56941.html。