區塊鏈知識講解:SPV簡單支付驗證 | 人人都是產品經理

在上一期中我們學習了比特幣網路的內部結構,其中我們提到了SPV簡單支付驗證通過區塊頭進行交易驗證,這期我們將著重說明SPV簡單支付驗證這個概念。

一、節點的分類

比特幣網路中的節點是不一樣的,主要包括全節點、輕節點和SPV節點。

全節點是指維持包含全部交易信息的完整區塊鏈的節點。更加準確地說,這樣的節點應當被稱為完整區塊鏈節點。

在比特幣發展的早期,所有節點都是全節點,當前的比特幣核心客戶端也是完整區塊鏈節點。但隨著區塊鏈網路的數據的增多,出現了新型的節點。

許多比特幣客戶端被設計成運行在空間和功率受限的設備上,如智能電話、平板電腦、嵌入式系統等。對於這樣的設備,通過簡化的支付驗證(SPV)的方式,可以使它們在不必存儲完整區塊鏈的情況下進行工作。這種類型的客端被稱為輕節點和SPV節點。

二、SPV節點和輕節點的區別

輕節點指的是:節點本地只保存與其自身相關的交易數據(尤其是可支配交易數據),但並不保存完整區塊鏈信息的技術。SPV的目標是驗證某個支付是否真實存在,並得到了多少個確認。

比如:小明收到來自小紅的一個通知,小紅聲稱已經從其賬戶中匯款一定數額的錢給了小明。如何快速驗證該支付的真實性,是SPV的工作目標。

輕節點的目標不僅是支付驗證,而且是用於管理節點自身的資產收入、支付等信息。比如:小明使用輕節點管理自身在區塊鏈的收入信息、支出信息,在本地只保存與小明自身相關的交易數據,尤其是可支配交易數據。

輕錢包與SPV的最大區別是:

  • 輕節點仍需下載每個新區塊的全部數據並進行解析,獲取並在本地存儲與自身相關的交易數據,只是無須在本地保存全部數據而已。
  • 而SPV節點不需要下載新區塊的全部數據,只需要保存區塊頭部信息即可。

雖然輕節點部分借鑒了SPV的理念,但和SPV是完全不同的。

三、支付驗證和交易驗證的區別

SPV節點進行的是區塊鏈支付驗證,而不是區塊鏈交易驗證。這兩種驗證方式存在很大的區別。

區塊鏈交易驗證的過程比較複雜,包括賬戶餘額驗證、雙重支付判斷等,通常由保存區塊鏈完整信息的區塊鏈驗證節點來完成。

而支付驗證的過程比較簡單,只是判斷該筆支付交易是否已經得到了區塊鏈節點共識驗證,並得到了多少的確認數即可。

簡單的說就是:交易驗證要檢驗這個交易是否合法,支付驗證就是驗證這筆交易是否已經存在。

四、SPV支付驗證的實現步驟

我們現在知道SPV節點是通過區塊頭進行支付驗證的,區塊頭中一般包括如下信息:前一區塊(也稱父區塊)的哈希值、區塊中交易默克爾樹的根哈希值、時間戳等,通過區塊的哈希值,可以識別出區塊鏈中的對應區塊。

區塊前後有序鏈接,每一個區塊都可以通過其區塊頭的「前一區塊的哈希值」欄位引用前一區塊。這樣把每個區塊均鏈接到各自前一區塊的哈希值序列,就創建了一條一直可以追溯到第一個區塊(創世區塊)的鏈條。

前一區塊的哈希值,可以確保區塊鏈所記錄的交易次序。默克爾樹的根哈希值,則可以確保收錄到區塊中的所有交易的真實性。

當比特幣網路需要利用SPV進行簡單支付驗證時步驟如下:

  1. 計算待驗證支付的交易哈希值;
  2. 節點從區塊鏈網路上獲取並存儲最長鏈的所有區塊頭至本地;
  3. 節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑;(這裡找到了該交易對應的哈希值)
  4. 根據哈希認證路徑,計算默克爾樹的根哈希值,將計算結果與本地區塊頭中的默克爾樹的根哈希值進行比較,定位到包含待驗證支付的區塊;(找到這個哈希值屬於哪個區塊)
  5. 根據該區塊頭所處的位置,驗證該區塊的區塊頭是否已經包含在已知最長鏈中,確定該支付已經得到的確認數量,如果包含則證明支付真實有效。(證明本交易得到了6次確認)

簡單的講,其實SPV就做了兩件事:

  1. 找到要驗證的這筆交易在哪個區塊;
  2. 確定這個交易是否被6次確認過了。

如果驗證的這筆交易已經被6次確認過了,代表這筆交易已經被最長鏈承認了,則這筆交易是真實存在的。

五、總結

SPV對普通用戶一個很友好的支付驗證方式,可以幫助節省更多的硬體控制項。但是凡事都有兩面性,這種方式有利也有弊。

SPV因為沒有保存全部區塊的節點信息,需要和其他節點配合才能進行驗證,所以SPV節點存在被誘導連入了一個虛假的網路中的情況,存在被惡意攻擊的可能。

在絕大多數的實際情況中,具有良好連接的SPV節點是足夠安全的,它在資源需求、實用性和安全性之間維持恰當的平衡。當然,如果要保證萬無一失的安全性,最可靠的方法還是運行完整區塊鏈的節點。

 

版權聲明:數字簽名:Press.one

作者:liheng,區塊鏈探索者、互聯網產品經理,超級個體修鍊中,只創作對用戶有價值的內容