區塊鏈鼻祖比特幣之12:(SPV) 節點與Bloom 過濾器
(SPV) 節點
並非所有的節點都有能力儲存完整的區塊鏈。許多比特幣客戶端被設計成運行在空間和功率受限的裝置上,如智慧電話、平板電腦、嵌入式系統等。對於這樣的裝置,通過簡化的支付驗證(SPV)的方式可以使它們在不必儲存完整區塊
鏈的情況下進行工作。這種型別的客端被稱為 SPV 客戶端或輕量級客戶端。隨著比特幣的使用熱潮,SPV 節點逐漸變成比特幣節點(尤其是比特幣錢包)所採用的最常見的形式。SPV 節點只需下載區塊頭,而不用下載包含在每個區塊中的交易資訊。由此產生的不含交易資訊的區塊鏈,大小隻有完整區塊鏈的 1/1000。SPV 節點不能構建所有可用於消費的 UTXO 的全貌,這是由於它們並不知道網路上所有交易的完整資訊。SPV 節點驗證交易時所使用的方法略有不同,這個方法需依賴對等節點“按需”提供區塊鏈相關部分的區域性檢視。打個比方來說,每個全節點就像是一個在陌生城市裡的遊客,他帶著一張包含每條街道、每個地址的詳細地圖。相比之下,SPV 節點就像是這名陌生城市裡的遊客只知道一條主幹道的名字,通過隨機詢問該城市的陌生人來獲取分段道路指示。雖然兩種遊客都可以通過實地考察來驗證一條街是否存在,但沒有地圖的遊客不知道每個小巷中有哪些街道,也不知道附近還有什麼其他街道。沒有地圖的遊客在“教堂街 23 號”的前面,並不知道這個城市裡是否還有其他若干條“教堂街 23 號”,也不知道面前的這個是否是要找的那個。對他來說,最好的方式就是向足夠多的人問路,並且希望其中一部分人不是要試圖搶劫他。簡易支付驗證是通過參考交易在區塊鏈中的深度,而不是高度,來驗證它們。一個擁有完整區塊鏈的節點會構造一條驗證鏈,這條鏈是由沿著區塊鏈按時間倒序一直追溯到創世區塊的數千區塊及交易組成。而一個 SPV 節點會驗證所有區
塊的鏈(但不是所有的交易),並且把區塊鏈和有關交易連結起來。例如,一個全節點要檢查第 300,000 號區塊中的某個交易,它會把從該區塊開始一直回溯到創世區塊的 300,000 個區塊全部都連結起來,並建立一個完整
的 UTXO 資料庫,通過確認該 UTXO 是否還未被支付來證實交易的有效性。 SPV節點則不能驗證 UTXO 是否還未被支付。相反地,SPV 節點會在該交易資訊和它所在區塊之間用 merkle 路徑建立一條連結。然後
SPV 節點一直等待,直到序號從 300,001 到 300,006 的六個區塊堆疊在該交易所在的區塊之上,並通過確立交易的深度是在第 300,006 區塊~第 300,001 區塊之下來驗證交易的有效性。事實上,如果網路中的其他節點都接受了第300,000 區塊,並通過足夠的工作在該塊之上又生成了六個區塊,根據代理閘道器協議,就可以證明該交易不是雙重支付。如果一個交易實際上不存在,SPV 節點不會誤認為該交易存在於某區塊中。SPV 節點會通過請求 merkle 路徑證明以及驗證區塊鏈中的工作量證明,來證實交易的存在性。可是,一個交易的存在是可能對 SPV 節點“隱藏”的。SPV 節點毫無疑問可以證實某個交易的存在性,但它不能驗證某個交易(譬如同一個UTXO 的雙重支付)不存在,這是因為 SPV 節點沒有一份關於所有交易的記錄。這個漏洞會被針對 SPV 節點的拒絕服務攻擊或雙重支付型攻擊所利用。為了防御這些攻擊,SPV 節點需要隨機連線到多個節點,以增加與至少一個可靠節點相連線的概率。這種隨機連線的需求意味著 SPV 節點也容易受到網路分割槽攻擊或 Sybil 攻擊。在後者情況中,SPV 節點被連線到虛假節點或虛假網路中,沒有通向可靠節點或真正的比特幣網路的連線。在絕大多數的實際情況中,具有良好連線的 SPV 節點是足夠安全的,它在資源需求、實用性和安全性之間維持恰當的平衡。當然,如果要保證萬無一失的安全性,最可靠的方法還是執行完整區塊鏈的節點。
Bloom 過濾器
Bloom 過濾器是一個允許使用者描述特定的關鍵片語合而不必精確表述的基於概率的過濾方法。它能讓使用者在有效搜尋關鍵詞的同時保護他們的隱私。在SPV 節點裡,這一方法被用來向對等節點傳送交易資訊查詢請求,同時交易地址不會被暴露。我們之前的例子,一位手中沒有地圖的遊客需要詢問去特定地方的路線。如果他向陌生人詢問“教堂街 23 號在哪裡”,不經意之間,他就暴露了自己的目的地。Bloom 過濾器則會這樣問,附近有帶‘堂’字的街道嗎?”這樣的問法包含了比之前略少的關鍵詞。這位遊客可以自己選擇包含資訊的多少,比如 “以‘堂街’結尾”或者“‘教’字開頭的街道”。如果他問得越少,得到了更多可能的地址,隱私得到了保護,但這些地址裡面不乏無關的結果;如果他問得非常具體,他在得到較準確的結果的同時也暴露了自己的隱私。Bloom 過濾器可以讓 SPV 節點指定交易的搜尋模式,該搜尋模式可以基於準確性或私密性的考慮被調節。一個非常具體的 Bloom 過濾器會生成更準確的結果,但也會顯示該使用者錢包裡的使用的地址;反之,如果過濾器只包含簡單的關鍵詞,更多相應的交易會被搜尋出來,在包含若干無關交易的同時有著更高的私密性。首先,SPV 節點會初始化一個不會匹配任何關鍵詞的“空白”Bloom 過濾器。接下來,SPV 節點會建立一個包含錢包中所有地址資訊的列表,並建立一個與每個地址相對應的交易輸出相匹配的搜尋模式。通常,這種搜尋模式是一個向公鑰付款的雜湊指令碼、,該指令碼是一個會出現在每一個向公鑰雜湊地址付款的交易中的鎖定指令碼。如果 SPV 節點需要追蹤 P2SH 地址餘額,搜尋模式就會變成 P2SH 指令碼。然後,SPV 節點會把每一個搜尋模式新增至 Bloom 過濾器裡,這樣只要關鍵詞出現在交易中就能夠被過濾器識別出來。最後,對等節點會用收到的 Bloom 過濾器來匹配傳送至 SPV 節點的交易。Bloom 過濾器的實現是由一個可變長度(N)的二進位制陣列(N 位二進位制數構成一個位域)和數量可變(M)的一組雜湊函式組成。。這些雜湊函式的輸出值始終在 1 和 N 之間,該數值與二進位制陣列相對應。並且該函式為確定性函式,也就是說任何一個使用相同 Bloom 過濾器的節點通過該函式都能對特定輸入得到同一個的結果。Bloom 過濾器的準確性和私密效能通過改變長度(N)和哈希函式的數量(M)來調節。
Bloom 過濾器陣列裡的每一個數的初始值為零。關鍵詞被加到 Bloom 過濾器中之前,會依次通過每一個雜湊函式運算一次。該輸入經第一個雜湊函式運算後得到了一個在 1 和 N 之間的數,它在該陣列(編號依次為 1 至 N)中所對應的位被置為 1,從而把雜湊函式的輸出記錄下來。接著再進行下一個雜湊函式的運算,把另外一位置為 1;以此類推。當全部 M 個雜湊函式都運算過之後,一共有 M 個位的值從 0 變成了 1,這個關鍵詞也被“記錄”在了 Bloom 過濾器裡。圖 顯示簡易 Bloom 過濾器新增關鍵詞“A”。
增加第二個關鍵是就是簡單地重複之前的步驟。關鍵詞依次通過各雜湊函式運算之後,相應的位變為 1,Bloom 過濾器則記錄下該關鍵詞。需要注意的是,當Bloom 過濾器裡的關鍵詞增加時,它對應的某個雜湊函式的輸出值的位可能已經是 1 了,這種情況下,該位不會再次改變。也就是說,隨著更多的關鍵詞指向了重複的位,Bloom 過濾器隨著位 1 的增加而飽和,準確性也因此降低了。該過濾器之所以是基於概率的資料結構,就是因為關鍵詞的增加會導致準確性的降低。準確性取決於關鍵字的數量以及陣列大小(N)和雜湊函式的多少(M)。更大的陣列和更多的雜湊函式會記錄更多的關鍵詞以提高準確性。而小的陣列及有限的雜湊函式只能記錄有限的關鍵詞從而降低準確性。
圖顯示了向該簡易 Bloom 過濾器裡增加第二個關鍵詞“B”。
為測試某一關鍵詞是否被記錄在某個 Bloom 過濾器中,我們將該關鍵詞逐一代入各雜湊函式中運算,並將所得的結果與原陣列進行對比。如果所有的結果對應的位都變為了 1,則表示這個關鍵詞有可能已被該過濾器記錄。之所以這一結論並不確定,是因為這些位元組 1 也有可能是其他關鍵詞運算的重疊結果。簡單來說,Bloom 過濾器正匹配代表著“可能是”。下圖是一個驗證關鍵詞“X”是否在前述 Bloom 過濾器中的圖例。相應的位元位都被置為 1,所以這個關鍵詞很有可能是匹配的。
若結果為或然正匹配,則表示“可能是”。另一方面,如果我們代入關鍵詞計算後的結果某位為 0,說明該關鍵詞並沒有被記錄在過濾器裡。負匹配的結果不是可能,而是一定。也就是說,負匹配代表著“一定不是”。下圖 是一個驗證關鍵詞“Y”是否存在於簡易 Bloom 過濾器中的圖例。圖中某個結果欄位為 0,該欄位一定沒有被匹配。
Bloom 過濾器被用來過濾 SPV 節點從對等節點裡收到的交易資訊。SPV 會建立一個只能和 SPV 節點錢包裡的地址匹配的過濾器。隨後,SPV 節點會向對等節點傳送一條包含需在該連線中使用的過濾器的 filterload 訊息。當過濾器建好之後,對等節點將每個交易的輸出值代入過濾器中驗證。那些正匹配的交易會被傳送回 SPV 節點。為迴應來自 SPV 節點的 getdata 資訊,對等節點會發出一條只含有和過濾器匹配的區塊的區塊頭資訊,以及與之相匹配的交易的 merkle 樹。這一對等節點還會發出一條相匹配的交易的 tx 訊息。這個節點能夠通過傳送一條 filteradd 資訊來向它的 Bloom 過濾器增加關鍵詞,也能夠傳送 filterclear 資訊來清除整個過濾器。因為不能直接從過濾器裡刪除關鍵詞,所以如果某關鍵詞不再需要,節點必須通過清除和增加來替換原有的過濾器。
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 區塊鏈鼻祖比特幣之10:merkle tree與spv節點區塊鏈比特幣
- 區塊鏈鼻祖比特幣之7:區塊鏈在比特幣中的真正用意區塊鏈比特幣
- 區塊鏈鼻祖比特幣之2:可分割與去中心化區塊鏈比特幣中心化
- 區塊鏈鼻祖比特幣之1:比特幣的內涵與價值區塊鏈比特幣
- 區塊鏈鼻祖比特幣之11:比特幣困難度區塊鏈比特幣
- 區塊鏈鼻祖比特幣之9:挖礦、礦池與比特幣的產生區塊鏈比特幣
- 區塊鏈鼻祖比特幣之4:獨特交易設計區塊鏈比特幣
- 區塊鏈鼻祖比特幣之13:比特幣原始碼編譯詳解區塊鏈比特幣原始碼編譯
- 區塊鏈鼻祖比特幣之5:獨特交易模式的優勢與困境解決區塊鏈比特幣模式
- 比特幣與區塊鏈比特幣區塊鏈
- 布隆過濾器(Bloom Filter)過濾器OOMFilter
- 布隆過濾器 Bloom Filter過濾器OOMFilter
- Bloom Filter 布隆過濾器OOMFilter過濾器
- 區塊鏈鼻祖比特幣之6:詳解比特幣的密碼攻擊與分散式雙花攻擊區塊鏈比特幣密碼分散式
- 探索C#之布隆過濾器(Bloom filter)C#過濾器OOMFilter
- Xor過濾器:比布隆Bloom過濾器更快,更小過濾器OOM
- 區塊鏈鼻祖比特幣之3:驗證訊息真偽的數字簽名區塊鏈比特幣
- 區塊鏈鼻祖比特幣之8:分叉帶來的雙花支付、51%攻擊與解決辦法區塊鏈比特幣
- 布隆過濾器(Bloom Filter)詳解過濾器OOMFilter
- 點雲濾波器與過濾器過濾器
- 關於區塊鏈技術的12個誤區 區塊鏈就是比特幣嗎?區塊鏈比特幣
- 比特幣和區塊鏈(2):比特幣中區塊鏈的實現比特幣區塊鏈
- 布隆過濾器(Bloom Filter)的java實現過濾器OOMFilterJava
- 區塊鏈資料管理平臺開發,多節點聯盟區塊鏈搭建區塊鏈
- 區塊鏈輕節點:“身”輕,責任重區塊鏈
- 深圳區塊鏈技術應用落地服務,多節點聯盟區塊鏈搭建區塊鏈
- 區塊鏈入門——比特幣科普區塊鏈比特幣
- 雜湊表擴充套件—布隆過濾器(Bloom Filter)套件過濾器OOMFilter
- CoinDesk:2017年區塊鏈報告:比特幣的泡沫與過去不同區塊鏈比特幣
- 【轉】攔截器與過濾器的區別過濾器
- “區塊鏈與比特幣”-架構師之路年終總結區塊鏈比特幣架構
- 泛圈科技釋出YottaChain芝麻雲節點伺服器,打響區塊鏈儲存之爭!AI伺服器區塊鏈
- 區塊鏈3.0儲存礦機-YottaChain芝麻雲節點區塊鏈AI
- 【SSO】--單點登入之過濾器(filter)過濾器Filter
- 過濾器 Filter 與 攔截器 Interceptor 的區別過濾器Filter
- 區塊鏈技術應用智慧財產權上鍊存證,多節點聯盟區塊鏈搭建區塊鏈
- 區塊鏈特徵與區塊鏈技術應用落地區塊鏈特徵
- 區塊鏈開發公司區塊鏈與產業變革區塊鏈產業