基于交易的账本模式

系统没有明确记录一个账户存在多少钱,需要推算出来。

在全节点中,需要维护一个 UTXO - Unspent Transaction Output 的数据结构 - 还没有花出去的交易的输出 , 记录还没花出去的 内容。

新发布的交易只有在 UTXO 中,才可以交易合法性,方便快速检测 double spending 如果这个钱永远不花,那么就会永久保存在 UTXO 中

发布区块的节点,如何保证帮助其他人验证交易? 比特币系统也规定了第二种激励机制 - 交易费

基于账户的模式

系统需要显式记录每一个账户的金额 , 如以太坊就是这个机制。

区块链的例子

可以调整铸币交易后凭空产生的比特币的 coinbase 的内容,可以修改block header 里面的根hash 值 , 增大搜索空间

下面是一个交易的记录

验证交易的合法性,就是将 币的来源的output script 和自己的input script 拼接到一起来验证合法性

挖矿过程的概率分析

Bernoulli Trail : a random experiment with binary outcome

每一次尝试的 nonce ,大概率都是失败的。

每一次尝试都是无状态的 progress free

Poisson Process 可以近似模拟

出块时间是服从指数分布的,整个系统,通过调整难度,保持平均出块时间为10分钟

如果不是 progress free 的话 , 算力强的矿工 ,获得记账权的概率就会超过。 所以 progress free 是公平性的保证。

比特币的总量

21 万 个区块 ,每一个区块生成 50 个比特币 -> 21 万 个区块 ,每一个区块生成 25 个比特币 -> 21 万 个区块 ,每一个区块生成 12.5 个比特币 …

可以计算一下这个序列 ,总量为 2100 万

比特币的稀缺性是人为造成的,即人为调整难度和出块奖励

Bitcoin is secured by mining

比特币的安全性

假设一个节点是恶意的,且这个时候获取了记账权:

获取记账权,但是无法获取前一个节点的签名,那么就无法伪造交易。

如果直接写到区块链呢?诚实的节点不会认可这个区块。那么对于恶意节点,反而是损失了一次 出块奖励。

如果写两个等长的合法链呢? 也由其他节点后续认可哪一个节点了。但是在这个认可的过程中,有可能造成类似卖家误认为已经写入到区块链了,线下交易已经完成,但是后续合法链修改分支了。 只要大部分算力掌握在诚实的节点上,上述攻击手段只需要多等几个确认就可以避免。 - 默认需要等待 6 个 确认才认为前面这个交易是不可篡改的 - 即平均需要等待 60 分钟。

如果故意不写合法的交易呢? 比特币系统中规定每一个区块的总存储不能超过1MB , 所以交易数量也是存在限制的,如果超出限制,那么就只能等到下一个区块里面。

如果我发现获取铸币权,先不发布(虽然冒着被别人替代的风险) , 而是藏着一个链,一次发布多个,只要覆盖掉主链的长度就可以 - selfish mining 。 也可以恶意将其他人挖出来的节点失效掉。 但是这个恶意挖矿需要非常大的算力 - 对抗全世界其他的算力才可以。