PPIO 的定位不僅僅是做存儲(chǔ),還有數(shù)據(jù)分發(fā)和數(shù)據(jù)傳輸。在數(shù)據(jù)傳輸?shù)臅r(shí)候,如何保證數(shù)據(jù)傳輸?shù)牧髁恳膊捎靡环N公正的,不可抵賴的方式來(lái)實(shí)現(xiàn)的
PPIO 的定位不僅僅是做存儲(chǔ),還有數(shù)據(jù)分發(fā)和數(shù)據(jù)傳輸。在數(shù)據(jù)傳輸?shù)臅r(shí)候,如何保證數(shù)據(jù)傳輸?shù)牧髁恳膊捎靡环N公正的,不可抵賴的方式來(lái)實(shí)現(xiàn)的。這就是我這篇文章要講解的狀態(tài)通道。PPIO 就是通過(guò)狀態(tài)通道的機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)墓?jì)量。
傳統(tǒng)意義的狀態(tài)通道機(jī)制
狀態(tài)通道在區(qū)塊鏈領(lǐng)域是個(gè)已經(jīng)存在的名字,主要應(yīng)用于高頻交易和微支付。因?yàn)樵谶@兩個(gè)場(chǎng)景下,交易吞吐量會(huì)非常大, 如果所有的操作都是在需要共識(shí)的去中心化的鏈上操作,性能低會(huì)成為重要問(wèn)題。
狀態(tài)通道的解決思路,本質(zhì)是在交易高吞吐量和驗(yàn)證者的去中心化之間做一個(gè)平衡。具體來(lái)說(shuō),就是把兩兩交易的細(xì)節(jié),放在鏈下去協(xié)商完成,當(dāng)多步交易完成后,或者交易發(fā)生爭(zhēng)議,再通過(guò)區(qū)塊鏈來(lái)進(jìn)行“仲裁”。
為了說(shuō)明狀態(tài)通過(guò),我們先做個(gè)假設(shè),兩個(gè)人 Alice 和 Bob,后面也可能簡(jiǎn)稱 A 和 B。假設(shè) Alice 在一開(kāi)始的資產(chǎn)是10,Bob 在一開(kāi)始的資產(chǎn)也是10,他們之間即將發(fā)生一系列高頻的微支付。我們開(kāi)始模擬這個(gè)狀態(tài)通道。
圖: Alice 和 Bob 使用狀態(tài)通道交易的示意圖
整個(gè)過(guò)程大概分為以下幾步:
1. Alice 或者 Bob 創(chuàng)建于一個(gè)狀態(tài)通道智能合約 Contract,后面會(huì)簡(jiǎn)稱 C,此時(shí)狀態(tài)通道處于 opening。這個(gè)過(guò)程是要上鏈的。
2. Alice 將10個(gè)資產(chǎn)打入到合約中,接著 Bob 也將10個(gè)資產(chǎn)打入到合約之中,此時(shí)狀態(tài)通道就算是開(kāi)啟,進(jìn)入 open 狀態(tài)。這個(gè)過(guò)程中也是要上鏈的。這時(shí)候的分配方案是【A:10, B:10】。(分配方式是指交易雙方都能夠在鏈下都認(rèn)可的資產(chǎn)分配方式,總量是一樣的的,要么 A 多,要么 B 多,如果這個(gè)時(shí)候合約終止,就會(huì)按照分配方案的資產(chǎn)打回到各自的賬戶上)
3. 此后,由于 A 和 B 之間的狀態(tài)通道處于 Open 的狀態(tài),A和B之間可以開(kāi)始交易。如果 A 向 B 轉(zhuǎn)了1個(gè)資產(chǎn),則分配方案為【A:9; B:11;N:1】,這時(shí) B 拿到了 A 對(duì)分配狀態(tài)的簽名;而接著 B 又向 A 轉(zhuǎn)了3個(gè)資產(chǎn),這時(shí)的分配方案變?yōu)椤続:12; B:8; N:2】,這時(shí) A 拿到了 B 對(duì)分配狀態(tài)。
這里 N 表示 Nonce。每次鏈下雙方按照約定改變資產(chǎn)分配,則雙方都要自增一次 Nonce 值。誠(chéng)實(shí)的交易者都會(huì)以 Nonce 最大的分配方案作為當(dāng)前的分配方案,而 Nonce 值較小的分配方案都是失效的方案,可以隨時(shí)拋棄。
4. 狀態(tài)提交,在交易的過(guò)程中,交易雙方,A 或者 B都可以隨時(shí)向智能合約 C 發(fā)起狀態(tài)提交,如果 A 發(fā)起了狀態(tài)提交,C 會(huì)驗(yàn)證 B 的簽名;反之如果 B 發(fā)起了狀態(tài)的提交,C 會(huì)驗(yàn)證 A 的簽名,同時(shí)也會(huì)驗(yàn)證 Nonce 值。
智能合約 C 只接收比上次鏈上分配的 nonce 值更大的方案,如果新提交的分配方案的 Nonce 和簽名都合法,則 C 接收新的分配方案,并更新合約中的 Nonce 值為新分配方案的 Nonce 值。雙方持續(xù)交易,... … 直到最后的分配方案,假設(shè)是【A:1; B: 19; N:50】,下面稱為最終狀態(tài)。假設(shè)該方案已被提交到智能合約 C,且被智能合約所接受。
5. 關(guān)閉狀態(tài)通道請(qǐng)求,這時(shí)候可由任一方發(fā)起關(guān)閉狀態(tài)通道,即按照合約中的鏈上分配方案進(jìn)行分配。一旦合約 C 接收到關(guān)閉通道的請(qǐng)求,合約會(huì)進(jìn)入 Closing 狀態(tài)并維持一定的有效期,在該狀態(tài)下且在有效期內(nèi),另一方依然可以提交新的有效的分配方案來(lái)將狀態(tài)通道置回 Open 狀態(tài)。
如果在有效期內(nèi)另一方未能將狀態(tài)通道置回 Open 狀態(tài),則狀態(tài)通道會(huì)在有效期過(guò)后,進(jìn)入 Closed 狀態(tài)。比如,在這個(gè)案例中,B 是受益方,一般來(lái)說(shuō),是由 B 在這時(shí)候發(fā)起關(guān)閉狀態(tài)通道請(qǐng)求,然后狀態(tài)通道進(jìn)入 Closing 狀態(tài),并在一定有效期后按照鏈上最后的有效分配方案【A:1; B: 19; N:50】進(jìn)行分配。
此時(shí),若B是一個(gè)作惡者,雖然現(xiàn)在鏈上的分配方案為【A:1; B: 19; N:50】,但其實(shí)鏈下最新的分配方案已是【A:4; B: 16; N:55】,但 B 嘗試用老的分配方案來(lái)分配資產(chǎn),使自己獲益增大。此時(shí)由于合約在 Closing 狀態(tài),只要A及時(shí)發(fā)現(xiàn) B 的鏈上關(guān)閉通道請(qǐng)求的交易,則 A 可以立刻將更新的分配方案【A:4; B: 16; N:55】提交到合約,從而使得合約被置回到 Open 狀態(tài),防止 B 的惡意提款。
之后 A 如果想關(guān)閉合約,則可重新向合約發(fā)起關(guān)閉狀態(tài)通道的請(qǐng)求。之后只要 B 無(wú)法再給出比 N:55 更新的分配方案,那么狀態(tài)通道最終將在有效期過(guò)后,進(jìn)入 Close 狀態(tài)。(注:具體實(shí)現(xiàn)時(shí)也可以將”狀態(tài)提交”和“關(guān)閉狀態(tài)通道請(qǐng)求”合并成一步)
6. 最終資產(chǎn)分配:當(dāng)合約 C 進(jìn)入 Closed 狀態(tài)后,任何一方都可以觸發(fā)最終的資產(chǎn)分配,即按照鏈上已確定的最后有效的分配方案進(jìn)行實(shí)際的資產(chǎn)分配。
回顧整個(gè)過(guò)程,需要寫(xiě)入?yún)^(qū)塊鏈的步驟,只是和鏈上智能合約 C 相關(guān)的部分,分別是開(kāi)始創(chuàng)建的時(shí)候和分配方案的提交以及最終狀態(tài)的提交。其余都是在鏈下操作,所以在狀態(tài)通道的設(shè)計(jì)中,項(xiàng)目一般設(shè)計(jì)為 只向區(qū)塊鏈智能合約 C 提交一次,從而做到最高的性能。
PPIO 的狀態(tài)通道機(jī)制的設(shè)計(jì)
· PPIO 支持三個(gè)核心模塊
POSS 是 P2P Object Storage Service,對(duì)標(biāo) AWS 的 S3 存儲(chǔ)。
· PCDN 是 P2P Content Delivery Network,對(duì)標(biāo)傳統(tǒng)的 CDN,就像 AWS 的CloudFront。
· PRoute,是基于 P2P 的自適應(yīng)網(wǎng)絡(luò)智能路由,做到兩個(gè)節(jié)點(diǎn)之間,以最合理路徑到達(dá),從而速度最快,延遲最低 。這是協(xié)議層的實(shí)現(xiàn),在 AWS 中沒(méi)有對(duì)標(biāo)的產(chǎn)品。
其中除去 POSS 模塊外,PCDN 和 PRoute 都是更多激勵(lì)帶寬的貢獻(xiàn),其網(wǎng)絡(luò)數(shù)據(jù)的傳遞非常頻繁且實(shí)時(shí)。如果每個(gè) Piece 的傳輸,都要寫(xiě)入?yún)^(qū)塊鏈,這將是非常大的浪費(fèi) 。其實(shí),網(wǎng)絡(luò)數(shù)據(jù)高速傳輸激勵(lì),本質(zhì)上是高頻交易和微支付,所以在設(shè)計(jì) PPIO 的時(shí)候,我們借鑒了傳統(tǒng)的傳統(tǒng)的狀態(tài)通道機(jī)制,來(lái)實(shí)現(xiàn)帶寬的激勵(lì)。
1. U 創(chuàng)建了區(qū)塊鏈上的智能合約 Contract(后面簡(jiǎn)稱C)。然后 U 往 C 中轉(zhuǎn)入資產(chǎn),假設(shè)轉(zhuǎn)入了10個(gè)資產(chǎn)。由于 PPIO 設(shè)計(jì)的是單向通道,只有 U 轉(zhuǎn)入資產(chǎn)后,即可進(jìn)入Open 狀態(tài),其分配方案是【U:10; M:0】
2. 開(kāi)始進(jìn)行數(shù)據(jù)傳輸,U 向 M 請(qǐng)求數(shù)據(jù),M 向 U 返回正確的數(shù)據(jù)后,U 會(huì)給予 M 一個(gè) Voucher,即帶有 U 簽名的新的狀態(tài)分配方案。由于網(wǎng)絡(luò)傳輸?shù)膶?shí)時(shí)性要求非常高,M 需要先給數(shù)據(jù),再拿 Voucher。此時(shí)分配方案逐步變成 了【U:9; M:1】。
3. 繼續(xù)傳輸數(shù)據(jù),狀態(tài)通道的分配方案,U 的資產(chǎn)越來(lái)越少,M 的資產(chǎn)越來(lái)越多。直到U 把之前存入狀態(tài)通道的資產(chǎn)用完,即【U:0; M:10】;
4. 最終狀態(tài)提交:此時(shí) M 用最新的 Voucher 去區(qū)塊鏈上的智能合約用 Voucher 去提款。C 在驗(yàn)證 Voucher 中有 U 的正確簽名后,接受了 M 的提款。之后狀態(tài)通道關(guān)閉,標(biāo)記為 Close 狀態(tài),之后該狀態(tài)通道不能再進(jìn)行交易。
5. 之后 U 在 M 請(qǐng)求數(shù)據(jù),由于資產(chǎn)已經(jīng)用完,M 將不再提供服務(wù)。除非 U 創(chuàng)建新的狀態(tài)通道合約 C1,再轉(zhuǎn)一定的資產(chǎn)進(jìn)去,才能再次向 M 請(qǐng)求數(shù)據(jù)。
圖:PPIO 的數(shù)據(jù)傳輸狀態(tài)通道設(shè)計(jì)
這就是 PPIO 整個(gè)狀態(tài)通道的過(guò)程。下面我們做一下簡(jiǎn)單的攻防分析。
1. 假設(shè) User 作惡,作惡方式為 U 向 M 請(qǐng)求到了數(shù)據(jù)之后,不給 Voucher。處于網(wǎng)絡(luò)性能的考慮,PPIO 的設(shè)計(jì)是 M 先給一定的數(shù)據(jù),再要 Voucher。如果 U 不給 Voucher,M 給予一定量的數(shù)據(jù)發(fā)現(xiàn)收不到 Voucher,于是將不再對(duì)該 User 給予更多的數(shù)據(jù)了,并且標(biāo)記為 U 為惡意用戶,已經(jīng)給予的部分?jǐn)?shù)據(jù)作為自己有限的損失。
2. 假設(shè) Miner 作惡,作惡方式是給予 User 錯(cuò)誤的數(shù)據(jù)。User 收到一定量的數(shù)據(jù)后,就會(huì)發(fā)現(xiàn)數(shù)據(jù)異常,于是不給予 Voucher,并向區(qū)塊鏈智能合約 C 發(fā)起關(guān)閉狀態(tài)通道,并標(biāo)記該 Miner 為惡意礦工。如果網(wǎng)絡(luò)中存在 Verifier,U 還可以向 Verifier 舉報(bào) M,之后 Verfier 會(huì)對(duì) M 重點(diǎn)驗(yàn)證,分析 M 是否還存在其他作惡。
圖:如果 User 發(fā)現(xiàn) Miner 作惡的狀態(tài)通道示意圖
采用狀態(tài)通道的方式,在交易雙方存在作惡的情況下,可能存在一方有些輕微損失。但不影響整體的設(shè)計(jì),因此,PPIO 中的帶寬激勵(lì)是不需要 Miner 做任何抵押的,這點(diǎn)和存儲(chǔ)場(chǎng)景不太一樣。
1. 存儲(chǔ)場(chǎng)景具有長(zhǎng)時(shí)性,使得 Miner 抵押成為必要。一次存儲(chǔ)少則幾天,多則數(shù)月,甚至幾年,如果在存儲(chǔ)期間 Miner 作惡,User 可能面臨文件的風(fēng)險(xiǎn),后果很嚴(yán)重,因此在存儲(chǔ)場(chǎng)景下,通過(guò)要求 Miner 抵押這一經(jīng)濟(jì)手段還迫使 Miner 誠(chéng)實(shí)可靠的為 User 提供存儲(chǔ)服務(wù)是必要的;
2. 存儲(chǔ)數(shù)據(jù)具有確定性,使得驗(yàn)證存儲(chǔ)的持久性變的可行。確定性的數(shù)據(jù)可用 Merkle樹(shù)來(lái)組織,然后利用葉子節(jié)點(diǎn)到 Merkle 根的路徑作為數(shù)據(jù)持有證明,而這種證明的驗(yàn)證,利用智能合約或者可信的第三方就可以完成。
而帶寬則不同,帶寬具有瞬時(shí)性和不確定性。帶寬傳輸相對(duì)于存儲(chǔ)來(lái)說(shuō),交易時(shí)間很短,且傳輸什么數(shù)據(jù)在傳輸前一般都不可知。這兩點(diǎn)導(dǎo)致了 User 很難在數(shù)學(xué)層面上限制 Miner 只傳輸正確的數(shù)據(jù),也就很難通過(guò)證明來(lái)約束 Miner 使得 Miner 不作惡。
一旦 Miner 作惡,可信的第三方或者智能合約也無(wú)法準(zhǔn)確的判斷出到底是 Miner 真的作惡,還是 User 在陷害 Miner,因此即使 Miner 做了抵押,可信的第三方或者智能合約也不知在糾紛出現(xiàn)時(shí)如何處置該抵押。所以解決帶寬場(chǎng)景的思路和存儲(chǔ)場(chǎng)景不一樣,帶寬場(chǎng)景的思路是利用狀態(tài)通道實(shí)現(xiàn)“小步快跑”:每次都只做很小的交易,如果發(fā)現(xiàn)對(duì)方作惡,則立刻停止交易,轉(zhuǎn)而尋找新的交易者。這樣即使對(duì)方作惡,己方損失也不是很大。
講到這里,只是講解了 PPIO 里面應(yīng)用狀態(tài)通道的基本原理,在 PPIO 的一些場(chǎng)景設(shè)計(jì)中,狀態(tài)通道還有更復(fù)雜的用法,但基本原理是不變的。
Owner 角色的引入
PPIO 在設(shè)計(jì)的時(shí)候,我們還設(shè)計(jì)了一個(gè) Owner 的角色,Owner 不是一個(gè) P2P 傳輸角色,而是一個(gè)支付和結(jié)算角色。在 PCDN 架構(gòu)中,每個(gè) Peer 都需要指定一個(gè) Owner。這個(gè) Peer 產(chǎn)生的花費(fèi)由它的 Owner 來(lái)承擔(dān),而同樣該 Peer 賺取的收入也由它的 Owner 來(lái)接收。
如下圖,同一個(gè) Owner 可以對(duì)接多個(gè) Peer。
圖:Owner 和 Peer 的關(guān)系圖
這個(gè)角色可以簡(jiǎn)單理解為,在需求端就是開(kāi)發(fā)者,在供給端就是礦池;它本質(zhì)就是 CoinPool。
由狀態(tài)通道升級(jí)后的數(shù)據(jù)分發(fā)合約如下圖所示
圖:PCDN 下最簡(jiǎn)單的下載流程圖
關(guān)于引入 Owner 角色的分發(fā)智能合約的描述。但其中 Peer 和 Peer,Peer 和 Miner 之間的通信本質(zhì)上還是走得狀態(tài)通道的機(jī)制。
這是最基本的 PPIO 狀態(tài)通道邏輯,另外在具體應(yīng)用場(chǎng)景中,如 PCDN 和 PRoute,還有更多的考慮。關(guān)于狀態(tài)通道在 PCDN 場(chǎng)景下應(yīng)用,具體可見(jiàn)文章《讓智能合約在數(shù)據(jù)分發(fā)中更智能?PPIO 的設(shè)計(jì)小巧思》。另外,我后面還會(huì)介紹,PPIO 在具體場(chǎng)景中更深入的實(shí)現(xiàn),請(qǐng)大家敬請(qǐng)期待。
效率提升與價(jià)值落地一直以來(lái)都是 PPIO 實(shí)現(xiàn)技術(shù)不斷創(chuàng)新進(jìn)步的標(biāo)尺。這一期文章,我們分享了如何基于傳統(tǒng)的狀態(tài)通道機(jī)制,完成了 PPIO 的狀態(tài)通道機(jī)制的設(shè)計(jì) ,從而實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)墓?jì)量。我們又通過(guò)一個(gè)實(shí)際案例,分析了基于這樣的設(shè)計(jì), User 和 Miner 的兩個(gè)角色如何進(jìn)行有效的數(shù)據(jù)傳輸,避免雙方作惡帶來(lái)的不必要的損失。
同時(shí)也解釋了,PPIO 中的帶寬激勵(lì)是不需要 Miner 做任何抵押的,這一點(diǎn)和存儲(chǔ)場(chǎng)景有本質(zhì)區(qū)別。不知看到這里,是否讓您對(duì)的 PPIO 的技術(shù)工程實(shí)現(xiàn)有了更深入的了解呢?如果您想更進(jìn)一步的和我們一起學(xué)習(xí)探索,就快來(lái)關(guān)注 PPIO 公眾號(hào),加入 PPIO 開(kāi)發(fā)者社區(qū)或 Discord 群組,和我們一起創(chuàng)造精彩。(PPLabs)
關(guān)鍵詞: PPIO 數(shù)據(jù)傳輸 公正計(jì)量