區(qū)塊鏈知識(shí)講解:SPV簡單支付驗(yàn)證
在上一期中我們學(xué)習(xí)了比特幣網(wǎng)絡(luò)的內(nèi)部結(jié)構(gòu),其中我們提到了SPV簡單支付驗(yàn)證通過區(qū)塊頭進(jìn)行交易驗(yàn)證,這期我們將著重說明SPV簡單支付驗(yàn)證這個(gè)概念。
一、節(jié)點(diǎn)的分類
比特幣網(wǎng)絡(luò)中的節(jié)點(diǎn)是不一樣的,主要包括全節(jié)點(diǎn)、輕節(jié)點(diǎn)和SPV節(jié)點(diǎn)。
全節(jié)點(diǎn)是指維持包含全部交易信息的完整區(qū)塊鏈的節(jié)點(diǎn)。更加準(zhǔn)確地說,這樣的節(jié)點(diǎn)應(yīng)當(dāng)被稱為完整區(qū)塊鏈節(jié)點(diǎn)。
在比特幣發(fā)展的早期,所有節(jié)點(diǎn)都是全節(jié)點(diǎn),當(dāng)前的比特幣核心客戶端也是完整區(qū)塊鏈節(jié)點(diǎn)。但隨著區(qū)塊鏈網(wǎng)絡(luò)的數(shù)據(jù)的增多,出現(xiàn)了新型的節(jié)點(diǎn)。
許多比特幣客戶端被設(shè)計(jì)成運(yùn)行在空間和功率受限的設(shè)備上,如智能電話、平板電腦、嵌入式系統(tǒng)等。對(duì)于這樣的設(shè)備,通過簡化的支付驗(yàn)證(SPV)的方式,可以使它們?cè)诓槐卮鎯?chǔ)完整區(qū)塊鏈的情況下進(jìn)行工作。這種類型的客端被稱為輕節(jié)點(diǎn)和SPV節(jié)點(diǎn)。
二、SPV節(jié)點(diǎn)和輕節(jié)點(diǎn)的區(qū)別
輕節(jié)點(diǎn)指的是:節(jié)點(diǎn)本地只保存與其自身相關(guān)的交易數(shù)據(jù)(尤其是可支配交易數(shù)據(jù)),但并不保存完整區(qū)塊鏈信息的技術(shù)。SPV的目標(biāo)是驗(yàn)證某個(gè)支付是否真實(shí)存在,并得到了多少個(gè)確認(rèn)。
比如:小明收到來自小紅的一個(gè)通知,小紅聲稱已經(jīng)從其賬戶中匯款一定數(shù)額的錢給了小明。如何快速驗(yàn)證該支付的真實(shí)性,是SPV的工作目標(biāo)。
輕節(jié)點(diǎn)的目標(biāo)不僅是支付驗(yàn)證,而且是用于管理節(jié)點(diǎn)自身的資產(chǎn)收入、支付等信息。比如:小明使用輕節(jié)點(diǎn)管理自身在區(qū)塊鏈的收入信息、支出信息,在本地只保存與小明自身相關(guān)的交易數(shù)據(jù),尤其是可支配交易數(shù)據(jù)。
輕錢包與SPV的最大區(qū)別是:
- 輕節(jié)點(diǎn)仍需下載每個(gè)新區(qū)塊的全部數(shù)據(jù)并進(jìn)行解析,獲取并在本地存儲(chǔ)與自身相關(guān)的交易數(shù)據(jù),只是無須在本地保存全部數(shù)據(jù)而已。
- 而SPV節(jié)點(diǎn)不需要下載新區(qū)塊的全部數(shù)據(jù),只需要保存區(qū)塊頭部信息即可。
雖然輕節(jié)點(diǎn)部分借鑒了SPV的理念,但和SPV是完全不同的。
三、支付驗(yàn)證和交易驗(yàn)證的區(qū)別
SPV節(jié)點(diǎn)進(jìn)行的是區(qū)塊鏈支付驗(yàn)證,而不是區(qū)塊鏈交易驗(yàn)證。這兩種驗(yàn)證方式存在很大的區(qū)別。
區(qū)塊鏈交易驗(yàn)證的過程比較復(fù)雜,包括賬戶余額驗(yàn)證、雙重支付判斷等,通常由保存區(qū)塊鏈完整信息的區(qū)塊鏈驗(yàn)證節(jié)點(diǎn)來完成。
而支付驗(yàn)證的過程比較簡單,只是判斷該筆支付交易是否已經(jīng)得到了區(qū)塊鏈節(jié)點(diǎn)共識(shí)驗(yàn)證,并得到了多少的確認(rèn)數(shù)即可。
簡單的說就是:交易驗(yàn)證要檢驗(yàn)這個(gè)交易是否合法,支付驗(yàn)證就是驗(yàn)證這筆交易是否已經(jīng)存在。
四、SPV支付驗(yàn)證的實(shí)現(xiàn)步驟
我們現(xiàn)在知道SPV節(jié)點(diǎn)是通過區(qū)塊頭進(jìn)行支付驗(yàn)證的,區(qū)塊頭中一般包括如下信息:前一區(qū)塊(也稱父區(qū)塊)的哈希值、區(qū)塊中交易默克爾樹的根哈希值、時(shí)間戳等,通過區(qū)塊的哈希值,可以識(shí)別出區(qū)塊鏈中的對(duì)應(yīng)區(qū)塊。
區(qū)塊前后有序鏈接,每一個(gè)區(qū)塊都可以通過其區(qū)塊頭的“前一區(qū)塊的哈希值”字段引用前一區(qū)塊。這樣把每個(gè)區(qū)塊均鏈接到各自前一區(qū)塊的哈希值序列,就創(chuàng)建了一條一直可以追溯到第一個(gè)區(qū)塊(創(chuàng)世區(qū)塊)的鏈條。
前一區(qū)塊的哈希值,可以確保區(qū)塊鏈所記錄的交易次序。默克爾樹的根哈希值,則可以確保收錄到區(qū)塊中的所有交易的真實(shí)性。
當(dāng)比特幣網(wǎng)絡(luò)需要利用SPV進(jìn)行簡單支付驗(yàn)證時(shí)步驟如下:
- 計(jì)算待驗(yàn)證支付的交易哈希值;
- 節(jié)點(diǎn)從區(qū)塊鏈網(wǎng)絡(luò)上獲取并存儲(chǔ)最長鏈的所有區(qū)塊頭至本地;
- 節(jié)點(diǎn)從區(qū)塊鏈獲取待驗(yàn)證支付對(duì)應(yīng)的默克爾樹哈希認(rèn)證路徑;(這里找到了該交易對(duì)應(yīng)的哈希值)
- 根據(jù)哈希認(rèn)證路徑,計(jì)算默克爾樹的根哈希值,將計(jì)算結(jié)果與本地區(qū)塊頭中的默克爾樹的根哈希值進(jìn)行比較,定位到包含待驗(yàn)證支付的區(qū)塊;(找到這個(gè)哈希值屬于哪個(gè)區(qū)塊)
- 根據(jù)該區(qū)塊頭所處的位置,驗(yàn)證該區(qū)塊的區(qū)塊頭是否已經(jīng)包含在已知最長鏈中,確定該支付已經(jīng)得到的確認(rèn)數(shù)量,如果包含則證明支付真實(shí)有效。(證明本交易得到了6次確認(rèn))
簡單的講,其實(shí)SPV就做了兩件事:
- 找到要驗(yàn)證的這筆交易在哪個(gè)區(qū)塊;
- 確定這個(gè)交易是否被6次確認(rèn)過了。
如果驗(yàn)證的這筆交易已經(jīng)被6次確認(rèn)過了,代表這筆交易已經(jīng)被最長鏈承認(rèn)了,則這筆交易是真實(shí)存在的。
五、總結(jié)
SPV對(duì)普通用戶一個(gè)很友好的支付驗(yàn)證方式,可以幫助節(jié)省更多的硬件控件。但是凡事都有兩面性,這種方式有利也有弊。
SPV因?yàn)闆]有保存全部區(qū)塊的節(jié)點(diǎn)信息,需要和其他節(jié)點(diǎn)配合才能進(jìn)行驗(yàn)證,所以SPV節(jié)點(diǎn)存在被誘導(dǎo)連入了一個(gè)虛假的網(wǎng)絡(luò)中的情況,存在被惡意攻擊的可能。
在絕大多數(shù)的實(shí)際情況中,具有良好連接的SPV節(jié)點(diǎn)是足夠安全的,它在資源需求、實(shí)用性和安全性之間維持恰當(dāng)?shù)钠胶?。?dāng)然,如果要保證萬無一失的安全性,最可靠的方法還是運(yùn)行完整區(qū)塊鏈的節(jié)點(diǎn)。
版權(quán)聲明:數(shù)字簽名:Press.one
作者:liheng,區(qū)塊鏈探索者、互聯(lián)網(wǎng)產(chǎn)品經(jīng)理,超級(jí)個(gè)體修煉中,只創(chuàng)作對(duì)用戶有價(jià)值的內(nèi)容
本文由 @liheng 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
- 目前還沒評(píng)論,等你發(fā)揮!