transaction-based ledger

比特币采用基于交易的账本模式,并不直接记录账户余额,每次交易都要说明币的来源

UTXO

全节点维护的数据结构(Unspent Transaction Output)

所有没有被花出去的交易输出集合。

可以用于检测交易是否合法,即待交易的货币是否存在于该集合中。

transaction fee

为了提高全节点记账的积极性,每笔交易都要给予其一定的交易费

当矿被挖完了之后,这仍然是一种激励机制

挖矿问题

Bitcoin is secured by mining

由于挖矿难度增加,很可能nonce(4字节,32位)找不到一个满足条件的,这时可以调整merkle tree的根哈希值?

merkle tree中的铸币交易有一个被称为coinbase的区域可以写入任意内容,以影响根哈希值。也就是将coinbase的一部分作为extra nonce。

Bernoulli trial

a random experiment with binary outcome

无记忆性:memoryless

Bernoulli process

a sequence of independent bernoulli trials

挖矿尝试次数很多,但每次概率很小可以用(Poison process)泊松过程来近似。

可推导出出块时间服从指数分布。

(progress free)将来还要挖多长时间与已经挖了多长时间是没有关系的。假如已经挖了10分钟了,没有挖出,那么平均还需要再挖10分钟才能挖出。这保证了不同算力挖矿机器的公平性,否则会导致高算力机器不成比例的挖矿成功概率上升。

系统会一直调整让出块时间维持在十分钟左右,而对于每个矿工来说出块时间是根据其算力占该系统的比例来决定的。

比特币数量

出块奖励每隔四年(21万个区块)会减半

比特币总量多少?

21万*(50+25+12.5+6.25+….)=2100万个比特币

安全性问题

假设大多数算力都是合法的

恶意节点从概率上有可能获得记账权

伪造转账?

不可行,因为其没有转账方的私钥。如果非要写的话,其他节点也不会接受,善意节点会沿着合法的区块继续延伸。非法区块被作废。

双重支付问题?

两种方式

将区块插在最后面?

其他节点不会承认

插在与第一次支付平行的位置

若正常区块发生某种问题,造成回滚,则非法区块可能会取代正常区块。

如何防范?

多等几个确认(比特币默认需要等6个)才能认为其实正确且不可篡改的。也就是要等一个小时。这样非法节点取代正常区块的难度大大降低。

故意不写某些节点?

总有其他节点会把交易写到其他节点中去(其实比特币系统中每个区块大小是有限制的,实际上也有可能会写入之后的区块)

藏着发?

selfish mining

挖到之后不发布,积攒一定长度之后再发布,使其长度长于现有链,以覆盖正常区块。

但前提是有足够大的算力。