本發(fā)明涉及一種區(qū)塊鏈技術(shù)領(lǐng)域,特別是涉及一種基于區(qū)塊鏈的在分布式數(shù)據(jù)庫(kù)中進(jìn)行交易查詢的方法。
背景技術(shù):
從數(shù)據(jù)的角度來(lái)看,區(qū)塊鏈本質(zhì)是一種分布式數(shù)據(jù)庫(kù),這里的“分布式”是指區(qū)塊鏈技術(shù)利用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)不僅解決了分布式數(shù)據(jù)存儲(chǔ)問(wèn)題,也解決了存儲(chǔ)時(shí)的分布式一致性問(wèn)題。區(qū)塊鏈技術(shù)利用分布式記賬簿保證數(shù)據(jù)可靠傳輸和訪問(wèn),利用可自動(dòng)執(zhí)行的智能合約來(lái)編程和操作數(shù)據(jù)。
區(qū)塊鏈技術(shù)中涉及多項(xiàng)與交易查詢有關(guān)的技術(shù),如布隆過(guò)濾器(bloom過(guò)濾器),是一個(gè)允許用戶描述特定的關(guān)鍵詞組合而不必精確表述的基于概率的過(guò)濾方法,bloom過(guò)濾器實(shí)際上是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),可以用于檢索一個(gè)元素是否在一個(gè)集合中,bloom過(guò)濾器的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過(guò)了一般算法,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難以及誤差。另外,如merkle樹,是一種哈希二叉樹,它是一種用作快速歸納和校驗(yàn)大規(guī)模數(shù)據(jù)完整性的數(shù)據(jù)結(jié)構(gòu)。區(qū)塊鏈中的每個(gè)區(qū)塊都包含了當(dāng)前區(qū)塊的所有交易,用merkle樹表示,這種二叉樹包含加密哈希值,在比特幣網(wǎng)絡(luò)中,merkle樹被用來(lái)歸納一個(gè)區(qū)塊中的所有交易,同時(shí)生成整個(gè)交易集合的數(shù)字指紋,生成一棵完整的merkle樹需要遞歸地對(duì)哈希節(jié)點(diǎn)對(duì)進(jìn)行哈希,并將新生成的哈希節(jié)點(diǎn)插入到merkle樹中,直到只剩一個(gè)哈希節(jié)點(diǎn),該節(jié)點(diǎn)就是merkle樹的根,merkletree大多用來(lái)進(jìn)行比對(duì)以及驗(yàn)證處理,如比特幣錢包服務(wù)就用merkletree的機(jī)制來(lái)做“百分百準(zhǔn)備金證明”,在處理比對(duì)或驗(yàn)證的應(yīng)用場(chǎng)景中時(shí),特別是在分布式環(huán)境下進(jìn)行比對(duì)或驗(yàn)證時(shí),merkletree會(huì)大大減少數(shù)據(jù)的傳輸量以及計(jì)算的復(fù)雜度。
然而,目前基于區(qū)塊鏈技術(shù)的比特幣項(xiàng)目中沒(méi)有一種這樣的交易查詢方式,即針對(duì)任意指定的交易,查詢到交易的有效性及其所屬區(qū)塊,目前的情況下,如果只有一個(gè)交易id,區(qū)塊鏈的歷史賬本中的大量數(shù)據(jù)又得不到有效利用的情況下,想要判斷這個(gè)交易是否有效是十分困難的。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明設(shè)計(jì)了一種基于區(qū)塊鏈的在分布式數(shù)據(jù)庫(kù)中進(jìn)行交易查詢的方法,包括如下步驟:
步驟s101,設(shè)計(jì)bloom過(guò)濾器,根據(jù)設(shè)計(jì)好的bloom過(guò)濾器找出包含指定交易id的候選區(qū)塊;
步驟s102,對(duì)候選區(qū)塊進(jìn)行遍歷篩選,找出包含交易id的目標(biāo)交易所在的具體區(qū)塊,然后構(gòu)造驗(yàn)證消息verifymessage;
步驟s103,通過(guò)解析verifymessage,對(duì)區(qū)塊所在交易路徑進(jìn)行完整性驗(yàn)證;
第四步s104,根據(jù)驗(yàn)證結(jié)果,返回對(duì)應(yīng)信息,實(shí)現(xiàn)基于區(qū)塊鏈的分布式數(shù)據(jù)庫(kù)中任意交易的查詢。
優(yōu)選的,所述步驟s101中設(shè)計(jì)bloom過(guò)濾器的具體方法為:對(duì)于每個(gè)區(qū)塊內(nèi)的所有交易id,通過(guò)k個(gè)哈希函數(shù)進(jìn)行哈希運(yùn)算,然后將運(yùn)算結(jié)果映射在一個(gè)大小為m的位數(shù)組內(nèi),每個(gè)交易id經(jīng)過(guò)哈希函數(shù)使bloom過(guò)濾器里的位數(shù)組中的若干位由0置1,同一個(gè)區(qū)塊中,經(jīng)過(guò)區(qū)塊中所有交易的輸入,使得bloom的位數(shù)組所有對(duì)應(yīng)的位為1從而完成所述區(qū)塊的bloom過(guò)濾器設(shè)計(jì)。
優(yōu)選的,所述位數(shù)組的大小m的最優(yōu)值和所述哈希函數(shù)個(gè)數(shù)k的最優(yōu)值是根據(jù)每個(gè)區(qū)塊內(nèi)的交易的數(shù)量n和允許誤差的p計(jì)算得到的,其中,
優(yōu)選的,所述哈希函數(shù)為如下的哈希函數(shù):bkdrhash,sdbmhash,djbhash,rshash,jshash,pjwhash,elfhash,bkdrhash,sdbmhash,dekhash。
優(yōu)選的,所述步驟s101中根據(jù)設(shè)計(jì)好的bloom過(guò)濾器找出包含指定交易id的候選區(qū)塊的具體方法為:將所述指定交易id作為對(duì)應(yīng)區(qū)塊的bloom過(guò)濾器的輸入,查看所述位數(shù)組中的對(duì)應(yīng)位是否都為1,如果對(duì)應(yīng)的位都為1則該區(qū)塊可能包含指定交易,所述區(qū)塊成為所述候選區(qū)塊;否則,如果對(duì)應(yīng)的所有位并不都為1,那么所述指定交易一定不在所述區(qū)塊中。
優(yōu)選的,針對(duì)一個(gè)所述特定交易id,通過(guò)已經(jīng)設(shè)計(jì)好的所述bloom過(guò)濾器會(huì)篩選出一個(gè)或多個(gè)所述候選區(qū)塊。
優(yōu)選的,所述步驟s102包括如下步驟:
(2-1)在目標(biāo)區(qū)塊中,首先根據(jù)區(qū)塊中的所有交易及其相應(yīng)順序構(gòu)造merkle樹;
(2-2)根據(jù)要查詢的指定交易,構(gòu)建merkle樹中,找出對(duì)應(yīng)祖先節(jié)點(diǎn),即找出從merkle樹根到交易節(jié)點(diǎn)的目標(biāo)路徑;
(2-3)由樹根節(jié)點(diǎn)到葉子節(jié)點(diǎn)進(jìn)行廣度優(yōu)先遍歷,如果包含指定交易id到樹根的路徑的目標(biāo)路徑位于當(dāng)前節(jié)點(diǎn)的左子樹,標(biāo)志位數(shù)組添加標(biāo)志位0,哈希值數(shù)組添加當(dāng)前節(jié)點(diǎn)的右孩子的值,否則,如果目標(biāo)路徑位于當(dāng)前節(jié)點(diǎn)的右子樹,標(biāo)志位數(shù)組添加標(biāo)志位1,哈希值數(shù)組添加當(dāng)前節(jié)點(diǎn)的左孩子的值;
(2-4)將構(gòu)造好的標(biāo)志位數(shù)組和哈希值數(shù)組連同區(qū)塊頭、交易數(shù)量、標(biāo)志位數(shù)量和哈希值數(shù)量封裝成verifymessage驗(yàn)證消息。
優(yōu)選的,所述步驟s102找出交易所在的區(qū)塊后,對(duì)merkle樹進(jìn)行完整性的驗(yàn)證。
優(yōu)選的,所述步驟s103中對(duì)所述解析verifymessage包括如下步驟:
(3-1)根據(jù)verifymessage中交易數(shù)量字段構(gòu)建出一個(gè)空的merkle樹,同時(shí)初始化一個(gè)空棧,用于存儲(chǔ)和計(jì)算哈希值;
(3-2)利用標(biāo)志位數(shù)組和哈希值數(shù)組,對(duì)merkle樹進(jìn)行廣度優(yōu)先遍歷,重新計(jì)算merkle樹的樹根;
(3-3)通過(guò)對(duì)比計(jì)算后的值和verifymessage中區(qū)塊頭的merkle樹根進(jìn)行比較,如果相同,則能確保指定交易在該區(qū)塊中;
(3-4)對(duì)verifymessage中區(qū)塊頭進(jìn)行驗(yàn)證,保證其是位于區(qū)塊鏈中的最長(zhǎng)鏈中。
優(yōu)選的,所述步驟s104,如果沒(méi)有找到區(qū)塊并且所述驗(yàn)證沒(méi)有成功,則返回錯(cuò)誤信息,若找出一個(gè)區(qū)塊并且所述驗(yàn)證成功,則返回區(qū)塊高度。
采用本發(fā)明的方法,實(shí)現(xiàn)基于區(qū)塊鏈的分布式數(shù)據(jù)庫(kù)中任意交易的查詢,提高區(qū)塊鏈數(shù)據(jù)的利用率。
根據(jù)下文結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的詳細(xì)描述,本領(lǐng)域技術(shù)人員將會(huì)更加明了本發(fā)明的上述以及其他目的、優(yōu)點(diǎn)和特征。
附圖說(shuō)明
后文將參照附圖以示例性而非限制性的方式詳細(xì)描述本發(fā)明的一些具體實(shí)施例。附圖中相同的附圖標(biāo)記標(biāo)示了相同或類似的部件或部分。本領(lǐng)域技術(shù)人員應(yīng)該理解,這些附圖未必是按比例繪制的。本發(fā)明的目標(biāo)及特征考慮到如下結(jié)合附圖的描述將更加明顯,附圖中:
圖1為根據(jù)本發(fā)明一個(gè)實(shí)施例的基于區(qū)塊鏈的分布式數(shù)據(jù)庫(kù)中進(jìn)行交易查詢的方法流程示意圖。
圖2為根據(jù)本發(fā)明一個(gè)實(shí)施例的bloom過(guò)濾器設(shè)計(jì)流程示意圖。
圖3為根據(jù)本發(fā)明一個(gè)實(shí)施例的verifymessage完整構(gòu)造過(guò)程示意圖,在整個(gè)驗(yàn)證消息的構(gòu)造過(guò)程中,需要主要找到目標(biāo)交易的路徑,完成標(biāo)志位數(shù)組和哈希數(shù)組的正確構(gòu)造。
圖4為根據(jù)本發(fā)明一個(gè)實(shí)施例的解析驗(yàn)證消息的過(guò)程示意圖,在整個(gè)解析驗(yàn)證消息的過(guò)程中,通過(guò)標(biāo)志位數(shù)組和哈希數(shù)組,通過(guò)廣度優(yōu)先遍歷的方式,重新構(gòu)造merkle樹根,最終用得到的哈希值與區(qū)塊頭中的merkle樹根進(jìn)行比較。
具體實(shí)施方式
為了使得本發(fā)明能夠針對(duì)其發(fā)明要點(diǎn)更加明顯易懂,下面將結(jié)合附圖和實(shí)例對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。在下面的描述中闡述了很多細(xì)節(jié)和具體實(shí)例,提供這些實(shí)例是為了能夠更透徹地理解本發(fā)明,并且能夠?qū)⒈景l(fā)明完整形象地傳達(dá)給本領(lǐng)域的技術(shù)人員。雖然本發(fā)明能夠以很多不同于此的描述的其它方式實(shí)施,但是本領(lǐng)域技術(shù)人員可以在不違背本發(fā)明內(nèi)涵的情況下做相應(yīng)的推廣,因此本發(fā)明不受下面公開的具體實(shí)例及具體附圖所限制。
圖1展示了本發(fā)明一個(gè)實(shí)施例的基于區(qū)塊鏈的分布式數(shù)據(jù)庫(kù)中進(jìn)行交易查詢的方法流程示意圖,包括如下步驟:步驟s101,對(duì)于每個(gè)交易與區(qū)塊的關(guān)系,需要先設(shè)計(jì)一個(gè)bloom過(guò)濾器,在這個(gè)bloom過(guò)濾器中,針對(duì)每個(gè)區(qū)塊內(nèi),需要把所有的交易id通過(guò)常用的哈希函數(shù)進(jìn)行哈希運(yùn)算,然后將結(jié)果映射在一個(gè)大小為m的位數(shù)組內(nèi)。由于bloom過(guò)濾器存在一定的錯(cuò)誤率,所以可能針對(duì)一個(gè)特定的交易id,通過(guò)已經(jīng)設(shè)計(jì)好的bloom過(guò)濾器會(huì)過(guò)濾出若干個(gè)區(qū)塊;步驟s102,根據(jù)步驟s101得到的候選區(qū)塊,需要對(duì)候選區(qū)塊進(jìn)行進(jìn)一步的搜索檢驗(yàn),來(lái)確定包含目標(biāo)交易id的區(qū)塊,若此時(shí)在候選區(qū)塊中都找不到目標(biāo)交易,就返回相應(yīng)的錯(cuò)誤信息。若找到了對(duì)應(yīng)的區(qū)塊,需要構(gòu)造verifymessage,通過(guò)verifymessage用戶可以完整的驗(yàn)證交易的有效性及所屬區(qū)塊;步驟s103,當(dāng)客戶端收到verifymessage之后,針對(duì)標(biāo)志位數(shù)組和哈希值數(shù)組的變化,需要對(duì)其進(jìn)行特定地解析來(lái)驗(yàn)證交易的有效性;步驟s104,根據(jù)指定的交易id返回對(duì)應(yīng)的結(jié)果(如果找到區(qū)塊存在指定的交易,并且驗(yàn)證成功,返回區(qū)塊高度;否則,如果存在一種甚至多種不滿足要求的情況,需要返回相應(yīng)錯(cuò)誤信息)。
圖2展示了本發(fā)明一個(gè)實(shí)施例的bloom過(guò)濾器設(shè)計(jì)流程示意圖,基本原理在于通過(guò)針對(duì)每個(gè)交易與區(qū)塊的關(guān)系來(lái)遍歷區(qū)塊鏈交易和區(qū)塊數(shù)據(jù)的方式設(shè)計(jì)對(duì)應(yīng)的bloom過(guò)濾器,具體方法為:對(duì)于每個(gè)區(qū)塊內(nèi)的所有交易id,通過(guò)k個(gè)最優(yōu)哈希函數(shù)進(jìn)行哈希運(yùn)算,然后將運(yùn)算結(jié)果映射在一個(gè)大小為m的位數(shù)組內(nèi),每個(gè)交易id經(jīng)過(guò)哈希函數(shù)使bloom過(guò)濾器里的位數(shù)組中的若干位由0置1,同一個(gè)區(qū)塊中,經(jīng)過(guò)區(qū)塊中所有交易的輸入,使得bloom的位數(shù)組所有對(duì)應(yīng)的位為1從而完成所述區(qū)塊的bloom過(guò)濾器設(shè)計(jì)。針對(duì)本實(shí)施例,bloom過(guò)濾器設(shè)計(jì)的完整過(guò)程為:首先,遍歷所有區(qū)塊,對(duì)每個(gè)區(qū)塊設(shè)計(jì)自己的bloom過(guò)濾器,對(duì)于特定的區(qū)塊x,假設(shè)當(dāng)前區(qū)塊中的交易數(shù)量為n個(gè),因?yàn)閎loom過(guò)濾器是存在一定誤差的,所以這里允許設(shè)計(jì)的bloom過(guò)濾器的誤差最大為p;在錯(cuò)誤率不大于p的情況下,bloom過(guò)濾器的為數(shù)組大小m最優(yōu)的情況需要滿足:
哈希函數(shù)個(gè)數(shù)選取的最優(yōu)數(shù)目為:
這里的哈希函數(shù)可以選取如下的哈希函數(shù):bkdrhash,sdbmhash,djbhash,rshash,jshash,pjwhash,elfhash,bkdrhash,sdbmhash,dekhash。區(qū)塊x中的所有交易id都會(huì)經(jīng)過(guò)所有哈希函數(shù)。
初始情況下,bloom過(guò)濾器的位數(shù)組都初始化為0;圖2中txidi通過(guò)哈希函數(shù)h1后得到對(duì)應(yīng)位數(shù)組的值為m1,那么就在這個(gè)位數(shù)組中的第m1位處置1;交易txidi經(jīng)過(guò)所有哈希函數(shù)之后,就會(huì)在位數(shù)組對(duì)應(yīng)的幾個(gè)位置都置1;對(duì)當(dāng)前區(qū)塊x的所有交易都執(zhí)行同樣的操作;當(dāng)bloom過(guò)濾器的位數(shù)組中某位已經(jīng)被置1后,后續(xù)的操作不會(huì)對(duì)該位有任何影響,這樣就完成了對(duì)區(qū)塊x的bloom過(guò)濾器的設(shè)計(jì)。對(duì)于其他所有區(qū)塊都需要執(zhí)行同樣的操作,設(shè)計(jì)出自己的bloom過(guò)濾器。
驗(yàn)證指定交易id是否存在與某個(gè)區(qū)塊中方法:對(duì)于每個(gè)區(qū)塊已經(jīng)根據(jù)圖2設(shè)計(jì)出自己的bloom過(guò)濾器,將指定交易id依次對(duì)每個(gè)bloom過(guò)濾器進(jìn)行驗(yàn)證;對(duì)于區(qū)塊x,當(dāng)指定交易id通過(guò)區(qū)塊x的bloom過(guò)濾器時(shí),所有對(duì)應(yīng)位數(shù)組位均為1,就假定指定交易id是存在與區(qū)塊x的;對(duì)于區(qū)塊y,當(dāng)指定交易id通過(guò)區(qū)塊y的bloom過(guò)濾器時(shí),位數(shù)組中對(duì)應(yīng)位的值不都為1,就可以相信指定交易id是不存在區(qū)塊y中的。由于bloom過(guò)濾器是存在允許誤差p的,所以對(duì)于指定交易,可能就會(huì)存在若干個(gè)候選區(qū)塊;這時(shí)僅需簡(jiǎn)單的遍歷就可找出指定id所在的具體區(qū)塊;當(dāng)然也會(huì)存在指定交易id不屬于任何區(qū)塊的可能。
對(duì)指定交易的驗(yàn)證過(guò)程中傳輸verifymessage的結(jié)構(gòu),verifymessage結(jié)構(gòu)中總共有6個(gè)字段,分別是1)區(qū)塊頭,區(qū)塊中的區(qū)塊頭的所有信息,區(qū)塊頭中的merkle樹根可以驗(yàn)證哈希結(jié)果是否一致,同時(shí)區(qū)塊頭本身也需要驗(yàn)證區(qū)塊的有效性;2)交易數(shù)量,該區(qū)塊中所有交易的數(shù)量;3)哈希值數(shù)量,下一字段“哈希值”的數(shù)量;4)哈希值數(shù)組,在該區(qū)塊merkle樹中,包含針對(duì)指定交易的目標(biāo)路徑,用于存儲(chǔ)交易驗(yàn)證的必要的哈希值;5)標(biāo)志位數(shù)量,下一字段“標(biāo)志位”的數(shù)量;6)標(biāo)志位數(shù)組,在構(gòu)造verifymessage的過(guò)程中,根據(jù)指定交易在merkle樹中具體目標(biāo)路徑,廣度優(yōu)先遍歷過(guò)程中會(huì)產(chǎn)生的對(duì)應(yīng)標(biāo)識(shí)位。通過(guò)標(biāo)志位和哈希值的配合能夠驗(yàn)證交易在區(qū)塊中的有效性,標(biāo)志位由0和1組成,其中0表示當(dāng)前節(jié)點(diǎn)的左孩子在目標(biāo)路徑中,1表示當(dāng)前節(jié)點(diǎn)的右孩子在目標(biāo)路徑中。
圖3為根據(jù)本發(fā)明一個(gè)實(shí)施例的verifymessage完整構(gòu)造過(guò)程示意圖,在整個(gè)驗(yàn)證消息的構(gòu)造過(guò)程中,需要主要找到目標(biāo)交易的路徑,完成標(biāo)志位數(shù)組和哈希數(shù)組的正確構(gòu)造。具體步驟如下:
圖3-a,在目標(biāo)區(qū)塊中,首先根據(jù)區(qū)塊中的所有交易及其相應(yīng)順序構(gòu)造merkle樹。
圖3-b,根據(jù)要查詢的指定交易,在圖3-a中構(gòu)建的merkle樹中,找出對(duì)應(yīng)祖先節(jié)點(diǎn),即找出從merkle樹根到交易節(jié)點(diǎn)的目標(biāo)路徑,圖3-b中可以看到根節(jié)點(diǎn)的左孩子h13在目標(biāo)路徑上,將0標(biāo)志位添加到標(biāo)識(shí)位數(shù)組中。
圖3-c,從merkle樹根開始,依次向其左右兩個(gè)孩子進(jìn)行下一步驟的操作。
圖3-d,由于根節(jié)點(diǎn)的右孩子不再目標(biāo)路徑上,但是在驗(yàn)證過(guò)程中是必須指定的,所以將根節(jié)點(diǎn)的右孩子的值h14添加到哈希數(shù)組中。
圖3-e,沿著目標(biāo)路徑繼續(xù)向下,即移到根節(jié)點(diǎn)的左孩子,繼續(xù)遍歷當(dāng)前節(jié)點(diǎn)兩個(gè)子孩子,右孩子節(jié)點(diǎn)h10在目標(biāo)路徑上,所以將標(biāo)志位1添加到標(biāo)志位數(shù)組中。
圖3-f,將非目標(biāo)路徑上節(jié)點(diǎn)的值h9添加到哈希數(shù)組中。
圖3-g,沿著目標(biāo)路徑繼續(xù)向下,即移到當(dāng)前節(jié)點(diǎn)的右孩子。
繼續(xù)遍歷當(dāng)前節(jié)點(diǎn)兩個(gè)子孩子,右孩子節(jié)點(diǎn)h4在目標(biāo)路徑上,所以將標(biāo)志位1添加到標(biāo)志位數(shù)組中。
圖3-h,將非目標(biāo)路徑上節(jié)點(diǎn)的的值h3添加到哈希數(shù)組中。
圖3-j,沿著目標(biāo)路徑繼續(xù)向下,即移到當(dāng)前節(jié)點(diǎn)的右孩子。
此時(shí)已經(jīng)遍歷到目標(biāo)交易節(jié)點(diǎn),需要將標(biāo)志1添加到標(biāo)志位數(shù)組中,同時(shí)將目標(biāo)節(jié)點(diǎn)哈希值添加到哈希數(shù)組中。
最后將構(gòu)造好的標(biāo)志位數(shù)組和哈希值數(shù)組連同區(qū)塊頭、交易數(shù)量、標(biāo)志位數(shù)量和哈希值數(shù)量封裝成verifymessage驗(yàn)證消息。
圖4為根據(jù)本發(fā)明一個(gè)實(shí)施例的解析驗(yàn)證消息的過(guò)程示意圖,根據(jù)接收到的verifymessage,需要對(duì)其進(jìn)行解析驗(yàn)證,在整個(gè)解析驗(yàn)證消息的過(guò)程中,通過(guò)標(biāo)志位數(shù)組和哈希數(shù)組,通過(guò)廣度優(yōu)先遍歷的方式,重新構(gòu)造merkle樹根,最終用得到的哈希值與區(qū)塊頭中的merkle樹根進(jìn)行比較,具體步驟如下:
圖4-a,首先根據(jù)verifymessage中交易數(shù)量字段構(gòu)造空的merkle樹來(lái)模擬交易的驗(yàn)證過(guò)程,同時(shí)初始化一個(gè)空的棧,用于存儲(chǔ)和計(jì)算哈希值。
圖4-b,標(biāo)志位數(shù)組中第一個(gè)標(biāo)志位為0,說(shuō)明目標(biāo)路徑中在左子樹,所以更具廣度優(yōu)先遍歷算法,先將哈希數(shù)組中的第一個(gè)哈希值h1放入樹根的右節(jié)點(diǎn)。同時(shí)向棧中添加第一個(gè)哈希值h1,并添加一個(gè)nil對(duì)象來(lái),用于表示目標(biāo)路徑上的左節(jié)點(diǎn)需要計(jì)算,然后繼續(xù)移向左孩子繼續(xù)下面的操作。
圖4-c,此時(shí)標(biāo)識(shí)位為1,說(shuō)明目標(biāo)路徑在當(dāng)前節(jié)點(diǎn)的右子樹,所以將哈希值h2添加到當(dāng)前節(jié)點(diǎn)的左孩子處,同時(shí)將棧中的nil對(duì)象彈出,并將哈希值h2壓棧,由于沒(méi)有遍歷到葉子節(jié)點(diǎn),所以還需要將nil對(duì)象壓棧,沿右孩子繼續(xù)向下計(jì)算。
圖4-d,此時(shí)標(biāo)識(shí)位為1,說(shuō)明目標(biāo)路徑在當(dāng)前節(jié)點(diǎn)的右子樹,所以將哈希值h3添加到當(dāng)前節(jié)點(diǎn)的左孩子處,同時(shí)將棧中的nil對(duì)象彈出,并將哈希值h2壓棧,由于沒(méi)有遍歷到葉子節(jié)點(diǎn),所以還需要將nil對(duì)象壓棧,沿右孩子繼續(xù)向下計(jì)算。
圖4-e,此時(shí)到達(dá)葉子節(jié)點(diǎn),即指定交易的節(jié)點(diǎn),當(dāng)前的標(biāo)識(shí)位為1,所以交易節(jié)點(diǎn)位于右子樹,然后直接將h4放入該節(jié)點(diǎn)。將nil對(duì)象從棧中彈出,然后將目標(biāo)交易節(jié)點(diǎn)的哈希值h4壓入棧中。
圖4-f,此時(shí)已經(jīng)將所有哈希值壓入棧中,然后從后向前遍歷標(biāo)志位數(shù)組,當(dāng)前標(biāo)志位為1,所以將棧中的兩個(gè)哈希值彈棧,因?yàn)闃?biāo)志位為1,所以在計(jì)算哈希值時(shí),第一個(gè)彈棧的是右孩子的哈希值,第二個(gè)是左孩子的哈希值,計(jì)算h5=hash(h3,h4),計(jì)算完哈希值之后將結(jié)果h5壓棧。
圖4-g,當(dāng)前標(biāo)志位為1,所以將棧中的兩個(gè)哈希值彈棧,因?yàn)闃?biāo)志位為1,所以在計(jì)算哈希值時(shí),第一個(gè)彈棧的是右孩子的哈希值,第二個(gè)是左孩子的哈希值,計(jì)算完哈希值之后將結(jié)果h6壓棧。
圖4-h,此時(shí)標(biāo)志位為0,所以在進(jìn)行哈希計(jì)算時(shí),第一個(gè)彈棧的為左孩子,第二個(gè)彈棧的為右孩子,計(jì)算h7=hash(h6,h1),經(jīng)過(guò)哈希計(jì)算之后得到最終的merkle樹根h7。
通過(guò)h7和verifymessage的區(qū)塊頭中的merkle樹根的哈希值進(jìn)行比較,驗(yàn)證交易的有效性。如果兩者相同,則證明該交易存在與這個(gè)區(qū)塊中并且是有效的,否則交易無(wú)效,返回對(duì)應(yīng)的錯(cuò)誤信息。
以下情況會(huì)導(dǎo)致交易的驗(yàn)證失?。?/p>
1、如果hashes數(shù)組中存在沒(méi)有完全利用的哈希值或者哈希值數(shù)量不夠,則解析失?。?/p>
2、如果標(biāo)志位數(shù)組中存在沒(méi)有完全利用的標(biāo)志位或者標(biāo)識(shí)位數(shù)量不夠,則解析失??;
3、如果最后的哈希值和區(qū)塊頭中的merkle樹根的哈希值不一致,則解析失敗;
4、如果verifymessage中的區(qū)塊頭經(jīng)過(guò)哈希算法之后,不在區(qū)塊鏈中最長(zhǎng)的那條鏈,則解析失敗。
在實(shí)施例實(shí)施過(guò)程中存在如下一些情況:由于bloom過(guò)濾器存在一定的錯(cuò)誤率,所以可能針對(duì)一個(gè)特定的交易id,通過(guò)已經(jīng)設(shè)計(jì)好的bloom過(guò)濾器會(huì)篩選出若干個(gè)區(qū)塊。通過(guò)bloom過(guò)濾器的篩選已經(jīng)把交易所在的區(qū)塊范圍縮小到極少數(shù)的若干個(gè)區(qū)塊,下一步,就分別對(duì)每個(gè)區(qū)塊中的交易數(shù)據(jù)進(jìn)行遍歷,找出交易實(shí)際所在的區(qū)塊,然而,針對(duì)某個(gè)特定交易,即使找出了幾個(gè)候選區(qū)塊,由于bloom過(guò)濾器存在誤差,也有可能致使這個(gè)交易不存在于任何區(qū)塊中,即指定的交易無(wú)效。
雖然本發(fā)明已經(jīng)參考特定的說(shuō)明性實(shí)施例進(jìn)行了描述,但是不會(huì)受到這些實(shí)施例的限定而僅僅受到附加權(quán)利要求的限定。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解可以在不偏離本發(fā)明的保護(hù)范圍和精神的情況下對(duì)本發(fā)明的實(shí)施例能夠進(jìn)行改動(dòng)和修改。