本篇文章我们主要对公链审计中几个值得关注的方面进行简单介绍,对于安全审计人员以及公链开发人员而言这都是一个值得借鉴与思考的项目。
在介绍公链体系建设之前我们先来看一下区块链的体系结构:
区块链 1.0时代:
体系架构:如下图所示
代表产物:比特币、瑞波币、狗狗币、莱特币、万事达币等

区块链 2.0时代:
体系结构:如下图所示
代表产物:以太坊、LISK、Hyperledger等
主要变更:

区块链 3.0时代:
体系结构:如下图所示
代表产物:EOS、VAR、AE、Asch、ELA、DFINITY
主要变更:区块链在金融行业之外的各行各业的应用场景,能够满足更加复杂的商业逻辑

下面我们根据区块链的体系架构来分层对区块链公链的安全建设中值得思考的问题进行简单介绍,其中有约75%的问题曾引发公链安全问题,也是公链安全审计中值得关注的一些点,这里以提问的形式给出,以引起大家思考,如果想要进一步进行讨论可以直接在Issue中进行,欢迎大家参与:
数据层是最底层的技术,主要的功能为数据存储、账户和交易的实现与安全。数据存储主要基于Merkle树,通过区块的方式和链式结构实现,大多以KV数据库的方式实现持久化,例如:比特币和以太坊采用的LevelDB。
关于数据层值得我们思考的点有如下几个:
网络层的主要目的是实现区块链网络节点之间的信息交互,区块链的本质是一个点对点(P2P)网络,每一个节点既能够接收信息,也能够生产信息,节点之间通过维护一个共同的区块链来保持通信。
在区块链的网络中,每一个节点都可以创造出新的区块,新区块被创造出以后,会通过广播的形式通知其他的节点,而其他节点反过来会对这个节点进行验证,当区块链网络中超过51%的用户对其验证通过以后,这个新的区块就会被添加到主链上。
关于网络层值得我们思考的点有如下几个:
共识层能够让高度分散的节点在去中心化的系统中针对区块数据的有效性达成共识,每一个运行着的区块链都需要一个共识算法来保证出块的有效性和有序性,常见的共识算法有POW、POS、DPOS、POA、POC等。
关于共识层值得我们思考的点有如下几个:
公链激励层的目的是提供一定的激励措施来鼓励节点参与区块链的安全验证工作,并确保区块链生态的平衡和良性发展,在去中心化的共有链中,需要设定相应的奖励机制来激励遵守规则的参与记账节点,同时需要建立惩罚机制来惩罚不遵守规则的参与记账节点。区块链激励层将经济因素引入区块链技术体系,带来组织协作效率和生态内价值交换效率的提升,公链的激励机制是保证区块链良性循环发展的重要机制。
关于激励层值得我们思考的点有如下几个:
合约层封装区块链系统的各类脚本代码、算法以及由此生成的更为复杂的智能合约。如果说数据、网络和共识三个层次作为区块链底层“虚拟机”分别承担数据表示、数据传播和数据验证功能的话,合约层则是建立在区块链虚拟机之上的商业逻辑和算法,是实现区块链系统灵活编程和操作数据的基础。包括比特币在内的数字加密货币大多采用非图灵完备的简单脚本代码来编程控制交易过程,这也是智能合约的雏形,随着技术的发展,已经出现以太坊等图灵完备的可实现更为复杂和灵活的智能合约的脚本语言, 使得区块链能够支持宏观金融和社会系统的诸多应用。
关于合约层值得我们思考的点有如下几个:
应用层封装了区块链的各种应用场景和案例,类似于计算机中的各种软件程序,是普通用户可以真正直接使用的产品,也可以理解为B/S架构的产品中的浏览器端(Browser)。
关于应用层值得我们思考的点有如下几个(仅公链而已,不涉及钱包APP/交易所/DEFI等):
公链高并发请求处理设计?
是否设置节点最大连接数?
公链WebUI交互界面是否允许远程访问?
公链WebUI交互界面是否存在Web类漏洞?
公链WebUI交互界面是否允许本地存储密码信息?
公链中确实没有"代码层"这一说,这里笔者将其提出来主要是用于归类公链开发过程中可能需要考虑的问题:
除了以上区块链架构层面值得思考的问题之外,还需要考虑一下安全问题:
是否使用存在漏洞的第三方类库,例如:Jackson-databind、FastJSON等
使用使用存在漏洞的中间件,例如:低版本的Tendermint
直接在Issue中参与相关问题的讨论即可