區塊鏈入門系列 | 比特幣白皮書的計算部分詳解
比特幣白皮書的第11部分是關於比特幣安全性的計算過程,原文有些艱澀,這裡這裡咱們展開聊聊。理解了這個過程就可以知道通常所說的六次確認是怎麼來的,以及它在多大程度上是正確的。
問題描述
首先把問題描述清楚。
這裡涉及兩個角色。一個是攻擊者,可能是一個人或者幾個協同起來的人。另一個角色是誠實節點,是除了攻擊者之外的所有的節點的集合。
攻擊成功意味著攻擊者的鏈超過了誠實的鏈。攻擊者和誠實節點拿到同樣一條區塊鏈,交易發出後,誠實節點接收了交易,然後開始運算下一個區塊。而攻擊者則會不包含或者篡改這個交易,然後也在自己的鏈上運算區塊。因為交易歷史不同,所以區塊鏈就分叉為誠實鏈和攻擊鏈了。如果攻擊鏈超過了誠實鏈的長度,就成為了最長鏈,而最長鏈是會被全網共同接受的,於是攻擊成功。
那麼我們要研究的問題是,交易發出後,包含這個交易的區塊鏈上要有多少了新區塊出來之後,才能認為這個交易很難被篡改了呢?
泊松分佈
白皮書一下子看不懂的很可能是因為有一個泊松分佈的概念,所以我們展開說說。
泊松分佈是一個常用的數學公式。比如有一個火車站,平均每十分鐘有100個人出站。我們知道,具體到每個特定的十分鐘,出站人數不一定是一百個,肯定是隨機的,存在一個概率問題,這種情況下的概率的分佈就是泊松分佈。
比如要計算出站人數是98個的概率,就讓公式中的 Lambda 等於100,k 等於98,帶入公式計算即可,至於公式本身是怎麼來的,不用關心。
回到我們的問題。誠實的鏈如果比攻擊鏈快 z 個區塊,那麼攻擊鏈能夠追上來的概率是多少呢?
這裡用 p 代表誠實節點找到下一個區塊的概率,q 代表攻擊者找到下一個區塊的概率。如果 p 小於等於 q 那麼概率就是1。而如果 p > q ,那就是 q 除以 p 的 z 次方。可見,如果誠實節點算力比較強,使得 p>q ,那麼攻擊者能夠追上來的概率隨著要追趕的區塊數量的增加而呈指數減小。最開始的時候可能還有點機會,但是拉開的距離越大,機會就越渺茫了。
接下來運算,如果交易發出者已經看到誠實鏈上延長了 z 個區塊,那麼此時這個交易被攻擊成功的概率是多大呢?注意,誠實鏈延長的同時,攻擊者也沒停下,攻擊鏈的延長几個區塊我們不知道。但是這個數量的平均值跟 z 是滿足比例關係的。
平均值 Lambda ,可以根據比例關係得出。
那麼根據泊松分佈,此時攻擊者延長的區塊數量為 k 的概率,直接帶入泊松分佈公式就可以得出:
這樣,我們就理解泊松公式的意義了。
公式變換
下面運算可以追上的概率。
如果誠實鏈延長了 z 個區塊,而攻擊鏈延長了 k 個區塊,k 是一個固定值,那麼追上的概率通過前面已有的公式就可以得到,也就是 q 除以 p 的 z 減去 k 次方。
但是問題是 k 可能取不同的值,用每個 k 值出現的概率,乘以這個 k 為這個值時追上的概率,k 的可能範圍是0到無窮大,所以把這些概率都加到一起,就是最終能夠追上的概率了。
但是如果要根據這個公式去運算最終結果,就會涉及到無限數列的累加,所以我們把公式來變換一下形式。
由於追上和追不上的概率之和是百分百,所以用1減去追不上的概率,就是追上的概率了。當 k 大於 z ,表示攻擊已經成功,已經追上了,所以也就不存在追不上的概率了,所以計算追不上的概率時 k 的取值範圍就是 0 到 z 了。最終,用1減去追不上的概率,結果就跟剛才一樣是追上的概率了,但是這次就是有限項相加了。
白皮書上中本聰把最後這個公式轉換成了 C 程式碼,通過運算結果可以看到,隨著 z 的增加,追上的概率會迅速變小。當然,這是基於一個合理的假設的,也就是誠實節點由於算力佔優勢,所以 q 遠遠小於 p 。
總結
推導過程我們就介紹到這裡了。最終的結論是:六次確認,是假設攻擊者掌握較少的算力條件下,如果誠實的鏈已經在交易之上疊加了六個區塊了,那麼攻擊鏈能夠追上的概率就變得非常小了,以至於可以近似認為本次交易不可能會篡改了。但是要注意,中本聰論文裡面可沒寫6次確認就肯定安全了,首先這是一個概率問題,其次根據白皮書上的運算結果可以看到,攻擊者算力越強大,需要等待的確認數量也就越多。
參考:
https://happypeter.github.io/bitcoin_basics/paper