1. 程式人生 > >【我的區塊鏈之路】- SPV 的特點及使用場景

【我的區塊鏈之路】- SPV 的特點及使用場景

我們很多人都知道在比特幣中有一種節點叫做 spv (簡易支付驗證) 節點;我們這裡來討論下,為什麼需要 spv 節點,什麼場景下會用到它,以及spv 的一些特點。

為什麼會有SPV:

在比特幣整個生態圈裡,大部分都是普通使用者,即只有基本的比特幣投資及消費支付需要的使用者,他們可能沒有礦機,沒有高階配置的電腦,那麼他們是否也要執行一個全節點程式呢?因為隨著時間的推移,目前比特幣的主鏈的區塊資料 高達 200G ,想想如果是一個手機錢包。,或者個人PC 的錢包,下載主網完整區塊的話,儲存壓力未免過大。這時候就出現了 spv

比特幣網路裡的節點在打包一個區塊的時候,會對區塊裡所有的交易進行驗證,並且,一個交易還會得到6至7次區塊的確認來確保交易最後的完成。正是如此,在使用簡單支付驗證時,只要判斷出一個交易在主鏈上的某個區塊裡出現過,則可以證明該交易之前已被驗證過

【注意】:

這裡有個細節需要注意,SPV指的是“支付驗證“,而不是“交易驗證”。這兩種驗證有很大區別。
"交易驗證”非常複雜,涉及到驗證是否有足夠餘額可供支出、是否存在雙花、指令碼能否通過等等,通常由執行完全節點的礦工來完成。
支付驗證”則比較簡單,只判斷用於“支付”的那筆交易是否已經被驗證過,並得到了多少的算力保護(多少確認數)。

交易驗證:要檢驗這個交易是否合法;支付驗證:就是驗證這筆交易是否已經存在

【考慮這樣一種情況】:SPV的目標是驗證某個支付是否真實存在,並得到了多少個確認

A收到來自B的一個通知,B聲稱他已經從某某賬戶中匯款一定數額的錢給了A。去中心方式下,沒有任何人能證明B的可靠。接到這一通知,A如何能判斷B所說的是真的呢?
在比特幣系統中,這一通知是以一個固定格式的“交易"來實現的,該交易中包含B的匯款賬戶、B的簽名、匯給A的金額以及A的地址。
如果A想本人親自驗證這筆交易,首先,A要遍歷區塊鏈賬本,定位到B的賬戶上,這樣才能檢視B所給的賬戶上是否曾經有足夠的金額;接下來,A要遍歷後續的所有賬本,看B是否已經支出了這個賬戶上的錢給別人(是否存在雙花欺騙);然後還要驗證指令碼來判斷B是否擁有該賬戶的支配權。這一過程要求A必須得到完整的區塊鏈才行。
但是,如果A只想知道這筆支付是否已經得到了驗證(如果驗證了就發貨),他可以依賴比特幣系統來快速驗證。即,檢查發生此項支付的那筆交易是否已經收錄於區塊鏈中,並得到了多少個確認

SPV的特點:

       SPV 節點一般會與臨近節點的連線中設定 BoomFilter ,(該Boomfilter 只接收包含錢包 公鑰地址的交易),當鄰近節點看到一個TX與SPV節點的 BoomFilter condition 符合的話,他就會用 markleblock 訊息給該SPV節點發送一個 區塊;【markleblock包含了 BlockHead一個連線到該 TX 的Markle Root 的一個Markle 路徑】;SPV 節點可以利用該markle路徑把TX和包含TX的區塊聯絡起來,並用BlockHead來校驗包含該TX的Block是在BlockChiain上的且已經過了6個確認的。這兩個驗證可以證明該TX是存在於區塊鏈上的。

總之SPV只需要接收小魚 1KB的BlockHead markle 路徑資料

spv 校驗過程:

 計算待驗證支付的交易Hash;

 節點從區塊鏈網路上獲取並存儲最長鏈的 所有BlockHeader 至本地;

 節點從區塊鏈獲取待驗證支付對應的默克爾樹雜湊 認證路徑

 根據雜湊認證路徑,計算默克爾樹的根雜湊值 (和組成該Markle Tree的其他交易一起計算 ??),將計算結果與本地區塊頭中的默克爾樹的根雜湊值進行比較,定位到包含待驗證支付的區塊(使用 Boom Filter 來查詢)

 驗證該區塊的區塊頭是否已經包含在已知最長鏈中,如果包含則證明支付真實有效;

 根據該區塊頭所處的位置,確定該支付已經得到的確認區塊數量

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

1、找到要驗證的這筆交易在哪個區塊;

2、確定這個交易是否被6次確認過了。

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

SPV的使用場景:

1、輕錢包中的支付校驗

2、側鏈的雙向掛鉤中,主鏈和側鏈需要通過對某筆特定的交易做SPV驗證,以確保該筆交易確實發生過支付,好使得一方鎖定資產,一方轉移資產

          如:(比特幣的側鏈)

         a】當用戶要想側鏈轉移BTC時,首先在主鏈上建立一筆交易【一筆特殊的交易】,待轉移的BTC被髮往一個特殊的輸出,這些BTC在主鏈上被鎖定。

         b】 等待一段確認其,使得上述交易獲得足夠的工作量確認 【如: 6個確認】

         c】 使用者在側鏈中也建立交易來提取BTC 【其實嚴格來說這時候在側鏈中不能是BTC了,而是比例兌換的側鏈的token】,需要在這筆交易的輸入指明 上述主鏈被鎖定的輸出,並提供足夠的SPV證明

         d】等待一段競爭期,防止雙花

         e】BTC就這樣在側鏈上流通了 【嚴格來說應該是比例兌換的側鏈token】

         f】當用戶想讓BTC返回主鏈時,採用類似的動作。<現在側鏈建立交易,待返回的BTC【側鏈的token】被髮往一個特殊輸出,等待一段時間確認期後,在主鏈用足夠的對側鏈輸出的SPV證明來解鎖最早被鎖定的輸出。等待一段競爭期,珠簾的BTC被解鎖,恢復流通>

SPV的神奇:

Merkle樹是一種雜湊二叉樹,它是一種用做快速歸納和校驗大規模資料完整性的資料結構。SPV充分利用了Merkle樹的這個特點,SPV節點在驗證交易是否存在時不儲存所有交易也不會下載整個區塊,僅僅只是儲存區塊頭。它使用認證路徑或者Merkle路徑來驗證交易存在於區塊中,而不必下載區塊中所有的交易

如:

可以看出,當區塊大小由16筆交易(4KB)急劇增加至65,535筆交易(16MB)時,Merkle的搜尋路徑長度增長卻極其緩慢。這樣一來,只需要一個區塊頭部結構,再加一個這樣的搜尋路徑的開銷,一個節點就能花費很小的代價快速定位一個交易。

區塊頭部只有80位元組。按照每小時6個的出塊速度,每年產出52560個區塊。當只儲存區塊頭部時,每年新增的儲存需求約為4兆位元組,100年後累計的儲存需求僅為400兆,即使使用者使用的是最低端的裝置,正常情況下也完全能夠負載

安全性

    【一】:spv由於沒有全部的交易記錄,不能驗證某個交易不存在,這個漏洞會被針對spv節點的拒絕服務或者雙重支付攻擊利用。

    【二】:spv節點需要隨機連結多個節點,增加與至少一個可靠節點相連線的概率,但是這種隨機連結的需求也會容易受到網路分割槽和sybil攻擊。

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