目录
前言
比特币系统的实现
UTXO(unspent transaction output)
交易费(transaction fee)
挖矿(Mining)
比特币的总量
挖矿的难度调整
前言
学习肖臻老师的《区块链技术与应用》公开课笔记,供学习参考。
比特币系统的实现
区块链是去中心化的账本,而比特币使用的是基于交易的这种账本模式(transaction based ledger),所以在比特币的系统中并不会显示每个账户中有多少钱。
UTXO(unspent transaction output)区块链上的交易中没有被花掉的输出的集合叫做UTXO,UTXO集合中的每个元素要给出产生输出交易的哈希值以及它在这个交易里是第几个输出。
假如A给B5个比特币,B花掉了。A也给了C3个比特币,C没有花掉,那么这5个比特币就不算在UTXO,而3个比特币算。只要C永远不把这3个比特币花掉,那么这个信息将会永久保存在UTXO中。
UTXO集合可以检测double spending,即检测新发布的交易是否合法,所以比特币系统中的全节点都要维护UTXO这个数据结构。
区块链中的每个交易可以有多个输出和输入,所有输入金额之和要等于输出金额之和,即total inputs=total outputs,所以一个交易可能来自多个地址,有多个签名。
但是有些交易的total inputs略微要大于total outputs,这就要说到比特币系统的第二个奖励机制:
交易费(transaction fee)因为打包交易的过程比较麻烦而且费时费力,所以要保持矿工挖矿的积极性,并且让矿工愿意去打包其他人的交易,出块奖励是不够的,于是比特币系统设计了第二个奖励机制:交易费。
发布区块的节点将某个交易打包在区块中,于是该交易给节点一些小费,这就叫做交易费。交易费一般很小,甚至一些简单的交易没有交易费。
除了比特币这种基于交易的模式,与之对应的还有基于账户的模式(account-based ledger),比如以太坊系统,在这种模式中,系统就会显示每个账户中有多少钱。但是比特币基于交易的模式的隐身保护性较好,缺点是比特币当中的转账交易要说明币的来源,而基于账户的模式就不用。
挖矿(Mining) 比特币的总量比特币的发行是通过挖矿(mining)获得的出块奖励,最初的出块奖励是50个比特币,每隔21万区块奖励就会减半,到今天,2022年,矿工每成功记账一次,获得的奖励为6.25个比特币,而产生的比特币构成的一个几何序列如下:
由此我们可知,比特币最终的总量为2100万,预计在2140年比特币会被全部挖完。
挖矿的难度调整那么21万个区块需要挖多长时间呢?因为比特币系统设计的平均出块时间为10分钟,所以经过计算(过程见下图),21万个区块大概要挖4年时间
那么问题来了,
比特币系统如何保证这10分钟的平均出块时间呢?
除了通过调整随机数nonce,我们还可以调整Merkle Root(区块中交易构成的merkle tree的根哈希值)来调整挖矿的难度来控制时间
因为nonce是32位的无符号整数,所以只有2的32次方个可能的取值。按照比特币目前的挖矿情况来看,很可能把所有可能的取值都遍历一遍也找不到合适的。所以只改变随机数是不够的,还可以改根哈希值。虽然哈希值是环环相扣的,但是每产生一个新的区块就会产生新的比特币,也就会产生铸币交易
铸币交易没有输入,所以也就不会受到前面的区块的影响,它有一个coinbase,可以写入任何的内容。也可以把digital commitment里的commit的哈希值写入里面。也可以把第一节讲到的预测股市的内容写入里面,coinbase的内容是没有人会检查的,甚至可以写你的心情。
coinbase对应的是最后一个block header里的根哈希值对应的merkle tree,左下角的交易是coinbase(如下图),将coinbase的域改变之后,其上的哈希值就发生了变化,然后沿着merkle tree的结构往上传递,最后导致block header里的根哈希值发生变化。
所以真正挖矿的时候只有两层循环,外层循环调整coinbase域的extra nonce。算出block header里的根哈希值之后,内层循环再调整header里的nonce。
伯努利实验(Bernoulli trial)
挖矿过程就是不断的尝试nonce的过程,每一次的尝试可以看作是一个伯努利实验,每一个随机的伯努利实验构成了一个伯努利过程,这个过程是无记忆性的。也就是说不管你前面尝试了多少次,你每下一次的尝试的概率都是相同的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)