本發(fā)明涉及一種基于雙鏈結(jié)構(gòu)的高性能聯(lián)盟區(qū)塊鏈,在現(xiàn)有區(qū)塊鏈技術(shù)的基礎(chǔ)上,修改了聯(lián)盟區(qū)塊鏈中關(guān)于共識(shí)架構(gòu)和擴(kuò)展性方面的設(shè)計(jì),形成了一種基于雙鏈結(jié)構(gòu)的高性能聯(lián)盟區(qū)塊鏈。
背景技術(shù):
區(qū)塊鏈中存在兩個(gè)獨(dú)立層面的共識(shí),其一可稱(chēng)為“輸入共識(shí)”,其含義是各節(jié)點(diǎn)對(duì)指令的順序及內(nèi)容達(dá)成共識(shí),類(lèi)似傳統(tǒng)數(shù)據(jù)通信的會(huì)話層,不牽涉業(yè)務(wù)操作;其二可稱(chēng)為“輸出共識(shí)”,其含義是業(yè)務(wù)系統(tǒng)受輸入的驅(qū)動(dòng),狀態(tài)不斷發(fā)生躍遷,同時(shí)產(chǎn)生一系列輸出,此時(shí)各參與方對(duì)業(yè)務(wù)系統(tǒng)進(jìn)入的狀態(tài)及產(chǎn)生的輸出達(dá)成共識(shí)。
這兩層共識(shí)在設(shè)計(jì)上可以分離,但不同區(qū)塊鏈在這里的設(shè)計(jì)差別很大,總的來(lái)說(shuō)有三種方式:
第一種方式是只提供輸入共識(shí),此以factom項(xiàng)目為例。factom只對(duì)數(shù)據(jù)內(nèi)容和順序進(jìn)行共識(shí),把對(duì)數(shù)據(jù)的后續(xù)檢驗(yàn)及處理交給其他應(yīng)用程序完成。其缺點(diǎn)是:不支持應(yīng)用程序結(jié)果的比對(duì)和校驗(yàn),無(wú)法抗擊應(yīng)用邏輯執(zhí)行時(shí)的拜占庭錯(cuò)誤。
第二種方式是以緊耦合的方式提供輸入共識(shí)和輸出共識(shí),典型案例如以太坊。以太坊的區(qū)塊頭中不僅包含交易根,也包含狀態(tài)根,通過(guò)統(tǒng)一的機(jī)制串行地達(dá)成對(duì)交易和狀態(tài)的共識(shí),也就是串行完成輸入共識(shí)和輸出共識(shí)。其缺點(diǎn)是無(wú)關(guān)的業(yè)務(wù)邏輯也不能并行執(zhí)行,且業(yè)務(wù)邏輯執(zhí)行和輸入共識(shí)執(zhí)行的串行化會(huì)極大降低系統(tǒng)的總吞吐量。
第三種方式是以分離的方式提供輸入共識(shí)和輸出共識(shí)。比如在fabric1.0中,輸入共識(shí)在orderer之間達(dá)成,orderer只看到數(shù)據(jù),并不理解任何業(yè)務(wù)含義,輸出共識(shí)則通過(guò)endorsor和committer及應(yīng)用層checkpoint機(jī)制另外實(shí)現(xiàn)。fabric的輸出共識(shí)機(jī)制所用的狀態(tài)指紋生成方式乃是把全部智能合約(chaincode)所訪問(wèn)的kv數(shù)據(jù)庫(kù)組織成許多邏輯有序的桶,以各桶為葉節(jié)點(diǎn)組織成一棵merkle樹(shù)生成,利用哈希操作自底向上逐層計(jì)算出樹(shù)根的值。其缺點(diǎn)是:計(jì)算無(wú)法個(gè)性化定制,即使只有一個(gè)桶的內(nèi)容發(fā)生改變,重新計(jì)算merkle根也會(huì)帶來(lái)o(logn)的開(kāi)銷(xiāo)(n是作為葉節(jié)點(diǎn)的桶的個(gè)數(shù))。另一方面,業(yè)務(wù)邏輯所需持久化操作若需進(jìn)入輸出共識(shí)就必須基于fabric提供的api、fabric選用的kv數(shù)據(jù)庫(kù)進(jìn)行,同時(shí)開(kāi)發(fā)語(yǔ)言也只能局限于fabric目前支持的兩種語(yǔ)言(golang和java),很大程度上限制了現(xiàn)有代碼的重復(fù)利用、限制了現(xiàn)有程序員技能的重復(fù)利用,限制了開(kāi)發(fā)業(yè)務(wù)邏輯所能利用的數(shù)據(jù)庫(kù)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種基于雙鏈結(jié)構(gòu)的高性能聯(lián)盟區(qū)塊鏈。
本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的:一種基于雙鏈結(jié)構(gòu)的高性能聯(lián)盟區(qū)塊鏈bc,包含一個(gè)輸入共識(shí)鏈和多個(gè)業(yè)務(wù)邏輯鏈。輸入共識(shí)鏈節(jié)點(diǎn)個(gè)數(shù)為ni,其中最多包含的惡意節(jié)點(diǎn)數(shù)為fi,根據(jù)bft類(lèi)算法的要求,ni大于等于3fi+1;所述業(yè)務(wù)邏輯鏈中最多包含的惡意節(jié)點(diǎn)個(gè)數(shù)為fb。
客戶(hù)端提交請(qǐng)求,輸入共識(shí)鏈的節(jié)點(diǎn)基于共識(shí)算法為bc的全部客戶(hù)發(fā)送的全部請(qǐng)求提供拜占庭容錯(cuò)的全序組播服務(wù);輸入共識(shí)鏈的全部正確節(jié)點(diǎn)都將看到全局一致的客戶(hù)請(qǐng)求流。每個(gè)輸入共識(shí)鏈的正確節(jié)點(diǎn)將客戶(hù)請(qǐng)求流仍按請(qǐng)求流內(nèi)的交易順序向其下游的“業(yè)務(wù)邏輯鏈”發(fā)布。
業(yè)務(wù)邏輯鏈中的正確節(jié)點(diǎn)nd與輸入共識(shí)鏈的ni–fi個(gè)不同節(jié)點(diǎn)建立連接,獲取客戶(hù)請(qǐng)求流,若業(yè)務(wù)邏輯鏈中的正確節(jié)點(diǎn)nd獲取大于等于fi+1個(gè)的一致的輸入,則讀取該輸入中的序列<i1,i2,i3,…>,驅(qū)動(dòng)業(yè)務(wù)邏輯鏈內(nèi)部狀態(tài)發(fā)生改變,同時(shí)產(chǎn)生有序的輸出流<o1,o2,o3,…>,每個(gè)nd都向聯(lián)盟鏈bc的客戶(hù)c發(fā)送此輸出流<o1,o2,o3,…>中和c在業(yè)務(wù)上相關(guān)的應(yīng)答信息。
bc的客戶(hù)c比對(duì)來(lái)自業(yè)務(wù)邏輯鏈各個(gè)節(jié)點(diǎn)的應(yīng)答信息,并在獲得fb+1個(gè)一致應(yīng)答信息后可確信應(yīng)答信息無(wú)誤,fb為業(yè)務(wù)邏輯鏈中最多包含的惡意節(jié)點(diǎn)個(gè)數(shù)。
進(jìn)一步地,客戶(hù)端提交請(qǐng)求時(shí),采用“多業(yè)務(wù)邏輯鏈和主題”的設(shè)計(jì),為每個(gè)請(qǐng)求附帶一個(gè)主題標(biāo)簽。
進(jìn)一步地,客戶(hù)端在對(duì)比應(yīng)答時(shí),采用“基于可觀測(cè)狀態(tài)的共識(shí)”的方法進(jìn)行比對(duì)。
本發(fā)明的有益效果在于:本發(fā)明相比于fabric,不限制業(yè)務(wù)邏輯的開(kāi)發(fā)平臺(tái)、開(kāi)發(fā)語(yǔ)言和基礎(chǔ)服務(wù),同時(shí)提出了“基于可觀測(cè)狀態(tài)的共識(shí)”的新選擇,將狀態(tài)指紋的產(chǎn)生效率提升到o(1)的復(fù)雜度。與此同時(shí),傳統(tǒng)“基于完整狀態(tài)的共識(shí)”的選擇仍然對(duì)設(shè)計(jì)者開(kāi)放。
附圖說(shuō)明
圖1為該方法的整體架構(gòu)圖。
具體實(shí)施方式
一種基于雙鏈結(jié)構(gòu)的高性能聯(lián)盟區(qū)塊鏈bc,包含一個(gè)輸入共識(shí)鏈和多個(gè)業(yè)務(wù)邏輯鏈。輸入共識(shí)鏈節(jié)點(diǎn)個(gè)數(shù)為ni,其中最多包含的惡意節(jié)點(diǎn)數(shù)為fi,根據(jù)bft類(lèi)算法的要求,ni大于等于3fi+1;所述業(yè)務(wù)邏輯鏈中最多包含的惡意節(jié)點(diǎn)個(gè)數(shù)為fb。
客戶(hù)端提交請(qǐng)求,輸入共識(shí)鏈的節(jié)點(diǎn)基于共識(shí)算法為bc的全部客戶(hù)發(fā)送的全部請(qǐng)求提供拜占庭容錯(cuò)的全序組播服務(wù),例如,可以采用pbft共識(shí)算法實(shí)現(xiàn)。輸入共識(shí)鏈中每個(gè)正確節(jié)點(diǎn)都遵照協(xié)議規(guī)定的pre-prepare、prepare、commit三階段算法運(yùn)行,唯一的變化是:commit成功后只執(zhí)行空操作,也即完全不執(zhí)行業(yè)務(wù)相關(guān)邏輯,且不向client發(fā)送reply消息。
客戶(hù)端提交請(qǐng)求m時(shí),采用“多業(yè)務(wù)邏輯鏈和主題”的設(shè)計(jì),可以為每個(gè)m附帶一個(gè)主題標(biāo)簽,方法如下:
(a)可以采用的最簡(jiǎn)單的主題標(biāo)簽設(shè)計(jì)是:每個(gè)m只能賦予1個(gè)主題,想要把一個(gè)消息發(fā)送給多個(gè)主題,可以打上不同topic標(biāo)簽,提交多次。
(b)可以采用的復(fù)雜標(biāo)簽設(shè)計(jì)則是:可以附帶許多個(gè)主題標(biāo)簽。
備注:同一bc的不同業(yè)務(wù)邏輯鏈對(duì)主題的訂閱是獨(dú)立的。訂閱的本質(zhì)是從單一的輸入共識(shí)鏈輸出流中根據(jù)m的主題標(biāo)簽過(guò)濾出自己關(guān)心的部分進(jìn)行處理。如果需要有多個(gè)不同的輸入共識(shí)鏈輸出流,將其分在不同分區(qū)中就可以了,本專(zhuān)利不闡述這部分設(shè)計(jì)。
共識(shí)算法執(zhí)行后,輸入共識(shí)鏈的全部正確節(jié)點(diǎn)都將看到全局一致的客戶(hù)請(qǐng)求流。一致性體現(xiàn)在:在正確節(jié)點(diǎn)看到的客戶(hù)請(qǐng)求流中,下標(biāo)seq相同的消息,其內(nèi)容一定一致。
每個(gè)輸入共識(shí)鏈的正確節(jié)點(diǎn)將客戶(hù)請(qǐng)求流仍按請(qǐng)求流內(nèi)的交易順序向其下游的“業(yè)務(wù)邏輯鏈”發(fā)布。
業(yè)務(wù)邏輯鏈”中的正確節(jié)點(diǎn)nd與輸入共識(shí)鏈的ni–fi個(gè)不同節(jié)點(diǎn)建立連接,進(jìn)行客戶(hù)請(qǐng)求流獲取,若“業(yè)務(wù)邏輯鏈”中的正確節(jié)點(diǎn)nd讀到大于等于fi+1個(gè)的一致的輸入m,則可以確定出現(xiàn)在全局輸入流的seq位置上的消息確實(shí)是m(因?yàn)閚i≥3fi+1,故nd建立有至少ni-fi≥2fi+1個(gè)這樣的連接,其中至少fi+1個(gè)連接到業(yè)務(wù)邏輯鏈中的正確節(jié)點(diǎn)。此種方式下,業(yè)務(wù)邏輯鏈和一般的拜占庭容錯(cuò)集群存在少許不同,因?yàn)槠湔_節(jié)點(diǎn)的輸入流已可確保一致,所以確保正確的條件可以放寬到nb≥2fb+1),nd就可以據(jù)此執(zhí)行業(yè)務(wù)邏輯。
當(dāng)ni=nb時(shí),還可以采用:在業(yè)務(wù)邏輯鏈節(jié)點(diǎn)和輸入共識(shí)鏈節(jié)點(diǎn)之間建立一一對(duì)應(yīng)關(guān)系,進(jìn)行發(fā)布。由于此時(shí)兩層鏈之間的耦合關(guān)系被強(qiáng)化,業(yè)務(wù)邏輯層看到的輸入也不能確保正確,所以就應(yīng)該把對(duì)應(yīng)的一對(duì)業(yè)務(wù)邏輯鏈節(jié)點(diǎn)/輸出共識(shí)鏈節(jié)點(diǎn)看作一個(gè)整體,fi=fb,且必須nb≥3fb+1。
業(yè)務(wù)邏輯鏈的每個(gè)正確節(jié)點(diǎn)nd讀取輸入共識(shí)鏈發(fā)布的客戶(hù)請(qǐng)求流中的序列<i1,i2,i3,…>,驅(qū)動(dòng)業(yè)務(wù)邏輯鏈內(nèi)部狀態(tài)發(fā)生改變,同時(shí)產(chǎn)生有序的輸出流<o1,o2,o3,…>,每個(gè)nd都向聯(lián)盟鏈bc的客戶(hù)c發(fā)送此輸出流<o1,o2,o3,…>中和c在業(yè)務(wù)上相關(guān)的應(yīng)答信息。
bc的客戶(hù)c比對(duì)來(lái)自業(yè)務(wù)邏輯鏈各個(gè)節(jié)點(diǎn)的應(yīng)答信息,并在獲得fb+1個(gè)一致應(yīng)答信息后可確信應(yīng)答信息無(wú)誤,fb為業(yè)務(wù)邏輯鏈中最多包含的惡意節(jié)點(diǎn)個(gè)數(shù)。
客戶(hù)端在對(duì)比應(yīng)答時(shí),采用“基于可觀測(cè)狀態(tài)的共識(shí)”的設(shè)計(jì),根據(jù)應(yīng)答中包含的信息量不同,實(shí)現(xiàn)這種比對(duì)所需的開(kāi)銷(xiāo)和能確保的內(nèi)容也有所不同:
(a)可以采用的最簡(jiǎn)單的o(1)的做法是:<o1,o2,o3,…>不包含任何狀態(tài)指紋,客戶(hù)c滿足于看到的應(yīng)答順序和內(nèi)容經(jīng)過(guò)共識(shí)確保正確。
(b)可以采用的另一種o(1)的做法是:oi中納入一個(gè)prehash字段,o1.prehash=0,oi.prehash=hash(oi-1),在輸出序列上構(gòu)成一個(gè)類(lèi)區(qū)塊鏈結(jié)構(gòu)。
備注:有些區(qū)塊鏈設(shè)計(jì)中,在應(yīng)答之中會(huì)嵌入業(yè)務(wù)邏輯節(jié)點(diǎn)執(zhí)行后系統(tǒng)完整狀態(tài)的指紋(如fabric中的狀態(tài)根)。這種指紋將系統(tǒng)內(nèi)部狀態(tài)作為白盒進(jìn)行匯總,哪怕對(duì)最終客戶(hù)而言某些信息與其無(wú)關(guān)也仍然要匯總。這種設(shè)計(jì)在本專(zhuān)利中仍然可以使用,但缺點(diǎn)前面也已指出。本專(zhuān)利提出“基于可觀測(cè)狀態(tài)的共識(shí)”這一新思路,也就是站在客戶(hù)角度將系統(tǒng)看作黑盒。如果系統(tǒng)對(duì)客戶(hù)展現(xiàn)出的可觀測(cè)狀態(tài)(通常是輸出,查詢(xún)的返回也是一種輸出)確保是經(jīng)過(guò)共識(shí)確保一致的,而客戶(hù)又確實(shí)以此為足,則此時(shí)狀態(tài)指紋的創(chuàng)建可以采用其他方式。