Steve Shadders:Bitcoin SV交易鏈長度限制將從25提升至1000

雖然用時比我們預期的久,但是Bitcoin SV節點軟件1.0.7測試版本(名爲Dynastic)終於將在1月初發布了。

我們在這次發佈的Dynastic版本上忙活了近一年,爲了解決我們此前從Bitcoin Core(BTC)那裏繼承的一個特別棘手的麻煩事。這次代碼更改很多,因此我們需要比通常的測試更加謹慎,但我相信大多數 BSV 應用程序開發者會認爲這是值得的。

在這裏插入圖片描述
上面是一個動態圖表,演示了隨着時間推移,我們向Bitcoin SV 節點提交200萬筆交易時的情況。Y 軸表示節點接受的交易數量,X軸是經歷的時間,單位爲秒(動畫演示中我們對時間進行了加速)。橙色線是v1.0.7最新測試版軟件的表現,藍色線是以前的v1.0.6軟件。在第一張圖表中,你可以看到v1.0.6和v1.0.7的表現幾乎是相同的;第二張圖中你可以看到差異開始顯現;第三圖你可以看到戲劇化的差異。

上面爲什麼有3個並列的圖表?答案就在每個圖表的上方。這三個圖表中所提交的交易分別是(祖孫)交易鏈長度爲1、50和1000的交易集。

祖孫交易鏈長度25的限制已成爲歷史!

在Bitcoin SV v1.0.7測試版中,我們將祖孫鏈默認限制長度從25提高到了1000。我們也測試過了更長的鏈,觀察到了相似的線性性能曲線。實際上,除了因爲在一個充滿敵意的環境中我們需要格外謹慎,並沒有什麼明確的理由阻止我們刪除這個限制。因此請放心,在這次將上限提升至1000幾個月後,我們就會徹底移除限制。我們認爲移除了這個限制還可以使性能略有提高,因爲不需要再計算交易鏈長度了。

話說回來,爲什麼一開始會有這個限制呢?爲什麼我們花了很久才移除它?

區塊構建的歷史

一開始,bitcoind 0.1.0版本的做法相當簡單:每隔一秒左右,它就對接收到的所有交易做一次內存映射,並檢查其中所有新的交易以確保它們滿足了最低的交易費要求;只要滿足,就將它們添加到區塊模板中,這就相當於一個有順序的、有效交易的列表。接下來計算這組交易的merkle樹,並構建一個區塊頭來開始進行工作量證明(挖礦)。這個過程可以被優化,但當時這種做法已體現出足夠高的效率,因此並沒有人對此進行不必要的優化。

隨後出現了1MB區塊大小限制和打造一個交易費市場的想法。當時的想法是,限制區塊大小將創造出對區塊空間的需求,並推高交易手續費,進而讓用戶競價交易費,以爭取自己的交易被打包入塊。這時就對比特幣軟件提出了新需求:如果一個礦工由於1MB限制無法選擇所有的可用交易,他就需要通過選擇高費率的交易來最大化他自己的挖礦收入,把利潤較低的交易留給他人後續處理。

限制區塊大小的後果

因爲限制了區塊大小,因此構建區塊的代碼變成了一個如同要對意大利麪條進行記賬的噩夢,而且基於這個限制還衍生了其它規則。選擇高費率的交易聽起來很簡單,但實際上當您有未確認的祖先交易並且出現CPFP(child-pays-for-parent)時,將會面臨大量的圖形遍歷工作和其它可怕的複雜性情況。比如每新增一個關聯交易時,基本上就需要再次遍歷與這個交易有關聯的交易圖組,這會帶來二次計算成本。進一步解釋就是,關聯交易集合越大,在集合上進行操作就越貴,結果就是速度呈指數級下降。這一點從我們上面的圖表中就可以清楚的看到,隨着關聯交易集合數量的增大,我們傳輸交易到 mempool 的速率會急劇下降。

你也可以在用Bitcoin Core、Bitcoin ABC 和舊版本的Bitcoin SV軟件生產的區塊中的交易佈局裏,觀察到這種效應——區塊中的第一個交易的交易費率最高,往交易列表的後面看,會發現交易的費率越來越低。不幸的是,這種模式消除了區塊內交易的時間順序屬性,而這是比特幣系統中一個重要的功能。

解決方案

就像我們在比特幣上面臨的大多數問題和困境一樣,解決這個問題的方法就是讓比特幣回到本來的樣子。這說起來簡單做起來難,因爲開發人員已經在代碼庫上花了12年的時間了。

2020年Bitocin SV的幾次升級軟件中包含了一些爲了解決這個問題而做的準備工作,並且已被證明可以穩定運行。v1.0.6軟件裏的技術變更最爲重要,我們用新的日誌區塊彙編程序(JBA)替換了默認的舊版區塊彙編程序(LBA)模塊,因此現在的交易判定迴歸到以下這種簡單的模式:

  • 交易是有效的嗎?答:是的
  • 這個交易支付了高於我們最低要求的費率了嗎?答:是的
  • 可以將這個交易添加到交易列表中

你可以看到,當區塊大小被假定爲無上限的時候,就沒有必要擔心一個交易的交易費相對於其他交易來說是高是低;只要這個交易的費率高於你設定的最低值,你就可以選擇它們。這使得構建區塊變得出人意料的簡單,但也對比特幣費率市場的運作模式產生了深遠的影響——從用戶競價擡高手續費轉化爲礦工(礦池)之間相互競爭、提供更低的收費標準從而鼓勵大量交易。

因爲我們上面提到的費用選擇(fee selection)邏輯與LBA緊密交織在一起,這意味着我們不可能在不破除LBA的情況下移除這個邏輯,因此明智的做法就是完全取消LBA。爲了做到這一點,我們需要確保替換了LBA的JBA是完全穩定的。此外,此前的交易費邏輯不僅涉及區塊彙編程序,它還涉及到Bitcoin SV中幾乎所有的領域,甚至會深入到非常敏感的代碼中,這其中一些代碼還將影響JBA的性能。

因此,我們在Dynastic版本中實現的最後一步就是移除了LBA,刪除了費用選擇代碼,並大大簡化了交易選擇邏輯。

無需多說大家也知道,這次的改動巨大,因此需要大量的測試。去年爲了Genesis升級,我們的QA團隊在工作中度過了聖誕假期。但今年我強制他們要在聖誕節期間休息一段時間(如果不強制休假他們可能還會繼續工作下去,他們就是如此敬業)。因此,我們將在一月初對v1.0.7測試版進行測試。

我真的很喜歡這個圖表,所以我想任性地再展示一次。因爲它不僅證明了我們解決了這個難題,還彰顯出了當我們要解決比特幣中所有擴容挑戰時必須遵循的結構原則:

在這裏插入圖片描述

  • 不要做不必要的工作;
  • 如果你認爲你需要做這個事,那就進行冷酷的自我拷問;
  • 保證圖中的線足夠徒峭。

相比Bitcoin SV節點軟件,我們此次處理的難題在Teranode中更容易被解決,因爲我們不必擔心在切除垃圾代碼的手術中可能產生的連帶破壞風險。在Teranode裏我們只要簡單的遵循中本聰原始設計原則就可以了,這也是中本聰在alpha版本代碼中就已經能做到的。

無論如何,應用開發團隊可以利用未來的幾周時間思考如何利用好更長的鏈式交易。就像我們在Genesis創世紀升級之後看到的腳本實踐大爆炸一樣,我期待着看到應用長鏈交易的創新浪潮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章