官术网_书友最值得收藏!

第三章
區塊鏈進階本章《簡單支付驗證》部分由海濱完成,《側鏈》部分由申屠青春完成,《閃電網絡》部分由潘志彪完成。

一、簡單支付驗證(SPV)

簡單支付驗證(Simplified Payment Verification,簡稱SPV)是一種無須維護完整的區塊鏈信息,只需要保存所有的區塊頭部信息即可進行支付驗證的技術。該技術可以大大節省區塊鏈支付驗證用戶的存儲空間,減輕用戶存儲負擔,降低區塊鏈未來交易量劇增而給用戶帶來的壓力。以比特幣系統為例,節點只需保存所有區塊頭信息,即可進行交易支付驗證。節點雖然不能獨立驗證交易,但能夠從區塊鏈其他節點獲取交易驗證的必要信息,從而完成交易支付驗證,同時還可以得到整個區塊鏈網絡對交易的確認數。

要理解SPV的概念,首先需要理解如下兩類概念的區別。

一是SPV與輕錢包(或瘦客戶端)的區別。輕錢包指的是節點本地只保存與其自身相關的交易數據(尤其是可支配交易數據),但并不保存完整區塊鏈信息的技術。SPV的目標是驗證某個支付是否真實存在,并得到了多少個確認。比如愛麗絲(Alice)收到來自鮑伯(Bob)的一個通知,鮑伯聲稱已經從其賬戶中匯款一定數額的錢給了愛麗絲。如何快速驗證該支付的真實性,是SPV的工作目標。輕錢包或瘦客戶端的目標不僅是支付驗證,而且是用于管理節點自身的資產收入、支付等信息。比如愛麗絲使用輕錢包或瘦客戶端管理自身在區塊鏈的收入信息、支出信息,在本地只保存與愛麗絲自身相關的交易數據,尤其是可支配交易數據。輕錢包與SPV的最大區別是,輕錢包節點仍需下載每個新區塊的全部數據并進行解析,獲取并本地存儲與自身相關的交易數據,只是無須在本地保存全部數據而已。而SPV節點不需要下載新區塊的全部數據,只需要保存區塊頭部信息即可。雖然輕錢包或瘦客戶端中部分借鑒了SPV的理念,但和SPV是完全不同的。

二是區塊鏈支付驗證與區塊鏈交易驗證的區別。SPV指的是區塊鏈支付驗證,而不是區塊鏈交易驗證。這兩種驗證方式存在很大的區別。區塊鏈交易驗證的過程比較復雜,包括賬戶余額驗證、雙重支付判斷等,通常由保存區塊鏈完整信息的區塊鏈驗證節點來完成。而支付驗證的過程比較簡單,只是判斷該筆支付交易是否已經得到了區塊鏈節點共識驗證,并得到了多少的確認數即可。還是以比特幣系統為例,用戶愛麗絲收到來自鮑伯的通知,鮑伯聲稱已經從其賬戶中匯款一定數額的錢給愛麗絲。愛麗絲進行交易驗證的過程如下:首先,愛麗絲遍歷完整的區塊鏈賬本,在區塊鏈賬本的交易中保存了鮑伯的歷史交易信息(包括鮑伯的匯款賬戶、鮑伯的簽名、歷史收款人的地址以及匯款金額信息等),查詢鮑伯的賬戶,就可以判斷鮑伯提供的賬戶是否有足夠的余額,如果余額不足則交易驗證失敗;其次,愛麗絲要根據區塊鏈賬本判斷鮑伯是否已經支出了這個賬戶上的錢給別人,即是否存在雙重支付問題,如果存在則交易驗證失敗;最后,判斷鮑伯是否擁有其提供賬戶的支配權,如果判斷失敗則交易驗證失敗。而如果愛麗絲只是進行支付驗證,則過程簡單得多:通過SPV,愛麗絲可以進行支付快速驗證,即檢查此項支付交易是否已經被收錄存儲于區塊鏈中,并得到了多少個確認數,就可以判斷支付驗證的合法性。詳細的技術原理如下。

(一)SPV的技術原理

在區塊鏈中,區塊信息主要包括區塊大小、區塊頭、交易數量和交易信息四部分內容。其中,區塊頭大小為固定字節,比如比特幣中區塊頭的大小始終為80字節。區塊頭中一般包括如下信息:前一區塊(也稱父區塊)的哈希值、區塊中交易默克爾樹的根哈希值、時間戳等。以比特幣為例,其區塊頭的數據結構如表3-1所示。

表3-1 區塊頭的數據結構

通過區塊的哈希值,可以識別出區塊鏈中的對應區塊。區塊前后有序鏈接,每一個區塊都可以通過其區塊頭的“前一區塊的哈希值”字段引用前一區塊。這樣把每個區塊均鏈接到各自前一區塊的哈希值序列就創建了一條一直可以追溯到第一個區塊(創世區塊)的鏈條。前一區塊的哈希值,可以確保區塊鏈所記錄的交易次序。默克爾樹的根哈希值則可以確保收錄到區塊中的所有交易的真實性。

區塊鏈節點利用SPV對支付進行驗證的工作原理如下:

①計算待驗證支付的交易哈希值;

②節點從區塊鏈網絡上獲取并存儲最長鏈的所有區塊頭至本地;

③節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑;

④根據哈希認證路徑,計算默克爾樹的根哈希值,將計算結果與本地區塊頭中的默克爾樹的根哈希值進行比較,定位到包含待驗證支付的區塊;

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

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

上述方法可以減輕用戶的負擔。以比特幣為例,無論未來的交易量多大,區塊頭的大小始終只有80字節,按照每小時6個的區塊生成速度,每年產出52560個區塊。當只保存區塊頭時,每年新增存儲需求約為4兆字節,100年后累計的存儲需求僅為400兆字節,即使用戶使用的是最低端的設備,正常情況下也完全能夠負載。

SPV的工作原理中,最為關鍵和復雜的是步驟③,節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑的過程。例如,一個區塊鏈節點想要知道其錢包中某個比特幣地址即將到達的某筆支付,該節點會在節點間的通信鏈接上建立起布魯姆過濾器,限制只接受含有目標比特幣地址的交易。當節點探測到某交易符合布魯姆過濾器的要求時,將以默克爾區塊消息的形式發送該區塊。默克爾區塊消息包含區塊頭和一條連接目標交易與默克爾樹根的默克爾哈希認證路徑。默克爾樹哈希認證路徑是驗證待驗證支付是否存在于默克爾樹的關鍵條件,該認證路徑由默克爾樹所有路徑中節點的哈希值共同構成,自下而上進行哈希計算。節點能夠使用該路徑找到與該交易相關的區塊,進而驗證對應區塊中該交易的有無。如圖3-1所示為根據交易A、B、C、D、E、F、G、H生成的默克爾樹。這是一棵自下而上通過哈希運算生成的二叉樹。葉子節點為交易信息的哈希值,葉子節點兩兩進行哈希運算得到其父節點,繼續此過程,直至生成默克爾樹根節點。需要注意的是,如果存在單個葉子節點無法匹配成對,則用復制的方法構成完整的二叉樹,比如圖3-2中交易H不存在,則可以將交易G的哈希值M(G)復制一份替代M(H),從而完成二叉樹的生成過程。

圖3-1 交易默克爾樹結構示意圖

圖3-2 默克爾樹哈希認證路徑示意圖

假設待驗證交易為E,則交易E的默克爾樹哈希認證路徑為圖3-2虛線框所示的M(F)、M(GH)和M(ABCD)。通過該哈希認證路徑,即可以通過哈希計算找到一條鏈接交易E與默克爾樹根的完整路徑。

(二)SPV的功能擴展

雖然SPV可以高效地進行支付驗證,但對于節點當前狀態(賬戶余額、賬戶信息甚至合約狀態等)均無法給出證明。SPV能否擴展并更進一步呢?以太坊對SPV的功能進行了擴展:每一個區塊頭,并非只包含一棵默克爾樹,而是包含了三棵默克爾樹,分別對應了三種對象——默克爾交易樹、默克爾收據樹和默克爾狀態樹。其中默克爾收據樹和默克爾狀態樹是比特幣等現有區塊鏈系統沒有的。默克爾收據樹是由展示每一筆交易影響的數據條構成的默克爾樹。而在默克爾狀態樹中,則保存賬戶信息、賬戶余額等信息。三棵默克爾樹的功能分工如下。

①默克爾交易樹:保存交易信息,用于驗證交易是否真實包含于區塊鏈中。

②默克爾收據樹:保存某個地址的歷史事件實例,比如一個交易是否成功執行、一個眾籌合約是否完成了目標等。

③默克爾狀態樹:保存了賬戶名稱、賬戶余額等信息。

基于上述三棵樹,以太坊不僅可以實現SPV的支付驗證,而且可以快速驗證賬戶是否存在、了解賬戶余額甚至快速判斷交易是否執行成功等信息,實現了良好的SPV擴展。

(三)SPV面臨的問題

SPV面臨的第一個是問題是SPV節點與區塊鏈系統去中心化程度似乎存在一定的矛盾。隨著SPV節點數量的增多,那么區塊鏈參與完整驗證的節點數量就會減少。然而,SPV卻不能完全獨立構成區塊鏈。由于SPV節點沒有存儲完整的區塊鏈信息,SPV的實現離不開存儲區塊鏈完整信息的節點或系統的輔助。

SPV面臨的第二個問題是交易可鍛性攻擊交易可鍛性(transaction malleability)攻擊,又稱交易延展性攻擊。攻擊者偵聽比特幣P2P網絡中的交易,利用交易簽名算法的特征修改原交易中的input簽名,生成擁有一樣input和output的新交易,然后廣播到網絡中形成雙重支付。這樣,原來的交易將有一定的概率不能被確認,造成不可預料的后果。。由于SPV實現中一個關鍵步驟是根據支付哈希值定位其在區塊中的位置,而該過程可能遭遇交易可鍛性攻擊。比如比特幣系統中,交易可鍛性攻擊體現在交易ID(賬號)可被偽造,而交易ID可被偽造的原因是比特幣簽名算法不夠完善。以比特幣為例,交易可鍛性攻擊的過程如下:在比特幣的交易中,第三方交易系統會將交易發送方、接受方、交易金額等數據作為一個交易發送到比特幣網絡中,發送之前會對這條交易信息進行加密和簽名,接著根據生成的簽名最終獲得一個哈希值,這個哈希值作為交易ID返回給提現的用戶。一次交易請求過后,用戶接收到的僅有一個交易ID,根據這個交易ID可以查看交易是否成功。當交易發送到比特幣網絡中后,網絡中的各個節點會根據之前生成的簽名來驗證交易的真實性。問題就出在簽名算法上:橢圓曲線數字簽名ECDSA這個算法的一個問題是,修改簽名的某個字節能夠使簽名依然校驗成功,這樣偽造簽名之后交易依然能夠成功進行。由于交易ID是根據簽名生成的,而偽造之后的簽名會生成一個完全不同的交易ID,第三方判斷到兩個ID不同便會確定當前交易失敗,而事實上交易已經成功了。這時如果用戶發現交易提示失敗,可以再次發起交易,第三方交易系統一看之前交易確實失敗了,那就會再進行一次交易。這時用戶的比特幣錢包里就會多收到一份比特幣,也就造成了第三方交易平臺資金損失。交易的可鍛性體現在雖然交易簽名被“鍛造過”(即修改偽造過),但最終的交易依然有效。上述攻擊對于SPV是有效的,因為在交易可鍛性攻擊場景中,偽造的交易和正常的交易都在區塊鏈網絡中,如果偽造的交易先被處理,那么攻擊就成功。從而,SPV支付在區塊鏈中的位置定位過程可能無法完成或出現錯誤,最終影響支付驗證的進程和準確性。

有人提出可以通過改進SPV的工作流程來提升攻擊防范的有效性,比如不再僅根據哈希值來判斷支付的狀態,而是使用雙因素或者多因素驗證,包括賬戶余額、支付信息追蹤等來綜合判斷支付是否真正成功,但這會增加SPV的復雜度。如何更加有效地解決SPV面臨的問題還值得進一步研究。

主站蜘蛛池模板: 山丹县| 渭南市| 中方县| 通道| 临猗县| 大丰市| 胶州市| 衢州市| 昌黎县| 祁阳县| 铅山县| 阜平县| 元谋县| 文昌市| 龙井市| 梅河口市| 邯郸县| 瑞丽市| 拉孜县| 长兴县| 师宗县| 舒兰市| 吉首市| 江津市| 南宁市| 武清区| 霍林郭勒市| 张掖市| 方山县| 衢州市| 闽清县| 浦北县| 临洮县| 出国| 义乌市| 武义县| 辽源市| 泰宁县| 郯城县| 静海县| 洛浦县|