北大肖臻《区块链技术与应用》学习笔记
作者:互联网
四、BTC-实现
视频地址:https://www.bilibili.com/video/BV1Vt411X7JF?p=4
-
Transaction-based ledger(比特币是基于交易的账本模式)
- Account-based ledger(以太坊是基于账户的账本模式)
-
UTXO Unspent Transaction Output(还未交易的输出)
比特币系统的全节点要维护一个叫UTXO(unspent transaction output)(还没有被花出去的交易的输出)的数据结构。区块链上有很多交易,有些交易的输出可能已经被花掉,有些还没有被花掉。所有没有被花掉的输出的集合就叫做UTXO
UTXO的作用
为了检测double spending。即检测新发布的交易是否合法。因此全节点要在内存中维护UTXO这样一个数据结构,以便快速检测double spending
-
total inputs=total outputs
每个交易可以有多个输入,也可以有多个输出,所有输入金额之和要等于输出金额之和。因此一个交易可能来自多个地址,可能有多个签名 -
total inputs>total outputs的情况
比特币系统设计了第二个激励机制:交易费(transaction fee)。矿工将信息放入区块中
-
挖矿时只改随机数不够,还可以更改根哈希值。
-
比特币的发行总量及计算公式
Geometric serices
21wx50x(1+1/2+1/4+....)=21wx50x1/(1-1/2)=2100w
-
比特币系统设计的平均出块时间是10分钟,就是整个系统平均10分钟会产生一个新的区块,因比特币数量的上限以及人为的提高寻找区块链的难度,导致新区块的产生仅仅依靠nonce(随机数)很难维持出块奖时间的稳定,因此加入了coinbase的随机, 只有铸币交易没有输入,它有一个coinbase,可以写入任何的内容。因此通过改变这其中的内容来改变最后的哈希值。所以真正挖矿的时候只有两层循环,外层循环调整coinbase域的extra nonce。算出block header里的根哈希值之后,内层循环再调整header里的nonce。
- 每次求解nonce 是Bernoulli trial :a random experiment with binary outcome
-
比特币系统中验证交易的合法性,就是把input scripts和output script配对后执行来完成的。注意:不是把图中的input scripts和output scripts配对,因为这两个脚本是一个交易中的脚本。不是把同一个交易里的输入脚本和输出脚本配对,而是把这里的输入脚本和前面提供币来源的交易的输出脚本配对。如果输入输出脚本拼接在一起,能顺利执行不出现错误,那么该交易就是合法的。
-
挖矿过程每次尝试一个nonce可以看作是一个Bernoulli trial(伯努利实验)。每一个随机的伯努利实验就构成了一个伯努利过程。它的一个性质是:无记忆性
-
指数分布也是无记忆性的。因为概率分布曲线的特点是:随便从一个地方截断,剩下一部分曲线跟原来是一样的。比如:已经等十分钟了,还没有人找到合法的区块,仍然参考概率密度函数分布 ,平均仍然要等十分钟。Prisson process(泊松过程)将来还要挖多长时间,跟过去已经挖了多长时间是没有关系的。这个过程也叫:progress free
两个问题(Bitcoin is secured by mining)
-
他能不能偷币,能不能把别人账上的钱转给自己
假如他把M→A的交易写在了一个区块里面,现在他获得了记账权,他又发布另一个交易,把这个钱转回给自己,即M→M'。同样,这很明显是double spending,只要是诚实的节点都不会接受这个区块。
-
能不能把已经花了的币再花一遍(即double spending)
假如他把M→A的交易写在了一个区块里面,现在他获得了记账权,他又发布另一个交易,把这个钱转回给自己,即M→M'。同样,这很明显是double spending,只要是诚实的节点都不会接受这个区块。
- 注意:区块插在哪个位置,在刚挖矿时就是要决定的,因为设置的block header里要填上前一个block header的哈希。所以他想插到那个区块的话,一开始就要认定,而不是等获得记账权以后再认定。irrevocable ledger(不可撤销的记账)
-
比特币协议当中,缺省(系统默认)的是要等六个confirmation。有了六个confirmation,才认定M→A的交易是不可篡改的。区块链是不可篡改的账本,那是不是意味着凡是写入区块链中的内容就永远改不了呢?经上述分析可以看出,这种分析只是一种概率上的保证。刚刚写入区块链的内容,还是比较容易被改动的。经过一段等待时间之后,或者后面几个区块被确认之后,被篡改的概率就大幅度下降(指数级别的下降)。
selfish mining
M→M'的交易所在的区块所在的链条虽然短,但是先偷偷的生成比上面更多的区块,然后等上面的链条公布后再公布,就能够胜过上面的几个区块了
-
目的一:selfish mining是分岔工具的一种手段。但这样成功的概率并不大,因为有恶意的节点本来算力占比就不高,还要生成更多的区块,就非常困难
目的二:假如A挖了两个区块都没有发布,而在B挖到一个区块公布后立马公布,这样B挖的区块就作废了。好处是减少竞争,因为A在挖第二个区块时,别人还在挖第一个区块(前提是A算力足够强)。
坏处是假如A挖出一个区块,A以为他能赶在别人面前再挖一个区块,结果这时有人挖出了第一个区块,那这样的话A就要在别人发布之后立马发布,去争取区块奖励
标签:nonce,区块,比特,spending,double,笔记,肖臻,交易 来源: https://www.cnblogs.com/addc/p/15078407.html