Blockchain-Fork

如果發生比特幣硬分叉,防止重放攻擊的最佳方法是什麼?

  • July 24, 2017

我最初認為在分叉的情況下添加重放攻擊保護(改變一些關於如何生成 tx 雜湊)會相對簡單。但是 BU 的人提到這會破壞 SPV 客戶(包括許多移動錢包)。因此,儘管仍然是一種選擇,但這樣做並不是免費的。

我們集思廣益的一種解決方案是使用一些僅在一條鏈上有效的硬幣(例如新開采的硬幣),並在所有生成的交易中添加 1 satoshi 的“污點”。這會起作用,但並不完美。例如,新開采的硬幣不能用於 100 個區塊,因此至少會導致經濟節點在發生硬分叉時出現延遲。對於所有錢包軟體來說,實現這一點也很重要(相當多的工作,尤其是在規模上)。還有一個操作挑戰是你必須在硬分叉發生時急於獲得這些新開采的硬幣,所以你無法提前準備。這肯定會很混亂。

另一種選擇是嘗試在分叉鏈上雙花一些代幣(獲得一些代幣的交易,這些代幣流向跨兩條鏈開采的兩個不同地址)。然後這些硬幣也可以用於“污染”,但您不必等待完整的 100 個塊。這有點好,但仍然不完美。

我懷疑有更好的解決方案。人們的想法是什麼?

我們集思廣益的一種解決方案是使用一些僅在一條鏈上有效的硬幣(例如新開采的硬幣),並在所有生成的交易中添加 1 satoshi 的“污點”。這會起作用,但並不完美。

聽起來你有兩個問題:

  1. 如何獲得一些僅在鏈的一側有效的輸入。
  2. 如何將這些輸入與您的所有交易混合。

我對第二個問題沒有任何好的答案;您必須通過將輸入混合到您發送的每筆交易中,或者將它們與大量硬幣混合,然後將其分成數十或數百個您將正常使用的輸入。

對於第一個問題:

硬幣分裂

最好的方法是在硬分叉客戶端中推動重放保護,因為它們已經在更改規則。但如果這不可能,則鏈之間存在一些潛在差異,可用於在一條鏈上確認交易的一個版本和在另一條鏈上確認同一交易的另一個版本。

我要警告的是(1)比特幣客戶端並非設計為在持續的硬分叉下執行,因此許多通常可以正常工作的事情最終可能導致金錢損失,(2)沒有重放攻擊保護,無法保證下面的任何機制都會分割你的硬幣——所以你應該把硬幣從你自己那裡寄給你自己,這樣,如果分割失敗,你仍然擁有所有的硬幣(減去任何交易費用),並且(3)在一個硬分叉,任何規則都可以更改,因此以下通用資訊可能不適用於硬分叉鏈;請與硬分叉開發人員確認。

方法:

  1. **Coinbase 交易:**不是你公司生產的那種,而是礦工用來申請補貼和交易費用的那種。正如您的問題所表明的那樣,這些僅在生成它們的硬分叉一側有效,但它們還必須等待 100 個塊才能成熟。

優點:簡單,保證工作

缺點:需要礦工幫助,必須等待 100 個區塊 2. **nLockTime:**如果兩條鏈的高度不同,您可以創建一個將 nLockTime 設置為最長鏈高度的交易。該交易可以立即在該鏈上得到確認,但它不能添加到較短的鏈中,直到該鏈趕上相同的高度——為您提供一個時間視窗,以便在較短的鏈上廣播替代交易並拆分你的硬幣。

方便的是,Bitcoin Core 有一個名為 antifee sniping 的功能,它會自動(在目前版本中)將 nLockTime 設置為預設錢包交易的目前區塊高度,所以如果你只想拆分你的 Bitcoin Core 錢包,這個技巧非常簡單。

優點:應該非常有效,因為它取決於共識規則

缺點:你仍然需要在分叉後等待幾個區塊才能讓鏈有時間在鏈高上發散。

(圖片來源:我第一次從 Peter Todd 那裡聽說過這樣的方法;我不知道他是否發明了這種方法,也不知道這是否正是他正在考慮的方法——我不得不猜測它會如何從他那裡發揮作用只是說“使用 nLockTime”。)

你也可以用共識強制的 nSequence 做同樣的事情,但它不會給你任何額外的東西。 3. **費用差異:**有可能分叉一側的礦工在探勘交易費用低於另一側的交易,所以你可以在低費用鏈上廣播你的交易的低費用版本,等待它確認,然後在高費鏈上播出高費版。

優點:簡單

缺點:您可能仍然需要等待幾個區塊才能使費用相差很大,並且由於每個礦工都有自己的政策,您可能需要多次嘗試。此外,許多錢包不允許您選擇任意費用(它們只是給您合理的費用或讓您從合理的費用範圍中選擇)。

(信用:我今天第一次聽到 @ElectrumWallet 在 Twitter 上描述的。) 4. 找到兩條鏈上礦工之間存在分歧的其他一些功能。例如,在我寫這篇文章時,我認為預設情況下,Bitcoin Core 不會將任何需要首先探勘超過 20 個祖先的交易接受到其記憶體池中(這可以防止濫用並允許探勘程式碼更有效地執行,因為 Bitcoin Core 提供了子-支付父母(CPFP)採礦);Bitcoin Unlimited 基於舊版本的 Bitcoin Core,不提供 CPFP 優化,因此將允許無限深度的交易祖先進入記憶體池。這意味著您可以在分叉的一側開採 101 筆相關交易,然後您將有多達 5 個區塊在分叉的另一側開採不同的第 101 筆交易。

可以使用的客戶端之間可能存在其他這些中繼級別差異。

優點:中繼差異可能會在硬分叉之後立即使用,以便在第一個分叉塊(如果你知道什麼時候會發生)或第二個分叉塊(如果你從第一個分叉塊開始已生產)。此外,它們可能相當簡單。

缺點:這些技巧取決於鏈一側的所有礦工執行一個版本的程式碼,而另一側的所有礦工執行不同版本的程式碼。重疊越多,這些技巧奏效的可能性就越低。

這是我們一直在為 Zcash 考慮這個問題的 github 票。與比特幣相比,Zcash 在任何可能的區塊鏈分裂之前擁有更小的安裝基數和更長的跑道,因此我們沒有像您那樣對設計空間有那麼多限制,但儘管如此,其中一些想法可能會有所幫助:

<https://github.com/zcash/zcash/issues/174>

這是一個想法:

<https://github.com/luke-jr/bips/blob/bip-noreplay/bip-noreplay.mediawiki>

據我所知,這似乎可行,並且不會與 SPV 客戶不兼容。

引用自:https://bitcoin.stackexchange.com/questions/52210