比特幣程式碼在去中心化系統中究竟是如何發生變化的
長期以來,我一直認為比特幣只是一個“協議”或“契約”。不同的節點在不同的硬體上執行自己的實現。有些是高效的,有些不是,它們必須同意比特幣協議才能執行在這個生態系統中。
但我發現實際上有一個經常更新的集中式比特幣程式碼庫!他們甚至如何確保每個節點都更新到最新的程式碼?他們如何確保程式碼可以針對每個硬體進行編譯?或者,我想最重要的是,歷史中是否存在任何向後不兼容的更改,需要每個節點都進行更新?
長期以來,我一直認為比特幣只是一個“協議”或“契約”。不同的節點在不同的硬體上執行自己的實現。有些是高效的,有些不是,它們必須同意比特幣協議才能執行在這個生態系統中。
這是正確的。有許多節點、錢包和其他各種使用 P2P 協議的軟體的實現。
有一些可選的特性,以及添加到協議中的新東西,但這些幾乎都是以兼容的方式完成的:在支持它們的對等方之間進行協商,而在不支持它們的對等方之間回退到舊的替代方案。
其中一部分是通過協議版本協商的,該版本過去只是比特幣客戶端的版本號,但自2011 年12 月以來,這些都是分開的。
如今,大多數比特幣協議實現都兼容比特幣 0.2.10 版本(從 2010 年 6 月開始,當時只有一個實現),當時校驗和被添加到協議中。使用協議適配器(一個同時使用舊版本和新版本的節點),今天編寫的軟體甚至可以使用第一個程式碼(比特幣 0.1.0,2009 年 1 月)。
但我發現實際上有一個經常更新的集中式比特幣程式碼庫!
比特幣核心是一個項目,它維護一個由 Satoshi 原始程式碼庫演變而來的實現。它通常被稱為參考實現,以及開發的焦點。然而,它不是唯一的實現,甚至不是唯一的完全驗證節點實現,並且它不決定協議規則是什麼(儘管有一些可選的協議特性只在比特幣核心中實現)。
他們甚至如何確保每個節點都更新到最新的程式碼?
他們沒有;嚴格來說沒有必要。協議規則和關於哪些塊有效的規則並沒有真正改變。更新有充分的理由(例如安全性改進、速度改進、新功能),但這是每個人的個人選擇。比特幣核心非常刻意地沒有自動更新功能,因為這被認為給客戶端維護者過多的網路控制權。
他們如何確保程式碼可以針對每個硬體進行編譯?
廣泛的持續集成測試。所有程式碼更改都在各種平台上進行測試,包括 Windows、MacOS、Linux(用於 ARM32、ARM64、x86_64、RISC-V、POWER),最近還包括 Android。更多系統可能會工作,但不能保證。
或者,我想最重要的是,歷史中是否存在任何向後不兼容的更改,需要每個節點都進行更新?
是的,但它們非常罕見(現在是古代歷史)。
比特幣 0.2.9(協議版本 209)在每個協議消息中引入了校驗和。最初這些是協商的,就像其他協議功能一樣。然而,比特幣 0.2.10(2010 年 6 月)實現了該功能,因此自 2012 年 2 月起,校驗和將成為強制性的 - 並包含在用於協商版本本身的消息中。這意味著到 2012 年 2 月,0.2.9 之前的節點軟體停止工作。
不兼容的另一個來源是網路的共識規則。這些是確定哪些交易和區塊有效的規則,也是系統中最複雜的部分。整個網路必須以相同的方式有效地實現它們,否則存在網路分裂成不同貨幣的風險。如果您想了解更多資訊,此站點上有很多關於此主題的問題,但簡短的總結是,對這些規則的幾乎所有更改現在都是作為所謂的“軟分叉”完成的:只收緊哪些區塊有效的規則,這意味著只要大多數雜湊率也執行這些規則,網路就不會出現分裂。其他更改稱為硬分叉,除了 2013 年有爭議的更改(由於數據庫層的更改,請參閱BIP 50),自 2010 年 8 月以來沒有任何這些。有關更多資訊,請參閱<https://blog.bitmex.com/bitcoins-consensus-forks/>。
免責聲明:我是 Bitcoin Core 的貢獻者和維護者,並參與了提到的一些更改。協議 209 校驗和更改早於我的時間。