如果兩種不同狀態的智能合約發生衝突會怎樣?
我是學習區塊鍊和乙太坊的新手。在我學習的時候,我有一個問題。
如果智能合約的兩個不同狀態發生衝突,例如 eclipse 等網路分區攻擊,會發生什麼情況?
從網路分區攻擊來看,乙太坊網路將被分成兩組,智能合約的狀態將進入兩種不同的狀態。我想知道,在攻擊結束後,為了達成共識,解決乙太坊衝突會發生什麼?
自從比特幣出現以來,人們一直在解釋這一點,但一開始有點難以理解,通常需要從幾個角度進行一些解釋,所以我將嘗試對你的具體問題進行概述。
當我對一些概念進行分層時,請耐心等待。
區塊鏈共識主要關注通過去中心化的方法就大致同時交易的順序達成一致,而不參考外部時鐘或其他中心化參與者。問題是由於網路延遲,通過網路廣播的交易以稍微不同的順序到達節點。挑戰是不可避免的,因為我們不能讓一切都比其他一切都快。發現的實時順序對每個節點都是主觀的。
我們不能使用時間戳,因為這需要一個關於“正確”時間的集中權威來源。在像乙太坊這樣的工作量證明系統中,礦工在很短的時間內贏得了決定交易的規範順序以及哪個交易“使其”進入區塊的特權。獲得這種特權是昂貴和困難的,特別是在設計上要長期保持這種特權是昂貴和困難的。這有助於減輕可能的特權濫用,例如審查 - 不合理地阻止與礦工不喜歡的人之間的交易。
事務本身始終是確定性的。也就是說,給定相同的初始條件和相同的輸入,結果總是相同的。這意味著賬戶和合約的“狀態”可以從交易序列一直到開始計算。任何事情都不是交易,因此所有節點都可以通過以正確的順序重放所有交易來自行計算狀態。這就是節點同步時發生的情況(拋開快速同步和其他快捷方式)。
您描述的情況是鏈頭的正常事件。礦工可以在不知道其他礦工已經做過的情況下找到適用於區塊的隨機數。來自兩個礦工的區塊將通過網路傳播(八卦),他們會有兩種不同的想法。它可能是不同順序的相同事務或不同事務。無論如何,這兩種狀態都會有分歧。
我認為重要的是要理解這兩種狀態都是“有效的”,因為如果一個狀態無效,節點就會拒絕它。因此,在所有分歧的情況下,每一個都是對未決交易、探勘區塊等的有效解釋。事實上,礦工將開始在兩條鏈上進行挖礦。這種情況由最長鏈規則解決。當一個節點聽到兩條鏈時,它們通常遵循最長的鏈。他們“通常”這樣做是因為他們知道其他人都會這樣做。我不會說“總是”,因為沒有人控制其他節點的行為。
這種分歧不一定會立即解決,但最終,一條鏈會比另一條長,礦工將開始跟隨它,節點將聽到更長的鏈(最高塊數)並看到它是有效的。
對於某些節點,這意味著重組。他們必須拋棄關於某些區塊的舊觀念,接受規範區塊,並重新計算發生了什麼。這是他們與大多數網路達成共識的唯一方式,這也是他們想要的。
您不必在契約中做任何特別的事情來處理這個問題。區塊鍊和合約始終是內部一致的。有輸入的歷史和必須從這些輸入中產生的一組結果,因為它是對歷史的唯一正確解釋。在內部,如果合約收到並發送了一些東西,然後歷史被修改並且交易還沒有被探勘(在修改後的歷史中),沒有任何東西放錯地方,因為沒有發生任何事情。
從外部的角度來看,歷史和狀態可能會發生變化,因此等待確認很重要。隨著每個區塊的開採,可能的重組機率呈指數下降。因此,如果您在鏈外世界並考慮用現金換取乙太幣或合約指示的東西,最好等待幾個區塊堆積起來,這樣您就可以查看合約是否仍然顯示您已獲得報酬。
在你描述的場景中,這將是一次大規模的重組。包括合約在內的鏈上狀態將是內部一致的,但不一定是少數節點認為的那樣。雖然這聽起來有點可怕,但交易有可能不會失去。
在正常分叉中,各地的節點都知道大部分待處理的交易(受傳播延遲的影響)。當兩個礦工找到同一個區塊時,他們可能會選擇不同的交易或對交易進行不同的排序,但如果一個區塊被拒絕,待處理的交易不會失去——前提是每個人仍然知道它們,這樣礦工就可以將它們包含在以後的區塊中。
如果中斷持續很長時間,那麼兩個網路的成員都會假設交易已被探勘(他們已經在區塊中看到它們)並將它們從待處理的池中丟棄。當網路重新組合在一起時,就會失去交易。就好像它們從未發生過一樣。
這樣的情況會給以為自己是同步的,沒想到這麼大規模的重組是可能的外部系統帶來很多不便。如果一個人正在做非常嚴肅的事情,建議提前預測可能性並創建自動響應。節點可以接收“已取消”事件,這些事件表明先前報告的事件實際上並沒有因為重組而發生。這是一個 gimme,你不必在你的合約程式碼中處理。如果你的合約似乎發出了一個事件,可能是伺服器或客戶端做某事,如果/當重組使早期的發射無效時,該節點將包含一個相應的“取消”事件。當然,聽眾需要知道該怎麼做。
希望能幫助到你。