958 views
# Notes on Blockchain ###### tags: `blog` ## 什么是区块链? // TODO: ## 什么是比特币? // TODO: ## 双重支付与“51%攻击” ### 双重支付 “51%攻击” 的主要目的是制造“双重支付”。所谓双重支付,直观理解起来就像我用一个比特币买了一杯咖啡,然后又使用同一个比特币去买一杯老坛酸菜面。 :::info 严格来说,比特币世界没有“账户”或“余额”的概念,而是一个一个分散的UTXO。UTXO的定义: > UTXO are indivisible chunks of bitcoin currency locked to a specific owner, recorded on the blockchain, and recognized as currency units by the entire network. —— 《Mastering Bitcoin》 by Andreas M. Antonopoulos UTXO就是一个个数据结构而已,记录了所包含的比特币数量,以及公钥信息,任何人提供了私钥就能解锁该UTXO,即使用它来进行支付。比特币交易实际上是UTXO的转换,输入和输出都是UTXO。比如一笔交易是从地址A转账到地址B,那输入就是归属与地址A的一个或多个UTXO,输出是一个归属于地址B的UTXO,如果有“找零”,输出还有一个归属于地址A的UTXO,这是一个全新的UTXO,而不是在输入的UTXO 的“余额”字段作修改。 ::: ### 比特币网络怎么避免双重支付 首先,“双重支付”理论上是可以实现的。但按照上面所说,“双重支付”需要两笔交易引用同一个UTXO作为输入。比特币网络的节点在校验交易时,如果发现一笔交易的输入所引用的UTXO已经被之前一笔交易所引用作为输入,则会认为该笔交易无效而丢弃掉,且不会继续向比特币网络进行广播。 ### 怎么实现双重支付 两种方式: 1. 在交易前,先构造并广播一笔交易,引用同一个UTXO作为输入,使得新的交易无效。常见于 2. 利用区块链分叉,该方法破坏性强,但需要很强的算力支持。所谓“51%攻击”说的就是这个,51%不是确数,而是“整个网络的大部分算力”,理论上1%的算力也能实现攻击,但概率非常第,拥有越多算力就越容易实现攻击。具体流程: 1. 假设有一笔交易,是我昨天在711买馒头时给店家支付的1个比特币。该笔交易已经记录在第1000个区块上,而现在整个比特币网络的区块总数是1001,现在整个网络的其他节点都在以第1001个区块作为父区块去挖第1002个区块。 2. 现在假设我有很强大的算力(或者说我运气非常好,买彩票能连续365天中500万的那种),然后我以第999个区块作为父区块去挖出第1000个区块,继而挖出第1001和第1002个区块,且把我付给711店家1个比特币的那笔交易换成我给自己的另一个比特币地址支付(或者把转账金额改成0.1个比特币),记录在这3个任意一个区块上(不能直接丢掉这笔交易,因为这笔交易已经广播出去,需要新建一笔交易引用同一个UTXO作为输入,使得其他节点在挖后续区块时把原来的交易作为无效交易,否则其他节点在挖新区块时还是会记录记录这笔交易)。 3. 在我利用算力优势或运气挖出第1000、1001和1002这3个区块并广播出去后,别的节点都还没挖出第1002个区块,在这个时候别的节点收到我的这3个区块。由于我这3个区块对于校验机制来说都是合法的,因此别的节点会接收我这3个区块,并在自己本地的区块链副本上,从第999个区块产生区块链分支,然后因为我有第1002个区块,长度超过了原来主链的1001个,因此别的节点会以新的分支作为主链,停掉正在挖的第1002个区块,而开始以我挖的第1002个区块作为父区块去挖第1003个区块。 4. 这个时候,因为原先记录了我给711付1个比特币的那笔交易不存在于当前的主链上,因此挖矿节点会在挖第1003个区块的时候尝试重新那笔交易。但由于该比交易的输入所引用的UTXO已经被我新构造的那笔交易的输入引用了,因此我给711付1个比特币的那笔交易就变成无效交易了。 5. Bingo. ### 那比特币还算安全吗? 安全。因为实际上“双重支付”的攻击会很少。个人理解的两点原因: 1. 攻击的投产比很低。第一种攻击方式,常见于小额支付,比如我买馒头时,商家还没确认交易就把馒头给我了,这种情况很少见。大额交易,收款方就会先确认交易,甚至会等待多个区块的确认,这个时候就需要第二种方式去实现攻击。第二种方式对算力要求很高,且交易所在的区块深度越深,对算力要求就越高,攻击难度就越大。因为你需要在记录该比交易的区块的前一个区块去产生分支,且要求你能够挖出多个区块使得你产生的分支的长度超过当前主链的长度,那么高的算力所需要的成本,需要一次攻击的收益很大很大才能cover到,这使得攻击很不切实际。 2. 另一个方面,发起一次成功的攻击,会使得比特币网络的公信力受损,因此使得比特币的价值变低,也就间接损害了攻击发起者得到的回报的价值。