比特幣開發者哲學

本文為機器翻譯
展示原文

作者:Kalle Rosenbaum & Linnéa Rosenbaum

來源:https://bitcoindevphilosophy.com/#scaling

前篇見此處

scaling-banner

在本章中,我們要探索比特幣如何擴容,以及無法為它擴容的方法。我們先要看看以前人們是怎麼想這個問題的。然後,本章的主體是解釋各種為比特幣擴大吞吐量的辦法,具體來說可分為垂直擴容、水平擴容、向內擴容和分層擴容。在每一段敘述之後,都會討論這種方法是否會與比特幣的價值立場相沖突。

在比特幣世界裡,人們常常會在不同意義上使用 “擴容(scale)” 這個詞。一些人認為這個詞指的是區塊鏈交易吞吐量的提高,另一些人認為它的意思是更加高效地使用區塊鏈,還有人認為這是指開發建立在比特幣之上的系統。

在比特幣的語境下,並且也是出於本書的目的,我們將 “擴容” 定義為 “提高比特幣的可用吞吐量,而不犧牲其抗審查性 ”。這個定義概括了多種變更,比如:

  • 讓交易的輸入使用更少的字節
  • 提升簽名驗證的效率
  • 讓比特幣的點對點網絡使用更少的帶寬
  • 交易批量處理
  • 分層架構

我們很快會深入討論擴容的各種方法,但先,我們先從比特幣歷史在擴容視角下的一個簡述開始。

8.1 歷史

擴容從比特幣誕生以來就是討論的焦點。給中本聰宣佈比特幣白皮書的 Cryptography 郵件組郵件的第一封回信的最開頭段落,就是關於擴容的:

Satoshi Nakamoto wrote:
> I’ve been working on a new electronic cash system that’s fully
> peer-to-peer, with no trusted third party.
>
> The paper is available at:
> http://www.bitcoin.org/bitcoin.pdf

我們非常、非常需要這樣一個系統,但按照我對你的提案的理解,它似乎無法擴容到所需的規模。

—— James A. Donald 回覆中本聰,Cryptography 郵件組(2018)

這段討論本身可能算不上非常有趣,也不準確,但它表明,擴容從一開始就一直是人們心頭的顧慮。

關於擴容的討論在 2015 ~ 2017 年間到達頂峰,那時候有許多不同的想法,圍繞著要不要增加比特幣區塊體積的最大限制。這是相當無聊的討論,關於要不要改變源代碼中的一個參數,這種變更並不能在根本上解決任何問題,只能將擴容問題推遲一段時間來解決,這不過是在積累 “技術債”。

在 2015 年,一個叫做 “Scaling Bitcoin” 的大會在蒙特利爾(Montreal)舉辦;6 個月後,一場後續會議在香港(Hong Kong)劇本;此後還在世界各地舉辦了一連串的會議。Scaling Bitcoin 大會的關注點完全集中在如何解決擴容問題。許多比特幣開發者和狂熱愛好者聚集在這些會議中,討論多種多樣的擴容問題和提案。絕大部分討論都沒有落於提高區塊體積限制的俗套,而是關於更加長期的解決方案。

在 2015 年 12 月的香港大會後,Gregory Maxwell 總結了他對討論中的許多問題的觀點,但他的起筆是更加廣義的擴容哲學。

當前可用的技術,在擴容和去中心化之間存在根本的矛盾。如果比特幣系統的使用成本變得太高,人們就會被迫信任第三方,而不是獨立地強制執行這個系統的規則。如果比特幣區塊鏈的資源用量,相對於可得的技術,太大了,比特幣就會失去其相對於傳統系統的競爭優勢,因為驗證成本變得太高(排擠了許多用戶),從而迫使系統重新引入信任因素。如果吞吐量太低、我們構造交易的方法太過低效,訪問區塊鏈來解決糾紛的代價就會變得太高,也會將信任因素推到這個系統中。

—— Gregory Maxwell,《為比特幣系統提高吞吐量》(2015)

他講的是吞吐量和去中心化之間的矛盾。如果你允許更大的區塊,那就會吧一些推出網絡,因為他們沒有足夠多的計算機資源來驗證擴大之後的區塊。但另一方面,如果使用區塊空間變得更加昂貴,那就只有更少的人能負擔使用它作為一種爭議調解機制。不管是哪一種情況,用戶都會被推向需要信任的服務。

然後,他總結了會議上出現的許多擴容方法,包括:計算上更加高效的簽名驗證、包含了區塊體積變更的 “隔離見證(Segregated witness )” 、一種空間效率更高的區塊傳播機制,還有在比特幣上開發分層的協議。自那以來,這些方法中的多項都已經實現了。

8.2 擴容方法

如前所述,為比特幣擴大吞吐量並不必然要提高區塊體積限制或其它限制。現在,我們要列舉擴容的通用方法,其中一些並不受困於上一節提到的 吞吐量-去中心化 矛盾。

8.2.1 垂直擴容

“垂直擴容” 指的是增加處理數據的機器的計算機資源。在比特幣的語境下,這樣的機器就是全節點,也就是代表用戶驗證區塊鏈的機器。

在比特幣世界裡,被討論得最多的垂直擴容技術就是提高區塊體積限制。這將要求一些全節點升級自己的硬件,以跟上增加的計算需求。這種方法的缺點在於,它的代價是中心化,這我們已經在前面的章節中討論過了;更深入的討論在章節 1.2中文譯本)。

除了影響 “全節點去中心化” 的負面效果,垂直擴容可能也會對比特幣的 “礦工去中心化” (詳細解釋見章節 1.1中文譯本))和安全性產生負面效果,只是方式更加隱秘。我們先來看看礦工 “應該” 怎麼運營。假設一個礦工在高度 7 處挖出了一個區塊,並將這個區塊發佈到了比特幣網絡中;這個區塊需要花費一些時間才能得到網絡的廣泛接受,這其中有兩個原因:

  • 由於帶寬的限制,區塊在節點之間傳播需要時間
  • 驗證區塊也需要時間

而當這個區塊正在網絡中傳播的時候,許多礦工依然在區塊 6 的基礎上挖礦(也即依然在區塊高度 7 處挖礦),因為他們還沒收到這個,而且還沒有驗證它。如果在此期間,這些礦工中有人在區塊高度 7 處發現了一個新區塊,那就會在同一高度形成兩個競爭區塊。每個高度都只能有一個區塊得到整個網絡的認可,那就意味著這兩個候選區塊中必定有一個要被拋棄。

簡而言之,網絡中會出現這樣的 “陳腐區塊”,那是因為每一個區塊都要花時間來傳播,而傳播的時間越長,出現陳腐區塊的概率就越高。

假設區塊體積限制被解除,實際挖出的區塊的平均體積大幅提高,那區塊在網絡中的傳播速度就會變慢(因為帶寬限制和驗證時間)。傳播時間的增加也會提高出現陳腐區塊的概率。

礦工們肯定不想讓自己的區塊變成陳腐區塊,這就像煮熟的鴨子飛了,所以,他們肯定會嘗試避免這樣的情形。他們可以採取的措施包括:

  • 延遲對到來的區塊的驗證,也叫做 “無驗證挖礦(validationless mining)”(更進一步的討論在章節 9.2.4.4)。礦工可以僅檢查區塊頭的工作量證明,然後直接在後面繼續挖礦,等到下載得到完整的區塊再驗證。
  • 接入一個帶寬更大、連接更穩定的礦池。

無驗證挖礦會進一步降低全節點去中心化,因為礦工直接信任了到來的區塊 —— 至少是暫時這樣做了。它也會或多或少傷害安全性,因為可能會有一定比例的挖礦算力被用在了一條無效的區塊鏈上,而不是全部用於打造最健壯的有效區塊鏈。

上述第二點也對礦工去中心化有負面影響,詳見章節 1.1中文譯本),因為通常來說,擁有最穩定連接、最大帶寬的礦池,也就是規模最大的礦池,這讓礦工逐漸聚集成少量幾個礦池。

8.2.2 水平擴容

“水平擴容” 指的是將工作負載分散到多臺機器上的技術。雖然這是在熱門的網站和數據庫中普遍的擴容方法,但在比特幣上並不容易實現。

許多人將這種比特幣擴容方法稱作 “分片(sharding )”。基本上,它的意思是讓每個全節點只驗證區塊鏈的一部分。Peter Todd 曾經在這個概念上花費許多心思。他寫了一篇博客文章來解釋廣義上的分片,還提出了他自己的想法,叫做 “樹鏈(treechains )”。這篇文章非常難讀,但 Todd 的一些觀點是非常容易理解的。

在分片系統中,“全節點屏障” 無法生效,至少不能直接生效。根本原因在於,並不是每個人都持有所有數據,所以你必須在不是全部數據都可得的情況下確定發生了什麼。

—— Peter Todd,《為什麼用分片技術來擴容比特幣是非常困難的》(2015)

然後他提出了關於處理分片(或者說水平擴容)的許多想法。在文章末尾,他總結道:

但還有一個大問題:老天爺!XXX 相比於比特幣更加複雜!即使是分片的 “小巧” 版本 —— 我的線性化方案,不使用 zk-SNARKS 零知識證據 —— 可以也比當前正在使用的比特幣協議要複雜一到兩個數量級;而現在,這個行業的許多公司似乎都不再直接使用比特幣協議、轉而使用中心化的 API 供應商了。實際實現上述方案、把它交到終端用戶手上,不會是簡單的事。

另一方面,去中心化並不便宜:使用 PayPal 又比使用比特幣協議簡單一到兩個數量級。

—— Peter Todd,《為什麼用分片技術來擴容比特幣是非常困難的》(2015)

他的結論是,分片 可能 在技術上是可以實現的,但要讓系統增加大量的複雜性。給定許多用戶已經覺得比特幣太過複雜、偏向於使用中心化的服務了,要說服他們使用更加複雜的東西是很難的。

8.3 向內擴容

儘管水平擴容和垂直擴容都曾在中心化的系統(比如數據庫和互聯網服務器)上大放異彩,但因為其中心化效果,它們似乎並不適合比特幣這樣的去中心化系統。

一種獲得的關注少得多的方法,我們可稱為 “向內擴容(inward scaling)”,翻譯過來就是 “以少御多”。它指的是許多開發者的持續工作:優化已經在服役的算法的表現,從而我們可以在系統現有的侷限性下做得更好。

已經通過向內擴容實現的提升是讓人驚訝的 —— 這完全沒有誇張。為了給你一個基本印象,關於這些年來的提升,Jameson Lopp 曾為區塊鏈同步運行基準測試,比較了從 0.8 版本以來的 Bitcoin Core

Bitcoin-Core-Sync-Performance-1

- 圖 7. 多個版本的 `Bitcoin Core` 的初始化區塊下載的性能。Y 軸是同步到的區塊高度,X 軸是同步到該高度所花費的時間 -

不同顏色的線代表的是不同版本的 Bitcoin Core。最左邊的那條是最新版本,版本0.22,是在 2021 年 9 月發行的,花了 396 分鐘就完成了同步。最右邊的是 0.8 版本,發行於 2013 年 11 月,花了 3452 分鐘才完成同步。所有這些提升 —— 大概是 10 倍的性能 —— 都是靠向內擴容實現的。

這些提升可以歸類為節約空間(內存、磁盤、帶寬,等等)或者節約計算力。不管是哪類提升,都對上圖中的提升有幫助。

計算優化的一個好例子是 libsecp256k1 庫,這個庫(和其它部分)實現了生成和驗證電子簽名的密碼學原語。Pieter Wuille 是這個庫的貢獻者之一,他曾經發一條長推特來展示性能提升是如何在多個 PR 中實現的。

libsecp256k1speedups

- 圖 8. 簽名驗證的性能如何逐漸提升;重要的 PR 在 X 軸上標出 -

上圖展示了在兩種 64 位的 CPU 類型(ARM 和 x86)上,驗證簽名的性能變化趨勢。兩類 CPU 的性能出現區別的原因在於,x86 架構有更多的專門指令可用,而 ARM 架構可用的指令更少,更通用。然而,兩種架構上出現了同樣的趨勢。請注意,Y 軸是對數單位,這削弱了視覺上的衝擊力;實際效果會更令人驚訝。

還有許多節約空間的提升的好例子。在關於 “Taproot” 如何有助於節約空間的 Medium 博文中,Murch 比較了各種 2-of-3 閾值簽名腳本要佔用的區塊空間;在 Taproot 腳本中實現 2-of-3 閾值簽名還有多種方式。

murch-taproot

- 圖 9. 不同花費腳本的區塊空間用量;Taproot 對比更加傳統的腳本類型 -

使用原生隔離見證腳本的 2-of-3 閾值簽名需要總計 104.5 + 43 vB = 147.5 vB(虛擬字節);而最為節約空間的 Taproot 腳本只需要 57.5 + 43 vB = 100.5 vB (在標準使用場景中)。在最差勁,同時也罕見的情形中,比如一個簽名器因為某種原因而不可用的情形中,Taproot 腳本將使用 107.5 + 43 vB = 150.5 vB 。你不需要理解所有的細節,也能看出,開發者是如何思考空間節約的 —— 錙銖必較。

譯者注:Taproot 腳本在許多情況下能夠減少交易的區塊空間用量 —— 但不是以裸字節數量計量,而是以 “vB(虛擬字節)” 這個單位來計量。隔離見證升級之後,交易的不同部分(可簡單區分為交易本體數據和簽名數據)在計算區塊空間用量時會有換算的乘數,就是 vB 這個單位的來源。不過,用戶使用的腳本類型的變更,很難說因為其交易體積減小而對圖 7 所示的初始化同步速度提升有幫助,因為區塊體積不一定減小了;可能主要還是來自隔離見證及後續版本腳本的驗證運算負擔本身降低了。

除了比特幣軟件的向內擴容,還有許多方法,能讓用戶也為向內擴容作出貢獻。他們可以更加從聰明地製作交易,從而節約交易手續費,同時,還能減少他們對全節點資源的佔用。兩種常用的技術都朝向這個目標,分別叫做 “交易批量處理” 和 “輸出整合”。

交易批量處理的想法是將多筆支付組合成一筆交易,而不是各自構成一筆交易。這可以給你節約許多交易手續費,同時減少區塊空間佔用。

tx-batching

- 圖 10. 交易批量處理將多筆支付合併為一筆交易,以節約手續費 -

輸出整合的想法是利用對區塊空間需求較低的時期,將多個交易輸出合併為單個輸出。這可以在日後節約你的手續費,當你需要在區塊空間需求較高的時候發起交易。

utxo-consolidation

- 圖 11. 輸出整合。在網絡的手續費率較低時,將你的多個錢幣鑄造為一個,這樣可以在日後節約手續費 -

輸出整合如何算是內部擴容,可能並不明顯。畢竟,區塊鏈的數據可能會因為使用了這種方法而稍微增加。但是,UTXO 集,即追蹤哪個地址擁有哪個錢幣的數據庫,會因為你花費的 UTXO 多於創建的 UTXO 而收縮。這就舒緩了全節點維護 UTXO 集的負擔。

不幸的是,這兩種 UTXO 管理 技術可能損害你或者你的收款方的隱私性。在批量處理情形中,每個收款人都將知道,被批量處理的輸入都來自於你,而其它每個輸出都給了一位收款人(除了那個找零,給了你自己)。而在 UTXO 整合中,你會揭曉這些被整合的輸出都來自於同一個錢包。你可能必須在成本效率和隱私性之間作出取捨。

8.2.4 分層擴容

最有力的擴容方法可能就是 “分層” 了。分層背後的想法是,一套協議可以結算用戶之間的支付,而無需讓區塊鏈來確認他們的交易。這已經在章節 2中文譯本)和章節 3.7中文譯本)中簡要討論了。

一個分層協議的起點是,兩個或更多人同意一筆起點交易,並將它發佈到區塊鏈網絡中,如圖 12 所示。

scaling-layer

- 圖 12. 一個標準的 layer 2 協議,建立在比特幣 layer 1 之上 -

這個起點交易是如何構造的,因協議而異,但一種通用的方案是,參與者們先創建一筆待簽名的起點交易,以及一系列預簽名的懲罰交易;這些懲罰交易會以不同方式花費起點交易的輸出。然後,起點交易才收集到所有的簽名,並廣播到區塊鏈,而(保留在各用戶手上的)懲罰交易可以獲得全部簽名併發布到區塊鏈來懲罰行為不軌的參與者。這激勵各方都信守承諾,從而協議可以獲得免信任性。

一旦起點交易得到區塊確認,協議就能開始工作。比如說,它可以在參與者之間實現非常快的支付、實現一些保護隱私的技術,或者實現比特幣區塊鏈無法支持的更加高級的腳本編程。

我們不會細說各個具體的協議如何工作,但正如你可以在圖 12 中看到的,在分層協議的整個生命週期中,區塊鏈很少被用到。所有有趣的動作都發生在 鏈外 。我們已經看到了這可能會增強隱私性(如果正確實現的話),但它同時也有利於可擴展性。

在一篇標題為《登上月球需要多級火箭,不然火箭等式就會吃掉你的午餐 …… 把所有小丑模樣的人都放上投石車然後等待成功,是正確做法》的 Reddit 帖子中,Gregory Maxwell 解釋了為什麼分層是讓比特幣吞吐量擴大幾個數量級的最佳方法。

一開始,他強調了將 Visa 和 Mastercard 視為比特幣的主要競爭對手是錯誤的,以及,提高區塊體積限制是因為這樣的謬誤而提出的錯誤方法。然後,他講到了如何利用分層來真正改變局面。

所以,這是不是說,比特幣無法成為支付技術的大贏家?不是。僅僅是說,為了具備服務全世界的支付需求的那種吞吐量,我們必須更加聰明。

從一開始,比特幣就被設計成可以通過它的智能合約編程能力安全地結合各種層級(怎麼,你以為這只是為了讓人們能夠把毫無意義的 “去中心化自治組織(DAOs)” 吹成宇宙級發明嗎?)。是時候,我們將使用比特幣系統作為一種非常容易訪問、完全可信的機器人法官,然後在法庭外面管理我們的絕大部分商業 —— 只是,我們的交易方式將決定了,如果什麼事情出了錯,我們會持有所有的證據和已經建立的合同,從而確信這個機器人法庭會作出正確決定。(極客側邊注:如果這看起來是不可能的,請回頭看看這篇關於交易 cut-through 的舊文章。)

這是可能的,就因為比特幣的核心屬性。一個可審查的、可以逆轉的基礎系統,並不適合在上面開發強大的上層交易處理系統 —— 而且,如果底層資產並不可靠,用它來交易也沒有什麼意義。

—— Gregory Maxwell,r/Bitcoin on Reddit (2016)

這個法官的比喻非常形象地說明了分層的工作原理:法官必須是廉潔的,而且不能反覆無常,否則,在比特幣基礎層之上的層級也將無法可靠地工作。

他接著提出了對中心化服務的看法。通常來說,為了使用微不足道數量的比特幣,信任一個中心服務器沒有什麼問題:那也是一種分層擴容。

在 Maxwell 寫了這篇文章之後,許多新的層級出現了,他的話依然正確。閃電網絡的成功,證明了分層是提高比特幣有用性的正道。

8.3 結論

我們已經討論了多種被設想過的擴容比特幣(提高比特幣的可用吞吐量)的方法。擴容從一開始就是人們對比特幣的顧慮之一。

到了今天,我們知道了,比特幣無法很好地垂直擴容(“購買更高級的硬件”)和水平擴容(“僅驗證部分數據”),但可以內向擴容(“以少御多”)和分層擴容(“在比特幣上開發協議”)。

相关赛道:
來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論