摘要区块链是通过去中心化、去信任化的方式维护的分布式账本,其发展可以划分为3个阶段:区块链1.0,2.0和3.0.区块链1.0以比特币为代表,提供了非图灵完备的脚本语言;区块链2.0以以太坊为代表,在比特币的基础上引入了智能合约的概念,提供了图灵完备的可编程语言Solidity,使得区块链的应用范围从单纯的货币领域拓展到其他领域;区块链3.0将会是可编程世界,社会各行各业都以自治的方式运转.智能合约作为区块链2.0最为显著的特点,在构建去中心化应用中发挥了重要的作用.但近年来,智能合约安全事件频发,给项目方和投资方带来了巨大损失,智能合约的安全问题逐渐引来多方的关注.首先介绍了区块链的基本概念,接着阐述了以太坊相关知识,然后对智能合约作了全面的介绍,包括运行环境、构成、部署流程和工作原理.主体对现存已知的智能合约漏洞进行分类总结,并且对每一类漏洞都给出解决方法.
关键词区块链;以太坊;智能合约;安全;漏洞
区块链是随着比特币等数字加密货币的日益普及而逐渐兴起的一种全新的去中心化基础架构与分布式计算范式[1],它运用链式数据结构、分布式共识算法、时间戳、数据加密等多项核心技术构建了一个无需信任、去中心化的分布式账本系统,解决了传统中心化系统成本高、效率低、数据存储过于集中容易造成单点故障等问题.近年来,区块链技术研究呈现爆发的态势,被认为是继大型机、个人电脑、互联网、移动?社交网络之后计算范式的第5次颠覆式创新,是人类信用进化史上继血亲信用、贵金属信用、央行纸币信用之后的第4个里程碑[2].
比特币系统是区块链技术首次成功应用的案例,它的出现标志着第1个点对点数字货币支付系统的诞生[3],但它的功能较为单一,限制了它在其他领域的应用.以太坊的出现弥补了比特币系统的短板,它创造性地引入了智能合约的概念,结合底层可信的运行环境,可以很方便地构建去中心化应用,拓展了区块链的应用范围[4].
智能合约的概念由跨领域专家Szabo[5]于1994年提出,它是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议.由于没有可信的运行环境,一直没有得到广泛的关注和研究,直到以太坊的出现,智能合约重新进入到公众的视野[6].
区块链不可篡改的特性使得智能合约一旦部署便无法更改,即使智能合约本身存在漏洞,加之智能合约本身承载着巨大的经济价值,愈发成为黑客的攻击目标.基于区块链加密数字货币引发的安全问题来源于区块链自身机制安全、生态安全和使用者3个方面.在区块链自身机制安全方面,智能合约的安全性至关重要[7].据统计,当前全球Top100市值的虚拟币中,92%都是基于以太坊开发的.有数据显示,89%的智能合约皆存在安全漏洞,保守估计因智能合约漏洞所造成的损失已超过20亿美元[8].
1区块链基本概念
1.1区块链定义
区块链是比特币系统的底层支撑技术,它的概念是随着中本聪在2008年在论坛上发表的一篇名为“Bitcoin:Apeer-to-peerelectroniccashsystem”而诞生的.从数据的角度来看,它是一种区块加链的链式数据结构,并由所有节点存储的分布式账本[9];从协议的角度来看它可以作为价值互联网的底层协议;从技术的角度来看它是多种成熟技术的融合体,而非新兴的技术[10].
1.2区块结构
图1区块结构不同的区块链区块结构可能会有些许差异,但大致相同.拿比特币来说,每个区块由区块头和区块体2个部分组成,区块头存放了父区块头的哈希值、版本号、时间戳、随机数、目标哈希、Merkle根等信息[11],区块体则包含了区块创建过程中所发生的交易记录,如图1所示:
1.3区块链架构分层
区块链架构分层如图2所示.一般来说,区块链架构主要分为6层,分别为数据层、网络层、共识层、激励层、合约层和应用层[12],数据层存储了区块数据及其链式数据结构,时间戳、哈希函数、Merkle树、非对称加密作为支撑技术来保证数据的不可篡改性和历史可查性;网络层由P2P分布式网络支撑,完成节点之间数据传播和交易验证的任务[13];共识层由一些共识算法构成,目的在于使分布式节点在数据一致性上达成共识;激励层作为共识层的衍生层,通过发行机制和分配机制等经济激励措施来辅助节点之间达成共识;合约层是脚本代码、算法机制和智能合约的聚集地,构成了区块链可编程的基础[14];应用层则包含了区块链技术的各种应用场景.
1.3.1数据层
每隔一段时间全网都会选取一个节点来对交易进行打包,并通过在区块头中包含父区块头的哈希值与父区块链接起来,这意味着如果想要修改某个区块上的内容,那么必须得重新计算之后的所有区块,并且要赶上主链产生区块的速度,理论上来说这是很难完成的,除非拥有全网51%的算力,否则无法修改区块数据.链式的数据结构不仅保证了数据的完整性,而且也可以快速复现历史交易数据.
1.3.2网络层
采用分布式P2P网络进行组网,网络中的每个节点的地位都是平等的,不存在任何特殊节点,节点之间可以直接进行价值转移并且可以自由进出,每个节点都具有路由发现、广播交易、广播区块、发现新节点等功能[15].节点会时刻监听网络上的动态,一旦收到邻居节点发送过来的区块信息或者交易信息,会对其有效性进行验证,验证通过的区块会被链接到本地区块链,而交易则被加入到各节点所维护的交易池.
1.3.3共识层
系统分散程度越高达成共识的时间越长,效率越低.比特币和以太坊都采用极度依赖算力的工作量证明(PoW)共识算法来高效地对数据一致性达成共识[16].节点通过解决一道复杂但验证起来非常简单的数学难题来竞争区块记账权,最快获得题解的节点将获得打包区块的权利和相应的奖励,解题的过程是从0开始不断地递增随机数,直到找到一个合适的随机数,使得与区块头部的双哈希值小于目标哈希值.
1.3.4激励层
在共识阶段,最快找到题解的节点可以获取相应的奖励,通过这样的经济激励措施来吸引更多的节点加入到挖矿中来,从而可以有效地提高区块链的安全性和稳定性.随着挖矿节点和难度的增加,一些节点会选择加入矿池,通过贡献自己的算力从而获得相应比例的奖励.
1.3.5合约层
如果说数据层、网络层、共识层构成区块链的底层基础设施,那么合约层就是建构在其上的逻辑代码和算法,它是实现区块链可编程性和操作数据的基础.
1.3.6应用层
应用层主要包含基于区块链的各种应用场景,囊括了可编程货币、可编程金融、可编程社会[17]的方方面面.
1.4区块链核心技术
区块链通过对多种成熟的技术进行整合,形成了一种前所未有的数据存储方式,主要包括非对称加密算法、SHA256算法、P2P网络、时间戳、Merkle树等.
1.4.1非对称加密算法
加密和解密的过程需要2种类型的密钥,分别为公钥和私钥,缺一不可.私钥是通过调用底层操作系统随机数生成器生成的[18],长度为256b,公钥则是经过椭圆曲线加密算法和一系列的哈希函数生成的.在加密信息的过程中既可以选择公钥也可以选择私钥,如果用公钥对信息加密,那么相应地就要用私钥对其进行解密,反之也一样,也就是说加密和解密不是使用相同的密钥.与对称加密算法相比提高了安全性,但同时也降低了加解密的效率.
1.4.2SHA256算法
在区块链中到处都可以看到SHA256算法的身影:区块链中并没有对原始的交易数据进行存储,而是对其经过SHA256算法运算后得到固定长度的交易数据指纹再进行存储[19];在共识的过程中,SHA256被用作寻找题解的工具;区块头指纹、公钥和Merkle树的形成也离不开SHA256算法的参与.SHA256算法具有输出长度固定、单向性、定时性、抗碰撞性等特点.
1.4.3P2P网络协议
P2P网络是一个无中心化服务器管理的分布式网络,网络中的每个节点既充当客户端获取其他节点提供的服务也作为服务器对外提供服务.P2P网络协议有很多,比特币网络采用了无结构的gossip协议,而以太坊则采用了结构化的Kademlia协议.
1.4.4时间戳
每一个区块在被加入到区块链之前都要在区块头处加盖时间戳,标识该区块产生的时间,作为区块存在性证明的一部分,时间戳使得区块链具有时序性、不可篡改性、不可伪造性.
1.4.5Merkle树
Merkle树是二叉树结构,叶子节点存储了交易数据指纹,非叶子节点存储的是相邻的2个孩子节点拼接后的哈希值,最终我们可以得到一个根哈希.采用这种数据结构来存储交易数据无需下载整棵树,就可以很方便快捷地对某一块数据完整性进行验证,这为轻节点(SPV)提供了技术保障.
1.5区块链工作流程
不管是对于比特币系统还是以太坊系统,主要的功能或者说工作流程都是围绕着交易展开的,只不过以太坊系统不仅包括普通的转账交易,还包括特殊的合约呼叫交易.一般来说,区块链的工作流程分为以下6个步骤:交易生成、交易广播、验证交易、竞争记账权、广播区块、写入区块链.如图3所示:
①交易生成.交易发起者用自己的私钥交易信息进行签名.
②交易广播.将含有签名的交易信息向全网进行广播,确保大部分节点收到该交易信息.
③验证交易.节点对交易的有效性进行验证,包括签名是否由交易发起者本人签署、账户余额是否足够来发起这笔交易等,验证通过的交易会被节点放入交易池,等待打包入块.
④竞争记账权.节点通过解一道哈希数学难题来竞争记账权,首先获得题解的节点负责将一段时间内所形成的交易打包进区块.
⑤广播区块.节点将打包好的区块向全网进行广播,通知其他节点已经找到哈希数学难题的题解.
⑥写入区块链.当节点挖出合法的区块时,直接将区块链接到本地区块链副本;当节点收到其他节点传递过来的区块时,首先会对区块的有效性进行检验,包括验证题解是否正确、每笔交易是否有效等,然后再将区块链接到本地区块链副本.
1.6区块链特点
区块链具有去中心化、去信任化、可追溯性、集体维护性、安全性、开放性、匿名性、可编程性等特点.
1)去中心化.整个区块链网络不存在任何的中心化机构,互不信任的双方无需协调便可以安全地进行交易,省去了很多传统中心化结构的中介成本.
2)去信任化.区块链通过利用数学为信任进行背书,从传统的对人的信任转变为对数学严谨逻辑的信任,大大减少了失信的行为.
3)可追溯性.区块链包含了从创世区块到现在所有的交易记录,并且每一个区块的区块头都被打上了时间戳,这意味着任何时间的任何一笔交易都能被查询到.
4)集体维护性.区块链网络中的每个节点都维护了一份完整的区块链数据副本,使得区块链系统具有很强的容错能力,不会因为单点故障而造成大范围的影响.
5)安全性.区块链的链式数据结构保证了数据的不可篡改;非对称加密技术使得数据可以在不安全的网络中进行安全的传输;基于PoW的共识算法使得篡改数据的成本非常之高,可以有效抵御外部攻击.
6)开放性.区块链数据是公开透明的,任何人都可以查询到相关的数据.
7)匿名性.区块链上的数据虽然是公开透明的,但是没有和现实中的人绑定起来,所有的交易都是在匿名下进行的.
8)可编程性.通过脚本或智能合约可以在链上构建去中心化应用.
2以太坊初探
2.1什么是以太坊
和比特币系统一样,以太坊将区块链作为其运行的底层支撑技术,从某种意义来说,它本质上也是一个去中心化的分布式账本,但它不单单是一个去中心化的货币发行和交易系统[20],以太坊通过提供一门图灵完备的编程语言,使得任何人可以很方便地在链上构建去中心化的应用,从而大大拓展了区块链的应用范围.
2.2以太坊基本概念
2.2.1账户
以太坊中包含2种类型的账户,分别为普通账户和合约账户,它们都由20B的地址所唯一标识,普通账户由私钥控制,合约账户由代码控制,每个账户都包含以下4个字段:
1)nonce.限制每个交易仅被处理1次.
2)balance.账户余额.
3)codeHash.对于普通账户来说该字段为空,而对于合约账户来说该字段保存的是合约代码的哈希值.
4)storageRoot.以太坊采用梅克尔帕特里夏树来组织和管理账户的状态信息,并按照一定的规则生成树的根哈希值存储在此.
2.2.2ether
ether是以太坊系统中流通的电子货币,矿工挖矿所获得的奖励以及执行交易需要耗费的gas都是用ether来计量的,最小的单位为wei,1ether=1018wei.
2.2.3叔区块
以太坊的出块速度相对于比特币系统来说更快,平均为12s出1个块,出块速率的提高意味着区块链分叉会时常发生,导致大量的孤儿区块出现,这些孤儿区块并不会因为没有价值而被丢弃,矿工可以通过在区块中引用孤儿区块获取额外的奖励.
2.2.4gas
交易执行的每一步都需要耗费一定量的gas,用于支付矿工在执行这些交易时所消耗的系统资源,gas是交易复杂度的衡量标准,交易越复杂需要耗费的gas就越多.gas机制的引入可以有效地防止因无限循环导致以太坊网络瘫痪的情形.
2.2.5交易
以太坊系统是交易驱动的状态机,交易是状态发生转移的必要条件,交易经全网节点确认并执行后打包进区块,相应的以太坊的全局状态也由上一个状态转变为下一个新的状态.在以太坊中主要有3种类型的交易,分别为普通转账交易、合约创建交易、函数调用交易,它们都由以下字段所构成:
1)nonce.交易计数器,用于预防重放攻击.
2)gasPrice.交易发送者愿意为每单位gas支付多少wei.3)gasLimit.交易所能耗费的gas最大上限.
4)to.交易接收方的地址,如果为空,则为合约创建交易.
5)value.交易附带的ether,可以为0.
6)data.经过RLP编码的数据,依不同的交易类型而不同,对于普通转账交易该字段为空,对于合约创建交易,此处存储的是需要部署的合约代码,对于函数调用交易,此处存储的是函数签名和需要传入的参数.
7)signature.交易发送者的签名信息,用于验证身份真伪.
相关期刊推荐:《信息安全与技术》杂志是我国信息安全和信息技术领域集学术性、技术性、专业性和权威性为一体的国家级月刊,面向中国信息安全与技术领域,展现学术水平和专业技术成果,创建中国信息安全与技术领域第一交流平台,以期提高我国信息安全和信息技术的突破。将为工程技术人员提供中、高级职称评定,为项目申请作证明依据,体现用户单位管理及技术人员的应用成果,发表科研院所研究人员的研究成果、IT企业的技术突破、工程人员的实施经验总结,以及有关单位管理经验的实施性总结。
* 稍后学术顾问联系您