比特幣大區塊的實驗之路
前言:大區塊相關的提案包辦了近兩年比特幣的最大爭議。從Segwit2x到BCH,再到BCH ABC 和SV,都有自己的路徑偏好。那麼,大區塊實現未來會走向何處?它會一統江湖?還是共存共榮?還是layer2勝出?每個人都有自己的答案,不同的道路都有自己的鐵粉,有自己的堅信,有自己的社群,最終來說,所有勝利的喜悅或失敗的苦澀都來自於當初自己的選擇,來自自己的認知,以及伴隨而來的,曾經堅信的那個東西。也許不用太多年,就可以看出端倪。這是一個爭議極大的問題,大家怎麼看呢?本文作者Lucas Nuzzi也有自己明確的偏好,大家自行做好判斷。本文來源於medium.com,由藍狐筆記公眾號社群“Leo”翻譯。
在比特幣十年的歷史中,提升區塊大小的相關提議有很多。即使這些提議都沒被採納,關於區塊大小的辯論依然是最具爭議、最具分裂性、最讓人心累的問題之一。如今,BCH建立一年多,還有圍繞ABC/SV的分叉衝突,權衡利弊也日益清楚。
本文會提供增加區塊大小的歷史背景。隨著時間的推移,它有顯著支持者,此外這個持續的問題引發兩次分叉。之後,我通過分析BCH的歷史及它採用的技術來對這些提案提出不同意見。最後,我提出這個論點:在沒有區塊獎勵之時,有限的區塊空間對維持比特幣安全模型和奧派經濟學的貨幣基礎至關重要。下面先簡單介紹歷史背景:
第一次區塊大戰
產生區塊大小爭議的一個促成因素是在比特幣的第一次迭代中,區塊沒有明確限制。中本聰通過一系列的隱藏提交,於2010年9月增加了比特幣1MB的上限,該隱藏提交引入MAX_BLOCK_SIZE變數。
在此之前,區塊在技術上有大約500-750kb的軟頂限制。鑑於當時交易量小且其他功能優先順序更高,區塊大小並不是比特幣早期歷史上的爭議話題。然而,隨著越來越多的開發者加入,同時開始考慮比特幣大規模採用面臨的技術挑戰,從這時起,關於擴充套件性的討論不時出現。
在中本聰推出1MB區塊大小限制不到一個月,第一個增加區塊大小的提議出現了。2010年10月,比特幣最早期的開發者之一Jeff Garzik提出把區塊大小增加7倍(7MB)的建議。大多數早期技術實施提案在成為正式的比特幣改進提案(BIP)之前,一般會先在BitcoinTalk.org上發帖。
在這個帖子上,Garzik認為“比特幣應該至少能達到Paypal的平均交易率”,並把它作為建議提出的理由。中本聰是最早回覆該帖子的人之一,他警告Garzik不要實施該擴容提案,因為“它會讓你跟網路不相容,對你無益。”
後來的討論顯示,中本聰並不完全反對擴容。然而,當提及潛在實施時,他暗示這種變化必須逐步推出。在一篇短文中,他表示,當舊的比特幣客戶端在網路中成為少數時,區塊擴容可看作是“未來版本”,從而阻止分叉。
兩個月後,中本聰在BitcoinTalk.org上發表最後一篇帖子後消失。鑑於客戶端層面要完成的工作量,開發者們在接下來的幾年主要把精力放在安全性和可靠性,大區塊的潛在實施並不是當時的優先要務。
三年後,也即是在2013年,當絲綢之路和Satoshi Dice等服務讓鏈上交易增加時,可擴充套件性的話題再次浮出水面。正當關於可擴充套件方案的辯論被重新點燃時,絲綢之路的關閉以及緊接著門頭溝事件的爆發讓大區塊提議沒有進入正式提案。
比特幣價格崩潰,2014一整年都處於熊市。儘管如此,鏈上交易的數量還是幾乎翻了一倍,這導致交易費用的增加。到2015年初,交易量達到當時的歷史最高水平,區塊大小的爭議再次成為人們關注的焦點。然而,這次並沒有像之前一樣“曇花一現”,它在接下來的三年一直都是焦點。
2015年7月,Jeff Garzik提出BIP100的提案,提出由礦工投票的動態最大區塊大小的方案,這是第一個關於大區塊的比特幣改進提案。除了增加區塊大小之外,正如Garzik在2010年初的提議,BIP提出可調整的區塊大小,範圍從1MB到32MB之間,由礦工投票動態確定。
在該系統下,礦工使用區塊頭在預定時間間隔內對區塊大小的增減進行投票。75%的絕大多數礦工投票才能擴容,並且每次擴容不能超過前一區塊的5%大小。在接下來的幾個月,BIP100受到社群內重要成員的高度重視,他們認為,考慮到區塊大小的範圍很大,交易費用的波動會導致比特幣價格的更大波動,甚至會出現網路攻擊的可能性,原因是頻繁的雜湊率流入和流出。
BIP提案的評論者中有一位是Gavin Andresen,中本聰精心挑選的繼任者,他希望區塊變化是可預測的,他反對給予礦工更大的權力。他也提出了自己的提案BIP101,該提案希望通過演算法把區塊增加至8MB,計劃每兩年增加一倍。隨著各種競爭提案的權衡變得清晰,比特幣社群陷入嚴重分歧。
由此產生了三種相互競爭的利益集團,直至今日依然存在。1)礦工極端主義者,他們希望礦工能夠根據需要增加區塊大小 2)業務極端主義者,他們關心技術的擴充套件性 3)硬分叉最小主義者,他們反對任何貨幣政策的改變。
不出所料,當時大部分雜湊率表示支援Garzik的BIP100,而大多數比特幣業務公司支援Andresen的BIP101。兩個派別之間還有使用者和開發者社群,他們中的大多數認為硬分叉不是一個好主意。一些開發者開始強調,增加區塊大小隻是臨時解決方案,其他解決方案是大規模採用的方法,比如支付通道和側鏈。比特幣有單執行緒特性,即所有交易必須由所有節點進行規範驗證,這種情況下不可避免地出現延遲,尤其是作為大規模交換媒介的情況,即使出現千兆位元組的區塊也如此。
社群反對硬分叉。Gavin Andresen與另外一位知名的比特幣開發者Mike Hearn對Bitcoin Core開發者們反對BIP101感到沮喪。兩人都在開發Bitcoin Core客戶端的可替代客戶端,叫Bitcoin XT,Bitcoin XT客戶端已經激活了BIP101。
局勢變得緊張,很明顯,硬分叉的可能性已經出現,兩個競爭性網路隨時都會成為選擇。2015年11月,當Mike Hearn指責Blockstream時,緊張局勢進一步升級。Blockstream由不少Bitcoin Core開發者們建立,它意在反對區塊擴容,推出自己的側鏈解決方案。
對BIP101的反對歷經了幾個月,到2015年底,該提案几乎無法實施。儘管如此,Andresen 和Hearn依然在推動Bitcoin XT客戶端的採用,Bitcoin XT帶有BIP101。2015年12月,在XT客戶端釋出後幾個月,它的網路遭受了大規模DDoS攻擊,可能是BIP的對手設計實施。這種無休止的攻擊阻礙了XT節點長達數週的通訊,這有效地殺死了網路。
2016年1月,Hearn釋出了“比特幣實驗解決方案”一文,並宣稱比特幣已經死亡,因為它沒能接受大區塊。本文的標題名稱有模仿Hearn的這篇文章,因為我堅信採用更大的區塊(通過BIP101或其他方法),可能會破壞比特幣的長期價值主張。
第二次區塊大戰
具有諷刺意味的是,在距離Hearn離職和Bitcoin XT解散一年還不到,讓人心累的區塊大小爭議又重新出現。這次出來的是隔離見證方案,它可以在不增加區塊大小情況下實現效率提升,同時它還可以作為Layer 2解決方案的必需路徑,因為它還可解決交易延展性的問題。然而,它的方案啟用面臨阻力,這是來自於上一次區塊大戰中被遺忘的派別:支援BIP100的礦工們。
這些礦工試圖跟Bitcoin Core開發者們達成妥協,並在2016年2月舉行會議。在會上,礦工們表示如果區塊大小增加到2MB,他們才會啟用Segwit。該協議後來被稱為“香港協議”。這次會談被記錄為“比特幣圓桌會議共識”,這是在2016全年都廣受討論的話題。風暴正在醞釀,困擾比特幣開發近三年的基礎爭議又回來了。不幸的是,這個爭論再次分裂社群,讓人們遠離比特幣。
在2017年5月共識大會期間,舉行了一次閉門會議,會議權衡比特幣礦工和商用企業對SegWit的立場。跟2016年香港協議一樣,他們要求啟用SegWit並把區塊大小增加到2 MB,即所謂的“紐約協議”。截止到2017年5月底,只有不到20%的礦工表示他們會在不增加區塊大小情況下接受Segwit。2MB版本的SegWit後來以“SegWit2x”而著稱,它的區塊高度受到絕大多數比特幣商業企業和80%以上的網路雜湊率支援。
與此同時,一些大區塊支持者開始活動以拒絕SegWit。他們的非官方領袖是Bitcoin.com的CEO Roger Ver,他能夠吸引一些SegWit2x的重要支持者,如Bitmain,以支援完全拒絕SegWit的硬分叉。為此,Ver支援比特幣的替代客戶端 Bitcoin ABC(可調整區塊大小上限),同時宣佈硬分叉,他們稱之為Bitcoin Cash。其他替代的實施,比如Bitcoin Unlimited,緊隨其後,硬分叉迫在眉睫。同年,Bitcoin XT也復活,並激活對更大區塊的支援。
比特幣現金(BCH)的誕生
2017年8月1日,Bitcoin Cash分叉了比特幣。它的實施有一個變化是難度重新調整,導致分叉後的雜湊率下降。它的演算法被稱為EDA(緊急難度調整),顧名思義,它在分叉後立即調整比特幣現金的挖礦難度。考慮到分叉後只有少數礦工分配雜湊算力到BCH,同時依然是每隔10分鐘左右出塊,所以這種調整是非常有必要的。不出所料,EDA成功地重新調整了難度,第一個BCH區塊由ViaBCT在比特幣區塊478558後6個小時挖出。
在8月份,像Antpool、F2Pool以及BTC.COM開始支援BCH。在此期間,BCH的價格和它的雜湊率波動都很大,分叉後只有很少的交易所立即上市了BCH交易。跟Gavin Andresen 的BIP101一樣,BCH最初的區塊大小上限為8MB,但它從來未達到上限。分叉後不久,Roger Ver恢復了他的活動,以削弱比特幣技術,比如閃電網路和Blockstream的Liquid。
與此同時,SegWit2X再次分裂了網路。2X分叉計劃於2017年11月16日進行,但在11月8日,有訊息說它已被暫停。在Mike Belshe(BitGo執行長)的一封電子郵件中,他代表Wences Casares(Xapo),Jihan Wu(Bitmain),Jeff Garzik(Bloq),Peter Smith(Blockchain.com)和Erik Voorhees(Shapeshift.io)宣佈“我們目前尚未就區塊大小升級建立起足夠的共識。繼續走當前道路可能會分裂社群並對比特幣增長造成挫折。這絕不是SegWit2x的目標。”
隨著2x的消亡,價格顯示了一些預期,即2x的支持者們可能接受了BCH,但事實並非如此。2017年第四季度是加密資產全面反彈時期,所以,有這麼一個時候,比特幣和比特幣現金共存,沒有出現大的爭議。礦工支援BCH,然而大多數網路依然留在比特幣上,兩個網路都有大量資金流入。這種過程在某種程度上改變了社群對分叉的看法,這與BCH的鏈分叉有關。
其他硬分叉
鑑於BTC和BCH在硬分叉之後經歷的價格波動,BCH的雜湊率缺乏足夠的穩定性。跟其他使用SHA-256的加密貨幣一樣,BCH經歷了大量的雜湊算力的流入和流出。雖然其網路中的交易規模不大,但BCH出塊不穩定且確認時間長。事實證明,EDA對它也有反作用。當比特幣價格飆升時,礦工把算力從BCH轉入比特幣,反過來也一樣,不斷引發算力調整。
比特幣不太容易受到流出的影響,因為它的雜湊率要高出幾個數量級,但比特幣現金則不同,它每次算力的流出,都會引發EDA和出塊不穩定。結果是,在創造比特幣現金的硬分叉後不到三個月,Bitcoin ABC背後的開發人員決定於11月13日再次分叉,以取消啟用EDA,同時用更具響應性的演算法取而代之。新演算法設計為每600秒重新調整一次難度,它是基於分配給之前144個區塊的雜湊率來進行,而它跟當初的EDA所實施的不同,當初的調整是每12個小時進行一次。
11月13日的硬分叉引入了新的難度調整演算法,這也標誌著硬分叉計劃的開始,以實現根據需要的新增和刪除功能。BCH開發者社群保證每六個月對協議進行一次硬分叉,以不斷為協議新增功能。儘管其網路中的交易規模不大,但比特幣現金依然在2018年5月再次硬分叉,以支援32MB區塊。這次硬分叉還重新激活了一組操作碼,該組操作碼曾出現在比特幣第一個版本中,後來基於安全考慮,它們在2013年被停用。操作碼是比特幣網路支援的機器級操作,例如OP_ADD和OP_MUL。
結合起來,比特幣支援的所有操作碼都可用於設計演算法並構成比特幣的本地指令碼語言。這種語言通常稱為指令碼。指令碼基於Forth;基於堆疊的指令式程式設計語言允許簡單但綜合的計算機程式。例如,可以建立程式,以便如果(OP_IF)某個語句為真,則觸發一個函式。相反,如果其他內容為真(OP_ELSE),則可以觸發其他函式。由此,雖然比特幣沒有圖靈完備,但依然可以使用該語言建立基本智慧合約。
不幸的是,指令碼功能也伴隨著嚴重的利弊權衡。在比特幣第一次迭代中已停用的OP_CODES被新增到BCH,它證明是不必要的攻擊向量,如果被利用,可能會導致整個網路崩潰。例如,OP_CAT,它最初的設想是能支援開發人員連線兩個字串以及連結資料點,如簽名。
但是,OP_CAT也可被用來通過溢位交易建立大規模DoS攻擊。攻擊者可使用OP_CAT連線兩個隨機字串,然後,使用OP_DUP(複製)來無限複製該字串。下面展示了漏洞被利用情況:
每輪OP_DUP與OP_CAT相結合,導致堆疊大小翻倍。如果被利用,這些操作的組合將導致指數級的記憶體使用,並且網路中的所有節點會在計算交易時崩潰。當這個漏洞於2013年被曝光後,它的重要性開始得到更好理解,核心開發者決定停用一些可能導致這類攻擊的操作碼。
由於沒有簡單方法來解決指數級記憶體使用的漏洞,即使簡單的操作碼如OP_MUL也被停用。在BCH硬分叉後,它的支持者們,尤其是Roger Ver,則對此有不同看法。他認為功能之所以被限制,是因為Blockstream有自己的議程,是為了推它的側鏈計劃,以提供它的智慧合約服務。在為重新啟用這些操作碼遊說之後,Bitcoin ABC於2018年5月把這些操作碼新增進入客戶端。
除了重新啟用這些有爭議的操作碼之外,ABC和Bitcoin Unlimited的開發人員也開始探索建立更多的操作碼,以實現更多的功能。這在社群引發很大爭議,並引起CSW的嚴厲批評。在BCH硬分叉之前,CSW已經讚揚ABC的措施,這些措施要降低費用,而實際上網路中的交易規模還不大,這更多是缺少交易而不是大區塊的結果。
然而,他當時參與有限。但在2017年9月,CSW在香港會議上與Jihan Wu(Bitmain CEO),Roger Ver(Bitcoin.com CEO)以及Haipo Yang(ViaBTC CEO)建立聯絡,並聲稱支援比特幣現金。Ver和其他支持者抓住這次機會,並讓CSW成為2018年比特幣現金背後的主要人物之一。
雜湊戰爭的前奏
這也讓CSW有機會對BCH的發展道路提出更多積極的建議,而當新功能被提出時,CSW明確表示他完全反對引入更多操作碼。不出所料,當Bitcoin ABC的開發人員無視他的建議時,事情開始有了爭議。根據CSW的建議,ABC開發人員推動增加的功能從來不是原始規範的一部分,稱為OP_CHECKDATASIGVERIFY或OP_DSV的操作碼。此外,他們還建議在協議中新增規範的交易排序,這是2014年由Gavin Andresen 提出的建議,目的是優化區塊傳播以及其他一些小的改動。
在宣佈要增加操作碼之後,CSW在推特上表示反對,特別是DSV,他表示:
“OP_CHECKDATASIGVERIFY 沒有發生——如果某個ABC開發人員希望推動它,那麼,我們將只為替代者提供資金——相信我——還有其他人。”——CSW
他所指的開發者是Andrew Stone,他一直在研究如何為BCH智慧合約改進指令碼。
為什麼OP_DSV 有爭議?
DSV允許網路驗證任意資料字串的有效性,從而使BCH智慧合約可以驗證外部來源的資料。正如比特幣使用OP_CHECKSIG一樣,它驗證了數字簽名的有效性,DSV也使用ECC(橢圓曲線加密)來驗證表示為簽名的資訊。該資訊可以作為發生在另外網路的交易證明,或者是通過外部預言機報告的事件結果。
雖然DSV所要求的ECC在理論上可以通過使用比特幣現有的操作碼集來實現,但操作所需的指令碼會在區塊鏈上佔用大量空間,每個驗證輪可達1MB。DSV通過在協議本地的單個操作碼中執行所有的底層操作來解決這個問題。單個操作碼大大地降低了執行成本以及需要儲存在鏈中的資訊量。
表面上看,Bitcoin ABC決定將所有OP_DSV的底層操作表示為單個操作碼,這導致SV派別的產生,他們把OP_DSV 視為“補貼”。
如果它是使用比特幣本地指令碼實現,則DSV需要大量計算,對一些礦工來說,這讓更少空間需求的單個操作“會變得不公平”(根據SV聯盟的說法)。作為單個操作碼,使用DSV的合約將支付簡單操作(如OP_MUL)相同的費用,雖然它有更高的計算要求。問題的實質是,跟以太坊不同,BCH並不採用染色gas的概念,由此操作成本在理論上與計算它的時間成正比。
相反,BCH中的智慧合約和指令碼遵循相同的基本價格:每交易位元組1聰。這實際上意味著DSV的底層操作執行單一操作碼的成本更低,而使用比特幣的指令碼實現則成本更高。考慮一下,如果通過指令碼實現,整個DSV指令碼可能會需要1MB(或1M聰),按當前價格,要花費大約2.89美元的交易費。相反,OP_DSV的定價是1聰,只需幾分錢。雖然比特幣ABC認為這是改進,而比特幣SV則把2.89美元視為補貼,它會直接影響礦工的盈利能力。
如果我們退一步看,這個問題實質是通過單一操作碼來補償計算成本,這個操作碼鏈外計算所有底層DSV操作(僅在鏈上儲存結果),而不是通過多個操作碼,多個操作碼則用指令碼實現DSV,並將所有操作和結果儲存在鏈上。然而,將DSV視為補貼的問題在於,它意味著會給礦工帶來成本,而不僅是機會,因為不得不將DSV作為單個操作碼來計算。然而,實際上,這些成本不僅可以忽略不計,與1MB指令碼的負外部性相比,它們顯得蒼白無力。(譯註:外部性的概念由經濟學家馬歇爾和庇古於20世紀初提出,主要指一個經濟主體(生產者或消費者)在自己的活動中對其他主體的福利產生了一種有利影響或不利影響,部分類似於溢位效應。如工廠排放汙染物是負外部性,會有社會治理的成本,對周圍人健康有危害等。教育是正外部性,為社會培養系統人才。)
DSV所需的ECC可以在TI-84上計算,它的要求並不會以有意義方式給礦工造成負擔。由此,除了CoinGeek聯盟之外,其他多數礦工都支援ABC的硬分叉。
更大區塊不是好主意
儘管區塊擴容可能暫時緩解網路交易的擁堵,但它不是一個有意義的長期解決方案。假設比特幣持續增長和被廣為接受,區塊最終會填滿。然而,區塊大小之爭會持續很長時間,BCH是值得關注的有趣實驗。
經過四年的爭論,關於更大區塊的利弊權衡,大家有了更清晰的認識。一方面,更大區塊允許在鏈上處理更多交易。但另外一方面,它們是臨時解決方案,從長遠看,這會極大地影響網路。通過硬分叉增加區塊大小會影響很多不同方面,下面的四個原因讓我們相信它不是可行的長期解決方案:
1.它們是臨時解決方案
區塊大小增加被視為是垂直可伸縮性的解決方案,因為它們沒有規避所有節點規範地處理所有交易的要求。如果加密資產要進入大規模主流人群,吞吐量勢必要求水平擴充套件方案,這才可以持續增加交易容量。這包括使用已經部署的技術,例如閃電網路支付通道和Liquid側鏈,它們允許並行處理。僅僅增加區塊上限會有限度,只是臨時解決方案。
無論你增加多少個車道,車流量都會趕上來
2.更大的區塊很難傳播
在比特幣基本線路協議(基於TCP/IP)下,更大的區塊顯然更難傳播。在十分鐘的區塊視窗下,32MB區塊會花費很長時間才能從中國礦工傳播到美國的一個節點。128MB區塊傳播到其他節點會非常繁重,即便使用更有效率的傳播技術,如石墨烯,這進一步把中心化引入系統。
結果是,礦工會產生更高比率的孤塊,有效區塊沒能新增到鏈上,因為沒有及時快速廣播出去。因此,鏈必須更加頻繁地進行重組,這開啟了雙花攻擊的可能性。
3.節點數減少降低了網路安全性
每十分鐘有128MB區塊,這樣每天將產生18.4G的資料,每週129,每月0.5TB。執行全節點比特幣客戶端的使用者需要儲存區塊鏈的完整副本,並承擔執行軟體的儲存成本。有了128MB的區塊,高階使用者將無法執行全節點,甚至對於公司來說,使用雲端計算來執行也是非常貴的。
比特幣區塊鏈的當前目錄大小是190GB,這讓大多數個人計算機能夠執行。但是,如果區塊大小翻倍,比特幣目錄大小將成比例增長,而從增加使用者儲存成本。因此,更少使用者能夠執行全節點,從而加劇礦工的中心化,這與比特幣的分散式理念是相矛盾的。
4.如果沒有Coinbase會發生什麼?
比特幣的PoW是一種有效的安全機制,它有10年的歷史,它為比特幣99.99%服務正常執行做出了貢獻。礦工集體投入算力來解決計算密集型難題,這個過程讓民族國家這樣的實體攻擊網路變得困難。在PoW中,網路安全維持通過區塊獎勵得到補貼,這會激勵礦工一直挖礦,即使網路上沒有交易。獎勵數量每四年減半,到2140年會變成0。
到那時,網路有足夠高的交易費用,可以讓礦工繼續貢獻算力。否則,比特幣挖礦將無利可圖,雜湊率會下降,這會帶來很大的安全漏洞。更大的區塊會減少費用,增加區塊空間供應,這會讓費用市場更難發展。(譯註:更大的區塊會減少費用?)
另外一方面,如果我們假定大多數交易都發生在閃電網路支付通道或Liquid側鏈上,那麼,只有大額的交易才會在鏈上發生,這是一個讓費用市場更可行的模型。(譯註:這裡缺乏足夠詳細的說明)
BCH分叉標誌著大區塊實驗的解決方案
我懷疑SegWit2x是獲得大規模採用的最後一個大區塊提案。正如BCH短暫的歷史所展示的,社群購買更大區塊的代幣往往是基於個性魅力而不是事實。不可避免,當這些個性人物存在爭議時,硬分叉給不同看法的人提供一個解決之路:那就硬分叉來解決吧。這是唯一的死亡螺旋,破壞“正確貨幣”價值的死亡螺旋。(譯註:這裡的說法可能會有較大爭議。)
如果貨幣的歷史告訴我們什麼,那就是當一個社會可以選擇擴大其貨幣基礎,那麼,最終會在某個時點採用這種選擇。在比特幣中,硬分叉提供了這個選擇,這也是評估其不可篡改特性的另外一個原因。閃電網路在2018年證明了可擴充套件性是可能的,它不需要具有長期負面影響的浮躁決策。
------