主页 > imtoken离线钱包 > 走进区块链4 | 比特币实施
走进区块链4 | 比特币实施
前几章见合集_(绝命姬_嗨)
推荐课程:北京大学《区块链技术与应用》公开课-bilibili
比特币的交易模型是基于基于交易的账本模型。
基于交易的账本模型
在比特币系统中,全节点需要维护一个名为UTXO(Unspent Transaction Output 未花费交易输出)的数据结构。 顾名思义,这个数据结构只存储尚未转移(花费)的比特币。
如图,A转5个BTC给B,转3个BTC给C,B花费5个BTC,则交易记录不会保存在UTXO中,C也不会花费,交易记录会被保存在UTXO中,如果B转账给D之后,那么UTXO只存储A转账给D的交易记录,并以这种方式存储交易记录。
如果有人收到 BTC 转账但从未花费过,那么此信息将始终存储在 UTXO 中。 在这种情况下,可能是用户不想花费这些BTC,也可能是用户忘记了私钥,无法花费。 因此,UTXO 逐渐增加,但目前,数据可以完全存储在一个普通的服务器硬盘中。
UTXO 集合存储了每笔交易的哈希值以及它是哪个输出。 通过这两条信息,可以定位到比特币输出的位置,从而防止二次攻击。
一般来说,有些交易的总收益大于总支出,因为比特币在设计时就考虑到需要给区块所有者一小部分交易手续费,类似于小费。 这是为了防止某些区块所有者拒绝写入其他合理的转账记录。 按照目前比特币每增加一个区块10分钟计算,大约需要四年时间,将初始区块奖励翻倍,变成6.25个比特币。 随着时间的发展,交易支付手续费以后可能会成为区块所有者的主要收入来源(比特币总量为2100万枚)。
另一种交易模式是基于账户的分类账。 这种交易方式直接记录每个用户还拥有多少虚拟货币,减少了比特币去查虚拟货币来源的必要性。 以太坊使用基于账户的分类账模型。
比特币区块信息示意图
比特币挖矿过程其实就是在不断改变Nonce的值,使得Block Header的哈希值最终满足Target,最终挖矿成功。 但是随着近几年挖矿难度越来越大,Nonce本身只有四个字节,可供选择的Nonces并不多。 有可能遍历所有的Nonces计算出Block Header哈希值后,不满足Target要求。 那么我们还能改变什么呢?
其实我们也可以修改Merkle Tree Root根的哈希值。
_(Jue Ji_Wow) 很多同学会疑惑,root hash值不是和交易记录相关的吗,怎么能改变root hash值呢,不用担心,虽然root hash值和交易记录相关,但是它不仅与交易记录有关。 每笔交易记录(tx)中都有一个域名CoinBase。 没有人关心这个域中写的是什么。 想写什么就写什么。 因此,我们可以在 CoinBase 域中写入内容来改变 Block Header 的哈希值,从而找到与 Target 范围相匹配的 Block Header。
挖矿本质上就是不断尝试各种nonce来解开这样一个谜题。 随机数的每次尝试都可以被视为伯努利试验。 最典型的伯努利实验就是抛硬币,正面和反面的概率分别为p和1-p。 在采矿过程中,伯努利实验成功的概率非常小,失败的概率非常高。 挖矿就是多次进行伯努利实验,每次都是随机的。 这些伯努利试验构成了一系列的***********伯努利试验(一系列的**伯努利试验)。 根据概率论的相关知识,伯努利实验本身是没有记忆的。 也就是说,无论之前做了多少次实验,都不会对后续的实验产生影响。
对于挖矿来说,就是通过多次伯努利实验来尝试随机数,最终找到一个符合要求的随机数。 在这种情况下,可以使用泊松分布进行近似,因此从概率论可以推断出系统出块时间服从指数分布。 (需要注意的是,出块时间指的是整个系统的出块时间,不是挖矿个体的出块时间)
系统平均出块时间为10分钟,这是为系统本身设计的,通过难度调整维持平均出块时间。
指数分布本身也是无记忆的。 也就是说,对于整个系统来说,10分钟过去了,还没有人挖出一个区块,所以平均还需要等10分钟(很违反直觉)。 换句话说,你未来要挖多久,与你已经挖了多久没有关系。
_(爵区姬_哇吼)虽然这看起来是一件冰冷的事情,但过去的工作可能就白做了。 但实际上,这是挖矿公平性的保证。 对于在算力上有优势的矿工来说,他们之前所做的很多工作可能还是白费了。
比特币安全分析
_(极区姬_哇)大部分算力都在好用户手里,能保证坏交易记录不被写入区块链吗?
不,仍然有可能将不良交易记录写入区块链。
_(极区ji_哇)坏块可以随意写入交易记录吗?
不能。 由于转账交易需要签名,恶意节点无法伪造他人签名。 加入它获得记账权,将交易写入区块,大部分用户会认为这是一个非法区块,大部分算力都不会认可这个区块,于是沿着其他路径挖矿。 随着时间的推移,拥有多数算力的诚实节点仍会沿着原来的区块进行挖矿,从而形成一条“最长合法链”,而这个区块就变成了孤块。
_(绝境姬_哇)坏块可以二次攻击吗?
取决于哪个区块链将被认为是最长的合法区块链
如果M->B交易之后有好几个区块,如下图,大多数诚实节点是不会认出后面的链的。 于是,就变成了恶意节点挖下链,其他节点挖上链的算力竞争。 由于区块链中的大部分节点都是良性节点,上链最终会获胜,而恶意节点的链将得不到认可,造成投资成本的浪费。
因此,一个简单的预防措施是等待更多的确认块。 在比特币协议中,默认情况下需要等待 6 个确认块才能认为记录是不可变的。 平均出块时间为10分钟100t算力变成比特币流程,确认6个区块需要1小时。 可以看出等待时间比较长。
_(极区ji_wow hoo)自私挖矿
提前挖不发布,继续挖100t算力变成比特币流程,等到你要攻击的交易被确认6次后再发布全链,试图回滚原来的记录。 在这种情况下,恶意节点需要掌握系统中一半以上的算力,否则无法成为最长的合法链。
如图,如果你挖出2号块的时候不发布,其他人还需要挖出1号块。 如果自己的算力足够强,可以保证别人挖出1后可以挖出3,你现在可以挖出2和3一起发布,从而压榨出区块1所在链的最长合法链(减少别人和你自己竞争去挖区块 3)。
但这种方式存在风险。 如果别人挖出了1而你还没有挖出3,你需要尽快放出2来和别人争夺最长合法链的地位。