時(shí)間:2023-07-12|瀏覽:279
1. 請(qǐng)求如何接入?是http,restful,還是rpc? 2. 應(yīng)用邏輯寫在哪里,怎么寫 3. 數(shù)據(jù)如何存儲(chǔ)?用什么數(shù)據(jù)庫? 4. 當(dāng)前服務(wù)如何調(diào)用其它服務(wù)(高級(jí),異步)
將此模式應(yīng)用到Substrate上,官方給出了如下結(jié)構(gòu)圖。在這個(gè)圖中,Off-chain workers起到了非常重要的作用。
筆者通過對(duì)substrate的深度分析,在這里給出上圖的一個(gè)細(xì)化圖,基于此圖,采用substrate進(jìn)行Web3.0的開發(fā)就就豁然開朗了。
區(qū)塊鏈應(yīng)用開發(fā)更加復(fù)雜一些,因?yàn)樯婕暗芥溕湘溝虏煌糠值牟僮鳌?duì)上圖Substrate Application Structure的解釋如下:
1. 外界使用JsonRPC與substrate node進(jìn)行交互 2. (幾乎)所有對(duì)鏈上狀態(tài)的修改,都應(yīng)該使用transaction提交到Runtime logic中進(jìn)行處理 3. Runtime logic對(duì)Runtime的Storage具有完全的讀寫能力。對(duì)Offchain Storage具有寫能力 4. Substrate node能直接對(duì)Offchain Storage進(jìn)行讀寫 5. Offchain Workers能直接對(duì)Offchain Storage進(jìn)行讀寫,只能讀取Runtime Storage中的內(nèi)容 6. Offchain Worker可以提交新的交易來實(shí)現(xiàn)對(duì)鏈上狀態(tài)的更新 7. Offchain Worker可以請(qǐng)求外部服務(wù),獲取相應(yīng)的數(shù)據(jù)回來,(異步)更新鏈上狀態(tài)或者本地存儲(chǔ) 8. Substrate node可以通過Runtime API機(jī)制對(duì)鏈上狀態(tài)進(jìn)行讀取,也可以傳參數(shù)進(jìn)Runtime logic以更靈活地讀狀態(tài) 9. 鏈上狀態(tài)的變更,會(huì)生成event,發(fā)送到substrate node中,經(jīng)由rpc被外界監(jiān)聽到
基于Substrate這種清晰的結(jié)構(gòu),我們可以設(shè)計(jì)一些不同的Web3.0應(yīng)用的編程范式。比如其中一種是:
1. 所有修改狀態(tài)的操作,都提交到鏈上處理。但是鏈上不一定存儲(chǔ)所有信息,可以通過Offchain Indexing存一部分到local storage(Offchain Storage) 2. 所有查詢狀態(tài)的操作,可以只通過local storage查詢。或者鏈下與鏈上 storage相結(jié)合的方式查詢(鏈上存儲(chǔ)代價(jià)較大,而鏈下存儲(chǔ)代價(jià)小)。 3. Offchain層可以只需要專注于substrate體系本身。而不受外部接口和數(shù)據(jù)的影響
還可能出現(xiàn)一些瘋狂的玩法,比如:
- 直接使用substrate node和offchain storage,offchain worker部分,實(shí)現(xiàn)一個(gè)傳統(tǒng)的應(yīng)用服務(wù)。完全跟區(qū)塊鏈沒有關(guān)系 - 所有交易先提交到offchain storage中,由offchain worker監(jiān)聽后,來代理提交交易?:P
不過現(xiàn)在Offchain Storage的能力和接口還比較弱。作為kv數(shù)據(jù)庫,功能比redis之類差太遠(yuǎn)。而如果能有一層sql數(shù)據(jù)層就更完整更好用了——能否嵌入一個(gè)sqlite進(jìn)去呢?
熱點(diǎn):web開發(fā)