比特币中使用的是基于交易的账本模式。
transaction-based ledger
每个区块里记录的是交易信息,有转账交易,有铸币交易。
但是系统当中并没有哪个地方显性的记录哪个账户到底有多少钱。比如说你想知道A账户上有多少钱,需要通过交易记录来推算。区块链中一共有多少往A地址中转账的交易,转入了多少币,这些币当中有哪些被花掉了,哪些没有被花掉,这样来推算有A有多少币。
比特币的全节点要维护一个叫做UTXO的数据结构
UTXO: Unspent Transaction Output
注意:一个交易可能有多个输出。
同一个交易里面可能有的输出在UTXO里面,有的输出不在。
比如说在上面这个交易里面,A转给B5个比特币,B已经花掉了,那么B的这个输出就不在UTXO里,A转给C3个比特币,C还没有花掉,那么给C的这个输出就在UTXO里。
UTXO这个集合当中每个元素要给出产生这个输出的交易的哈希值以及它在这个交易里是第几个输出。就这两个信息就可以定位到这一个UTXO中的输出。
随着交易的发生,每个交易会消耗掉一些输出,同时也会产生一些新的输出。
B花掉了5个比特币,转给了D,那么A给B的这个输出就不在UTXO里面了,但是B给D的新输出在UTXO里面。
如果某个人收到比特币的转账交易之后,这个钱始终都不花,那么这个信息就要永久的保存在UTXO中。比方说中本聪,他就是不花的。或者是有的人想花没法花,因为把密钥弄丢了。这些东西就永久的保存在UTXO里面了。
在一些区块链中的实际统计数据。UTXO的这个数据量会逐渐增大,但是目前来说的话,存在一个全节点服务器中的内存里还是完全没有问题的。
每个交易可以有多个输入,也可以有多个输出。但是所有输入的金额总和要等于所有输出金额的总和。
total inputs = total outputs
输入也可以是多个的,而且多个输入不一定要来此同一地址。这也是为什么一个交易可能需要多个签名,每个输入地址都要提供对应签名。
有些交易,total inputs可能大于total outputs
有些节点可能比较自私,只把跟自己有关的交易记录下来,这就产生了第二个机制,交易费机制。
目前来说矿工争夺的还是出块奖励。
目前来说每个十分钟会产生一个新的区块。
目前的产出是12.5个比特币/区块,21万个区块之后奖励减半。
某一天初块奖励可能就会很小了,到了那一天,交易费就会变成主要的奖励。
还有一个模式是账户模式。
account-based ledger
以太坊用的就是这种显性模式,类似于我们的银行系统。
比特币中的隐私性就会好一点,但是要说明币的来源。
以太坊中就不需要显性的说明币的来源。
下面我们对挖矿的过程进行一些概率分析。
挖矿的过程就是找随机数nonce
Bernoulli trial:
Bernoulli process:
a sequence of independent Bernoulli trials
Bernoulli process 的一个性质是无记忆性 memoryless
可以用泊松porocess来近似。 Poisson process
我们关心的是出块时间,这个出块时间是指数分布的。
expoonential distribution
纵轴是概率密度probability density,横轴是出块时间 time to next block。
整个系统的平均出块时间是十分钟左右。
这个性质有的时候也教progress free。过去的progress是不算数的,任何时候出块的概率都是满足这个性质的。
这个性质恰恰是挖矿公平性的保证。不会因为某一个矿工的算力强而使得他获得nonce的概率不成比例的增加,而是依然跟他的算力在总算里中占的比例挂钩。
出块奖励每隔四年减半。
geometric series
21万 * 50 + 21万 * 25 + 21万 * 12.5 + …
= 21万 * 50 * (1+ 1/2 + 1/4 + …) = 2100万
这就是系统中所有比特币的总量。既包括已产生的,也包括未来将要会产生的。
比特币中的puzzle除了比拼算力之外,没有其他的实际意义。比特币挖矿难度的增加,是人为造成的,因为出块奖励被人为的减少了。比特币的稀缺性是人为造成的。
虽然挖矿本身求解的puzzle是没有任何实际意义的,但是挖矿过程对于维护比特币系统的安全性是至关重要的。所以有一种说法:
当出块奖励趋于零的时候,是否就没有人挖矿了呢?不是的,还有交易费奖励。
不能。他没有别人的签名。
我们判断恶意节点有没有成功,是看诚实节点是否认账。诚实节点不承认非法交易,所以会舍弃掉这个链表,走向诚实节点的新的最长有效链。
那么能够双发吗?
得到商品后,重新写入另一条区块并将其发展为最长合法链,实现双发。
难度大大增加。如果大部分算力是掌握在诚实节点上,那么诚实节点会沿着最长合法链去延申。
比特币协议中要等6个confirmation,到这个时候才确认前面的交易是不可篡改的。
这要等多长时间呢?平均一个区块十分钟,所以是60分钟后才能确认。
区块链的账本是不可篡改的,irrevocable ledger。这只是相对的。刚写入区块链中的信息还是比较容易被篡改的,但是几个区块以后,被篡改的可能性就成指数下降。
正常情况下,我们挖到一个区块就马上发布,如果不发布就作废了,被人就抢先发布了。
但是selfish mining挖到了以后现藏着,然后突然一下甩出来。
但这样做的话,有一个前提,恶意节点占据很大一部分算力,超过51%。如果你是普通矿工,你连续挖到几个区块的可能性很难比诚实节点正常挖到区块的可能性大。