為什麼比特幣的block產生速度被設定為10分鐘?

和網路延遲有關係么?按著官方wiki所說, 每個節點需要一些時間來確認block(&<10mins),但是為什麼要10分鐘?和hash方程的難度有關么?


比特幣有很多神奇的數字,這些數字到最後都被證明是很有效的,其中就包括這10分鐘。

10分鐘並不是一個什麼必須要遵從的公理,我猜你把它改成8分鐘或者15分鐘也不會有太大問題。

然而如果你把它改成1分鐘,問題就來了——

我們假設任何一個新的區塊傳遍網路需要2分鐘。

那麼,如果10分鐘產生一個區塊,那麼新區塊在傳播過程中沒收到它的節點又生成了一個新區塊的幾率還不算大,因為畢竟只是全網平均產生區塊時間的1/5。

然而,如果1分鐘產生一個區塊的話,問題就大了——假設區塊傳輸速度平均,那麼幾乎可以確定,在新產生的區塊傳輸到一半的時候,還沒收到這個區塊的網路有很大可能性也生成了一個新的了。

於是,一個分叉就產生了。

而這種情況是很可能會出現的,也就是說,這個網路里會長期存在至少一個分叉。

這樣的網路顯然是不安全的,因為比特幣的假設是「如果想要作弊,你得算贏所有的競爭者,也就是全網51%的算力。」

但是,如果網路里常年有兩個以上的分叉,說明全網的算力被分攤了,於是,想要作弊的話,只需要算贏一半的網路就夠了,也就是25%算力。

很顯然,這樣比特幣的可靠性就降低了。

這也是比特幣為何不能通過減少區塊產生時間來擴容了,增加區塊大小也同理。

我記得有一篇論文里曾經討論過,比特幣現在的結果,通過修改區塊大小和間隔時間來提高輸出的話,現行的比特幣系統最多支持27tx/s。


10分鐘是預期。

礦工根據歷史出塊時間自動調節難度,若比10分鐘短,就加大難度,反之就減小難度,讓下一塊的出塊時間接近10分鐘。

設定了10分鐘預期之後,關於比特幣的很多計算就可以簡化:理想狀況下,10分鐘出一塊。

出塊時間太短會導致較多孤塊出現,受其他因素影響較大,也不夠安全;

出塊時間太長會導致交易難以確認,等時過長。

10分鐘合理、合適、好記、好算,但並不是精確計算得出的數字,不是增一分則多減一分則少。

一個重要事實是,6確認安全的計算過程中,區塊確認時間沒有參與計算。

也就是說,即使區塊確認時間被設定成15分鐘、20分鐘,還是6確認安全。

實際出塊時間受3元素影響:算力、難度、運氣。

運氣不能控制,不考慮;

算力由礦工提供,越大出塊時間越短;

難度由演算法調節,越大也塊時間越長。


因為代碼里是這麼寫的

// 目標時間窗口長度:兩周

static const int64 nTargetTimespan = 14 * 24 * 60 * 60;

// block頻率,每10分鐘一塊

static const int64 nTargetSpacing = 10 * 60;

// 每兩周的產量2016,也是調節周期

static const int64 nInterval = nTargetTimespan / nTargetSpacing;


推薦閱讀:

怎麼證明second preimage resistant不代表collision resistant?
求解 烏雲白帽子大會 直播的第三道題是怎麼解的呢?
有沒有兩個完全不一樣的文件,但是他們的md5值是一樣的?
Git是否考慮到SHA1碰撞的問題了?

TAG:比特幣Bitcoin | 哈希函數 |