本發(fā)明涉及區(qū)塊鏈,特別涉及一種區(qū)塊鏈本地賬本數(shù)據(jù)同步方法及系統(tǒng)。
背景技術(shù):
1、在聯(lián)盟鏈環(huán)境中,鏈節(jié)點分化為共識節(jié)點和普通業(yè)務(wù)節(jié)點。共識節(jié)點通常是由單數(shù)個節(jié)點組成的集群,該集群內(nèi)節(jié)點執(zhí)行共識協(xié)議,由leader節(jié)點負(fù)責(zé)賬本的記賬和出塊,業(yè)務(wù)節(jié)點只需從共識節(jié)點同步賬本信息即可。
2、為消除因偶然的因素(如存儲和網(wǎng)絡(luò)延時)造成的數(shù)據(jù)異常,各業(yè)務(wù)節(jié)點需定期對本地賬本數(shù)據(jù)進行盤點校驗,盤點從當(dāng)前區(qū)塊開始,逐塊進行核驗,核驗失敗,則向共識節(jié)點同步正確的區(qū)塊,每個區(qū)塊的都記錄上一個區(qū)塊的hash,可以依據(jù)此hash回溯到上一區(qū)塊進行校驗,直到回溯校驗至創(chuàng)世區(qū)塊。
3、隨著業(yè)務(wù)的增長,鏈的高度也不斷增長,若每次賬本盤點都回溯校驗至創(chuàng)世區(qū)塊,就會有大量不必要的重復(fù)工作。
4、另外網(wǎng)絡(luò)故障或者共識節(jié)點的單機故障,區(qū)塊鏈可能會因共識集群的腦裂問題出現(xiàn)分叉現(xiàn)象,雖然通常有措施保障不會出現(xiàn)較長的分叉鏈,但分叉仍有可能存在,進一步造成盤點困難。
技術(shù)實現(xiàn)思路
1、本發(fā)明提供一種區(qū)塊鏈本地賬本數(shù)據(jù)同步方法及系統(tǒng),旨在解決現(xiàn)有區(qū)塊鏈盤點方式存在大量重復(fù)計算的問題。
2、本發(fā)明提供一種區(qū)塊鏈本地賬本數(shù)據(jù)同步方法,包括以下步驟:
3、s1.在區(qū)塊鏈進行區(qū)塊的盤點時,每完成一次盤點,保存盤點過的區(qū)塊位置,并將盤點的兩個區(qū)塊位置標(biāo)記為兩處檢查點,且在兩處檢查點分別寫入兩個對應(yīng)區(qū)塊的哈希值;
4、s2.開啟新區(qū)塊的回溯盤點,當(dāng)回溯到其中一處檢查點時,則將另一處檢查點更新為新區(qū)塊位置的標(biāo)記,并去除該另一處檢查點對應(yīng)的原區(qū)塊位置標(biāo)記;
5、s3.伴隨區(qū)塊鏈的高度延長和多次盤點,兩處檢查點在區(qū)塊鏈上交替更新,并沿區(qū)塊鏈延長的高度方向移動更新;
6、s4.當(dāng)區(qū)塊鏈延伸未出現(xiàn)分叉的情況下,兩處檢查點執(zhí)行步驟s3的交替更新操作;
7、s5.當(dāng)區(qū)塊鏈延伸存在分叉,且其中一個檢查點位于主鏈上,另一個檢查點位于有效分叉鏈上的情況下,兩處檢查點執(zhí)行步驟s3的交替更新操作;
8、s6.當(dāng)區(qū)塊鏈延伸存在分叉,且其中一個檢查點位于主鏈上,另一個檢查點位于無效分叉鏈上的情況下,新檢查點以主鏈的檢查點為回溯終點生成,并繼續(xù)執(zhí)行步驟s3的交替更新操作。
9、作為本發(fā)明的進一步改進,所述步驟s1還包括:
10、在區(qū)塊鏈進行首次區(qū)塊盤點時,將首次盤點的區(qū)塊向前回溯至初始創(chuàng)世區(qū)塊,以初始創(chuàng)世區(qū)塊的位置作為第一檢查點,并將初始創(chuàng)世區(qū)塊的哈希值寫入第一檢查點,以首次盤點區(qū)塊的位置作為第二檢查點,并將首次盤點區(qū)塊的哈希值寫入第二檢查點。
11、作為本發(fā)明的進一步改進,所述步驟s2包括:
12、s21.開啟下一次的區(qū)塊盤點時,從第n區(qū)塊開始盤點,當(dāng)回溯到第n-1區(qū)塊時,若檢測到第n-1區(qū)塊的哈希值與第二檢查點的哈希值一致,則第n區(qū)塊的回溯停止,并將第n區(qū)塊的哈希值寫入第一檢查點,將第一檢查點的標(biāo)記更新為第n區(qū)塊的位置,結(jié)束該次的區(qū)塊盤點;
13、s22.再開啟下次區(qū)塊盤點時,從第n+1區(qū)塊開始盤點,當(dāng)回溯到第n區(qū)塊時,若檢測到第n區(qū)塊的哈希值與第一檢查點的哈希值一致,則第n+1區(qū)塊的回溯停止,并將第n+1區(qū)塊的哈希值寫入第二檢查點,將第二檢查點的標(biāo)記更新為第n+1區(qū)塊的位置,結(jié)束該次的區(qū)塊盤點;n為整數(shù)且n≥2;
14、所述步驟s3包括:
15、區(qū)塊鏈的高度延長和多次盤點時,輪流執(zhí)行步驟s21和s22,以使第一檢查點和第二檢查點的位置和哈希值輪流更新,并交替在鏈上移動前進,直至指向最新盤點的區(qū)塊。
16、作為本發(fā)明的進一步改進,所述步驟s3的具體執(zhí)行步驟包括:
17、s31.盤點開始,定位到當(dāng)前最新區(qū)塊,取到最新區(qū)塊的哈希值,以此哈希值在本地節(jié)點上做檢索,若檢索到具體的區(qū)塊,則說明本節(jié)點區(qū)塊有效,檢索通過;若根據(jù)此哈希值,在本地節(jié)點檢索不到具體的區(qū)塊,則說明本節(jié)點缺少該區(qū)塊,檢索失?。?/p>
18、s32.若檢索失敗,則重新下載該區(qū)塊;
19、s33.若檢索通過,則計算本區(qū)塊的哈希值,將此哈希值依次與第一檢查點和第二檢查點變量中的哈希值進行比較,若本區(qū)塊的哈希值與第一檢查點、第二檢查點中任一個標(biāo)記變量的哈希值相同,則說明遇到了其中一個已經(jīng)盤點過的檢查點,則用本次盤點開始的區(qū)塊哈希值來更新另一個檢查點的標(biāo)記變量,然后返回并結(jié)束此次盤點;
20、s34.若檢索通過,且本區(qū)塊的哈希值與第一檢查點、第二檢查點中的值均不同,則通過區(qū)塊頭中的信息,找到上一個盤點區(qū)塊,繼續(xù)循環(huán)執(zhí)行步驟s31至s34。
21、作為本發(fā)明的進一步改進,所述步驟s4具體包括:
22、s4.在區(qū)塊鏈延伸未發(fā)生分叉的情形下,從最新的區(qū)塊開始沿區(qū)塊鏈進行回溯操作,回溯至區(qū)塊鏈上的前序檢查點時停止,將最新區(qū)塊更新為新的檢查點,該新檢查點與區(qū)塊鏈上的前序檢查點共同構(gòu)成新的兩處檢查點。
23、作為本發(fā)明的進一步改進,所述步驟s5具體包括:
24、當(dāng)區(qū)塊鏈延伸過程中存在分叉,且一處檢查點處于主鏈上,另一處檢查點位于有效分叉鏈上時,最新區(qū)塊從有效分叉鏈上開始回溯,回溯至有效分叉鏈上的前序檢查點時停止,將該最新區(qū)塊更新為新檢查點,此新檢查點與有效分叉鏈上的前序檢查點共同構(gòu)成新的兩處檢查點。
25、作為本發(fā)明的進一步改進,所述步驟s6具體包括:
26、當(dāng)區(qū)塊鏈延伸過程中存在分叉,并且一處檢查點位于主鏈上,而另一處檢查點處于無效分叉鏈上時,最新區(qū)塊從有效分叉鏈上開始回溯,回溯至主鏈的檢查點時停止,將該最新區(qū)塊更新為新檢查點,此新檢查點與主鏈的檢查點共同構(gòu)成新的兩處檢查點。
27、本發(fā)明還提供一種區(qū)塊鏈本地賬本數(shù)據(jù)同步系統(tǒng),包括區(qū)塊鏈和設(shè)置在區(qū)塊鏈上的多個區(qū)塊節(jié)點,并執(zhí)行:
28、在區(qū)塊鏈進行區(qū)塊的盤點時,每完成一次盤點,保存盤點過的區(qū)塊位置,并將盤點的兩個區(qū)塊位置標(biāo)記為兩處檢查點,且在兩處檢查點分別寫入兩個對應(yīng)區(qū)塊的哈希值;
29、開啟新區(qū)塊的回溯盤點,當(dāng)回溯到其中一處檢查點時,則將另一處檢查點更新為新區(qū)塊位置的標(biāo)記,并去除該另一處檢查點對應(yīng)的原區(qū)塊位置標(biāo)記;
30、伴隨區(qū)塊鏈的高度延長和多次盤點,兩處檢查點在區(qū)塊鏈上交替更新,并沿區(qū)塊鏈延長的高度方向移動更新;
31、當(dāng)區(qū)塊鏈延伸未出現(xiàn)分叉的情況下,兩處檢查點執(zhí)行步驟s3的交替更新操作;
32、當(dāng)區(qū)塊鏈延伸存在分叉,且其中一個檢查點位于主鏈上,另一個檢查點位于有效分叉鏈上的情況下,兩處檢查點執(zhí)行交替更新操作;
33、當(dāng)區(qū)塊鏈延伸存在分叉,且其中一個檢查點位于主鏈上,另一個檢查點位于無效分叉鏈上的情況下,新檢查點以主鏈的檢查點為回溯終點生成,并繼續(xù)執(zhí)行交替更新操作。
34、本發(fā)明還提供一種存儲介質(zhì),其上存儲有計算機程序,所述程序被處理器執(zhí)行時實現(xiàn)所述的區(qū)塊鏈本地賬本數(shù)據(jù)同步方法。
35、本發(fā)明還提供一種計算機設(shè)備,包括存儲介質(zhì)、處理器及存儲在存儲介質(zhì)上并可在處理器上運行的計算機程序,所述處理器執(zhí)行所述程序時實現(xiàn)所述的區(qū)塊鏈本地賬本數(shù)據(jù)同步方法。
36、本發(fā)明的有益效果是:引入了檢查點,即每次盤點結(jié)束時,把盤點過的位置保存下來,在區(qū)塊鏈上設(shè)置前后兩個已盤點的檢查點,并在每次盤點后依次更新這兩個檢查點,可優(yōu)化存在區(qū)塊鏈分叉可能性的情況下,本地賬本檢核的重復(fù)工作量。