區塊鏈技術資源分享
追尋中本聰先生的腳步
?

分叉鏈、孤塊與區塊重組_作者Shdders是比特幣(BSV)擴容計劃的首席開發

分叉鏈的安全性與未分叉鏈的安全性幾乎相同,沒有交易損失或雙花,重組是比特幣的特性。

??作者:Shadders,原文標題《On forks,orphans and reorgs》,首發于www.yours.org | 2019-4-21

注:Shdders是比特幣(BSV)擴容計劃的首席開發

概要(TLDR):

  • 分叉鏈的安全性與未分叉鏈的安全性幾乎相同。
  • 沒有交易損失或雙花。
  • 重組是比特幣設計的一部分,并激勵勵更安全的零確認。
  • 該設計將分布式系統的不可靠性從一個問題轉化成一個特性。

背景

2019年4月18日,我們在比特幣 SV 區塊鏈上看到了一個有趣的事件。兩組礦工開始采礦競爭鏈,導致兩鏈重組。

Twitter上的標題數字是:重組了3個區塊,緊接著又重組了6個區塊。沒有被指出的是,6個區塊重組封裝了3個區塊重組,所以從局外人的角度來看,它就像鏈條的一部分切換到一個更長的分叉,然后一旦原來分叉變得更長,又切回去。想象一下,如果有人領先,然后又退回到第二位。

我還知道沒有報道的標題數字是:在事件中,沒有任何鏈與比另一鏈領先兩個區塊。也許更重要的是,我們很少看到關于對用戶影響的討論。

也有評論:

基于目前最大工作量的BSV 鏈,系來自分叉的所有 txid (幣基交易除外)組成的主鏈。因此,似乎沒有發生雙重花費。

什么是重組?

簡而言之,它是中本聰共識的正常組成部分。首要的是明確概念。重組是一次事件,而孤塊(或鏈)是事件的結果。早在2014年,CEX.io的報道就指出,BTC區塊鏈每天約有1-3次孤塊發生:

What is an Orphan Block?

當兩個礦工在接近同一時間發現一個區塊時,網絡就分成兩組礦工在不同區塊的高度開采。這通常在找到下一個塊時解決。其中一個競爭區塊被保留下來,因為它現在是更長鏈的一部分,而另一個成為孤塊。偶爾有兩個第二塊在接近同一時間被發現,競爭繼續,一旦第三個區塊挖出,可能有兩個區塊被孤立。

緩慢的區塊傳播會加劇這種情況。我們早些時候注意到"礦工們幾乎在同一時間發現了一個區塊"。真正重要的不是礦工找到區塊的時間,而是其他礦工看到區塊的時間。

他們將開始在他們首先看到并驗證的高度之上進行挖掘。礦工們受到高度激勵,將避免他們的區塊被孤立(如果這種情況發生,他們將失去區塊獎勵) ,同時他們也受到高度激勵去迅速傳播區塊。

用戶為什么要關心這個?

簡而言之,他們可能無需關注,這只是礦工們的問題。人們有一個普遍迷思,即認為孤塊中的交易發生了不好的事情。或者丟失了,或者雙花了?我們可以證明前者是錯誤的,而后者是如此不可能,以至于不值得擔心。我們還可以證明,從用戶的角度,分叉鏈的安全性與未分叉鏈的安全性幾乎完全相同。

然而,他們關心的一個可能原因是想理解這是如何工作的。關于比特幣如何真正安全地工作,已經錯過了過去的10年,這是一個寶貴的教訓。

重組時,節點中發生了什么?

首先需要指出,所有節點對比特幣賬本狀態的視圖略有不同。這個視圖通常被稱為 UTXO 集,我們將看到 UTXO 實際上并不是一個靜態的東西即每個塊只改變一次,它的視圖是恒定變化的。

一個節點的作業可以歸結為回答一個簡單的問題。“此交易是有效的還是無效的?” 這個問題的答案取決于他們對比特幣歷史的看法。

這段歷史由兩部分組成,一部分是節點看到的包含在最長鏈區塊中的交易,另一部分是它們看到的未驗證交易(又稱內存池)。復合視圖(請記住,這是瞬態 UTXO 集)是通過將后者疊加在前者之上獲得的。

這使得他們要回答這樣一個問題:"這筆新的交易中有哪些input是雙花的?"。

此視圖是不斷變化的,通常是為了響應看到的新交易。偶爾是為了響應重組。但是在后一種情況下,它并沒有改變太多,事實上也許根本沒有改變。

當一個節點看到一個新的最長鏈時,它會經歷重組過程。首先是回滾,然后是前滾。引擎蓋下面是這樣的:

  1. 對于孤立鏈上的每個塊(從最高的開始向后工作),它獲取該塊中的每個交易并將其放回內存池中。這些交易暫時被認為是"未經驗證的"。請注意,這些塊中不能有任何雙花,因為節點已經驗證了它們,已在其內存池的所有交易都已在歷史上經過測試,該歷史也確保了這個區塊不存在雙花。
  2. 一旦我們到達了分叉塊,我們就開始在新的最長鏈上向前工作,以通常的方式驗證新塊。對于新塊中的每個交易,我們檢查內存池中是否有該交易。如果我們這么做,它會被從內存池中驅逐出去。我們還檢查我們的內存池是否包含該交易的雙花,也將其驅逐出去

步驟1可能是最需要注意的。節點正在做的是有效地從孤塊中提取交易,以確保如果它們不在更長鏈中,不會丟失。

Bitmex 的研究證實了這種情況:

基于目前最大工作量的BSV 鏈,來自分叉的所有 txid (幣基交易除外)使其成為主鏈。因此,似乎沒有發生雙重花費。

但是,如果內存池達到了它的極限,它們就會丟失,據我所知,所有挖礦節點** 都配置了許多 GB 的內存池,因此需要大規模的重組才能發生這一事件。在未來,我們計劃將這些交易寫到磁盤上,以便在這種罕見情況下,萬一內存池確實滿了,可以回退。

因此,節點的交易歷史復合視圖可能出現的唯一變化發生在,當新的最長鏈包含了節點尚未看到的交易時。在通常情況下,這種情況應該相當罕見,但即使發生了,也不會傷害任何人。

對節點實際上如何處理重組的理解,以及"先見原則"的魔力,將我們引向了一個有趣的問題。

只需問一問礦工。

最近幾個月,我一直在談論先見規則。

如果一個礦工接受了一個交易,他們不會讓雙花交易進入內存池,即使它有更高的費用。唯一的例外是,如果他們接受了一個包含雙花的重組鏈(某些條件下它們也許不會出現在未來)。

因此,如果你想確保一筆交易即使面臨重組也不會雙花,你可以通過詢問所有的礦工來得到一個相當肯定的答案。如果您是一家理解風險 / 回報的企業,您可能不會對所有交易都這樣做,也許只是一個高價值交易的樣本。但是,如果所有的礦工都回應并告訴你,他們已經接受了這筆交易,那么即使其中一個礦工進行了重組,你的交易也將包含在分叉的兩邊。

是的,這種技術確實需要一種查詢礦工的方法,其中之一是我們目前正在開發的“商戶到礦工(merchant to miner)” API,它將在第三季度的某個時候采用,不過它也證明了解決那些關心確認數的少數用戶的問題是多么的簡單。

那么雙花呢?

只要沒有不誠實的礦工潛伏在網絡的某個地方,上述技巧就是有效的。然而,這并沒有改變雙花發生的風險,只是在你可能知道的時候改變了。在幾乎所有情形下,這都將是下一個區塊。較長時間的重組所帶來的額外風險,只有在惡意礦工正在秘密開采一個長鏈并計劃在稍后釋放時才會顯現。從邏輯上講,他們不會這么做,除非他們擁有超過51% 的哈希能力。這就是中本聰在白皮書中描述的攻擊,假設51% 的節點都是誠實的,是比特幣安全主張的基礎。因此,我們可以安全地得出這樣的結論: 因為重組而產生的雙花風險與正常情況下發生的雙花風險沒有什么不同。

在后面的帖子中,我將解釋,為什么我認為即使是這種情況也不太可能發生在比特幣 SV 網絡上,一旦在不久的將來做出一些改變。

我們能從中學到什么?

關于安全

如果有一個工具可以同時監控兩個鏈(比如交易所),這將不是一個問題。 @nikitazh 在推特上評論道:

“網絡基本上停滯了1.5個小時,這表明即使6次確認也不夠。”

我會假定Nikita是善意的,并認為這是誤解,而不是誤導。對于那些看到兩條鏈的人(兩條鏈的區塊頭都被廣播以便任何人請求區塊),最多出現一個兩區塊的高度差異。如果你可以看到你的交易包含在鏈的兩個分叉,那么重組就算有100個區塊長度也無關緊要了。在沒有另一個隱藏鏈時,無論誰贏,你的交易總能得到確認。

這只關系到那些因為選錯分叉而受到懲罰的礦工。事實上,這是這個系統的一個特征。通過激勵礦工提升自己的能力以避免這種懲罰,隨之獲得了更快地接受和傳播交易的能力,此對于確保強大的零確認安全至關重要。這就是中本聰設計的精妙之處。它解決了分布式系統設計的基礎問題,而不是試圖解決所有問題,它把這些問題與激勵結合起來,使之成為一個特性。

這次事件是關鍵是什么呢?

“分叉不是問題,要害在于選擇正確的工具"。

比特幣目前的狀態是,許多企業過于依賴節點軟件來做不該做的事情。如果你真的關心確認數(據我所知,只有交易所才真正關心確認數),那么設置你的系統,使得可以監視兩個分叉,然后從這兩個分叉中選擇一個最小的確認數作為你的決策依據。如果你想要一個健壯的系統來計算確認數,這就是所需要的。如果您正在運行一個每天處理上千萬美元規模的交易所,那么對于開發團隊,這不是一個大的要求。

另一種方法是要求更多的確認,這樣可以簡單地把責任拋回節點,除非有一個分叉比需要的確認數更長。我們不要忘記2013年發生的24個區塊重組。 那次事件是因為一個軟件錯誤。但它也可能發生于主網故障或任何其他原因,所以你得預計這種情況可能時時發生。

關于服務的延續性

在這次事件中,我們確實觀察到一件不幸的事情,那就是在比特幣 SV 區塊鏈頂端運行的一些服務跟不上。挖礦節點 * * 運行很好,盡管有點緊張,響應速度有點慢,我稍后將介紹,但其他方面都按預期工作。一些區塊瀏覽器要么停止更新,要么響應遲滯,unwriter 的一些服務在處理重組時遇到了問題。

壓力測試是有用的,因為他們聚焦了這種能力不僅及于節點軟件,還及于使用區塊鏈的服務。我們有一個持續進行壓測的地方,叫擴容測試網絡(也稱為 STN)。我借此機會邀請任何受到影響的服務在 STN 上運行其服務的測試實例。 在這些問題未成為主網的問題之前,先行聚焦,并為開發團隊提供有用的數據來幫助發現性能瓶頸。順便說一句,我們將在幾天內向開發者和企業發出正式邀請。

節點性能

前面提到過挖掘節點 * * 的行為與預期一樣,盡管速度減慢。多年來眾所周知,兩個相同大小的區塊,一個有少量的大交易,另一個有大量的小交易,將具有完全不同的性能特征,這并不奇怪。然而,這個事件凸顯了另一些問題,通過對節點性能、區塊時間和區塊大小的分析,傾向于證實我們從廣泛的研究中得出的大多數結論,即不僅僅是節點性能,更是交易和區塊的傳播性能問題。幸運的是,針對這幾個問題的修復工作已取得進展,其中一些將在6月份發布,其余大部分將在下一次發布。不幸的是,這些細節太長,本文不足容納,所以我將很快另寫帖子闡明。

* * 備注: 在本文中,我多次提到"挖礦節點",以區分向礦工提供區塊模板的比特幣 SV 實例和不向礦工提供區塊模板的比特幣 SV 實例。應該注意的是,挖礦是節點定義的一部分。 那些沒有參與挖礦的比特幣 SV 實例更適合被稱為"胖錢包(fat wallet)"或"區塊鏈監聽器(blockchainlisteners)"。

譯校:劉曄律師,上海市海上律師事務所合伙人


微博@上海劉曄律師


分叉鏈、孤塊與區塊重組_作者Shdders是比特幣(BSV)擴容計劃的首席開發

分享到:更多 ()
區塊鏈神吐槽

來評論吐槽 搶沙發

評論前必須登錄!

 

區塊鏈資源分享

韭菜的自我進化首頁更多新聞
新疆25选7开奖结果是多少钱