智能合約可以使用分叉塊嗎?
如果生成了兩個分叉的區塊 A 和 B。區塊 A 中的智能合約可以訪問區塊 B 中的交易嗎?
我知道 PoS 是通過檢查區塊中的所有權益來工作的共識算法。驗證者保留有很多權益的區塊。我想不需要訪問其他區塊的股份。我認為驗證者將每個區塊中的所有權益相加並比較兩個總權益就足夠了。
但是,我想知道 A 塊中的智能合約是否可以訪問 B 塊中的交易?
與鏈分叉相關的合約和狀態與用於達成共識的方法無關,例如 PoS、PoW 等。
在這種情況下,“共識”與建立規範的交易秩序有關。給定一組按特定順序的已知交易,那麼每個節點都可以確定狀態必須是什麼。它是確定性的,所以只有一個可能的正確答案——任何偏離它的地方都是故障節點,但網路本身對此無動於衷。
由於這兩個分叉上的交易和訂單的差異,該合約可能在兩個分叉鏈上具有不同的狀態。
考慮一個部署在區塊 10 上的簡單合約。
contract SimpleStorage { uint public x; function set(uint _x) public { x = _x; } }
偉大的。X 最初為 0。任何人都可以將其設置為其他值。
假設 Alice 和 Bob 分別向 50 和 100 發送兩筆交易
setX()
,並且他們或多或少同時進行。現在是叉子。
假設鏈 A 探勘兩個交易,Alice 首先。
x
一會兒是 50(如果有人看過的話),然後是 100,因為 Bob 再次更新了它。在區塊高度為 11 處,所有看到該區塊的節點都可以觀察到這一點。假設另一個礦工發現了第 11 個區塊,但在那個版本中,Bob 的交易排在第一位。在該版本的歷史中,結果是 x == 50。該確定得到了歷史版本的支持。
那麼,問題是哪個版本的歷史是正確的?最長的鍊式規則將解決這個問題,最終,例如第 15 塊,將有一個或另一個歷史的多個確認。一個是本來可以存在的世界,一個是我們發現自己所處的世界。
分叉之間沒有已知的通信方法。
總而言之,合約狀態類似於賬戶餘額,同樣的思考過程也適用於確認。無論發生什麼,總是有對歷史的規範描述的支持——所有發生的事情都是按照被認為是共識發生的順序發生的。
希望能幫助到你。
既然您提到 PoS,您的問題是關於未來的 Eth 2.0 信標鏈還是 Eth 1.0 中的正常合約?
Eth 1.0 中的智能合約限制了對區塊鏈數據的訪問:
- 前 255 個區塊的雜湊值
- 訪問呼叫事務的數據,而不是其他人
- 訪問自己的儲存(以前的事務可能已寫入的地方)。
可以設計一個實現挑戰-響應協議的合約,其中合約驗證分叉等塊的數據。區塊鏈數據必須由參與者提供。合約不能直接訪問數據,但它可以驗證發送給它的數據。