Skip to content

Softfork Hardfork

changwu edited this page Mar 22, 2016 · 2 revisions

Bitcoin的本質, 是對區塊有效性的一套共識.

Hardfork的意思, 是把本來不合法的區塊, 變為合法; Softfork的意思, 是把本來合法的區塊, 變為不合法

Softfork在Bitcoin歷史上出現了很多次, 一些是bug修正, 一些是新功能. 以比較簡單的一次CVE-2010-5139為例. 在2010年, 發現了一個嚴重的bug, 原來bitcoin容許輸出的bitcoin量為負值, 由於規則是要求輸出的總量不得高於輸入的總量, 如果有一個輸出為負值, 那其餘輸出的總值就可以大於輸入總值, 就是說可以無限制刷bitcoin了. 當時實行了一次緊急的softfork, 規定任何個別輸出值不得小於0, 問題就解決了. 這做法令原本合法的交易 (負值輸出) 變為不合法, 所以是一次softfork.

要實行softfork, 只要大部份礦工同意新規則就可以了. 如果有小量礦工拒絕新規則, 繼續容許負值輸出, 他們挖到的區塊就得不到大部份礦工承認, 變為無效區塊, 損失了挖礦的收入. 對於非礦工的普通用戶, 即使他們沒更新, 由於新規則的區塊鏈對於他們來說仍然合法, 他們也會自動跟隨這最長的新規則區塊鏈. 因此只要絕大部份礦工同意, softfork其實不會造成真正的分叉

這裏列舉了bitcoin歷史上所有softfork: https://bitcointalk.org/index.php?topic=641294.msg7166458#msg7166458

至於Hardfork, 情況就複雜得多. 由於是把本來不合法的區塊變為合法, 不更新的用戶, 他們會拒絕接受新的區塊鏈, 而堅持留在舊的區塊鏈. 因此區塊鏈會出現真正的分叉, 兩分叉的bitcoin各不互通. 分叉前就存在的bitcoin, 可以在兩個分叉內各自使用一次; 分叉後才收到的bitcoin, 就只能在該分叉流通. 這明顯會嚴重危害bitcoin的價值. 因此要實行hardfork, 必須要有極充分的共識, 提供長時間的預告, 讓絕大部份的用戶, 包括礦工和非礦工, 都升級到新的規則.

(如果只有極小數如0.1%的用戶拒絕更新, 那問題就不大, 因為他們將沒有足夠算力維持挖礦, 平均一星期才出現一個新區塊, 要6星期才能確認一次交易, 還要等38年才可令難度下調, 那明顯是不可能維持下去的.)

至目前為止, Bitcoin還沒有一次真正的Hardfork. (2013年的BIP0050 bug某種意義上可以算一次, 將來另文再述)

講完了背景, 就正式答問題了. 現在bitcoin區塊有一個規定, 是任何區塊不得大於1MB. 這規定在最初的bitcoin是沒有的, 是Satoshi為防止Bitcoin被攻擊而後來加上 (這其實是一個softfork, 請自己想想為什麼). 但這個1MB的規定, 限制了bitcoin處理的交易總量, 因此很多人希望可以提高. 如果是簡單的由1MB提高至2MB, 那就會是一個hardfork, 因為這是把一個本來不合法的區塊 (2MB大小) 變為合法.

不更新的後果, 就要視乎客戶端的種類. 如果是bitcoin core (前稱bitcoin-qt), 由於會檢查每一區塊的合法性, 因此不更新的後果和上述一樣, 會堅持跟隨原有的分支. 如果是輕便型的錢包, 如multibit, android bitcoin wallet, 由於他們不檢查區塊合法性, 他們是不會知道區塊的大小, 所以兩個分支對他們來說都是合法的, 他們會選擇較長的分支. 如果是在線錢包如blockchain.info, 那服務商選擇哪一個分支, 用戶就用哪一分支

但其實只要動動腦筋, 在理論上是可以用softfork提升區塊大小上限, 去年我就提出了Auxiliary block ( https://bitcointalk.org/index.php?topic=283746.0 ) 來解決這個問題, 我暫時不打算翻譯為中文了. 這做法的明顯好處是softfork, 但缺點是實行起來非常複雜, 而且輕便型錢包也必須更新, 否則是看不到擴大後的交易.

Clone this wiki locally