简单支付验证(SPV)与创新
“比特幣挖礦越來越難了怎么辦?”,“比特幣存在的缺陷是否會造成自身的消亡呢?”,“比特幣是否是一個注定失敗的實驗?”,人們對比特幣的疑問有很多很多,甚至很多還有點悲觀。作為一個軟件程序,穩定運行這么多年已經是一個奇跡,然而我們也不得不承認它有一些不完美的地方。但是,事物都是在發展中的,我們一樣也應以發展的眼光來看待它目前存在的缺陷的問題。今天不打算聊這些缺陷,而是探討比特幣在發展過程中的一種創新,因為創新才是不斷解決問題的根本辦法,這個創新就是簡單支付驗證(SPV,Simplified Payment Verification)。
1、為什么會有SPV
在比特幣整個生態圈里,大部分都是普通用戶,即只有基本的比特幣投資及消費支付需要的用戶,他們可能沒有礦機,沒有高端配置的電腦,那么他們是否也要運行一個全節點程序呢?要知道,現在官方顯示的結果,比特幣所有區塊數據目前在80G左右,而且還是持續增長中。
在之前的千聊課程“比特幣的分叉之殤”里,我曾經提到過,Core團隊堅持不擴容的一個支撐證據是“每個人應該具備運行全節點程序的能力”,但是即使個人擁有這個能力,也不一定見得要去這么做,更不會是大多數人的需求。這很容易理解,我們個人安裝比特幣錢包的目的是什么?是能夠正常支付使用、收款,即日常的消費需求。
中本聰再一次展示了他高瞻遠矚的能力,令人欽佩不已,他曾在比特幣白皮書里提到,“不運行全節點也可以驗證支付,用戶只需要保存所有的區塊頭(Block Header)就可以了。用戶雖然不能自己驗證交易,但如果能夠從區塊鏈的某處找到相符的交易,他就可以知道網絡已經認可了這筆交易,而且得到了網絡的多個確認。”
他提到的這個方案就是本文要介紹的SPV,簡單支付驗證。這是一個偉大的創新,解決了人們在支付驗證時如何處理超大規模區塊數據的難題。
2、回顧下區塊結構及默克樹
簡單支付驗證(SPV)充分利用了區塊的結構信息及默克樹(Merkle Tree)的強大搜索能力,從而能實現對交易信息的快速定位。這里面首先要理解的一點是:為什么要這么做?為什么要去定位一個交易的具體位置?
簡單來講,就是比特幣網絡里的節點在打包一個區塊的時候,會對區塊里所有的交易進行驗證,并且,一個交易還會得到6至7次的確認來確保交易最后的完成。正是如此,在使用簡單支付驗證時,只要判斷出一個交易在主鏈上的某個區塊里出現過,則可以證明該交易之前已被驗證過。
在進入下一部分講解SPV的搜索過程細節時,需要你能回顧起區塊的結構以及默克樹的特點,這些在之前的課程里都有介紹過。這里再簡單過一遍:
區塊結構對于以上的區塊結構:前一區塊Hash值用于將所有區塊鏈接成一個鏈條,Merkle樹根是通過默克樹的組織方式將所有交易的信息映射成一個字段,時間戳證明了區塊產生的唯一性及存在性,目標值也叫難度值,表明本次“挖礦”(打包區塊)的難度,隨機數則是“礦工”通過暴力破解算出的最終答案。
默克樹呢?結構如下:
默克樹結構簡單理解這個結構就是:所有的具體交易信息的哈希值都存放在葉子節點,將所有這些信息兩兩進行歸納,重復這樣一個過程,最后歸納成一個節點,即根節點(如圖中的節點0),通過一個根節點這樣的哈希值就代表了所有打包到這個區塊里的交易信息,所以大大減少了區塊頭部的大小。不僅如此,當要搜索某一個交易,比如上圖中的23的時候,可通過幾步,比如0-2-5-11即可以快速搜到。
如果你已經將上面這兩部分內容都搞懂了,可進入下面這一部分。
3、SPV的神奇
通過上面的回顧,可以知道,Merkle樹是一種哈希二叉樹,它是一種用做快速歸納和校驗大規模數據完整性的數據結構。SPV充分利用了Merkle樹的這個特點,SPV節點在驗證交易是否存在時不保存所有交易也不會下載整個區塊,僅僅只是保存區塊頭。它使用認證路徑或者Merkle路徑來驗證交易存在于區塊中,而不必下載區塊中所有的交易。
這有什么顯著的作用呢?看下面一張表格:
Merkle樹的效率通過上表可以看出,當區塊大小由16筆交易(4KB)急劇增加至65,535筆交易(16MB)時,Merkle的搜索路徑長度增長卻極其緩慢。這樣一來,只需要一個區塊頭部結構,再加一個這樣的搜索路徑的開銷,一個節點就能花費很小的代價快速定位一個交易。具體計算一下:
區塊頭部只有80字節。按照每小時6個的出塊速度,每年產出52560個區塊。當只保存區塊頭部時,每年新增的存儲需求約為4兆字節,100年后累計的存儲需求僅為400兆,即使用戶使用的是最低端的設備,正常情況下也完全能夠負載。
也就是說,一個普通用戶如果目的僅僅是為了對支付進行驗證,使用SPV方式能很好滿足這種需求,完全不用擔心區塊數據量太大的問題。
但是,這里面還有一個問題:如何根據交易哈希定位在哪一個區塊里呢?以往的比特幣系統不支持SPV,完成這種定位只能下載所有區塊,然后從頭到尾遍歷每一個區塊,并通過Merkle路徑找到對應的交易。
后來,比特幣提供了一種叫做布隆過濾器(Bloom filter)的功能,節點會在通信鏈路上建立一個這樣的過濾器,限制只接受含有目標地址的交易,從而能過濾掉大量不相關的數據,減少客戶端不必要的下載量。比如,SPV節點會收到少于1KB的有關區塊頭和Merkle路徑的數據,其數據量只約占一個完整區塊(目前大約1MB)的千分之一。
這樣一來,借助這個功能,“輕錢包”不用借助中心化的方式也可以實現,在手機上面運行也不是太大問題。
通過上面的講解,其實你會發現,比特幣在誕生的時候很“驚艷”,隨著它的發展,以及人們研究的深入,又發現了其自身出現的很多問題,比如容量限制為1M等。但是,隨著人們的繼續深入,又不斷找到了解決這些問題的辦法,從而讓它繼續發展。
可見,事物的發展都是動態演變的,我們看待問題的方式更不能靜止地看。比特幣目前依然有很多問題亟待解決,但是過于悲觀也是不必要的。
作者:higer
鏈接:https://www.jianshu.com/p/39be41dfb5fa
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的简单支付验证(SPV)与创新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊智能合约生命周期(Ethereum
- 下一篇: SPV、SPV节点和SPV钱包