摘要:合約會(huì)處理由子鏈提交的區(qū)塊,并且將區(qū)塊的哈希值存在主鏈上。負(fù)責(zé)處理所有子鏈上發(fā)生的交易,將其打包成區(qū)塊存儲(chǔ)在子鏈上,并且周期性地向合約提交區(qū)塊,將子鏈上的狀態(tài)區(qū)塊的哈希值提交到主鏈共識(shí)。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:深入理解Plasma(三)Plasma MVP原文已更新,請(qǐng)讀者前往原文閱讀
這一系列文章將圍繞以太坊的二層擴(kuò)容框架 Plasma,介紹其基本運(yùn)行原理,具體操作細(xì)節(jié),安全性討論以及未來研究方向等。本篇文章主要介紹 Plasma 的一個(gè)最小實(shí)現(xiàn) Plasma MVP(Minima Viable Plasma)。
在上一篇文章中我們已經(jīng)理解了 Plasma 中的一些關(guān)鍵操作,但是 Plasma 是一套框架,如果脫離了實(shí)際的應(yīng)用,仍然很難徹底理解它。因此本篇將詳細(xì)介紹 Plama 的第一個(gè)項(xiàng)目 Plasma MVP(Minimal Viable Plasma),即在 Plasma 框架下的最基礎(chǔ)的實(shí)現(xiàn)。Plasma MVP 是 Vitalic 和他的團(tuán)隊(duì)在 2018 年初提出的基于 UTXO 模型實(shí)現(xiàn)的 Plasma 設(shè)計(jì)標(biāo)準(zhǔn)[[1]](https://ethresear.ch/t/minima...,它以最簡(jiǎn)單的方式實(shí)現(xiàn)了鏈下交易,但無法支持復(fù)雜的計(jì)算,例如腳本(Script)和智能合約。在閱讀下面的內(nèi)容之前,請(qǐng)確保已經(jīng)理解了這個(gè)系列之前的文章。
整個(gè) Plasma MVP 的生命周期可以通過下面這幅圖表現(xiàn)出來:
Plasma 合約首先需要將 Plasma 合約部署到主鏈(以太坊)上作為主鏈和子鏈溝通的媒介。Plasma 合約會(huì)處理由子鏈提交的區(qū)塊,并且將區(qū)塊的哈希值存在主鏈上。除此之外,還會(huì)處理用戶的存款(deposit)、取款(withdrawal/exit)以及爭(zhēng)議(challenge)操作。
Plasma 合約中主要包括的數(shù)據(jù)結(jié)構(gòu)有:
Owner:合約的擁有者(即部署合約交易的發(fā)送者)的地址,即部署合約交易的發(fā)送者;
Plasma 區(qū)塊列表:每個(gè) Plasma 區(qū)塊中存儲(chǔ)了(1)區(qū)塊的 Merkle root(2)區(qū)塊提交的時(shí)間;
退出列表:即提交了退出申請(qǐng)的列表,每個(gè)退出申請(qǐng)存儲(chǔ)了(1)申請(qǐng)者的地址(2)申請(qǐng)退出的 UTXO 的位置。
Plasma 合約中主要包括的函數(shù)有:
submitBlock(bytes32 root):向主鏈提交一個(gè)區(qū)塊,僅僅提交區(qū)塊中所有交易的 Merkle root;
deposit():生成一個(gè)只包含一個(gè)交易的區(qū)塊,這個(gè)交易中包含與 msg.value 值相等的 UTXO;
startExit():執(zhí)行給定 UTXO 的退出操作;
challengeExit():向某個(gè)正在執(zhí)行的退出提出爭(zhēng)議。
Operator在前面的文章中我們已經(jīng)知道 Plasma 子鏈?zhǔn)且粋€(gè)獨(dú)立的區(qū)塊鏈,那么也就有獨(dú)立的共識(shí)機(jī)制。在 Plasma MVP 中采用的共識(shí)機(jī)制就是 PoA(Proof of Authority),即參與共識(shí)的只有唯一一個(gè)礦工,稱為 Operator。Operator 負(fù)責(zé)處理所有子鏈上發(fā)生的交易,將其打包成區(qū)塊存儲(chǔ)在子鏈上,并且周期性地向 Plasma 合約提交區(qū)塊,將子鏈上的狀態(tài)(區(qū)塊的哈希值)提交到主鏈共識(shí)。那么,既然 Operator 是唯一的礦工,這不就意味著 Plasma 違背了去中心化的初衷了嗎?其實(shí),這是去中心化向執(zhí)行效率的妥協(xié)。在之前的文章中也提到過,Plasma 的安全基礎(chǔ)依賴于底層的區(qū)塊鏈,只要底層的區(qū)塊鏈能夠保證安全,那么在 Plasma 子鏈上發(fā)生的最差結(jié)果也只是迫使用戶退出子鏈,而不會(huì)造成資產(chǎn)損失。
Operator 可以采用最簡(jiǎn)單的 REST API 方式實(shí)現(xiàn),子鏈中的用戶可以通過調(diào)用簡(jiǎn)單的 API 獲取到子鏈中區(qū)塊的數(shù)據(jù)。
存款(deposit)用戶 Alice 通過存款(deposit)操作向 Plasma 合約發(fā)送帶有一定數(shù)額的以太幣或 ERC20 token 加入 Plasma Chain,這時(shí) Plasma 合約會(huì)執(zhí)行 deposit() 函數(shù),生成一個(gè)只包含一個(gè)交易的區(qū)塊,這個(gè)交易的 UTXO 記錄了 Alice 從主鏈轉(zhuǎn)移到子鏈的數(shù)額。當(dāng)這個(gè)區(qū)塊被主鏈確認(rèn)后,Alice 就可以使用新生成的 UTXO 向其它用戶發(fā)送交易了。
交易(transaction)在 Plasma MVP 中,所有用戶發(fā)送的交易都是直接發(fā)送給 Operator,當(dāng)積累了一定數(shù)量的交易后,由 Operator 將交易打包成區(qū)塊。這里需要注意的是,由于 Plasma MVP 采用的是 UTXO 模型,所以即使交易的收款方不存在,交易也是成立的。
在子鏈上 Alice 向 Bob 發(fā)送一個(gè)交易的流程如下:
Alice 首先需要得到 Bob 在子鏈上的地址;
Alice 將一個(gè)或多個(gè) UTXO 作為輸入構(gòu)造交易發(fā)送到 Bob 的地址,并對(duì)交易簽名;
等待該交易被打包到區(qū)塊中;
Alice 向 Bob 發(fā)送確認(rèn)消息,并且使用相同的私鑰簽名。
生成區(qū)塊在 Plasma MVP 中,一個(gè) Plasma 區(qū)塊產(chǎn)生的情況只有兩種:一種是 Operator 打包生成區(qū)塊,另外一種是當(dāng)用戶執(zhí)行 deposit 操作時(shí),由 Plasma 合約直接生成一個(gè)只包含一個(gè)交易的區(qū)塊。
監(jiān)視子鏈為了保證子鏈上資產(chǎn)的安全,用戶需要周期性地檢查子鏈上的數(shù)據(jù),保證沒有惡意交易產(chǎn)生。用戶需要運(yùn)行一種自動(dòng)化的軟件(例如錢包),每隔一段時(shí)間下載子鏈中的區(qū)塊數(shù)據(jù),檢查每個(gè)區(qū)塊中的交易,如果有惡意交易產(chǎn)生,立即退出子鏈。
取款/退出(withdrawal/exit)當(dāng) Alice 想要退出子鏈時(shí),需要向 Plasma 合約發(fā)送一個(gè) exit 交易,申請(qǐng)中需要包含(1)所要退出的 UTXO 的位置,包括區(qū)塊號(hào)(blknum)、區(qū)塊內(nèi)交易號(hào)(txindex)以及交易內(nèi)輸出號(hào)(outindex)(2)包含該 UTXO 的交易(3)該交易的 Merkle proof(4)用于生成該 UTXO 所涉及的之前一系列交易的確認(rèn)簽名。除此之外,exit 交易中還要包含“退出押金(exit bond)”。如果這個(gè) exit 被 challenge 成功,那么取款的操作將被取消,而且退出押金將被發(fā)送給提出 challenge 的用戶。
之后這個(gè)申請(qǐng)會(huì)被放入一個(gè)優(yōu)先隊(duì)列中,通過這個(gè)公式計(jì)算優(yōu)先級(jí):
Priority = blknum 1000000000 + txindex 10000 + oindex
之所以采用這種優(yōu)先隊(duì)列的方式處理取款順序的原因是保證舊的 UTXO 總能優(yōu)先于新的 UTXO 被取出。也就是說,當(dāng)有惡意交易(例如雙花等)產(chǎn)生時(shí),所有在惡意交易發(fā)生之前的交易都可以被優(yōu)先取出。那么如何解決在惡意交易之后被確認(rèn)的交易的取款問題呢?Plasma MVP 采用了“確認(rèn)簽名(Confirmation Signatures)”的機(jī)制,在下一小節(jié)我們將介紹這一機(jī)制是如何工作的。
確認(rèn)簽名(Confirmation Signatures)在 Plasma MVP 中,用戶的退出順序以所要退出的 UTXO 所在的交易的位置為準(zhǔn)。假如 operator 作惡,在一個(gè)合法的交易之前插入一個(gè)非法的交易,那么當(dāng)用戶執(zhí)行取款時(shí),由于非法交易可以先被取出,因此當(dāng)執(zhí)行到該用戶的交易時(shí),可能 Plasma 合約中的資產(chǎn)已經(jīng)被取空。為了解決這個(gè)問題,Plasma MVP 采用了“確認(rèn)簽名”機(jī)制,例如當(dāng) Alice 產(chǎn)生一個(gè)交易時(shí),她首先會(huì)對(duì)交易簽名。當(dāng)該交易被打包入?yún)^(qū)塊后,Alice 還需要對(duì)該交易進(jìn)行一次簽名,即“確認(rèn)簽名”。
引入確認(rèn)簽名機(jī)制后,當(dāng) Alice 發(fā)現(xiàn)在一個(gè)區(qū)塊中自己的合法交易之前存在非法交易時(shí),可以拒絕對(duì)自己的交易進(jìn)行“確認(rèn)簽名”,同時(shí)申請(qǐng)取款。這樣可以使得當(dāng)前的交易失效,保證自己之前“確認(rèn)簽名”后的交易可以優(yōu)先于非法交易之前取出。
這種確認(rèn)簽名機(jī)制極大地破壞了用戶體驗(yàn),用戶每產(chǎn)生一個(gè)交易都要經(jīng)歷簽名->等待確認(rèn)->確認(rèn)簽名。而且由于確認(rèn)簽名也需要占據(jù) Plasma 區(qū)塊的空間,因此也降低了子鏈的可擴(kuò)展性。為了解決這個(gè)問題,Plasma 的研究人員提出了擴(kuò)展版本 More Viable Plasma 移除了確認(rèn)簽名的要求[[2]](https://ethresear.ch/t/more-v...。
爭(zhēng)議(Challenge)每個(gè)取款操作都會(huì)經(jīng)歷一個(gè)爭(zhēng)議期。例如在 Alice 的某個(gè) UTXO 退出子鏈的過程中,如果 Bob 在爭(zhēng)議期內(nèi)發(fā)現(xiàn)有惡意行為發(fā)生,他可以提出一個(gè)爭(zhēng)議(challenge)。一個(gè)爭(zhēng)議需要給出針對(duì)的 UTXO 的位置,以及該 UTXO 被花費(fèi)的證明,即該 UTXO 已經(jīng)存在于某個(gè)交易中,且這個(gè)交易已經(jīng)被打包到區(qū)塊。
合約通過調(diào)用 challengeExit() 函數(shù)執(zhí)行一個(gè)爭(zhēng)議,爭(zhēng)議成功后會(huì)取消正在執(zhí)行的取款操作,并將提交取款申請(qǐng)所凍結(jié)的押金發(fā)送給 Bob。
攻擊場(chǎng)景在 Plasma 子鏈中主要存在兩種攻擊場(chǎng)景:
Alice 試圖忽視在子鏈中轉(zhuǎn)移給 Bob 的資產(chǎn),使用最初加入 Plasma 子鏈時(shí)的交易證明向主鏈提出取款申請(qǐng)。
Operator 生成一個(gè)惡意交易,占有其他用戶的資產(chǎn),并且嘗試退出子鏈。
下面對(duì)這兩個(gè)攻擊場(chǎng)景進(jìn)行分析,觀察 Plasma MVP 如何保證資產(chǎn)的安全性:
場(chǎng)景1
Alice 使用最初加入子鏈時(shí)生成的交易作為證據(jù)向主鏈提出取款申請(qǐng);
Bob(或者其他任意用戶)擁有 Alice 申請(qǐng)退出的 UTXO 被花費(fèi)的交易證明,并將此作為證據(jù)向主鏈提出一個(gè)爭(zhēng)議;
爭(zhēng)議生效,Alice 的退出申請(qǐng)被駁回,同時(shí)將 Alice 申請(qǐng)退出的押金發(fā)送給 Bob;
Alice 的攻擊失效。
場(chǎng)景2
Operator 創(chuàng)建了一個(gè)非法交易,并且將其打包生成區(qū)塊之后在主鏈得到確認(rèn);
Operator 提交取款申請(qǐng),打算將 Alice 的資產(chǎn)取走;
在爭(zhēng)議期內(nèi),Alice 發(fā)現(xiàn)了 Operator 的惡意行為,立即提出取款申請(qǐng),退出子鏈;
由于 Alice 的申請(qǐng)優(yōu)先級(jí)較高,因此會(huì)在 Operator 之前退出;
Operator 的攻擊失效。
相關(guān)項(xiàng)目Talk is cheap, show me your code.
目前已經(jīng)有許多機(jī)構(gòu)和公司已經(jīng)實(shí)現(xiàn)了 Plasma MVP,但實(shí)現(xiàn)的語言和細(xì)節(jié)有所不同:
FourthState Lab[[3]](https://github.com/fourthstate)
Omisego[[4]](https://github.com/omisego/pl...
Kyokan[[5]](https://github.com/kyokan/pla...
總結(jié)本文介紹了 Plasma 的最小實(shí)現(xiàn)版本 Plasma MVP,雖然采用最簡(jiǎn)單的 UTXO 模型,但已經(jīng)足夠體現(xiàn)出 Plasma 的核心思想。在 Plasma MVP 中,用戶資產(chǎn)的安全主要依賴于用戶及時(shí)發(fā)現(xiàn)惡意行為,并退出子鏈。接下來的文章將會(huì)介紹另外一個(gè)稍微復(fù)雜一點(diǎn)的項(xiàng)目,Plasma Cash。
相關(guān)資源https://ethresear.ch/t/minimal-viable-plasma/426
https://ethresear.ch/t/more-viable-plasma/2160
https://github.com/fourthstate
https://github.com/omisego/plasma-mvp
https://github.com/kyokan/plasma
本文的作者是蓋蓋,他的微信公眾號(hào): chainlab
深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/24386.html
摘要:合約會(huì)處理由子鏈提交的區(qū)塊,并且將區(qū)塊的哈希值存在主鏈上。負(fù)責(zé)處理所有子鏈上發(fā)生的交易,將其打包成區(qū)塊存儲(chǔ)在子鏈上,并且周期性地向合約提交區(qū)塊,將子鏈上的狀態(tài)區(qū)塊的哈希值提交到主鏈共識(shí)。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:深入理解Plasma(三)Plasma MVP原文已更新,請(qǐng)讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴(kuò)容框架 Plasma,介紹其基本運(yùn)行原理,具體操作細(xì)...
摘要:稀疏梅克爾樹在上文中我們已經(jīng)了解到一個(gè)交易的成功的前提是需要發(fā)送方提供關(guān)于一個(gè)的完整交易歷史。因此,中使用了一種稱為稀疏梅克爾樹,的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)交易數(shù)據(jù),能夠在的時(shí)間復(fù)雜度驗(yàn)證一個(gè)交易不存在。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:深入理解Plasma(四)Plasma Cash原文已更新,請(qǐng)讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴(kuò)容框架 Plasma,介紹其基本運(yùn)行原理,具...
摘要:稀疏梅克爾樹在上文中我們已經(jīng)了解到一個(gè)交易的成功的前提是需要發(fā)送方提供關(guān)于一個(gè)的完整交易歷史。因此,中使用了一種稱為稀疏梅克爾樹,的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)交易數(shù)據(jù),能夠在的時(shí)間復(fù)雜度驗(yàn)證一個(gè)交易不存在。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:深入理解Plasma(四)Plasma Cash原文已更新,請(qǐng)讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴(kuò)容框架 Plasma,介紹其基本運(yùn)行原理,具...
摘要:用戶在將主鏈的資產(chǎn)如以太幣或者其它合約發(fā)布的轉(zhuǎn)移到的過程稱為存款,具體做法是直接向主鏈上的合約發(fā)送以太幣或。將賣給,獲得了以太幣,賺取了以太幣。當(dāng)子鏈中有拜占庭行為發(fā)生時(shí),用戶之間可以共同協(xié)作執(zhí)行批量取款。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:深入理解Plasma(二)Plasma 細(xì)節(jié)原文已更新,請(qǐng)讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴(kuò)容框架,介紹其基本運(yùn)行原理,具體操...
摘要:用戶在將主鏈的資產(chǎn)如以太幣或者其它合約發(fā)布的轉(zhuǎn)移到的過程稱為存款,具體做法是直接向主鏈上的合約發(fā)送以太幣或。將賣給,獲得了以太幣,賺取了以太幣。當(dāng)子鏈中有拜占庭行為發(fā)生時(shí),用戶之間可以共同協(xié)作執(zhí)行批量取款。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:深入理解Plasma(二)Plasma 細(xì)節(jié)原文已更新,請(qǐng)讀者前往原文閱讀 這一系列文章將圍繞以太坊的二層擴(kuò)容框架,介紹其基本運(yùn)行原理,具體操...
閱讀 2570·2021-11-23 09:51
閱讀 3120·2019-08-30 15:54
閱讀 1071·2019-08-30 14:14
閱讀 3542·2019-08-30 13:59
閱讀 1393·2019-08-29 17:09
閱讀 1468·2019-08-29 16:24
閱讀 2848·2019-08-29 15:43
閱讀 911·2019-08-29 12:45