何謂區塊鏈?(三) - IMMUTABILITY

上一篇文章到整條區塊鏈的安全性就是靠SHA256去維護。 因為SHA256確保區塊一旦生成,將來無人可以修改(immutable)。 這篇會詳細解為SHA256如何做到這一點

重溫一下這個例子:
SHA256(“Bill Gates pay me 10 dollars. I pay you 20 dollars.12345651231654798421231654556″) = 06AEB4DB892E1A5090657F25D94E509162A0D6D8B7B7718A2E8EBAE176EF7D50

"Bill Gates pay me 10 dollars" 和 "I pay you 20 dollars" 是兩個transactions

12345651231654798421231654556 是nonce,就是礦工為了令SHA256小於目標輸出而加上去的一個隨機數。

實際上一個區塊還有其他數據,例如時間、高度(即是第幾個區塊)、難度、和上一個區塊的SHA256,所以一個完整的區塊是這樣子:

Block Height: 0
Previous Block Header Hash: 0000000000000000000000000000000000000000000000000000000000000000
Timestamp: 2009-01-03 18:15:05
Difficulty: 1
Nonce: 2083236893
Transaction 1: Satoshi receives 50BTC

上面這個是真實例子,ref: https://blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

這個是Genesis Block (創世區塊,即是全世界的第一個區塊),所以它的Block Height 是0。

它之前沒有任何區塊,所以Previous Block Header Hash也是0

創世區塊的Hash是000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

然後我們看看第二個Block:

Block Height: 1
Previous Block Header Hash: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
Timestamp: 2009-01-09 02:54:25
Difficulty: 1
Nonce: 2573394689
Transaction 1: I receive 50BTC

(這個也是真實例子,ref: https://blockchain.info/block/00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048)

留意第二個Block包含著第一個Block的hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f,而第二個Block自己的hash是00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048

假設現在還是比特幣盤古初開,區塊鏈的高度只有1的時候,第二個Block的Hash就是整條區塊鏈的入口,因為hash在區塊鏈的世界裏還有指針(pointer)的作用。 可以想像每個區塊都係放左記憶體的某處,而hash則是記憶體的地址。

如果當中有一個壞礦工,意圖修改創世區塊的transaction,把"Satoshi receives 50BTC" 改成"壞礦工receives 50BTC"

Block Height: 0
Previous Block Header Hash: 0000000000000000000000000000000000000000000000000000000000000000
Timestamp: 2009-01-03 18:15:05
Difficulty: 1
Nonce: 2083236893
Transaction 1: 壞礦工receives 50BTC

創世區塊的transaction被修改以後,它的Hash無可避免地也會跟著改變。 記得上一課我們講過,以人類渺少的力量,是不會找到兩個不同的輸入,得出同一樣的SHA256 hash輸出嗎? 所以被修改過的創世區塊的hash肯定不是000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

然後問題出現了...第二個區塊記載了創世區塊的hash,如果創世區區塊的hash跟第二個區塊裏的Previous Block Header Hash不匹配,礦工馬上發現有問題,然後就會去問其他礦工重新拿過正確的區塊。

然後壞礦工就會想,這很容易呀,我把第二個區塊的Previous Block Header Hash也改一下,不就行了嗎?

但這樣一改,第二個區塊本身的hash也會改變了,肯定不再是00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 跟所有礦工所記住的區塊鏈入口也不一樣,根本變成了另外一條區塊鏈。

以2018-03-16來說,現在區塊鏈的高度是513806

如果有人在創世區塊加多了一個交易,那麼它就必須要把存在記所有礦工記憶體內的513806個區塊都改掉,再修改區塊鏈入口。要知道世界上的礦工何其多,要黑進所有礦機中,還要修改記憶體裏長達161GB(數據截至2018-03-16) 的區塊鏈,這是沒可能的事!


延伸閱讀