區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

區塊鏈 設計 區塊鏈研究實驗室 2019-06-01

當然,對於保管鏈的證明是沒有用的,除非它也可以傳遞給主鏈以保證資金的安全。鏈上接受證明的機制是Plasma安全模型的核心,被稱為“退出博弈”。

當用戶想把他們的錢從Plasma鏈上轉移出去時,這會打開一個爭議期。在爭議期結束時,如果沒有未解決的爭議,款項將從主鏈上的Plasma合同發送給退出者。在爭議期間,用戶可以提交“挑戰”,聲稱退出的資金不屬於退出的人。上面描述的證據保證對這些挑戰的“反應”總是可以計算的。

退出遊戲的目標是確保資金的安全,即使是在一個最大的對手的情況下。特別是,我們必須緩解三種主要攻擊:

  1. 數據預扣:操作員可以向智能合約公開根哈希,但不能告訴任何人關於塊的內容。
  2. 偽造/無效的交易:操作員可以在一個塊中包括一個交易,該塊的發送者不是監管鏈中的前一個接收者。
  3. 審查:在某人存入資金後,操作員可以拒絕發佈任何匯款交易。


在所有這些情況下,退出遊戲的挑戰/響應協議確保這些行為不允許盜竊,最多1個挑戰後1個響應。

跟蹤存款與退出

存款映射

每次存放一組新硬幣時,合同都會更新一個映射,每個映射都包含一個存款結構。從合同中:

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

請注意,此結構既不包含存款的untypedEnd或tokenType。那是因為合同使用這些值作為映射映射中的鍵。例如,訪問給定存款的存款人的訪問如下所示:someDepositer:address = self.deposits [tokenType] [untypedEnd] .depositer

這一選擇節省了一點gas,也使一些代碼更乾淨,因為我們不需要存儲任何類型的存款ID來引用存款。

現有的範圍映射

除了在每次有存款時添加self.deposit s條目之外,合同還需要以某種方式跟蹤歷史出口,以防止同一範圍內的多個出口。這有點棘手,因為出口不會像存款那樣按順序出現,而且搜索出口列表會很昂貴。

我們的合約實現了一個常量大小的解決方案,它存儲一個可存在範圍的列表,並在出現新的出口時更新該列表。從智能合約:

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

同樣,我們使用帶有tokenType和untypedEnd鍵的雙嵌套映射,以便我們可以調用self.exitable [tokenType] [untpyedEnd] .untypedStart來訪問範圍的開頭。請注意,對於所有未設置的映射鍵,Vyper返回0,因此我們需要一個isSet bool,以便用戶不會通過傳遞未設置的exitableRange來“欺騙”合同。

合約的self.exitable範圍基於通過名為removeFromExitable的幫助函數成功調用finalizeExit而被拆分和刪除。請注意,先前退出的範圍的退出甚至不需要受到挑戰; 他們永遠不會通過在finalizeExit中調用的checkRangeExitable測試。

退出遊戲與Plasma cash的關係

從本質上講,我們規範中的退出遊戲與原始的Plasma Cash設計非常相似。退出是通過調用該函數啟動的

beginExit(tokenType: uint256, blockNumber: uint256, untypedStart: uint256, untypedEnd: uint256) -> uint256:

為了對退出提出異議,所有挑戰都指定了一個特定的coinID,並對該特定硬幣進行了Plasm cash挑戰遊戲。只需要證明一枚硬幣無效即可取消整個退出。

退出和兩種類型的應對挑戰都有一個exitid和challengeid,通過遞增的challengenonce和exitnonce按順序分配。

Blocknumber事務指定

在最初的Plasma cash規範中,exiter需要指定退出的交易及其以前的“父”交易,以防止“in-flight”攻擊,其中操作員延遲包括有效的交易,並在兩個交易之間插入一個無效的交易。

這給基於範圍的方案帶來了一個問題,因為一個事務可能有多個父級。如果Alice向Carol發送(0,50),並且Bob向Carol發送(50,100),Carol現在可以向Dave發送(0,100)。但是,如果Dave想要退出,則兩者(0父母是父母。[50]和(50,100)。

雖然指定多個父級是絕對可行的,但是這個規範將非常昂貴,而且實現起來似乎更復雜。因此,我們選擇了一個更簡單的替代方案,其中每個事務都指定其發送者希望它進入的“塊”,如果包含在不同的塊中,則會失效。這解決了”in-flight”的攻擊,意味著合同不需要事務的父級。

每個幣交易有效性

我們的退出遊戲的一個非必然屬性值得預先注意的是,某些交易可能對其範圍內的一些硬幣“有效”,但對其他硬幣無效。

例如,假設Alice向Bob發送(0,100),Bob又向Carol發送(50,100).Carol不需要驗證Alice是完整的合法所有者(0,100)。僅限Carol需要保證愛麗絲擁有(50,100) - 託管鏈的一部分適用於她的收據。雖然如果愛麗絲不擁有(0,50),交易可能在某種意義上是“無效的”,智能合約對於硬幣出口的爭議而言,並不關心這一點(50,100)。只要收到的硬幣的所有權得到核實,其餘的交易都無關緊要。

這是一個非常重要的要求,以保持輕客戶端證據的大小。如果Carol必須檢查完整(0,100),她可能還必須檢查(0,10000)的重疊父項,然後檢查其所有父項,依此類推。如果交易相互依賴,這種“級聯”效應可能會大大增加證據的大小。

請注意,此屬性也適用於描述要交換的多個範圍的原子多重性。如果Alice為Bob的1 DAI交易1 ETH,則Alice有責任在簽名之前檢查Bob是否擁有1 Dai。然而,之後,如果Bob然後將1 ETH發送給Carol,Carol無需驗證Bob擁有1 DAI,只有Alice擁有她發送給Bob的1 ETH。Alice冒了風險,所以Carol不必這樣做。

從智能合約的角度來看,這個屬性是在出口處始終為特定coinID提交的挑戰的直接結果。

合同如何處理交易檢查

請注意,要在退出遊戲中使用,Transactions必須通過上面的證明部分中描述的TransactionProof檢查(有效簽名,分支邊界等)。此檢查在函數的合同級別執行

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

這裡一個重要的注意事項是transferIndex參數。請記住,事務可能包含多個傳輸,並且必須在樹中包含一次以進行每次傳輸。但是,由於挑戰涉及特定的coinID,因此只有一次轉移是相關的。因此,挑戰者和響應者給出了transferIndex - 無論哪個轉移與有爭議的硬幣有關。該檢查解碼並檢查TransactionProof中的所有TransferProofs,然後檢查每個函數的包含:

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

一旦驗證了所有的transferProof,transferIndexth傳輸的爭議相關值將返回到exit game函數:即sender,recipient,typedStart,typedEnd和plasmaBlockNumber。

在這種情況下,我們可以為退出指定完整的挑戰/響應遊戲集。

立即取消退出的挑戰

有兩種挑戰會立即取消退出:一種是已用過硬幣退出,另一種是存款發生前退出。

花費硬幣挑戰

這個挑戰用來證明交易的存在者已經將硬幣發送給了其他人。

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

它使用checkTransactionProof和gettypedTransfer,然後檢查以下內容:

  1. 受挑戰的coinID位於指定的退出內。
  2. 受挑戰的coinID位於transaction.transfers的transferIndexth元素的typedStart和typedEnd中。
  3. 挑戰的plasmaBlockNumber大於退出的plasmaBlockNumber。
  4. transfer.sender是exiter。

原子交換的引入確實意味著一件事:用過的硬幣挑戰期必須嚴格地小於其他因素,因為邊緣情況下操作員在兩方或多方之間保留原子交換。在這種情況下,這些當事人必須退出他們預先交換的硬幣,迫使操作員進行舊硬幣挑戰並揭示是否包括交換。但是,如果我們允許操作員在最後一刻做到這一點,那將成為一種競爭條件,在這種情況下,各方沒有時間使用顯示來取消其他出口。因此,超時比常規挑戰窗口更短(1/2),消除了“最後一分鐘響應”攻擊。

存款挑戰之前

這個挑戰用於證明退出來自早於的plasmaBlockNumber,而不是實際存入的硬幣。

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

合同查找self.deposits[self.exit s[exitid].tokentype][depositiontypedend].precingPlasmalbLockNumber並檢查它是否晚於出口的塊號。如果是這樣,它就會取消。

在樂觀的情況下,我們的合同允許在不進行任何包含檢查的情況下退出。為了實現這一點,任何退出都可以直接通過

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

退出方必須直接對其退出的交易或存款作出響應。

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

第二種情況是,如果操作員在存款後審查了所有交易,用戶就可以把錢取出來。

如果出現以下情況,兩種響應都將取消挑戰:

  1. 存款或交易確實在出口的Plasma區塊編號處。
  2. 存款人或收款人確實是存在者。
  3. 退出的起點和終點都在存款或轉賬的起點和終點之內。

無效的歷史挑戰

對於普通的Plasma cash 和這個規範來說,最複雜的挑戰響應遊戲是歷史失效的案例。協議的這一部分緩解了操作員包含偽造的“無效”事務(發送者不是前一個接收者)的攻擊。這個解決方案被稱為無效的歷史挑戰:因為合法擁有者還沒有花掉他們的硬幣,他們證明了這一點並提出挑戰:“哦,是的,那枚硬幣是你的嗎?嗯,那是我以前的,你不能證明我曾經花過它。”

無效的歷史挑戰和響應都可以是存款或交易。

挑戰性

根據當前的合法所有者,有兩種方法可以挑戰:

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲


這兩個都叫A

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

應對無效的歷史挑戰

挑戰者確實花了他們的硬幣,監管鏈確實是有效的。我們必須允許這種迴應, 有兩種:

第一種方法是通過顯示挑戰者支出的交易進行響應:

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

然後,智能合約執行以下檢查:

  1. transactionEncoding中的transferIndexth Transfer包含挑戰的coinID。
  2. transferIndexth transfer.sender確實是無效歷史挑戰的索賠人。
  3. 事務的Plasma塊號位於無效的歷史記錄質詢和退出之間。

另一種反應是證明挑戰是在硬幣實際存放-之前發生的,使挑戰無效。這類似於Challengebeforedeposit for exits本身。

區塊鏈研究實驗室 | Plasma cash智能合約與退出遊戲

在這種情況下,由於質詢無效,因此沒有對作為質詢收件人的發件人進行檢查。因此,合同必須簡單地檢查:

  1. 存款涵蓋受質疑的coinID。
  2. 存儲Plasma塊數位於挑戰和退出之間。
  3. 如果是這樣,退出將被取消。

這就結束了完整的退出遊戲規範。有了這些構建塊,即使是在最大程度上惡意的Plasma鏈的情況下,資金也可以保持安全。


相關推薦

推薦中...