MetaForce佛薩奇系統(tǒng)開(kāi)發(fā)主要流程
MySQL,關(guān)系型數(shù)據(jù)庫(kù),支持schema和富查詢,性能較KV數(shù)據(jù)庫(kù)低,目前關(guān)系型數(shù)據(jù)庫(kù)與區(qū)塊鏈的狀態(tài)數(shù)據(jù)并不能很好的結(jié)合,導(dǎo)致很少有區(qū)塊鏈采用關(guān)系型數(shù)據(jù)庫(kù)作為狀態(tài)數(shù)據(jù)庫(kù)。原因主要有兩點(diǎn):1.區(qū)塊鏈需要對(duì)智能合約所讀寫(xiě)的狀態(tài)數(shù)據(jù)做嚴(yán)格的控制和校驗(yàn),而SQL語(yǔ)句相對(duì)區(qū)塊鏈來(lái)說(shuō)過(guò)于靈活,難以控制;2.需要提前創(chuàng)建庫(kù)表和索引,需要針對(duì)不同的智能合約創(chuàng)建不同的數(shù)據(jù)庫(kù)表結(jié)構(gòu),不夠靈活。目前長(zhǎng)安鏈支持MySQL存儲(chǔ)引擎,在系統(tǒng)數(shù)據(jù)如Block DB上支持區(qū)塊元信息、交易信息的關(guān)系型語(yǔ)義,狀態(tài)數(shù)據(jù)庫(kù)支持kv的方式和智能合約編寫(xiě)SQL語(yǔ)句方式讀寫(xiě)狀態(tài)數(shù)據(jù)(world state)。 根據(jù)對(duì)同一批交易調(diào)度產(chǎn)生的執(zhí)行順序是否隨機(jī),并行調(diào)度算法可分為:
I8O系統(tǒng)2857開(kāi)發(fā)8624游戲
隨機(jī)性調(diào)度算法:即針對(duì)同一批交易調(diào)度產(chǎn)生的交易執(zhí)行順序是隨機(jī)的,即使同一節(jié)點(diǎn)針對(duì)同一批交易連續(xù)運(yùn)行兩次調(diào)度算法產(chǎn)生的結(jié)果也可能不同。此類算法往往調(diào)度速度較快,其難點(diǎn)在于驗(yàn)證節(jié)點(diǎn)如何保證執(zhí)行順序與提案節(jié)點(diǎn)一致并得到相同的執(zhí)行結(jié)果。因此,交易的執(zhí)行順序必須打包至區(qū)塊中并由其他節(jié)點(diǎn)據(jù)此驗(yàn)證。 確定性調(diào)度算法:即針對(duì)同一批交易調(diào)度產(chǎn)生的交易執(zhí)行順序是確定的。此類算法的優(yōu)點(diǎn)是交易執(zhí)行順序產(chǎn)生穩(wěn)定且可復(fù)現(xiàn),因此理論上講交易執(zhí)行順序的信息可不包含在區(qū)塊內(nèi),各驗(yàn)證節(jié)點(diǎn)運(yùn)行并行調(diào)度算法即可進(jìn)行校驗(yàn)。 同步服務(wù)模塊handlerá 同步模塊的消息handler負(fù)責(zé)處理從net模塊監(jiān)聽(tīng)到的NetMsg_SYNC_BLOCK_MSG類型的消息 func(sync*BlockChainSyncServer)blockSyncMsgHandler(from string,msg[]byte,msgType netPb.NetMsg_MsgType)error{ //檢查服務(wù)是否啟動(dòng) check sync.start //檢查消息類型 check msgType!=netPb.NetMsg_SYNC_BLOCK_MSG //解析msg unmarshal msg->syncMsg switch syncMsg.Type{ case syncPb.SyncMsg_NODE_STATUS_REQ: //返回本地高度 return sync.handleNodeStatusReq(from) case syncPb.SyncMsg_NODE_STATUS_RESP: //在定時(shí)器任務(wù)隊(duì)列中添加NodeStatusMsg任務(wù),啟動(dòng)處理流程 return sync.handleNodeStatusResp(&syncMsg,from) case syncPb.SyncMsg_BLOCK_SYNC_REQ: //返回區(qū)塊數(shù)據(jù)(封裝在SyncMsg中,包含相應(yīng)的業(yè)務(wù)數(shù)據(jù)) return sync.handleBlockReq(&syncMsg,from) case syncPb.SyncMsg_BLOCK_SYNC_RESP: //在定時(shí)器任務(wù)隊(duì)列中添加SyncedBlockMsg任務(wù),啟動(dòng)處理流程 return sync.scheduler.addTask(&SyncedBlockMsg{msg:syncMsg.Payload,from:from}) }