第五节
比特币系统的实现
区块链是去中心化的账本,比特币使用的是基于交易的这种账本模式(transaction[交易]-based ledger[账本])。系统当中并不会显示每个账户有多少钱。
比特币系统的全节点要维护一个叫UTXO(unspent transaction output)(还没有被花出去的交易的输出)的数据结构。区块链上有很多交易,有些交易的输出可能已经被花掉,有些还没有被花掉。所有没有被花掉的输出的集合就叫做UTXO。
一个交易可能有多个输出。假如A给B5个比特币,B花掉了。A也给了C3个比特币,C没有花掉。这时5个比特币就不算UTXO,而3个比特币算。UTXO集合当中的每个元素要给出产生输出的交易的哈希值,以及它在这个交易里是第几个输出。这两个信息就可以定位到UTXO中的输出。
要UTXO集合有什么作用?
为了检测double spending。即检测新发布的交易是否合法。因此全节点要在内存中维护UTXO这样一个数据结构,以便快速检测double spending。
每个交易要消耗掉一部分输出,也会产生新的输出。还看上面的例子,B花掉的5个比特币虽然不在UTXO里面,但如果他转账给D,而D没有花掉,那么这5个比特币又要保存在UTXO里面。如果D始终不花,那么这个信息要永久保存在UTXO里面。有可能是不想花,也有可能是把密钥丢了。
每个交易可以有多个输入,也可以有多个输出,所有输入金额之和要等于输出金额之和。即total inputs=total outputs。因此一个交易可能来自多个地址,可能有多个签名。
有些交易total inputs略微大于total outputs。
假如输入1比特币,输出0.99比特币,另外0.01比特币作为交易费给获得记账权发布区块的节点。
区块奖励也不能完全作为挖矿的奖励,发布区块的节点为什么一定要把你的交易打包在区块呢?他们还要验证你的交易的合法性,如果交易较多占用的带宽会比较大,网络传播速度也会更慢。所以只有区块奖励是不够的。
因此比特币系统设计了第二个激励机制:交易费(transaction fee)。也就是你把我的交易打包在区块里,我给你一些小费。交易费一般很小,也有一些简单的交易没有交易费。
21万个区块大概要挖多长时间呢?大约是4年。比特币系统设计的平均出块时间是10分钟,就是整个系统平均10分钟会产生一个新的区块。
除了比特币这种基于交易的模式,与之对应的还有基于账户的模式(account-based ledger),比如以太坊系统。在这种模式中,系统是要显示的记录每个账户上有多少币。
比特币基于交易的模式,隐私保护性较好。缺点是比特币当中的转账交易要说明币的来源,而基于账户的模式就不用。
如图⑥(第五节视频 16分钟处)
一个区块的例子
第一行表明:该区块包含了686个交易
第二行:总输出XXX个比特币