区块链通识——数据层、网络层(包含网络攻击)
一、区块链分层架构
传统互联网架构

区块链网络架构
区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。
区块链网络架构模型:由P2P网络、公钥体制、共识机制和智能合约等技术所构建的区块链网络结构
数据层(Data Layer):负责区块链数据的存储。“数据结构”,即“区块+链”的结构。从还没有记录交易信息的创世区块起,直到现在仍一直在新添加的区块,构成的链式结构,里面包含了哈希值、随机数、认证交易的时间戳、交易信息数据、公钥和私钥等,是整个区块链技术中最底层的数据结构。
网络层(Network Layer):负责各个节点之间的网络连接和传输。主要是(点对点)P2P网络机制、数据传播机制和数据验证机制。分布式算法以及加密签名等都在网络层中实现,区块链上的各个节点通过这种方式来保持联系,共同维护整个区块链账本,比较熟知的有闪电网络、雷电网络等第二层支付协议。目前很多区块链数据传输都采用RPC或者GRPC。
共识层(Consensus Layer):负责实现各个账本的数据一致性。主要包括共识算法机制。目前为止有 PoW、PoS、DPoS、PoW 和 PoS 结合、燃烧证明、重要性证明等十几种共识机制。共识层决定了区块的记账权(将数据连接到区块链的权利)、信息的一致性(确保每个节点的数据都一样)。
激励层(Actuator Layer)包括激励机制和分配制度。在区块链中一般指挖矿奖励,通过奖励一部分数字资产从而激励矿工去验证交易信息,从而维持挖矿活动以及区块链账本更新的持续进行;另外,还会制定一些相关制度,奖惩分明,激励记账节点,惩罚恶意节点。
合约层(Contract Layer):负责实现智能合约、脚本的功能。使区块链可编程。例如,智能合约是区块链的一些脚本,区块链上的各种交易会触发对应的脚本。触发后,该脚本就可以从区块链读取数据或向区块链写入数据甚至去触发其他脚本协同工作。通过这种方式,就可以使用程序算法来替换人员去仲裁和执行合同,为用户节省巨大的信任成本。【把代码写到合约里,就可以自定义约束条件,不需要第三方信任背书,到时间立即实时操作。】
针对不同的业务需求,在合约层灵活定义逻辑、规则 、关系,通过合约层与区块链网络交互,是应用层访问区块链数据的接囗,也是区块链中核心代码逻辑的定义层和处理层。应用层通过调用存储与区块链状态库中的智能合约账户,提供相关输入数据,智能合约根据输入数据及预置于合约代码中的响应条件,对区块链状态进行相关更新,并将更新后的状态叠加存入状态库。通过智能合约,应用层可以将产生的重要价值数据以智能合约提供的接囗存入区块链。
应用层(Application Layer)该层封装了区块链的各种应用和场景。
应用层:可编程货币,可编程金融,可编程社会
合约层:脚本代码、算法机制、智能合约
激励层:发行机制、分配机制
共识层:PoW、PoS、DPoS、PBFT、Raft
网络层:P2P网络、传播数据机制、验证数据机制
数据层:数据区块、链式结构、哈希算法、时间戳、默克尔树、非对称加密
区块链生态:技术生态、用户生态、应用生态、存储生态





二、数据层
每个分布式节点都可以通过特定的哈希算法和Merkle 树数据结构,将一段时间内接收到的交易数据和代码封装到一个带有时间戳的数据区块中,并链接到当前最长的主区块链上,形成最新的区块,该过程涉及区块,链式结构,哈希算法,Merkle树和时间等技术。
2.1 哈希函数
Hash,“散列”、“哈希”,把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
3个重要性质:
collision resistance抗碰撞;x≠y,可有H(x)=H(y)
若有一条信息x,我们希望别人知道我有x但不想让别人知道x具体是什么,就可以通过告诉其Hash(x)。对方可以通过Hash(x)知道你确实知道x这个信息,但他无法(很难)通过Hash(x)反推出x。
hiding单向不可逆;H(x)无法x
collision resistance + hiding digital commitment:
先公布H(x),待揭晓后公布x,因为H是可知的,通过求H(x)即可知道x是否被篡改。
puzzle friendly;哈希值的计算是不可预测的,
如果想要H(x)落在某个范围之内,只能一个个去试。
该性质保证了比特币系统中,只能通过“挖矿”获得比特币。保证了工作量证明(POW)机制可以运行下去【“挖矿难,但验证易”】。
2.2 账户模型(以以太坊为代表)
账户保存了余额的状态,与银行账户很像
优点:
①合约以代码形式保存在Account中,并且Account拥有自身状态
②该模型具有更好的可编程性,易被开发人员理解,场景更广泛
③批量交易的成本较低。设想矿池向矿工支付手续费,UTXO中因为每个Input和Out都需要单独Witness script 或者Locking script,交易本身会非常大,签名验证和交易存储都需要消耗链上宝贵的资源。而Account模型可以通过合约的方式极大的降低成本。
缺点:
①Account模型交易之间没有依赖性,需要解决重放问题
②对于实现闪电网络/雷电网络,Plasma等,用户举证需要更复杂的Proof证明机制,子链向主链进行状态迁移需要更复杂的协议。
2.3 UTXO账户模型(以比特币为代表)
UTXO —— Unspent Transation Output 未支出的交易输出。
不可再分的最小交易单元。
上一笔交易将比特币汇至某一地址,这笔比特币可长期存储,直到该地址的主人要将款项汇至下一个收款人。在某笔款项尚未被提出汇至下一个地址之前,这笔款项被称为UTXO。
以比特币为例,每笔交易都有一个或多个交易的输入可以追溯到铸币(coinbase)奖励。交易的每一个输出即为一个新的UTXO,一个用户所拥有的比特币余额即为该用户所有的UTXO之和,这些UTXO并不集中在同一个“账户”之中,而是记录在多个零散的交易区块中。
优点:
①原子性,或成功,或失败,无中间状态;
②可并发
③消耗存储空间较小
缺点:
①查询余额需要遍历所有交易数据
②UTXO无状态,若账户中需要存放复杂状态(如智能合约),则无法支持
③当Input较多时,见证脚本也会增加
④签名本身是比较消耗CPU和存储空间
2.4 地址
比特币里的地址是“一个0x00字节”+ “收款人公钥的哈希值”+ “4字节的校验”,整个地址以Base58编码(详细内容见另一个文档)
①添加版本的目的是为了明确需要编码的数据类型,数据类型如下:

②添加校验码主要是为了检测转录过程中出现的错误;
③Base58check是什么?
二进制:0、1
十进制:0~9
十六进制:0~9,A~F
Base64(相当于64进制):0~9,a~z,A~F,以及连个符号(例如,-、+)
Base58:是Base64编码格式的子集,同样使用大小写字母和10个数字,但舍弃了一些容易错读和在特定字体中容易混淆的字符。具体地,Base58不0(数字0)、O(大写字母o)、l(小写字母L)、I(大写字母i),以及“+”和“/”两个字符。
Base58Check:是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节,添加到需要编码的数据之后。最终生成的这个地址,就是你的账号了。
2.5 交易
每个比特币交易都有一个交易Hash(txhash),此Hash的值是针对整个交易内容计算得到唯一指向此条交易。因此,在比特币追那个交易Hash通常作为交易ID。
交易的正文包括2部分:输入地址信息、输出地址信息
输入地址信息:记录此次交易发送方的账户信息
并不是记录发送者的账号,而是记录输入资金的来源(pre-txhash),即通过来源交易Hash指定全局账本中的一条交易,并通过索引信息(index)来指定交易中对应的输出地址,并通过签名信息(sign)证明用户对这笔资金的所有权。
输出地址信息:记录此次交易接受方的账户信息
包括输出地址account和输出金额(amount)
输出地址是由用户自行生成的公钥信息经过字符变换得到的一串字符串,输出地址经过反向变换后可以得到公钥的Hash,用于验证签名。
交易具体例子
交易实例部分介绍了2条交易
其中编号为“10002”的交易中第“0”个输入地址中的来源交易Hash是同时索引为“1”
因此,可以确定此输入地址的真实账户是编号“10001”交易中第“1”个输出地址“1 A 1 R m b b V o L 4 p n M Z f”

2.6 时间戳
时间戳:上一个区块的hash
人类历史上第一次实现非物理时钟
区块链技术要求获得记账权的节点必须在当前数据区块头中加盖时间戳,表明区块数据的写入时间。因此,主链上各区块是按照时间顺序(区块高度)依次排列的
时间戳技术本身并不复杂,但其在区块链技术中的应用是具有重要意义的创新,从而为区块链应用公证,知识产权注册等时间敏感的领域奠定了基础。
①区块数据的存在性证明(Proof of existence)
②有助于形成不可篡改和不可伪造的区块链数据库
2.7 数据区块
每个数据区块一般包含:区块头(Header)和区块体(Body)两部分
区块头封装了: 当前版本号(Version);
前一区块的目标地址(Prev-block)
当前区块的目标哈希值(Bits)
当前区块POW共识过程的解随机数(Nonce)
Merkle根(Merkle-root)
时间戳(TimeStamp)等信息
比特币网络可以可以动态调整POW共识过程的难度值,首先找到正确的解随机数Nonce并经过全体矿工验证的矿工将会获得当前区块的记账权
区块体则包括当前区块的交易数量以及经过验证的,区块创建过程中生成的所有交易记录,这些记录通过Merkle树的哈希过程生成唯一的Merkle根并记入区块头
2.8 Merkle Tree(默克尔树)
默克尔树是一种二叉树,由一组叶节点,一组中间节点和一个根节点构成。
优点:
①节约存储空间(已经花费过的交易,如果时间很久就可以丢弃)
②可以只保留根节点的hash,即Merkle根,放到区块头里,便于支付验证。
③比特币中没有交易的区块头只有80bytes
2.9 链式结构
取得记账权的矿工将当前区块链接到前一区块,形成最新的区块主链,各个区块依次环环相接,形成从创世区块到当前区块的一条最长主链,它记录了区块链数据的完整历史。
优点:
①能够提供区块链数据的溯源和定位功能
②任意数据都可以通过此链式结构顺藤摸瓜,追本溯源
分叉:如果短时间内有两个矿工同时“挖出”两个新的区块加以链接的话,区块主链可能会出现暂时的“分叉”现象
分叉解决方法:
约定矿工总是选择延长累计工作量证明最大的区块链。
因此,当主链分叉后,后续区块的矿工将通过计算和比较,将其区块链接到当前累计工作量证明最大化的备选链上,形成更长的新主链,从而解决分叉问题。
三、网络层
【方框内为之前肖臻老师的网课笔记】
Application layer(应用层):运行Bitcoin Block Chain
Network layer(底层):运行P2P Overlay Network(P2P覆盖网络)
比特币系统中所有节点完全平等,不像一些其他网络存在超级节点(super node)。要加入网络,至少需要知道一个种子节点,通过种子节点告知自己它所知道的节点。节点之间的通信采用了TCP协议,便于穿透防火墙。当节点离开时,只需要自行退出即可,其他节点在一定时间后仍然没有收到该节点消息,便会将其删掉。
比特币网络设计原则:simple,robust but not efficient,flooding。
每个节点维护一个邻居节点集合,消息传播在网络中采用洪泛法,某个节点在收到一条消息会将其发送给所有邻居节点并标记,下次再收到便不会再发送该消息。邻居节点选取随机,未考虑网络底层拓扑结构,也与现实世界物理地址无关。该网络具有极强鲁棒性,但牺牲了网络效率。
比特币系统中,每个节点要维护一个等待上链的交易集合。第一次听到交易,若是合法交易,则将其加入该交易集合并转发给邻居节点,以后再收到该交易就不再转发(避免网络上交易无线传输)。假如网络中存在两个冲突交易,具体接收哪个取决于节点先接收到哪个交易,之后收到另一个交易会将其放弃。
新发布区块在网络中传播方式与新发布交易传播方式类似,每个节点除检查该区块内容是否合法,还要检查是否位于最长合法链上。区块越大,则网络上传输越慢。
比特币网络传播属于 Best effort(尽力而为) ,不能保证一定传输成功。以一个交易发布到网络上,未必所有节点都能收到,也未必所有节点收到交易顺序都一致。
3.1 概述
网络层封装了区块链系统的组网方式,消息传播协议和数据验证机制等要素,
结合实际应用需求,通过设计特定的传播协议和数据验证机制,
可使得区块链系统中每个节点都能参与区块数据的校验和记账过程,
仅当区块数据通过全网大部分节点验证后,才能记入区块链。
3.2 组网方式P2P网络
组网方式:采用对等式网络(Peer-to-peer networl, P2P网络)来组织散布全球的参与数据验证和记账的节点。
P2P网络:
每个节点均地位对等且以扁平式拓扑结构相互连通和交互
不存在任何中心化的特殊节点和层级结构
每个节点均会承担网络路由,验证区块数据,传播区块数据,发现新节点等功能
按照节点存储数据量不同,可以分为全节点和轻量节点
特点:永不停止
初始化时通过硬编码的种子节点建立连接。
分布式哈希表
核心思想:网络中的每个节点都维护一部分索引信息,然后通过特定的规则将这些节点连接起来,使得在查询或注册时,按规则触达相关节点或资源,这种方案既能避免中心化索引,也避免了网络风暴。不同的“规则”对应着分布式哈希表不同的协议。
好处:网络中有资源变更时不需要全网广播,只需更新相关节点。
主流实现协议Kademlia
每一个节点都维护一张哈希表,表中将网络的节点基于距离进行分组,每个分组下存放若干个节点代表。
Kademlia协议将网络中的节点和资源均映射成160位的二进制码,编码等于或接近某个资源的节点,需要知道该资源的下载地址。
优点:替换与递进的设计解决了点对点网络中的组网问题。
3.3 数据传播协议
任一区块数据生成后,将由生成该数据的节点广播到全网其他所有的节点来加以验证。
每个节点向其直接连接的节点发送区块信息,循环直至全网的节点。
在以太坊的具体实现中有两种发送方式:①向相邻节点发送完整区块的消息【只向根号N个相邻节点】;②向相邻节点发送只包含区块哈希的消息。
根据中本聪的设计比特币系统的交易数据传播协议包括如下步骤:
①比特币交易节点将新生成的交易数据向全网所有节点进行广播
②每个节点都将收集到的交易数据存储到一个区块中
③每个节点基于自身算力在区块中找到一个具有足够难度的工作量证明
④当节点找到区块的工作量证明后,就向全网所有节点广播此区块
⑤仅当包含在区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性。
⑥其他节点接受该数据区块,并在该区块的末尾制造新的区块以延长该链条,而将被接受区块的随机哈希值视为先于新区块的随机哈希值。
3.4 数据验证机制
数据验证机制:P2P网络中的每个节点都时刻监听比特币网络中广播的数据与新区块。
节点接受到邻近节点发来的数据后,将首先验证该数据的有效性。如果数据有效,则按照接受顺序为新数据建立存储池以暂存尚未记入区块的有效数据,同时继续向邻近节点转发;
如果数据无效,则立即废弃该数据,从而保证无效数据不会在区块链网络继续传播。
3.5 区块链网络攻击以及防御方案
【补充知识】
区块高度:时钟高度,其实是用来描述一个区块的序号的,从创世区块 0 开始依次递增。叫区块序号更容易理解。
确认数:
节点通过什么方式竞争,怎么竞争?竞争的方式就称之为共识,描述分布式去中心化的系统中大家通过共识算法达成统一某个行为或是认知的这种行为,即大家达成了共识,本次由 A 节点进行记账,下次由 B 节点进行记账。
若某节点放弃自己的链,那么这条链里面的数据是不是都无效了?里面的交易呢?
答案是的,里面的交易都无效了,因为一个区块是对一堆交易的打包,而对于同一笔交易来说,转账发起方会把这笔交易广播给所有人,也就是对于一笔交易来说,每个矿工都可能会收到这条交易并且放到自己的交易池。虽然在这条链上无效了,但是这些交易也会被其他节点看到,说不定已经被其他节点挖到区块并且记录到下面这条区块链里了。所以针对某笔交易来说,并没有丢失。
3.5.1 51%攻击
51% 攻击:如果攻击者拥有全网 51% 的算力,那么他就能够利用算力优势搞一些动作。这里的 51% 是一个概称,实际上运气好的话可能不需要这么多的算力就能发动 51%攻击。
攻击者会利用 51%攻击做什么事?
(1)双花攻击/做空比特币
攻击者拥有全网超过 51% 算力之后,首先是成功挖矿的概率增大了,由于成功挖矿的概率增大,那么攻击者就能够对挖到的区块进行修改。假设攻击者是理性的,为了利益考虑,那么他会修改区块中关于自己的交易记录,以便双重支付,区块中其他的交易,由于没有发起者的签名,攻击者是不能够去修改的,也就是说攻击者没法做到把别人的币转给自己。
具体做法就是把自己的币转到交易所,卖出后出金提现,然后利用 51% 攻击去修改这笔交易,转到自己的另外一个钱包地址中,由于有算力优势,并且遵循最长链原则,那么之前转到交易所的交易记录被认为是无效的,区块链中记录的是后面这笔交易。也就是同一笔钱花了两次,最终损失的是交易所。这里不一定是交易所,也可能是其他人或者商家等。
对于双花攻击,节点是有可能在 6 个确认周期内发现一笔交易被双重支付了,从而对交易发起者进行一些惩罚。所以为了预防双花,一般可以增加确认数,对比特币来说,6个确认周期是比较合适的。
区块链是由一个个区块形象的连接在一起,形成链状。当其中某笔交易发生的时候,会被打包到区块中,然后形成区块链,每追加一个区块,确认数加 1。计算方法很简单,用当前最长链的最新区块高度减去某笔交易所在的区块高度即为确认数。注意:由于有分叉的可能,这笔交易在不同的链里面高度是不一样的,所以正确获得某笔交易所在的区块高度是通过交易哈希去获取的。
(2)摧毁比特币系统
对比特币发起51%攻击,比特币系统不会崩溃,而且还能恢复,但比特币市值就不好说了,甚至整个加密货币的市值很可能损失0 ~ 90%以上。
本来POW是消耗了大量的电力来做算力竞速的,但是在比特币系统接近崩溃的时候,只要有算力的加入,整个区块链网络就能恢复起来。
如果是使用了POS的区块链系统,如果发生类似的51%攻击,由于共识算法是以Stake 作为依据的,那么新节点加入并不能带来任何起色,整个网络基本上不可能恢复了。
51%攻击悖论
发起 51%攻击的成本很高,尤其是想持续一段时间的攻击。那么收益的大小就很关键,但是无论怎么算,收益本身并不高并且风险巨大。
相比拥有 51% 算力诚实的参与比特币挖矿得到的奖励来说,可能都达不到。而且真实场景下,想要发起 51%攻击,门槛很高,并且不可能做到无人察觉。所以这也就是为什么51%攻击基本上不可能的原因。但是结合其他的攻击手段,可以降低51%攻击的算力门槛,比如日蚀攻击。
对于区块链系统来说,基本上不用担心这种攻击,因为有悖论的存在。真正需要关心的是门槛较低,风险较低,收益较高的攻击。
3.5.2 日蚀攻击
【补充知识】
P2P 网络
P2P 从诞生到现在经过了几个阶段,分别是混合式 P2P,无结构化 P2P以及结构化 P2P。
混合式:P2P 网络混合了传统的 C/S 模型,网络中有角色充当server角色;
无结构化:网状结构模型,纯分布式网络,典型代表就是比特币网络,节点之间以一种随机的、松散的方式组织在一起
结构化:节点按照一定规则组织在一起,路由算法比较精准,比如DHT算法。
路由表(邻居表)
路由表里面保存了网络里面的一些节点,具体数量从几个到几十个不等。路由表中的这些节点可以看做是这个节点与这个 P2P 网络建立关联的重要依据,或者说表示节点到这个 P2P 网络的一些入口。这个节点想要发送任何信息需要先转发给路由表中的节点,再由它们负责转发消息。
无论是哪一种结构的 P2P 网络,每个节点都有一个类似于路由表的概念,本质上就是跟这个网络中的多个节点建立了一些联系,然后后续的所有收发包都交由这些邻居代为收发。
所以对于 P2P 网络里的一个节点来说,它看不到网络的全貌,只能看到网络的局部信息。并且由于路由表的存在,哪怕路由表中只保存了一个入口节点,这个节点也能服务于整个 P2P 网络,其他节点也能通过一定的方式找到这个节点。
NAT 穿透
NAT穿透不是P2P网络的一个必要特性,如果P2P网络中都是公网节点(具有公网IP),其实是不需要NAT穿透的。如果有一些私网节点(局域网节点)也加入到了这个P2P网络中,由于不能互通,导致其他节点无法发现这些私网节点,最后带来的结果就是这个私网节点能够成功发送信息到这个P2 网络中,但是可能却无法收到来自P2P网络里的消息。注意这里的用词是可能,因为存在一些场景是有可能收到的。
日蚀攻击
日蚀攻击针对特定的某个节点,通过一些方法,填满被攻击节点的路由表,以便切断它们与其他对等点的所有入站/出站通信(这会有效地窒息受害者)。
造成什么后果?
①阻止受害节点查看真实的区块链信息
②隔离网络中多个节点,以达到分裂网络的可能
③用少于51%的算力发起51%攻击
受害节点被恶意节点包围之后,恶意节点可以选择性的给受害节点发包或者篡改真实的数据包,本质上就是让这个节点误以为自己还在这个网络中挖矿,然而真实情况是它已经从网络中隔离开来了。
如果受害节点很多的情况,从整个网络全局来看就是被隔离成多个部分,网络实际上已经被分裂了。那么就可以实施分裂网络的 51%攻击,只需要用比原来 51%攻击更少的算力就行。
如何发起日蚀攻击?以以太坊为例来做说明。
(1)以太坊 kademlia网络原理
以太坊底层的 P2P 网络采用的是kademlia算法,kademlia网络是一种结构化的P2P网络,网络中的节点按照一定的规则组织在一起。
kademlia 算法中的核心特点是用异或来定义两个节点的距离,这种距离与实际的物理距离没有任何关系。
每个节点的路由表会保存不同距离的节点,这个距离的最小值当然是 0,也就是它自己,这个距离的最大值跟节点ID的长度有关系(NodeID)。NodeID 是一段具有特定长度的字符串,每个节点具有唯一的NodeID,用NodeID来作为这个节点在P2P网络中的身份信息。比如:NodeID: DEA25B0AF6CC5EA9DA4961DBC5FFEB97
假设NodeID长度为N bit(对于上面的NodeID来说N为32 * 8 = 256),那么这个距离的最大值就是 N-1,即距离范围在 [0, N)。
kademlia网络中的节点的路由表中会保存每一个距离的节点,数量在1个以上,这个值称为为α值。与自己的NodeID距离为 1 的会保存α个,距离为2的会保存α个,以此类推,直到距离为N-1的节点会保存α个。实际情况是距离越大,能找到符合要求的节点的概率也就越大,想一想为什么?
每一个距离称为一个Bucket,每一个Bucket里保存着[0, α]个距离匹配的节点。
知道一个节点的NodeID,就能够计算出这个节点的路由表中的每一个Bucket中应该填入什么样的NodeID。而这就是日蚀攻击的核心依据。
(2)发起日蚀攻击
当我们知道目标节点的NodeID之后,就可以通过一定的方式去伪造生成满足不同Bucket的NodeID,当这个目标节点重启之后,马上以这些NodeID启动节点去连接目标节点,由于kademlia的特性,这些特意伪造的NodeID肯定会被填入目标节点的路由表中,从而把路由表占满,以达到日蚀攻击的目的。
至于让目标节点重启,可以等待目标节点自动重启或者采用DOS攻击迫使目标节点重启,当重启之后马上进行上面的操作就可以完成日蚀攻击。
当成功发起日蚀攻击之后,随后就能隔离节点,篡改目标节点的收发数据包了。
(3)如何防御日蚀攻击
想要避免日蚀攻击由很多种办法:(可能只适用于 kademlia 网络)
1. 提高节点进入网络的准入门槛
节点进入P2P网络需要一定的门槛,不论是以时间为代价还是以Stake或是工作证明为代价,这样就能有效防止大批量伪造节点进入网络,从而从源头上避免日蚀攻击
2. 针对同一个IP段的节点做连接限制
攻击者很可能利用有限的 IP(1~2个)伪造大量节点,发起日蚀攻击,那么对于目标节点来说,看到的节点都是来自于这个IP,多半可以说明这是恶意节点。那么只需要对来自同一个IP段的节点做一定数量的限制,比如最多2个,也能显著提高攻击者的攻击成本。
3. 对节点主动建立连接和被动建立连接的数量做一定的均衡
发起日蚀攻击,需要主动占满目标节点的路由表,也就是主动与目标节点建立连接,即便不是这样,也有方法让目标节点主动建立连接到恶意节点。所以对于进出的连接数,做一定的均衡能有效避免日蚀攻击的发生
4. NodeID 重启之后变化
进行日蚀攻击的前提是需要知道目标节点的NodeID,并且迫使目标节点重启,然后以事先根据目标节点NodeID计算好的伪造节点发起连接,达成日蚀攻击。所以如果节点重启之后NodeID变为与原来不再一致,那么攻击者事先计算伪造的节点就变得毫无可用之地了。
5. 其他辅助措施
比如节点实时检测,发现恶意节点进行广播,并采取一定的惩罚措施等。
由于以太坊采用的是结构化的P2P网络,采用了kademlia算法,知道了NodeID,基本上就大致能知道这个路由表中应该填入一些什么类型的节点;
由于比特币的P2P网络采用的是无结构的模型,节点之间以随机,松散的方式进行组织,比特币节点不关心你的NodeID。但是还是有办法迫使比特币节点只与恶意节点建立连接的。
3.5.3 女巫攻击
对于区块链来说,女巫攻击指攻击者将一个节点伪装成多个节点进入P2P网络中,在P2P网络中具有多重身份。通常用于恶意刷票、恶意刷排名、恶意刷信誉等网络活动,或者在一些网络活动中通过数量优势进行造假。
日蚀攻击的着眼点在于某一个确定的节点,而女巫攻击的着眼点在于整个网络。通过伪造身份进入网络,干扰路由,干扰信息传递等。
如何防御女巫攻击?提高进入P2P网络的门槛。
1. 身份验证
进入这个网络的任何节点都需要做验证,验证通过才能进入网络。
通常有两种方式:
①去中心化身份认证
②中心化身份认证(第三方身份认证)
但基于去中心化系统的匿名性,一般不推荐采用中心化的身份认证方式。所以在进入网络之时,通常需要网络当中已经存在较长时间或者信誉较高的多数节点共同达成认证公式,才能被允许进入。
2. 工作量证明
进入网络是需要成本的,不能够随意的加入退出。所以可以利用类似 POW 的方式对节点入网做一定的工作量证明,提高节点准入门槛。
3. 特征向量
在针对日蚀攻击的防御方案,其中有一个防御方案是采用“限制本地路由表中来自同一个 IP段的节点数量”。其实这种方式是可能造成误杀的,因为并非来自同一个IP段的节点就可能是恶意节点。所以我们可能需要一种更加准确的方式去分析一个节点的行为,区分一个节点。
我们在做大数据的时候,往往需要通过很多特征向量来区分出是不是同一个用户,同样的在P2P网络中,我们也可以通过这种特征向量来区分这个节点是不是伪造的节点。当然这种方式不能完全避免女巫攻击,但是可以有效的减少女巫攻击。这种是有成熟产品的,像SybilGuard 和 the Advogato Trust Metric。
女巫攻击相对来说成本是很低的,但是可能获取的收益是比较高的。通常这种攻击也会结合一些日蚀攻击,或者DDOS攻击进行。所以真正的区块链网络攻击,多半会结合多种攻击手段一起进行。
3.5.4 拒绝服务攻击
分布式拒绝服务攻击(Distributed Denial of Service Attack)
信息安全的三要素——“保密性”、“完整性”和“可用性”中,拒绝服务攻击,针对的目标正是“可用性”。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务。
拒绝服务攻击(DoS) 问题一直得不到合理的解决,目前还是世界性难题,究其原因是因为这是由于网络协议本身的安全缺陷造成的,从而拒绝服务攻击也成为了攻击者的终极手法。攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:①迫使服务器的缓冲区满,不接收新的请求;②使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接。
而分布式拒绝服务攻击 (DDoS) 是指攻击者采用分布式攻击手法施行DoS攻击,通常是控制了多台机器向目标主机或者路由器发起DoS攻击。
针对区块链来说,攻击者通过DDoS攻击试图减慢网络速度,或者迫使网络停止运作。也可用于针对矿池,使矿池脱机,或者针对特定的目标主机,使其从网络离线。
危害
DDoS攻击造成的危害自不必说,中心化场景下,通常针对网站或者主机施行攻击,造成网站无法访问,影响业务运作,造成巨大经济损失;
在区块链场景下,攻击者目标通常是为了一定的利益才执行这样的攻击,导致网络速度变慢,或者影响矿工挖矿,从而方便攻击者对目标下手。
DDoS并非是区块链特有的攻击,在中心化场景下的攻击其实相对会更多。
攻击形式
1. 带宽攻击
通过攻击使受害者节点的网络带宽耗尽,从而造成拒绝服务的效果。
区块链系统的底层构建于 P2P 网络,其中通信上广播占据了大部分通信,一次广播通常就是大于N倍的收包,随着网络规模的扩大,节点数量的增多,通信的压力也会很大。
攻击者通过疯狂向节点通信端口发包,或者攻击者利用软件逻辑触发系统自动的大规模通信(比如触发同步),耗尽节点的带宽,最终从网络中离线。
而一旦离线重启之后,往往又会伴随着其他的攻击,比如日蚀攻击。
2. CC攻击
DDoS攻击是针对IP的攻击,而CC攻击的是服务器资源。
CC攻击全称Challenge Collapsar,中文意思是挑战黑洞,因为以前的抵抗DDoS攻击的安全设备叫黑洞,新一代的抗DDoS设备已经改名为ADS(Anti-DDoS System),基本上已经可以完美的抵御CC攻击了。
CC攻击的原理是通过代理服务器或者大量肉鸡模拟多个用户访问目标网站的动态页面,制造大量的后台数据库查询动作,消耗目标CPU资源,造成拒绝服务。CC不像DDoS可以用硬件防火墙来过滤攻击,CC攻击本身的请求就是正常的请求。动态网页是需要与后台数据库进行交互的,消耗很多CPU资源,造成静态网页能打开,但是需要和数据库交互的动态网页打开慢或者无法打开的现象。这种攻击方式相对于前两种实现要相对复杂一些,但是防御起来要简单的多,提供服务的企业只要尽量少用动态网页并且让一些操作提供验证码就能抵御一般的CC攻击。
CC攻击的种类有三种,直接攻击,代理攻击,僵尸网络攻击。
①直接攻击主要针对有重要缺陷的WEB应用程序,一般说来是程序写的有问题的时候才会出现这种情况,比较少见。
②僵尸网络攻击有点类似于DDOS攻击了,从WEB应用程序层面上已经无法防御。
③代理攻击是CC攻击者一般会操作一批代理服务器,比方说100个代理,然后每个代理同时发出10个请求,这样WEB服务器同时收到1000个并发请求的,并且在发出请求后,立刻断掉与代理的连接,避免代理返回的数据将本身的带宽堵死,而不能发动再次请求,这时 WEB服务器会将响应这些请求的进程进行队列,数据库服务器也同样如此,这样一来,正常请求将会被排在很后被处理。
3. SYN 洪泛攻击
SYN Flooding攻击是指攻击者发送了大量的TCP/SYN包,并且以一个假的IP作为发送地址到达目标主机,由于TCP在建立连接的时候有3次握手,也就是建立连接需要发送3个包,当目标主机收到这个SYN建连包之后,会回复一个SYN-ACK包。
但是由于攻击者恶意伪造了来源 IP,那么攻击者是收不到这个ACK包的,但是会导致目标主机打开了一个半开放的连接,如果攻击者发动了频繁的SYN洪泛攻击,那么会造成目标主机TCP资源消耗枯竭,导致无法与正常客户端建立连接,以达到拒绝服务的效果。
4. Land 攻击
是SYN攻击的变种,攻击者此时伪造的来源IP就是目标主机的IP,就会导致目标主机向自己发送大量的SYN-ACK包,从而消耗TCP资源,阻止正常客户端的连接建立。
四、攻击案例
(1)GitHub 遭受史上最大规模 DDoS 攻击
在美国东部时间2月28日下午17:28分,几乎一瞬间收到了1.35 Tbps的流量访问。这是互联网有史以来规模最大、威力最大的分布式拒绝服务攻击 (DDos)。
不到十分钟,GitHub就不得不向CDN服务商Akamai请求协助。最终Akamai接管GitHub的所有信息流,并通过其清理中心发送数据以清除和阻止恶意数据包。8分钟后,攻击者发现没什么效果,选择了撤退,停止了攻击。
(2)2016 年以太坊DDoS攻击
此次攻击也被称为 “EXTCODESIZE” 攻击。
攻击者让矿工和节点需要花费很长的时间(20 ~ 60 秒) 来处理一些区块。造成这次攻击的原因是一个 EXTCODESIZE 的操作码,它具有相当低的 gas 价格,需要节点从磁盘读取状态信息。攻击交易调用此操作码的频率大约是50000次每区块。这样的后果就是,网络大大放缓了,但没有共识故障或是内存超载发生。
因为此次攻击事件,很多媒体都宣告了以太坊的末日。可见在区块链世界里,DDoS 攻击的后果是比较严重的。
(3)以太坊Fomo3D,黑客拿走2200万
Fomo3D是以太坊上一个比较火爆的Dapp,是一个类似于资金盘的游戏。
首先,介绍一下 Fomo3D 这个游戏的规则:
规则1: 每个人参与游戏需要购买一个Key
规则2: 在一轮游戏中,谁是最后一个购买Key的人,则可以拿走奖池中的大奖
规则3: 只要有人购买一个Key, 游戏倒计时就会增加30秒
规则4: 游戏启动从24小时倒计时
正常人一般都是在倒数的最后几分钟或者几秒钟去购买Key,这样的话自己也许是倒计时结束后最后一个购买的人。
稍微高级一点的玩家,比如程序员,可能会写个脚本,自动化的方式来购买Key,速度是不是比手工快多了。
黑客玩家是怎么做的?利用 DDoS 攻击,在你购买成功后,马上施行攻击,拖慢整个网络,造成矿工无法打包或者打包很慢,那么势必会影响到其他交易的正常进行。如果你比较幸运,正好导致其他正在购买Key的人的交易失败了,那么你就是大奖得主。
但是说起来容易,实际做起来还是不太容易操作的。因为你要能确保你购买成功后的 DDos攻击能让后续的交易都失败。
了解以太坊的人应该听说过gas机制,可以理解为一个交易的手续费,而矿工通常会优先打包gas费用较高的交易,那么这位黑客利用自己的智能合约创建了大量的交易,并且具有高额的gas费用,几乎垄断了以太坊网络的所有算力,这样就造成了以太坊拥堵了接近 3 分钟,进而使其他的玩家无法打包购买 Key 的交易,从而成为大奖得主。
该黑客此前还尝试过多次这样的攻击,直至最后一次才成功。
是不是还是很有趣的?区块链公链本身具有比较致命的缺陷就是 tps 很低,单位时间处理的交易有限。后续的交易只能在排队,尤其是在网络被攻击拖慢的情况下,交易成功的时间会大大拉长。
五、DDoS 防御方案
1. 高防服务器
高防服务器:能独立硬防御50Gbps以上的服务器,本身就能抑制一定的DDoS攻击。买就是了,只是比较贵。
2. CDN 加速
CDN本身就就有大带宽,多节点的优势,并且隐藏了真实的网站 IP。通过把流量分配到多地多节点降低攻击负载,防止源站崩溃。
3. 配置防火墙
防火墙能防御DDoS和其他的一些攻击。防火墙有软件防火墙和硬件防火墙之分。必要可以两者结合。
4. 攻击检测和溯源
通过分析攻击的方法和手段,追踪攻击的路由,检测出恶意的 IP 和路由,做好相应的屏蔽,保护主机。
5. 黑名单机制
通过建立黑名单机制,限制黑名单的访问。
DDoS 攻击每天都在发生,对于区块链系统来说,由于接入的节点性能参差不齐以及无许可的特征,想要利用中心化的防御机制去做好DDoS防御可能还是有难度。况且由于区块链本身的弊端,性能瓶颈,更容易被攻击者利用。
3.5.5 其他网络攻击
1. 异形攻击
异形攻击又称地址污染攻击,是指诱使同类链的节点之间互相发现、互联、侵入的一种攻击手法。同类链的意思是底层P2P网络使用了相同或者相似的P2P通信协议。这尤其针对比特币和以太坊系列的公链。
很多劣质公链大量 COPY 以太坊、比特币的源码,导致大量的公链的底层是相同的或者兼容的。
如果攻击者执行了异形攻击,就有可能导致同类链的节点之间互相缠绕在一起,影响公链节点内部的通信和路由,进而影响到交易、共识和安全。从而让攻击者有机会施行其他的攻击,比如 DDoS 攻击,网络分裂攻击。
应对办法也很简单,首先是拒绝做伸手党;其次加强对本公链的节点类型的检测,比如节点地址不符合的一切拒绝,通信协议不一致的一切拒绝,通信报文头特殊字段不一致的一切拒绝等等。
2. 窃听攻击
本质上就是流量行为分析,通过分析流量,甚至可以把IP和家庭地址关联起来,从而知道某笔交易时来自某一个特定的客户端或者某个人。
3. 交易延展性攻击
延展性攻击者侦听P2P网络中的交易,利用交易签名算法的特征修改原交易中的input 签名, 生成拥有一样input和output的新交易,然后广播到网络中形成双花,这样原来的交易就可能有一定的概率不能被确认,在虚拟货币交易的情况下,它可以被用来进行二次存款或双重提现。
4. BGP劫持攻击
BGP劫持,即利用BGP操纵因特网路由路径,最近几年中已经变得越来越频繁。如误导和拦截流量等,目前在区块链网络中节点的流量一但被接管又能对整个网络造成巨大的影响,如破坏共识机制,交易等各种信息。
而对于BGP劫持攻击中,目前有安全研究者已经证明该攻击的概念可行性,从2015年11月5日至2016年11月15日通过对节点网络的分析统计目前大多数比特币节点都托管在少数特定的几个互联网服务提供商(ISPs),而60%的比特币连接都是在这几个ISP。所以这几个ISP可以看到60%的比特币流量,所以也能够做到对目前比特币网络的流量控制权,研究者通过劫持的场景验证了至少如下两个攻击概念是可行的,同时给出了验证的代码。
4.1 分割攻击
攻击者可以利用BGP劫持来讲区块链网络划分成两个或多个不相交的网络,此时的区块链会分叉为两条或多条并行链。攻击停止后,区块链会重新统一为一条链,以最长的链为主链,其他的链将被废弃,其上的交易、奖励等全部无效。
攻击场景举例:
1) 首先,攻击者发动BGP劫持,将网络分割为两部分,一个大网络、一个小网络。
2) 在小网络中,攻击者发布交易卖出自己全部的加密货币,并兑换为法币。
3) 经过小网络的“全网确认”,这笔交易生效,攻击者获得等值的法币。
4) 攻击者释放BGP劫持,大网络与小网络互通,小网络上的一切交易被大网络否定,攻击者的加密货币全部回归到账户,而交易得来的法币,依然还在攻击者手中,完成获利。
4.2 路由攻击
路由攻击往往配合其他的攻击来施行,攻击者可以先利用女巫攻击或者日蚀攻击把网络分裂,然后篡改消息发送到网络当中。最终效果是影响了网络中的通信和路由。