Double Spending Attack

双花攻击,数字货币本身为带有签名的数据文件,可以进行复制。即对于用户来说,可以将同一货币花费两次。

在中心化场景下,可以对货币添加一个唯一编号(不可篡改),每次支付向货币发行单位查询真伪。

去中心化需要解决的问题

1.货币由谁发行?如何发行?发行多少?什么时候发行?

当引入去中心化思想后,系统中各节点平等,交易不通过第三方,那么货币的发行权的分配必然是一个需要解决的问题。在比特币系统中,由挖矿来决定货币的发行权和发行量。

2.如何验证交易有效?如何防止双花攻击?

在去中心化交易系统中,依赖于系统中维护的一个数据结构,记录了货币的使用情况(是否被花过?被谁花过)。该数据结构由系统中全体用户共同维护,保证了交易的有效性,该数据结构就是区块链

案例说明
如下,假定A获得铸币权,刚发布了10个比特币(该交易称为铸币交易)。A将10个比特币转给B(5个)和C(5个),A对交易进行签名,同时该交易需要说明所花掉的10个比特币的来源(来自铸币交易)。之后,B将自己的5个比特币转给了C(2个)和D(3个),该交易需要B的签名,该交易需要说明所花掉的5个比特币来自于第二个交易中。然后,C将自己所拥有的全部7个比特币都转给了E,并对该交易签名,可以发现该交易中C的比特币来源于两个交易中。这样,就构成了一个区块链。【红色部分为比特币来源】


需要注意的是,这里面有两种哈希指针。第一种为指向前面的区块(白色),使得各个区块形成链,第二种则是为了说明比特币的来源(红色)。说明比特币的来源并非凭空捏造,可以防止双花攻击。
在进行交易时,需要付款人的签名和收款人的地址,在比特币系统中,该地址为收款人的公钥的哈希。可以将其视作银行账户,根据此进行转账交易。
在交易中,收款方需要知道付款方的公钥,从而验证A签名是否有效。即A需要提供自己的公钥。实际中A转账时候提供的公钥需要和铸币交易中公钥对的上,这样就防止了恶意节点伪造A的公钥来偷走A的比特币。
在比特币系统中,通过执行脚本实现上述验证过程。将当前交易输入脚本与前一个交易输出脚本(说明币的来源的交易)拼接执行。如果可以正确执行,说明交易合法。
在该图中,一个区块仅含有一个交易,实际中一个区块中包含多个交易,交易通过Markle Tree组织起来,在区块中存储。

比特币区块信息

Block Header(区块宏观信息)Block body
vsersion(版本协议)...
hash of previous block header(前一个区块哈希指针)...
merkle root hash(默克尔树根哈希值)...
target(挖矿难度目标阈值)...
nonce(随机数)...

1.挖矿求解问题:Hash(block header) <=target。

2.hash of previous block header只计算block header的哈希值(merkle root hash保证block body内容不会被篡改,所以只需要计算block header即可保证整个区块内容不会被篡改)。

3.在区块链系统中,轻节点(只存储block header)只利用区块链,但并不参与区块链系统的维护和构造。

分布式共识

区块链是分布在各个节点上,如果各个节点独立打包交易,形成区块链,必然导致区块链内容不一致。从分布式系统的角度来说,账本内容需要取得分布式共识,保证区块链内容在不同节点上的一致性。

比特币共识协议

背景:假设系统中存在部分恶意节点,但存在比例较小,大多数节点为诚实的节点,在这个情况下惊醒共识协议设置。
想法一:直接投票。某个节点打包交易到区块链,将其发送给其他节点,其他节点检查该候选区块,检查正确投赞成票,若票数超过半数,加入区块链。
存在的问题
1.恶意节点不断打包不合法区块,导致一直无法达成共识,时间全花费在投票上。
2.无强迫投票手段,某些节点不投票(行政不作为)。
3.网络延迟事先未知,投票需要等多久,效率上会产生问题。
4.membership,在比特币系统中,创建账户极其简单,只需要本地生成公私钥对即可。这样,黑客就可以专门生成大量的公私钥对,当产生的数量超过系统中一半的数目,就可以获得支配地位--女巫攻击。所以这种简单的投票方案是不可行的。

比特币系统是怎么解决的
比特币系统中采用的是按照计算力投票的方案解决这个问题的。

在比特币系统中,每个节点都可以自行组装候选区块,而后尝试各种nonce值,这就是挖矿【Hash(block header) <=target】。当某个节点找到符合要求得到nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点收到区块后,验证区块的合法性,如果系统中绝大多数节点验证通过,则接受该区块为最新的区块并加入到区块链中。

最长合法链原则

如上图所示,当两个节点同时获得记账权,会发生分叉,同时存在两个等长的合法链。在缺省情况下,节点接受最先监听到的区块,该节点会沿着该区块继续延续。但随着时间延续,必然会有一个链胜出,变成最长合法链,由此保证了区块链的一致性。(被扔掉的区块被称为orphan block)。

分叉攻击

如上图所示,A对上面的A转账给B的记录回滚,从而非法获取利益。在两条链上,发现交易都合法。这就是一个典型的双花攻击。A给B转账后,用分叉攻击将钱又转给了自己,覆盖了原来的记录。

在比特币系统中,这种情况很难发生。由于上面提到的最长合法链原则,大多数矿工认可的是最长的合法链,会沿着上面的链继续挖下去。而A这个攻击者想要回退记录,就必须使得下面的链变得比上面的链还长。理论上来说,攻击者需要达到整个系统中51%的计算力,才能是这种攻击成功(51%算力攻击)。

比特币激励机制

比特币系统中,各节点需要提供算力和电力成本,为什么要这么做去竞争记账权?

比特币设计之初便考虑到这个问题,那就是引入了激励机制。比特币通过设置出块奖励来解决该问题。一个获得合法区块的节点,可以在区块中加入一个特殊交易(铸币交易)。事实上,这种方式也是唯一一个产生新比特币的途径。比特币在设计时规定,起初每个区块可以获得50个比特币,但之后每隔21万个区块,奖励减半。
区块中保存交易记录,那么,会不会存在节点只想发布区块而不想打包交易?中本聪在设计该系统时,引入了交易费。在一个区块中,其输入>=输出,差值便是给区块所属节点的手续费,这些会在后续文章中详细说明。


MockingJay
7 声望3 粉丝