区块链中的基础知识
BTC协议:不断扩展最长合法链的协议。
指针和hash指针的不同:指针保存地址,hash指针保存地址以及对应的hash值。
区块链中指针的不同:区块链中用hash指针代替了普通指针。
最先产生的区块:创世区块
区块链中hash值的由来:每一个区块都含有一个指向前一个区块的hash指针。(第一个区块没有) hash值是将整个区块包括hash指针来进行hash计算得到的。
如何检测区块链是否被修改:当链中其中一个区块进行修改时,会导致其后面的区块的hash指针所指地址与之前不符,产生连锁反应,因此在检测时只需记住最后一个区块的hash值就可检测出对整个区块链中任一一个区块的修改。(因为修改任意一个区块会导致最后一个区块的hash值改变)
挖矿设备:CPU—>GPU—>ASIC(矿机)
p2p:P2P是英文peer to peer lending(或peer-to-peer)的缩写,意即个人对个人(伙伴对伙伴)。又称点对点网络借款,是一种将小额资金聚集起来借贷给有资金需求人群的一种民间小额借贷模式。属于互联网金融(ITFIN)产品的一种。属于民间小额借贷,借助互联网、移动互联网技术的网络信贷平台及相关理财行为、金融服务。
blockhead中nonce的大小:blockhead中的nonce(挖矿的目标值)为4字节(4byte)。
UTXO:当前未使用的交易输出
Merkle Tree:Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash值。
soft fork:软分叉,当系统中拥有半数以上的算力的节点更新了软件,那么系统就不会出现永久性的分叉,可能会出现临时性的分叉。
hard fork:硬分叉,必须是系统中所有的节点都更新软件,系统才不会出现永久性的分叉。如果小部分节点不更新,则系统会分成两条链。
比特币的区块结构:
比特币相关问题
Question:比特币交易需要双方同时在线吗?
Answer:比特币交易时不要求双方同时在线,因为交易时仅需要一方将交易信息写进区块中即可。
Question:比特币交易时会不会出现从没听说过的账户?
Answer:比特币账户在创建时不需要告诉任何节点或任何人,只需要在本地产生一个公私钥对即可,在转账时其他的节点才会知道这个账户。
Question:如果用户的私钥丢失怎么办?
Answer:如果账户的私钥丢失,账户中的钱变为死钱,在去中心化的系统中没有办法重置密钥。
Question:如果用户的私钥泄露怎么办?
Answer:一旦发生私钥泄露,用户需要将账户中的比特币转移(交易)到另一个新的账户中,因为私钥一旦生成不可修改。
Question:如果交易转账时,收款人填错怎么办?
Answer:没有办法,如果转账发布是没有办法取消交易的。可联系对方商量,无法强迫。
比特币节点类型
比特币网络由多种类型的节点组成,其功能集一般包括网络路由(Network Route,简写为N)、完整区块链(Full BlockChain,简写为B)、矿工(Miner,简写为N)、钱包(Wallet简写为W)。
比特币和以太坊的工作机制是怎样实现的?
比特币是一种去中心化的数字货币,可以立即向世界任何地方的任何人付款。比特币使用对等技术在没有中央授权的情况下进行操作:交易管理和货币发行是由网络集体进行的。
在比特币的区块链中,会有很多个节点,所有的节点都可以向上进行溯源,最终能够到达源头。这样源头也被称作为整个区块链链条中的第一个区块,在整个区块链中被看作是“创世区块”,每个区块的第一笔交易是一个特殊的交易叫区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易,其为矿工为自己铸币(即系统奖励给矿工成功打包区块的激励) 与 矿工费的交易。
与常规交易不同,创币交易没有输入,不消耗UTXO。它只包含一个被称作coinbase的输入,仅仅用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易,其为矿工为自己铸币(即系统奖励给矿工成功打包区块的激励) 与 矿工费的交易。
比特币网络中的节点都是同时在寻找nonce试图打包生成区块,大约每10分钟会有一个节点找到符合条件的nonce挖出区块。也就是说,我们在寻找nonce的时候,大量的节点也在竞争寻找nonce,而且从概率上来说哈希算力大的节点找到nonce的速度更快。
如果一个节点在寻找nonce时接收到其他节点打包生成的区块,其会检查该区块是否合法:如果合法则停止当前的工作,转而在该区块后重新构造区块;如果不合法则继续原来的区块构造。
挖矿节点成功找到符合难度目标的nonce后立即将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。(即沿着这条路径继续挖矿)
共识机制的原理,PoW, PoS这些经典共识机制工作机制是怎样的?交易和区块如何发布和验证?
工作量证明/Proof of Work/PoW
比特币系统没有中心化机构,人人参与铸币:每个参与比特币网络的全节点通过竞争解决数学难题的方式抢夺铸币的权利,谁第一个抢先解出数学难题即获得特定数量的比特币/BTC。而这个解决数学难题抢夺铸币权的过程就叫工作量证明(PoW, Proof of Work)。
这是第一种共识算法(由中本聪在他的文章中提出),以创造分布式无信任的共识,解决双重支出问题。POW不是一个新概念,但中本聪将这一概念和其他现有概念(加密签名、merkle链和P2P网络)结合成一个可行的分布式共识系统,其中加密货币是第一个也是最基本的应用,非常具有创新性。
区块链的参与者(被称为矿工)要在区块链上添加一个区块,参与者需要用完成了多少工作量来证明。比特币在区块生成过程中采用了pow机制,为了得到一个合理的随机数来解决数学问题,需要进行大量的计算,即按照一定的规则求哈希值。
但是,第一个找到正确哈希值的人可以有机会向链中添加新的块。根据查询记录和检验区块链信息内容的证明,就能了解是谁完成了规定难度系数的工作量。
优点:从2009年至今依然运行稳定,是经过测试的有效的共识算法。缺点:达成共识慢,处理交易的效率低,高耗能高污染。
权益证明/Proof of Stake/PoS
权益证明的特点是没有复杂的计算,区块链的参与者不与他人竞争,而是抵押他们的资源,类似于把钱存在银行,银行会根据你的资金额度个时间给你分配相应的收益。参与者对网络安全很看重,因为他们自己手里持有网络中的TOKEN。
系统根据参与者所拥有的“股权”来选择检验者,如参与者拥有10%的股份,那么将检验网络中10%的交易。参与者承诺的资源越多,网络允许该检查器创建区块的概率就越高。Pos的想法是,检查员持有的“股份”比例越高,操纵检查程序的兴趣就越低。
优点:能源效率高,攻击者攻击成本高,不受规模经济影响。缺点:没有利害关系。
交易的发布
将交易的内容写在最新的账簿页中,并写入到区块链最新的区块中且被各个挖矿小组公告,看到公告之后即确认比特币到账了 。
以Alice向Bob支付10个BTC为例,首先需要交易的用户把交易传到网络中,也就是说Alice在向Bob支付10个BTC后需要把这笔交易全网传播,当这笔交易在比特币网络中传播开来后,这个时候矿工们开始通过比拼算力的方法挖矿来竞争记账权利,直到第一个矿工胜出然后把交易打包再次全网广播,那么其他收到消息的记账包的节点会对其进行验证,验证通过后加入自己的区块。
交易的验证
用户A用私钥对文件进行签名,然后广播整个交易,收到广播的其他用户利用A的公钥对文件进行验证,如果验证成功则证明该笔交易中的BTC是来自于用户A。
区块的发布
比特币网络中的节点都是同时在寻找nonce试图打包生成区块,大约每10分钟会有一个节点找到符合条件的nonce挖出区块。也就是说,我们在寻找nonce的时候,大量的节点也在竞争寻找nonce,而且从概率上来说哈希算力大的节点找到nonce的速度更快。
如果一个节点在寻找nonce时接收到其他节点打包生成的区块,其会检查该区块是否合法:如果合法则停止当前的工作,转而在该区块后重新构造区块;如果不合法则继续原来的区块构造。
挖矿节点成功找到符合难度目标的nonce后立即将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。(即沿着这条路径继续挖矿)
区块的验证
比特币网络中的节点在接收到传播过来的新区块,其会按照如下项目检查该区块是否合法:
- 区块的数据结构语法上有效
- 区块头的哈希值小于目标难度(确认包含足够的工作量证明)
- 区块时间戳早于验证时刻未来两个小时(允许时间错误)
- 区块大小在长度限制之内
- 第一个交易(且只有第一个)是coinbase交易
- 使用检查清单验证区块内的交易并确保它们的有效性
一旦节点验证通过了一个新的区块,它将尝试将新的区块连接到到现存的区块链,将它们组装起来。新区块在组装的过程中会有3中情况:
- 第一种是可以连接到主链上的。这种情况最简单:当前区块的父区块是最长链上的最后一个区块,该链累积了最多的工作量,自然的新区块链接在该区块之后;
- 第二种是从主链上产生分支的(备用链)。该种情况是节点先后收到两个(甚至多个)合法的区块,而且该区块的父区块相同。这样的情况,节点不会抛弃后收到的区块(因为当前并不能确认哪个区块会是主链上最终的区块),而是将所有合法的区块链接到父区块之后(链条产生分叉)。最终的区块需要等到下一个区块的到来才能决定,也就是下一个区块的父区块即最长链;
- 最后一种是在已知链中没有找到已知父区块的。这种情况是由于网络传播延迟等原因,导致该节点未保持最新的区块链,所以只要区块合法就不会丢弃,而是暂存等待。
由上可知,一个区块成功的生成后并不意味着它就会是最终的区块(即成为最长链的一部分),而是需要等到该区块后链接6个以上区块才认为该区块是成功获得确认,该区块的生成者才能花费该区块coinbase交易获得的激励(铸币奖励 + 旷工费)。
矿工是如何挖矿的?区块链上出现分叉系统如何处理?都有哪些面向区块链的攻击?
1.利用设备不断地进行哈希运算来找到一个值小于目标值nonce,找到后发布该区块等待验证之后即成功获取该区块中的比特币。
2.比特币系统中,各矿工节点基于各自的计算机算力相互竞争来共同解决一个求解复杂但验证容易的SHA256数学难题,最快解决该难题的节点将获得区块链记账权和系统自动生成的比特币奖励。
该数学难题可以表述为:根据当前难度值,通过搜索求解一个合适的随机数(Nonce)使得区块头各元数据的双SHA256哈希值小于或等于目标哈希值。
软分叉和硬分叉:
软分叉:由于整个区块链系统软件的升级,一部分矿工没有来得及升级,出现了遵从不同机制产生的分叉,当矿工升级后该分叉就回消失。当半数以上的矿工升级了系统,这个分叉就只是临时性的分叉(软分叉)而不会是永久性的分叉(硬分叉)。
硬分叉:指比特币区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
区块链圈里第一个有影响力的硬分叉应该是以太坊的分叉事件。以太坊上一个著名的项目The DAO由于其自身漏洞,导致黑客窃取了当时价值约6000万美元的以太币。2016年7月,以太坊开发团队通过修改以太坊软件的代码,在第1920000个区块强行把The DAO及其子DAO的所有资金全部转到一个特定的退款合约地址,从而“夺回”黑客所控制的DAO合约币。
由于一部分矿工并不认同这个修改,于是形成两条链,一条为以太坊(ETH),一条为以太坊经典(ETC),各自代表不同的社区共识以及价值观。当以太坊发生了这次硬分叉后,产生了两条区块链。由于这两条链在发生分叉之前的数据都是一样的,一个非常有意思的现象出现了:原本持有以太币(ETH)的人,发现自己除了持有原有的ETH外,又有了相同数量的ETC。
也就是说,凭空的多出了一些资产。这些资产的价值具体怎样,还要看市场交易情况。但总的来说,区块链的硬分叉,没有减少资产,反而让人手里多了一种资产,看上去总归是一件不亏的事情,于是区块链分叉就成了一种资产凭空增加的方式。
面向区块链的攻击:
Doubed Spending(双重支持、双花攻击)是一种数字货币失败模式的构想,即同一笔数字货币可以被花用两次以上。不像具有实体的符号货币如硬币,电子文件可被复制,所以花用这个行为并不会从原持有者身上移除拥有的状态,也就是凭空多出已支付但未移除的货币,或是使收款者凭空收到多重支付的金额,犹如伪钞般,造成通货膨胀而导致货币贬值,从而不再让人信任并愿意持有及流通。防止双重支付需要其他的措施。
区块链的共识机制决定着节点会认同最长链才是真实有效的。攻击者可以在当前最新区块上持续挖矿但不进行广播,从而隐藏自己挖出的区块。
当攻击者节点隐藏的区块长于已在链上的公布的最长区块时再进行广播,从而成为最长链,使得原先的最长链进行回滚,从而实现双花等攻击。
比特币在转账交易时,必须将所有的币转出,例如:A有10个BTC,其中3个转给B,那么剩下的7个BTC需要转给A‘(A的另一个账户地址),一般比特币钱包会自动生成地址。
以太坊(改进版本的比特币)特点
1.用权益证明代替比特币中的工作量证明。
2.以太坊的出块时间为10+s。相对于BTC大大缩短。
3.以太币在转账交易时,不用将所有的币转出,交易所剩下的以太币就存储在原本的用户的账户中,因此可以防御double spending attack。同时带来的问题是replay attack(重放攻击), 以太坊中的nonce为该账户所交易的次数,创建账户时nonce的值为0。这样可以防止replay attack。
4.以太坊支持智能合约,以太坊中的账户地址为160位(bits),40个16进制数。
5.以太坊中的以太币不会经过固定时间,而每个区块中的以太币减半。
6.以太坊中叔父区块中的交易是不执行的,只需要检查叔父区块是否符合挖矿难度。以太坊只执行整条合法链上的区块中的交易。
以太坊的数据结构
MPT(Merkle Patricia Tree)。以太坊的状态树、交易树和收据树数据结构都是MPT。
以太坊的回滚操作
以太坊要支持回滚操作,必须保存历史状态,因为智能合约中的代码非常复杂,如果不保留历史状态无法根据现有结果推算出以前的状态。
以太坊中共三棵树:状态树、交易数、收据树。
完整的状态树
交易树
每发布一个区块时,区块中的交易会组织成一个交易树也是一个Merkle Tree,这点和比特币类似。
收据树
每个交易执行完后会记录一个收据,记录交易的相关信息,交易树和收据树一一对应。由于以太坊的智能合约执行过程比较复杂,因此增加收据树能够快速查询执行的结果。
三棵树的区别
其中交易树和收据树只是收集了当前区块中的交易,而状态树是将系统中所有账户的状态都包含进去。
以太坊的挖矿
会尽量使普通的设备也能够进行挖矿,来保证整个以太坊的安全性。
什么是智能合约?
智能合约是运行在区块链上的一段代码,代码的逻辑定义了合约的内容。
智能合约的账户保存了合约当前的运行状态
- balance:当前余额
- nonce:交易次数
- code:合约代码
- storage:存储。数据结构是一颗MPT
智能合约的语言:Solidity是智能合约最常用的语言,语法上与JavaScript很接近。
以太坊和区块链矿工的不同:以太坊中各个矿工需要先执行智能合约再进行挖矿。矿工在验证区块中的交易时,不会获得任何的收益,但是必须验证每个交易否则不能够继续往下挖矿。执行发生错误的交易,依旧需要发布到区块链中,这样才能够扣除交易过程中产生的汽油费。
区块链中的跨链技术
三种主要的跨联策略
公证人机制、中继/侧链机制、哈希锁定机制。
分布式一致性和共识的区别:
分布式一致性是分布式计算的根本问题之一。但是共识和一致性还是有着细微的差别:共识研究侧重于分布式节点达成一致的过程及算法,而一致性研究则侧重于节点共识过程最终达成的稳定状态。
拜占庭将军问题(Byzantine failures):
拜占庭将军问题是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。
拜占庭容错(BFT)
简略来说,拜占庭容错(BFT)是能够抵抗拜占庭将军问题导致的一系列失利的系统特点。 这意味着即使某些节点出现缺点或恶意行为,拜占庭容错系统也能够继续运转。
分布式系统模型:时序模型和故障模型
时序模型(Timing Model)
根据对时间的假设将分布式系统分为同步系统和异步系统。区别在于前者对时间有严格的假设,而后者没有。
在同步分布式系统中,因为消息传递时间的上限是已知的所以可以通过超时(Timeout)来检测进程的(非拜占庭)故障。如果在同步模型下都不能够解决的问题,意味着没有时间保证的异步系统也不可能解决。
目前大多数区块链共识算法的理论验证都是采用的同步系统假设,但是在实际的运行环境中一般都是采用的异步系统。
故障模型(Failure Model)
根据故障的性质可分为崩溃故障、遗漏故障、时序故障和拜占庭故障。其中拜占庭故障是被认为分布式系统中最难解决的故障形式。
主流区块链共识算法
Pow共识算法,优势在于其架构简明扼要、有效可靠。可以实现某种意义上的公平性,即投入的算力越多就可以等比例的增加更多的获胜概率。Pow可以有效的抵御51%攻击,攻击者必须拥有超过整个系统中51%的算力,才有可能篡改比特币账本,这样使得攻击的成本变得十分昂贵,难以实现呢。另一方面,Pow共识机制也存在明显的缺陷,强大的算力造成了很大的资源量费(如电力),而且长达10分钟的交易确认时间使其相对不适合小额交易的商业应用。
Pos共识算法,目前主要包括三种Pos共识算法:
1、 Pos+Pow混合共识(Pos1.0)
2、 纯Pos共识(Pos2.0)
3、 Pos共识算法的拓展形式(Pos3.0)
第一代Pos+Pow混合共识:
Pow共识主要是为了用于早起的货币发行,随着系统挖矿难度的不断上升,系统会逐渐过渡到Pos共识。就交易在区块中的位置而言,Coinbase交易必须是区块的第一笔交易,同时如果Cointake是第二笔交易则可以确定该区块是Pos区块。和比特币类似这两种交易都不会被广播到网络中,只存在于区块中。因此在花费这两种交易时也需要检测区块是否已经成熟。
币龄
也被称为币天数(Coin Day),是特定数量的币与其最后一次交易的时间长度的乘积,每次交易都会消耗掉特定数量的币龄。如:10个币持有10天,则获得100币龄;花掉5个币后则消耗了50币龄。长期持有币者更倾向于拥有更多币龄,因此可以将币龄视为Pos中的权益。
Pos共识算法的区块生产过程
节点首先从自己所有的UTXO中选定一个座位Kernel,构造Coinbase交易,计算两次SHA256哈希值;如果不满足式子则重新构造Coinbase交易,重新构造的过程中时间戳(nTime)会改变;同时也可以改变Kernel以得到不同的Coinbase交易。循环此过程直到寻找到合格的区块为止。简化的式子为:
SHA256(SHA256((Timestamp))<Target X CoinAge
由于时间戳Timestamp是极其有限的,因此极大的缩短了Pos共识的搜索过程,不会浪费大量的能源消耗在搜索上面。同时该式子使得Kernel的币龄成为了影响找到合格区块的最大因素。
同时为了防止利用币龄实施51%攻击,规定UTXO必须超过最小币龄stakeMinAge才能够参与生产区块,如果超过最大币龄stakeMaxAge,则币龄不会增长,实在按照最大币龄计算。
区块链网络
数据传播协议
节点通常采用TCP协议,一般的区块链网络主要包含以下核心场景。
- 节点入网建立初始连接
- 节点地址传播发现
- 矿工、全节点同步区块交易
- 客户端创建一笔交易
- 矿工、全节点接收交易
- 矿工、全节点挖出新区块,并广播到网络中
- 矿工、全节点接收广播的消息
建立初始连接
比特币节点之间建立连接的形式类似于“TCP”的三次握手协议,例如A向B发送包含基本认证信息的Version内容,B节点收到后先检查是否与自己兼容,如果兼容则连接并返回Verake消息,同时给A发送自己的Version,如果A检查后也兼容,则返回Verake,完成连接过程。
地址广播及发现
一旦建立连接新节点就会向相邻节点发送包含自身IP地址的addr消息。相邻节点再将此addr消息转发给各自相邻的节点。此外新节点还向相邻节点发送getaddr消息来获取相邻节点可以连接的节点列表。
同步区块数据
由于新节点只知道创世区块,因此需要同步。具体如下:
连接双方发送同步消息getblocks,其包含各自本地区块链的顶端区块哈希值;
通过比较区块数多的向少的一方发送inv消息(这里的inv只是一个清单,无数据);
接收方收到inv消息后,发送getdata消息请求数据;
交易传播
比特币系统的交易数据传播协议步骤如下:
- 交易节点将新生成的交易数据向全网节点进行广播;
- 每个节点将收到的交易数据存储到一个区块中;
- 每个节点根据自身算力在区块中寻找到一个具有足够难度的工作量证明(挖矿);
- 节点找到工作量证明后向全网节点广播此区块(block消息);
- 仅当此区块中的所有交易都有效且之前未存在过,其他节点才认同该区块的有效性;
- 其他节点接收该区块,并在该区块的尾部制造新的区块以延长该区块链,而将被接收区块的随机哈希值视为先于新区块的随机哈希值。
检测节点存活
ping消息有助于判断接收方是否离线。接收方回复pong消息表明自己在线,默认情况下,20分钟未响应ping消息的节点被认为断开连接。
数据验证机制
当新区块在区块链中传播时,每个接收到区块的节点都会对区块进行独立验证,成功验证的区块才会进行转发,这样可以尽早杜绝无效或者是恶意的数据在区块链中传播,预防小部分节点串通作恶导致无效区块被接收,尽最大的可能保证网络中传播区块的正确性。
矿池网络协议
Getwork协议:可以认为是最早的挖矿协议——实现区块链数据与挖矿逻辑剥离,拥有完成数据的节点构造区块头。挖矿的主要过程是递增遍历Nonce,必要时可以未调整Timestamp字段。
Stratum协议:利用Merkle树结构特性,从coinbase构造hashMerkleroot,无须全部交易,只要把与coinbase涉及到的Merkle路径上的hash值返回即可。如区块含有N笔交易,这种方式能将数据规模压缩至log2(N)。Stratum协议不但保证给矿工增加了足够的搜索空间,而且仅需要很少的数据交互,这是该协议最好的地方。
常见的漏洞和攻击手段
区块链的每个层次都存在一定的安全隐患。除了木马、蠕虫等恶意入侵,中间人攻击、后门攻击等传统网络空间安全需要面对的恶意攻击外,还衍生出了诸如:51%攻击、双花攻击等针对区块链的攻击行为。
根据攻击目的不同,可以把区块链上常见的攻击手段划分为针对共识一致性攻击、针对扩展性的攻击、针对激励策略的攻击、针对智能合约的攻击手段以及由区块链使用的底层技术或上层应用漏洞衍生出来的安全问题。
针对一致性的攻击
双花攻击
也被叫做二次支付攻击或者双重支付攻击,顾名思义是攻击者想重复花费自己账户中的余额的攻击行为,是破坏共识一致性的典型攻击方式,也是数字货币设计方案设计中首先需要解决的问题。以区块链为例,攻击者想要重复花费常用的方式是在完成一笔交易后,再产生一条更长的区块链分叉,此时包含原交易的区块链会被大多数矿工丢弃。
51%攻击
在基于Pow的比特币中矿工需要依赖算力竞争区块链的记账权。51% 攻击则利用比特币的使用算力作为竞争条件,理论上当攻击者拥有51%及以上的算力时,可以控制整个区块链系统。当攻击者拥有绝对的算力优势时,可以随意的控制区块的产生,制造分叉,实施双花攻击、Dos攻击等等,破坏比特币的安全性和去中心化。51%攻击也指在Pos区块链中拥有超过50%权益的优势攻击者可以对Pos区块链进行控制。
针对扩展性的攻击
Dos攻击
Dos攻击也被称作拒绝服务攻击,是利用合理的服务请求来占用过多的目标节点服务资源,增加目标节点网络负载,形成网络拥堵,从而使正常的用户无法得到服务响应的攻击。针对传统互联网Dos攻击可分为三类:利用软件实现的缺陷、利用协议的漏洞、利用资源压制。
同样区块链也容易遭受到Dos攻击,造成区块链吞吐量低、交易确认时间长、节点无法服务等情况。根据攻击目标不同可以分类为:
- 对区块链效率的Dos攻击:攻击者利用粉尘攻击发布大量交易,造成网络拥堵形成大量交易排队等候的情况,同时占用矿工的存储空间。
- 对单一用户节点的Dos攻击:攻击者如果拥有大量的算力、权益或者其他的网络资源时,可以有针对性的拒绝某一些对自己不利的交易,并使得这些交易在短时间内或者永久都不会被写入区块中。
- 对智能合约的Dos攻击:攻击者利用智能合约的漏洞对智能合约发起Dos攻击,使得智能合约在一段时间甚至永久不能够正常执行。
粉尘攻击
区块大小和生成区块的时间间隔受限,使得比特币系统的拓展性差。攻击者利用这一特点发动粉尘攻击,通过广播大量的低金额交易来增加区块链网络的负载,占据矿工交易池的硬盘空间,造成大量的交易正在排队等待验证的情况,进而对网络中其他有意义的交易进行Dos攻击,严重影响了共识效率和系统的吞吐量。由于比特币系统是区中心化的因此很难防御粉尘攻击,当存在粉尘攻击时,只能通过提高交易费的形式来确保更快的被矿工打包记录。
空块攻击
矿工为了尽快解决Pow问题,仅填充区块的头部,而不验证打包任何交易,视图在挖矿的过程中能够更快的发布区块得到出块奖励。虽然该攻击不影响区块链的有效性,但是却拖慢了交易验证和记录的效率,加剧了Pow共识算法拓展性差的问题。
分布式账本
DAG概述
由于区块链的一些缺点,研究者不断提出超越区块链的新型分布式账本技术,其中以有向无环图(Directed Acyclic Graph,DAG)作为基础数据结构的分布式账本技术因其高并发、高效率、低能耗等特点被广泛关注。DAG因为有异步运作、交易并行发布等特性可以实现高扩展性和运行效率。
DAG账本的基础结构是有向无环图(从任意节点出发无法经过若干条边回到该节点(无环)的有向图结构)。DAG是以单个交易(不是区块链里面的区块)作为图结构的一个节点单元,是存储结构的最小单元,第一个账本称为创世单元。DAG的边由交易之间的hash指针组成,hash指针单向且不可篡改,子单元指向父母单元,因此在交易发布的时候就确定了交易的顺序和交易在图中的位置。
交易的建立:一般将建立hash指针的操作成为:批准(Approval),并将DAG可扩展方向上没有被批准的单元成为:末梢(Tip)。当一个新的交易发布的时候,会选择DAG中的末梢交易作为批准对象,同时新的交易会作为新的末梢。
两种主要的DAG结构:IOTA和Byteball为代表的混合缠结式图结构,以及以HashGraph为代表的并列堆叠式图结构。
混合缠结式:按照用户发布其交易的顺序混合组成。
并列堆叠式:按照同一用户将其交易按照发布顺序通过哈希指针连接并排为一列,各列的交易通过哈希指针相互连接。
对比:混合纠缠具有更好的匿名性,并列堆叠在用户交易发布顺序上更为清晰。
DAG系统运作的主要步骤为交易单元产生、单元发布以及单元验证。
(1)节点发布交易,需要选择若干(一般是2个)末梢作为新交易的父母单元。在末梢的选择上,节点需遵循系统规则或执行末梢选择算法,同时在检验新交易与其直接或间接批准的历史交易单元之间是否存在冲突之后,完成对DAG账本末梢单元的批准操作,从而实现新单元的生成。
(2)新单元将通过分布式账本底层的P2P网络进行广播,其他节点在收到后会进行初步的冲突检验,若与DAG账本单元发生冲突,则会被其他节点拒绝。
(3)各个节点会执行共识算法,实现对包含新单元的分布式账本状态的一致性同步,并且检测交易是否为“双重支付”,为交易的接收方提供可信的交易。
具体的实例如下:商家与用户使用IOTA完成对线下交易的线上支付,双方在交易填写完毕后,IOTA节点首先需末梢选择,末梢批准,单元广播,商家需要等待系统运行共识算法并完成交易的检验,若检验成功则商家可以确认交易成功,否则商家就可以认为交易失败。
所有用户节点可以在任意时刻根据需要产生交易单元并将其写入账本,DAG系统的运作方式是异步的。每个节点都有验证并发布交易的权利,交易的发布无须在系统达成统一的共识下完成,避免了节点竞争交易发布权所需要的消耗,使系统的效率更高,(实现了交易发布的并行实现)因此DAG系统可以实现极高的交易吞吐量和可扩展性。
由于系统是异步的所以系统在同一时刻不同节点的账本可能是不同的,账本的末梢交易也可能不同,但是由于批准操作所建立的hash指针是不可修改的因此单元之间的顺序具有不可修改性。随着单元的广播,各个节点的数据内容会逐渐趋于相同。
安全性:对于基于DAG数字加密货币来说,首先需要解决的问题就是防止双花攻击,而应对双花攻击的前提就是对交易的发布进行排序。由于DAG具有新的数据结构和技术特征,其安全性就有别于其他的区块链系统:攻击者可以搭建寄生链来对交易的排序进行干扰。
DAG系统中,冲突交易的发布顺序难以直接确定。对于采用混合缠结式图结构的DAG系统,攻击者可以通过发布许多交易、搭建寄生链,并竞争被新交易继承的机会,进而控制系统并完成双花攻击,这种方式可称为寄生链攻击;对于并列堆叠式DAG,节点账本的交易事件尽可能与其他节点账本的事件链接,以保障节点账本的交易事件被网络广泛的传播。
综上:DAG系统面对的攻击情况会比区块链更加复杂,从而需要建立相应的共识算法,为交易进行排序,辨识双重支付交易,以实现对寄生链等攻击的有效防御。
IOTA
IOTA是一种基于混合缠结式DAG结构的、专注于物联网应用的开源分布式账本,同时也是该分布式账本发行的一种数字加密货币。IOTA具有交易吞吐量大、零交易费等特点,特别适合物联网环境下的小额或者微额支付场景。
IOTA交易的发布不会给用户带来直接的收益和成本,但是如果有不正常运行或者罢工的节点,其他节点会拒绝为其传输数据。IOTA共识算法的实现是基于权重机制与马尔可夫链蒙特卡洛末梢选择算法。
权重机制
IOTA系统的节点在发布新单元时要进行求解运算,目的是求得节点的权重(weight),其取值范围为3^n(n为自然数)权重的取值大小与节点发布交易时运行Pow权重所投入的算力大小有直接的关系。同时密码学求解过程有效防止了大量交易发布而产生的网络拥堵问题。
由于权重的生成所完成的密码学运算是轻量级的,与发布交易所进行的其他运算相比,对算力的敏感度比较低(攻击者无法通过运用大规模算力生成远超其他单位的权重值),防范了双花攻击。
累计权重=自身权重+直接或间接批准该节点的所有子节点权重之和
累计权重反应了该交易单元的可信度和不可篡改性,交易被批准的次数越多,其累计权重越大。随着权重的不断增加,单元会更加可信和不可修改。
末梢选择算法与冲突交易判别
末梢选择算法:MCMC算法。如果从开始到结束的Walkers到达末梢过快,说明此时的末梢很可能是利用系统的异步性来批准“旧”单元的“懒惰”末梢,这样的末梢将会被抛弃。
关于冲突交易:系统需要对冲突交易进行合法判定,从而防止系统遭受到双花攻击。同时一旦交易被高度确信以及极难修改,可以认为交易得到了确认,首款方可以将此作为交易结算的依据。合法交易所联通的末梢被MCMC算法选中的可能性会更大。
攻击情形(安全性)
IOTA系统的共识算法在实现系统账本的一致性的同时能够有效地防御寄生链攻击与双花攻击,完成交易的排序与结算工作。
Byteball
Byteball(字节雪球)没有采用权重机制,即节点不需要挖矿,并设立了交易费和激励机制。发布交易时需要支付一定的费用给最先批准该单元的新单元发布者,另一部分会支付给发布者选择的见证人,由于需要发布交易需要支付费用,因此一定程度上减少了垃圾交易。
为了赚取交易费,不但节点被激励去批准末梢节点而不是旧单元,而且见证人也被激励去保持可信度,从而有更多的节点选择他。
见证人机制
系统选取的见证人一般为未匿名的在现实生活中具有高度可信度的个人或公司,其利益一般约系统安全直接挂钩。见证人的任务是频繁有序的发布交易,确保发布的交易满足固定路径。这为交易发布顺序无法准确的异步DAG,提供了客观的排序依据。见证人的账户、地址等信息是公开的可以随时查看。
主链机制
主链可以分为:全局主链和当前主链。
当前主链:从任意末梢开始,建立通向“创世”单元的主链路径,每一个末梢有一个唯一的当前主链,当前主链随着交易的发布会不停地变动。
全局主链:所有的当前主链的路径的相交点到“创世”单元的路径。系统具有唯一的全局主链且不可更改,账本交易根据全局主链完成排序,并达成系统共识。
单元距离:将单元沿其当前主链路径到达创世区块的的距离。
全局主链与共识
全局主链的确定:首先我们规定交汇点为稳定点,称主链共有部分称为部分全局主链。我们将从稳定点出发的各个分叉称为候选主链,而随着新交易的写入,候选主链末梢的见证人距离越来越大,我们将具有最大见证人距离的末梢单元的候选主链称作全局主链。
在DAG中最稳定的点就是创世单元,所以稳定点是必然存在的。
交易排序与交易确认
主链指标:在全局主链建立的基础上,其他单元可以通过与全局主链单元的父子关系进行排序,为了量化单元的次序,引入了主链指标。
Hashgraph
IOTA和Byteball系统为公有链系统,Hashgraph主要应用领域则为联盟链和私有链。Hashgraph采用了并列堆叠式DAG图结构,交易间具有较好的时序辨识度,系统可以更加容易的查询冲突交易的出现。该系统的共识算法是:Gossip about Gossip协议与虚拟投票协议的结合,其实质是拜占庭容错算法的异步实现。
by Covteam-Sma11_Tim3
生活不易,多才多艺。