在上一期中我們學習了比特幣網路的內部結構,其中我們提到了SPV簡單支付驗證通過區塊頭進行交易驗證,這期我們將著重說明SPV簡單支付驗證這個概念。
一、節點的分類
比特幣網路中的節點是不一樣的,主要包括全節點、輕節點和SPV節點。
全節點是指維持包含全部交易信息的完整區塊鏈的節點。更加準確地說,這樣的節點應當被稱為完整區塊鏈節點。
在比特幣發展的早期,所有節點都是全節點,當前的比特幣核心客戶端也是完整區塊鏈節點。但隨著區塊鏈網路的數據的增多,出現了新型的節點。
許多比特幣客戶端被設計成運行在空間和功率受限的設備上,如智能電話、平板電腦、嵌入式系統等。對於這樣的設備,通過簡化的支付驗證(SPV)的方式,可以使它們在不必存儲完整區塊鏈的情況下進行工作。這種類型的客端被稱為輕節點和SPV節點。
二、SPV節點和輕節點的區別
輕節點指的是:節點本地只保存與其自身相關的交易數據(尤其是可支配交易數據),但並不保存完整區塊鏈信息的技術。SPV的目標是驗證某個支付是否真實存在,並得到了多少個確認。
比如:小明收到來自小紅的一個通知,小紅聲稱已經從其賬戶中匯款一定數額的錢給了小明。如何快速驗證該支付的真實性,是SPV的工作目標。
輕節點的目標不僅是支付驗證,而且是用於管理節點自身的資產收入、支付等信息。比如:小明使用輕節點管理自身在區塊鏈的收入信息、支出信息,在本地只保存與小明自身相關的交易數據,尤其是可支配交易數據。
輕錢包與SPV的最大區別是:
- 輕節點仍需下載每個新區塊的全部數據並進行解析,獲取並在本地存儲與自身相關的交易數據,只是無須在本地保存全部數據而已。
- 而SPV節點不需要下載新區塊的全部數據,只需要保存區塊頭部信息即可。
雖然輕節點部分借鑒了SPV的理念,但和SPV是完全不同的。
三、支付驗證和交易驗證的區別
SPV節點進行的是區塊鏈支付驗證,而不是區塊鏈交易驗證。這兩種驗證方式存在很大的區別。
區塊鏈交易驗證的過程比較複雜,包括賬戶餘額驗證、雙重支付判斷等,通常由保存區塊鏈完整信息的區塊鏈驗證節點來完成。
而支付驗證的過程比較簡單,只是判斷該筆支付交易是否已經得到了區塊鏈節點共識驗證,並得到了多少的確認數即可。
簡單的說就是:交易驗證要檢驗這個交易是否合法,支付驗證就是驗證這筆交易是否已經存在。
四、SPV支付驗證的實現步驟
我們現在知道SPV節點是通過區塊頭進行支付驗證的,區塊頭中一般包括如下信息:前一區塊(也稱父區塊)的哈希值、區塊中交易默克爾樹的根哈希值、時間戳等,通過區塊的哈希值,可以識別出區塊鏈中的對應區塊。
區塊前後有序鏈接,每一個區塊都可以通過其區塊頭的「前一區塊的哈希值」欄位引用前一區塊。這樣把每個區塊均鏈接到各自前一區塊的哈希值序列,就創建了一條一直可以追溯到第一個區塊(創世區塊)的鏈條。
前一區塊的哈希值,可以確保區塊鏈所記錄的交易次序。默克爾樹的根哈希值,則可以確保收錄到區塊中的所有交易的真實性。
當比特幣網路需要利用SPV進行簡單支付驗證時步驟如下:
- 計算待驗證支付的交易哈希值;
- 節點從區塊鏈網路上獲取並存儲最長鏈的所有區塊頭至本地;
- 節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑;(這裡找到了該交易對應的哈希值)
- 根據哈希認證路徑,計算默克爾樹的根哈希值,將計算結果與本地區塊頭中的默克爾樹的根哈希值進行比較,定位到包含待驗證支付的區塊;(找到這個哈希值屬於哪個區塊)
- 根據該區塊頭所處的位置,驗證該區塊的區塊頭是否已經包含在已知最長鏈中,確定該支付已經得到的確認數量,如果包含則證明支付真實有效。(證明本交易得到了6次確認)
簡單的講,其實SPV就做了兩件事:
- 找到要驗證的這筆交易在哪個區塊;
- 確定這個交易是否被6次確認過了。
如果驗證的這筆交易已經被6次確認過了,代表這筆交易已經被最長鏈承認了,則這筆交易是真實存在的。
五、總結
SPV對普通用戶一個很友好的支付驗證方式,可以幫助節省更多的硬體控制項。但是凡事都有兩面性,這種方式有利也有弊。
SPV因為沒有保存全部區塊的節點信息,需要和其他節點配合才能進行驗證,所以SPV節點存在被誘導連入了一個虛假的網路中的情況,存在被惡意攻擊的可能。
在絕大多數的實際情況中,具有良好連接的SPV節點是足夠安全的,它在資源需求、實用性和安全性之間維持恰當的平衡。當然,如果要保證萬無一失的安全性,最可靠的方法還是運行完整區塊鏈的節點。
版權聲明:數字簽名:Press.one
作者:liheng,區塊鏈探索者、互聯網產品經理,超級個體修鍊中,只創作對用戶有價值的內容