當(dāng)然,對(duì)于自己親力親為執(zhí)行所有交易的全節(jié)點(diǎn)來(lái)說(shuō),即使有一小撮礦工偷懶實(shí)際上也不會(huì)影響他們對(duì)于當(dāng)前共識(shí)狀態(tài)的判斷。只要偷懶的礦工仍完整地執(zhí)行共識(shí)層協(xié)議,按照協(xié)議要求檢查區(qū)塊間的引用關(guān)系和選擇引用的區(qū)塊,則他們的算力依然為保證賬本中的交易順序不可篡改作出貢獻(xiàn)。

但是對(duì)于輕節(jié)點(diǎn)來(lái)說(shuō),區(qū)塊內(nèi)的狀態(tài)根不對(duì)就是一個(gè)相當(dāng)嚴(yán)重的問(wèn)題了。這是因?yàn)檩p節(jié)點(diǎn)自己沒(méi)有能力維護(hù)當(dāng)前整個(gè)共識(shí)系統(tǒng)里所有賬戶的狀態(tài)——否則也就不是“輕節(jié)點(diǎn)”了——只能選擇信任全節(jié)點(diǎn)提供的(帶有默克爾樹(shù)證明的)狀態(tài)。如果多個(gè)全節(jié)點(diǎn)提供的狀態(tài)不一致,輕節(jié)點(diǎn)就難以判斷當(dāng)前的真實(shí)狀態(tài)。

以比特幣的輕節(jié)點(diǎn)為例,只需要保留每個(gè)區(qū)塊的區(qū)塊頭(Block Header)就可以用 SPV(Simplified Payment Verification)的方式驗(yàn)證一筆交易是否已被確認(rèn)了。

比特幣的 SPV 驗(yàn)證步驟如下:1)通過(guò)區(qū)塊頭中保存的默克爾樹(shù)根(Merkle Root)和全節(jié)點(diǎn)提供的默克爾樹(shù)證明(Merkle Proof),可以非常容易地驗(yàn)證某個(gè)區(qū)塊里包含特定的交易;2)如果包含交易的區(qū)塊后面跟了足夠多的區(qū)塊(比如說(shuō)6個(gè))就可以認(rèn)為這筆交易已經(jīng)被確認(rèn)了——實(shí)際上這里是區(qū)塊被確認(rèn),但因?yàn)楸忍貛抛铋L(zhǎng)鏈上的所有交易都會(huì)被執(zhí)行,所以區(qū)塊被確認(rèn)等價(jià)于交易被確認(rèn)。

理論上,只要能生成足夠多的比特幣區(qū)塊,配合對(duì)于網(wǎng)絡(luò)連接的日食攻擊,就可以騙過(guò)輕節(jié)點(diǎn),讓其以為一筆不在真實(shí)的比特幣網(wǎng)絡(luò)最長(zhǎng)鏈上的交易已經(jīng)被確認(rèn)了,從而實(shí)現(xiàn)雙花攻擊?,F(xiàn)在比特幣的 UTXO 已經(jīng)達(dá)到了數(shù) GB 的規(guī)模,很多場(chǎng)合只能通過(guò)輕節(jié)點(diǎn)用 SPV 的方式確認(rèn)交易,理論上都會(huì)受到上述攻擊的威脅。

但是事實(shí)上很少聽(tīng)說(shuō)因?yàn)?SPV 驗(yàn)證受到這種雙花攻擊的案例,這又是為什么呢?樹(shù)圖區(qū)塊鏈Conflux研究所同樣為我們進(jìn)行了解惑。

主要的原因還是在于成本。以 6 個(gè)區(qū)塊確認(rèn)為例,欺騙輕節(jié)點(diǎn)實(shí)現(xiàn)雙花攻擊需要攻擊者至少挖到 7 個(gè)比特幣區(qū)塊,并且這些區(qū)塊都不在比特幣的最長(zhǎng)鏈上——否則就變成真的確認(rèn)交易了。

如果挖的這些區(qū)塊難度和真實(shí)的比特幣網(wǎng)絡(luò)相當(dāng),則意味著攻擊者要放棄 7 個(gè)得到比特幣區(qū)塊獎(jiǎng)勵(lì)的機(jī)會(huì)。按照現(xiàn)在的比特幣每個(gè)區(qū)塊 12.5個(gè)比特幣的獎(jiǎng)勵(lì)計(jì)算,除非雙花攻擊的交易價(jià)值超過(guò) 75 個(gè)比特幣,否則這樣的攻擊就是虧本的,因此自然不會(huì)有人去實(shí)施。如果再加上實(shí)施日食攻擊的成本,則上述攻擊就更加無(wú)利可圖了。

所以在比特幣網(wǎng)絡(luò)中,輕節(jié)點(diǎn)只需大致知道正確的挖礦難度值,就不用擔(dān)心在金額不太大的交易中因?yàn)椴捎?SPV 確認(rèn)規(guī)則而被騙。通過(guò) SPV 方式確認(rèn)交易,至少在比特幣的區(qū)塊獎(jiǎng)勵(lì)再減半幾次之前都還是相當(dāng)安全的。當(dāng)然,如果真的是大額比特幣交易的話,就需要增加等待的區(qū)塊數(shù)或者用全節(jié)點(diǎn)驗(yàn)證了。

以太坊的輕節(jié)點(diǎn)也可以通過(guò)類似的方式驗(yàn)證交易執(zhí)行的結(jié)果或查詢賬戶的狀態(tài),只需全節(jié)點(diǎn)根據(jù)節(jié)點(diǎn)中對(duì)應(yīng)交易收據(jù)和賬戶狀態(tài)的默克爾樹(shù)根提供相應(yīng)的證明即可。

與比特幣這樣“一根筋”的區(qū)塊鏈系統(tǒng)不同,樹(shù)圖區(qū)塊鏈Conflux 為了更高的系統(tǒng)性能采用了并發(fā)出塊的樹(shù)圖結(jié)構(gòu)以及更快的出塊速度(平均每秒4塊),并且減少了非必要情況下對(duì)于狀態(tài)根的驗(yàn)證。這些改動(dòng)不會(huì)影響全節(jié)點(diǎn)對(duì)于共識(shí)的判斷,卻可能為輕節(jié)點(diǎn)驗(yàn)證當(dāng)前狀態(tài)帶來(lái)困難。

為此,樹(shù)圖區(qū)塊鏈Conflux 引入了 Blaming 機(jī)制來(lái)幫助輕節(jié)點(diǎn)快速地確認(rèn)當(dāng)前賬戶狀態(tài)和每筆交易執(zhí)行的結(jié)果。

簡(jiǎn)單來(lái)說(shuō),每個(gè)區(qū)塊自己區(qū)塊頭的 Blaming 域指出自己認(rèn)可的上一個(gè)“正確的主鏈區(qū)塊”,這里的“正確”指區(qū)塊的狀態(tài)根和 Blaming 域都是正確的。例如如果一個(gè)區(qū)塊認(rèn)為自己的父區(qū)塊就是完全正確的,則 Blaming 域就填 0;如果認(rèn)為父區(qū)塊不正確,但是祖父區(qū)塊正確,則填 1;以此類推,如果認(rèn)為祖父區(qū)塊也不正確則相應(yīng)地要填一個(gè)大于1的整數(shù)用來(lái)指示最后一個(gè)正確區(qū)塊的位置,即落在中間的所有區(qū)塊都會(huì)被指為“狀態(tài)不正確的區(qū)塊”。

對(duì)于狀態(tài)根的判斷比較容易理解:打包新區(qū)塊的礦工節(jié)點(diǎn)需要沿著樞軸鏈執(zhí)行每個(gè) Epoch 中的交易,在這個(gè)過(guò)程中自然會(huì)知道每個(gè)處在樞軸鏈上的“主鏈區(qū)塊”應(yīng)該有什么樣的狀態(tài)根,因此就可以判斷出實(shí)際處在樞軸鏈上的區(qū)塊是否填對(duì)了這一項(xiàng)。而且因?yàn)榘凑諛休S鏈指定的順序執(zhí)行所有交易本來(lái)就是每個(gè)全節(jié)點(diǎn)都應(yīng)該做的,所以上述檢查并不帶來(lái)額外的負(fù)擔(dān)。檢查過(guò)后,就已經(jīng)可以確定哪些主鏈區(qū)塊的狀態(tài)根是正確的了。但是由于主鏈上有很多區(qū)塊,顯然不可能每次都一一羅列出哪些區(qū)塊的狀態(tài)根是對(duì)的,哪些是錯(cuò)的。這就用到了 Blaming 機(jī)制的第二部分——關(guān)于之前區(qū)塊 Blaming 域的 Blame。

每個(gè)區(qū)塊 A 在 Blaming 域都會(huì)指明它認(rèn)為的主鏈上最后一個(gè)正確的區(qū)塊 B,這表示區(qū)塊 A 認(rèn)可區(qū)塊 B 的所有觀點(diǎn):除了認(rèn)為區(qū)塊 B 的狀態(tài)根正確以外,還認(rèn)可區(qū)塊 B 的 Blaming 域是正確的。這就意味著區(qū)塊 A 也認(rèn)可了區(qū)塊 B 所指示的在 B 之前的最后一個(gè)正確的主鏈區(qū)塊 C,從而進(jìn)一步認(rèn)可了區(qū)塊 C 所指的 C 之前最后一個(gè)正確區(qū)塊 D,……直至創(chuàng)世塊位置。

因?yàn)閯?chuàng)世塊總是對(duì)的,所以上述 Blaming 的過(guò)程是有限的,每個(gè)區(qū)塊在 Blaming 域填的數(shù)也不會(huì)超過(guò)該區(qū)塊的高度。

通過(guò)這種方式,就可以把每個(gè)區(qū)塊 Blaming 域存的一個(gè)數(shù)字?jǐn)U展到一組狀態(tài)根得到當(dāng)前區(qū)塊認(rèn)可的主鏈區(qū)塊。下圖的例子即說(shuō)明了如何通過(guò) Blaming 機(jī)制擴(kuò)展對(duì)于“正確區(qū)塊”的判斷。

由于 Blaming 域是在每個(gè)區(qū)塊的區(qū)塊頭部分的,所以輕節(jié)點(diǎn)也可以很容易看到礦工們對(duì)于其它區(qū)塊的狀態(tài)根是否正確的看法。根據(jù)這些信息,輕節(jié)點(diǎn)就可以比較容易地判斷哪些區(qū)塊的狀態(tài)根是值得信任的,哪些區(qū)塊的狀態(tài)根有問(wèn)題了。然后只需選擇相信基于值得信任的狀態(tài)根做出的證明即可。

分享到

xiesc

相關(guān)推薦