曌鏈MIT核心技術(shù)之跨分片—Cross Sharding區(qū)塊鏈
曌鏈MIT跨分片合約以曌鏈MIT的多級名字空間機(jī)制作為基礎(chǔ),這種解決方式是直觀顯而易見的,而別的區(qū)塊鏈項(xiàng)目因?yàn)闆]有多級名字空間這個(gè)基礎(chǔ)設(shè)施,無法應(yīng)用該方案。
跨分片合約難點(diǎn)
跨分片合約的難點(diǎn)在于:一個(gè)分片對于共同訪問的狀態(tài)的修改,需要及時(shí)地讓另一個(gè)分片知道,否則就容易出現(xiàn)狀態(tài)錯(cuò)亂。任何支持合約的分片技術(shù),都必須要解決這個(gè)問題。目前業(yè)界大致有以下幾種方案:
第一種方案:讓發(fā)出交易的客戶端主動維護(hù)一致性,典型的就是Omniledger。客戶端負(fù)責(zé)驅(qū)動這個(gè)過程,避免分片之間的協(xié)議通信。優(yōu)點(diǎn)是分片協(xié)議不用考慮維護(hù)一致性的問題,技術(shù)簡單,且避免了分片之間一致性協(xié)議的開銷。缺點(diǎn)顯而易見,沒法做到交易丟出去不管,客戶端在這個(gè)過程中必須保持運(yùn)行。另外,客戶端去做這個(gè)事,真的安全么?實(shí)際上這個(gè)方案很難為業(yè)界所接受。我更傾向于認(rèn)為,由于分片機(jī)制不完善,解決不了狀態(tài)一致性而強(qiáng)行打的補(bǔ)丁。
第二種方案:基于trace對交易進(jìn)行標(biāo)注,典型的就是Chainspace。交易注入到網(wǎng)絡(luò)中之前,先模擬trace,并以此標(biāo)注出可能與其他交易沖突的地方,然后再根據(jù)這些沖突發(fā)到相關(guān)的分片中處理,相關(guān)的分片之間再用S-BAC去共識。這種方法,我想應(yīng)該還是不能完全依照trace,還必須在代碼層面進(jìn)行標(biāo)注,否則一個(gè)if/else語句在trace環(huán)境和實(shí)際環(huán)境下就可能走向了截然不同的分支。另外每一個(gè)交易可能的沖突都要相關(guān)的分片之間去跑一輪共識,一個(gè)分片如果牽涉到很多個(gè)這樣的交易,那每一次就要跟不同的分片跑很多個(gè)這樣的共識。
第三種方案:交易分裂,典型的就是Ethereum。首先要說明的是,這種方式交易只能類似于幣的轉(zhuǎn)移這種,從一個(gè)分片中的地址,轉(zhuǎn)移到另一個(gè)分片中的地址。合約內(nèi)部狀態(tài)是不能共享的,必須要保證每個(gè)分片的狀態(tài)是私有的。具體的做法就是將這個(gè)幣的轉(zhuǎn)移過程切開,分成幣的發(fā)送 幣的接受,并且在不同的共識周期中完成。具體在Ethereum中的話,在一個(gè)共識周期中,分片中的地址發(fā)送幣,并在主鏈中產(chǎn)生一個(gè)收據(jù),然后在下一個(gè)共識周期中,另一個(gè)分片中的地址依據(jù)這個(gè)收據(jù)接受幣。看起來簡單,然而并非如此,可以用火車和旅館問題來比喻。你要去另一個(gè)城市玩,要定火車票,還要定旅館。倘若你定了火車票,但是旅館沒訂到,那就麻煩了;倘若你旅館訂到了,但是火車票沒訂到,你也麻煩了。要么都訂到,要么都沒訂到,那才是良好的狀態(tài)。問題產(chǎn)生的原因就是交易分裂到多個(gè)共識周期,破壞了原子性。Ethereum目前在這一塊還處于初步的理論研究階段,計(jì)劃在分片的第四期中實(shí)現(xiàn)。
曌鏈MIT跨分片合約
具體做法就是,將跨分片的交易在他們的父級分片中處理。以曌鏈MIT的多級名字空間機(jī)制作為基礎(chǔ),這種解決方式是直觀顯而易見的,而別的區(qū)塊鏈項(xiàng)目因?yàn)闆]有多級名字空間這個(gè)基礎(chǔ)設(shè)施,無法應(yīng)用該方案。這種方案實(shí)現(xiàn)相對簡單,穩(wěn)定可靠,可以支持的交易比較靈活,適應(yīng)面廣,并且只需要一個(gè)共識周期就可以確認(rèn)。但是,這種方案一個(gè)明顯的缺點(diǎn)就是,父級分片存在處理壓力的匯聚問題,越是上級的分片對吞吐率的要求越高。曌鏈MIT的解決方案是鼓勵(lì)交易盡量在低層分片解決。一方面,多級分片結(jié)構(gòu)具有過濾作用,需要處理的分片比例隨著分片層級的升高而越來越低。需要說明的是:名字空間非常有利于數(shù)據(jù)的局部性,類似于CPU的緩存;而Ethereum那種按照地址前綴分配分片的做法,數(shù)據(jù)完全是隨機(jī)的,沒有局部性。另一方面,越上級的名字空間處理費(fèi)用越高,通過經(jīng)濟(jì)激勵(lì)手段讓合約只在必要的時(shí)候才跨分片,只在非常必要的時(shí)候才跨高層次的分片。
圖1:曌鏈MIT跨片示意圖
跨分片消息傳遞
每個(gè)實(shí)體都有一個(gè)URN,結(jié)構(gòu)是 : <protocol_id>:<shard_path>/<public_key_fingerprint>.
每個(gè)實(shí)習(xí)都有一個(gè)通過公鑰來識別身份的郵箱. RChain分片是通過channel實(shí)現(xiàn)的.
每個(gè)分片都運(yùn)行著一個(gè)Mailman合約來路由消息.
每條消息都包含這三個(gè)字段: destination, signature & payload
描述
同一個(gè)分片的消息傳遞
Mailman從消息中提取到destination,然后發(fā)送到目標(biāo)郵箱
準(zhǔn)備跨分片消息
在消息發(fā)送到其他分片前要經(jīng)過共識,發(fā)送消息的意圖將存儲在塊鏈中,并且只有在塊完成后才發(fā)送。
圖2:曌鏈MIT跨片消息傳遞
子分片到父分片交易
向父分片發(fā)送消息的總結(jié)如下:
1、就發(fā)送消息到父分片的決定達(dá)成共識;
2、validators簽名然后把消息發(fā)送給父分片;
3、消息需要至少k個(gè)validators的簽名;
4、獲得k個(gè)簽名之后,消息存儲在區(qū)塊鏈中;
5、共識達(dá)成之后,進(jìn)行下一步;
圖3:向父分片發(fā)送消息流程圖
父分片向子分片交易
傳輸過程如下:
1、就發(fā)送消息的決定達(dá)成共識;
2、子分片的validators作為父分片的客戶端,收到了這條消息;
3、子分片的validators在子分片的區(qū)塊鏈上存儲這條消息;
4、共識達(dá)成之后進(jìn)行下一步動作;
圖4:向子分片發(fā)送消息流程圖
散列鎖托管轉(zhuǎn)移(Hash-locked escrow transfer)
愛麗絲和鮑勃要通過代幣P來交易貨物,他們需要以下的一個(gè)交易機(jī)制來保證:
1、愛麗絲擁有代幣P有效
2、在交易過程當(dāng)中,代幣P在愛麗絲的賬戶金額當(dāng)中鎖定,并且不能被其他交易使用
3、當(dāng)?shù)玫搅薑次確認(rèn)之后,交易執(zhí)行成功
4、交易被取消的話,如果時(shí)間少于T,則代幣會歸還到愛麗絲的賬戶當(dāng)中
圖5:散列鎖托管轉(zhuǎn)移流程圖
相關(guān)名詞解釋
Shard - 有自己的一組驗(yàn)證人的獨(dú)立網(wǎng)絡(luò)節(jié)點(diǎn)群;
Shard tree - 分片的結(jié)構(gòu);
Neighbour shards - 相鄰的分片;
Mailman - 發(fā)送消息給別的分片的智能合約;
Mailbox - 存儲消息. 也是分片的客戶端;
Address - 多分片的環(huán)境里的實(shí)體的唯一標(biāo)識. 包括分片id和公鑰;
Mint - 在分片當(dāng)中創(chuàng)建和銷毀Token的智能合約;
Depository - 存儲子分片當(dāng)中的Token余額的智能合約;
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。