基于交易的账本模式
系统没有明确记录一个账户存在多少钱,需要推算出来。
在全节点中,需要维护一个 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 。 也可以恶意将其他人挖出来的节点失效掉。 但是这个恶意挖矿需要非常大的算力 - 对抗全世界其他的算力才可以。