《区块链技术与应用》笔记(四)比特币系统的实现

比特币是一个去中心化的账本,比特币采用了基于交易的账本模式。但是系统中并无显示记录账户包含比特币数,实际上其需要通过交易记录进行推算。

在比特币系统中,全节点需要维护一个UTXO(Unspent Transaction Output 尚未被花掉的交易输出)的数据结构,是所有还没被花掉的交易的输出组成的集合。同一个交易会有不同的输出,但只有尚未花费的交易输出才会算在UTXO里,以及该输出在当前交易中是第几个输出

维护UTXO的原因:防范双花攻击。查询判断一个交易是否合法,要查一下想要花掉的BTC是否在该集合中,只有在集合中才是合法的。如果想要花掉的BTC不在UTXO中,那么说明这个BTC要么根本不存在,要么已经被花过。所以,全节点需要在内存中维护一个UTXO,从而便于快速检测double spending(双花攻击)。

每个交易都会消耗输出,但也会产生新的输出。例如A转给B5个BTC,之后B将其转给D,则UTXO中会删掉A->B这一交易记录,同时会添加B->D这一交易记录。如果D一直不花掉它的BTC,那么这个交易记录会一直保存在UTXO中,UTXO也两会逐渐增大
新输出

每个交易可以有多个输入,也可以有多个输出,输入之和基本要等于输出之和(total inputs = total outputs)。但存在一些交易的total inputs 略大于 total outputs,这部分差额便作为交易费,给了获得记账权的节点

如果仅仅只有出块奖励一个机制,那么会存在有的节点只想发布区块获得出块奖励,而不想打包交易,因为打包别人的交易对自己毫无用处和利益。因此比特币设计了Tranction fee(交易费)。对于获得记账权节点来说,除了出块奖励之外,还可以得到打包交易的交易费。目前来说交易费远小于出块奖励,等未来出块奖励变少,可能区块链的维护便主要依赖于交易费了

比特币系统设计的平均出块时间大约是10分钟,设计规定每21万个区块BTC出块奖励减半,这样计算基本上每4年奖励会减半:21w10/(6024*365) =4年

比特币是基于交易的模式,与之对应,还有一种基于账户的模式(如:以太坊)。基于账户的模式要求,系统中显示记录账户余额。比特币这种模式,隐私性较好,但其也付出一定代价。在进行交易时,因为没有账户这一概念,无法知道账户剩余多少BTC,所以必须说明币的来源(防止双花攻击)。而基于账户的模式,则天然地避免了这种缺陷,转账交易就是对一个(多个)账户余额的数字减和另一个(多个)账户余额的数字加

Block haeder结构
结构
nonce是一个32位的无符号整型数据,在挖矿时候是通过不断调整nonce进行的,但可以看到,nonce的取值最多为232(2的32次方)种,现在挖矿人员越累越多,挖矿的难度已经很大了,232这一搜索空间太小,所以仅仅调整nonce很大程度上会找不到正确结果。不能调整nonce,那就只能修改Markle Tree的根hash。出块者可以在区块中发布铸币交易,交易的内容是自己随便定义的,这个内容被称为CoinSbase。在此写入的任何内容都不会有什么影响,并且它可以影响到Root Hash的值,从而影响产生区块的hash值,进而影响后面的区块hash

挖矿的概率分析

挖矿的本质是不断尝试各种nonce来求解一个puzzle,每次尝试nonce都可以视为一次伯努利试验

伯努利试验:在同样的条件下重复地、相互独立地进行的一种随机试验。例如抛硬币的概率为p和1-p,那么不论经过多少次实验,下一次正反面的概率仍然是一样的。并不会因为之前做了多少大量实验,而对后续的实验有什么影响。因为伯努利试验是无记忆性的。

挖矿也同样是多次伯努利试验尝试nonce,最终找到一个符合要求的nonce。比特币系统的出块时间是指数分布的(系统出块)。系统平均出块时间为10分钟,对于系统而言,10分钟过去后仍然无人挖到快去,那么平均仍然需要等待10分钟。也就说将来挖多久和已经挖多久没有关系。这种机制保护了挖矿的公平性,不会出现算力越高越容易挖到区块的情况
出块概率

比特币的总量

总量

比特币系统中已经挖出和未挖出的比特币总数便是2100万个。挖矿这一行为只是单纯的算例比拼,没有实际的意义。但挖矿的过程本身对比特币系统的稳定性起到重要的维护作用。因此只要大多数算例掌握在好的节点手中,就可以保障比特币系统的稳定

比特币的安全性分析

偷币行为

偷币,即某个恶意节点将其他账户上的比特币转给自己。答案是不可以的,因为付出的代价会非常高。转账操作需要付款者的私钥加密签名,恶意节点无法伪造签名,当它把该交易写入区块时,其他用户会认为这是个非法区块,大多数算例将不认可该区块,并沿着其他路径挖矿,随着时间推移,大多数诚实节点会沿着原来的区块挖矿,形成最长合法链,而包含伪造交易的区块将变成孤儿区块。

对于攻击者来说,不仅不能偷到其他人的比特币,而且得不到出块奖励,还浪费了挖矿花费的电费等成本

双花攻击

假设某节点已将钱转出,然后还想将钱再转一次给自己。它只能使用回滚的方式将转出钱的记录回滚掉。相当于有两条等长合法链,还是老问题了。诚实节点会挖原来旧的链,万一节点会挖新的回滚那条链,由于区块链中大多数节点为善意的,最终恶意链不会被认可,从而导致投入成本白费。系统默认是等6个确认区块,该记录才是不可篡改的。
双花

自私挖矿selfish mining

提前挖到区块但是不发布,继续挖,等到想要攻击的交易等了6次确认安全后再将整条链发布出去,试图回滚原来的记录。这种情况理论上是可行的,但前提是恶意节点需掌握系统中一半以上算例才可行,否则无法成为最长合法链

selfish mining的收益与风险

  • 如果某节点算力非常高,挖出一个区块后藏着不发布,其他用户会接着在上一个区块后面继续挖,而此时这个节点已经挖出第二甚至第三个区块了,它将几个区块一并发布,那么将会一次性获得多个出块奖励,其他用户做的就是无用功。
  • 如果某节点正在selfish mining,原来的旧区块已经接着挖出1个区块,而自己也只挖出了没有发布的这块,后面的块还没挖出来,那么需要尽快将已出的块发布出去,否则将会失去出块奖励
posted @ 2022-04-06 20:48  我永远喜欢石原里美  阅读(219)  评论(0编辑  收藏  举报