欧美日韩国产一区二区|qovd片|小明个人发布看看|小浪货你夹真紧水又多|老头把我添高潮了A片故|99热久久精品国产一区二区|久久久春色AV

比太錢包為什么從 Bitcoinj 切換到了 Bitherj ?比太錢包從 Bitcoinj 切換到了 Bitherj原因是什么?

比太錢包安卓版從v0.0.9開始不再基于Bitcoinj,而是使用了我們自行開發的Java語言比特幣協議庫Bitherj 。這其實是個很無奈的選擇,我們也不想“重新發明輪子”,不過沒辦法,因為“Too Fragile!”(借用Mike Hearn對bitcoind的評價),我們不得不開發一套全新的Bitherj來更好的為比太錢包用戶提供服務,這很辛苦,但卻值得 。

比太錢包為什么從 Bitcoinj 切換到了 Bitherj ?比太錢包從 Bitcoinj 切換到了 Bitherj原因是什么?

Bitcoinj的問題如下:
1. 架構:
對于SPV輕錢包模型來說,普通用戶并不關心整個區塊鏈上的全部交易,而只關心與自己相關的(和依賴的)比特幣交易 。基于一點,在設計輕錢包架構時,應更多的考慮使用關系模型而非序列化模型存儲數據 。
但Bitcoinj并沒有這么做,Bitcoinj的架構中,無論是緩存的區塊鏈SPV頭文件,還是錢包文件,都使用了谷歌自己的序列化方式進行讀寫 , 這其實是導致很多問題的根源 。
2. 性能:
【比太錢包為什么從 Bitcoinj 切換到了 Bitherj ?比太錢包從 Bitcoinj 切換到了 Bitherj原因是什么?】由于Bitcoinj的架構設計 , 使得所有錢包文件的讀寫都必須是通過谷歌的序列化方式全讀、全寫,這對于只有一個錢包、一個地址且交易很少的用戶來說可能還好(出問題的概率會低得多),但對于有多個錢包、多個地址的用戶來說 , 就可能會成為性能“災難”,錢包越多、地址越多、交易越多,就越是災難 。
另外,由于Confidential模型的設計 , 使得在每一個新塊到來的時候,所有錢包所有地址上的所有交易都需要進行更新 , 哪怕這個新塊與任何一個地址上的任何一個交易都無任何關系,都需要把所有的錢包文件序列化的讀到內存中,更新完所有的條目 , 再序列化的寫回文件,這就是Bitcoinj性能問題的根源 。
3. 錯誤:
因架構不合理所導致的性能問題,如果結果僅僅是性能較差,那還算是在可以忍受的范疇 。可問題就在于,這種性能瓶頸可能會導致Bitcoinj的各種運行錯誤 , 某些情況下,甚至會出現“致命”的后果 。
正因為意識到了嚴重的性能問題,Bitcoinj的作者不得不妥協的設計了兩套獨立的寫文件線程 , 一套高優先級的寫線程用于寫入那些比較重要的數據(比如通過廣播收到了新交易等),一套低優先級的寫線程用于延時同步各個錢包文件與SPV區塊頭文件 。
這使得Bitcoinj的錢包文件讀寫非常容易出錯,經常是錢包文件與塊頭不一致,錢包文件內的交易之間狀態不一致 , 各個交易的各種狀態都頻繁的處于正確、錯誤的來回切換之中,這次寫文件沒準給寫對了,下一個延時的寫操作沒準又給改錯了 。
此類問題,對于開發人員來說是非常頭疼的,因為你完全無法依賴某一個值是否可靠,你只能盡可能的用其它方式來判斷錢包的狀態、交易的狀態是否正確,如果發現不正確,再想方設法的用繞過Bitcoinj的方式去修改數據甚至是重置區塊鏈數據(ResetBlockchain) 。
大部分人對于上述問題可能完全沒有任何概念,但MultBit的開發者Jim618應該和我們團隊一樣,對這些問題深有感觸 。如果您閱讀過一些MultiBit的代碼或者比太錢包安卓版v0.0.8之前的代碼 , 就會發現,我們都寫了很多方法,專門用來繞過Bitcoinj中可能存在的缺陷 , 而這些缺陷都是明確的、可復現的、但卻幾乎不可能在Bitcoinj的架構上解決的(我們團隊從MultiBit上借鑒了很多,特此感謝) 。
MultiBit和比太都采用了非常多的迂回手段盡可能避開Bitcoinj中的架構陷阱,雖然已經能夠在大部分情況下解決很多問題,但還是不能根治 。而另一個基于Bitcoinj的安卓手機錢包Bitcoin-Wallet,因為它的單錢包、單地址模型,使得出現此類問題的概率大大降低(該應用的開發者本人甚至可能都不知道Bitcoinj會有這么多問題),開發者選擇的解決方案是出現問題時重置區塊鏈數據(ResetBlockchain) 。
幾個月前曾經發生過的MultiBit找零地址私鑰丟失的問題 , 開發者Jim618也挨了不少罵,但他其實也挺冤的 。您如果仔細看看代碼就會發現 , 程序本身是完全不會發生私鑰丟死的情況的 。問題就在于,該用戶有很多錢包文件 , 每個錢包文件又有很多地址,每個地址上的交易應該也不少 , 這就會放大各種問題出現的概率,因為會有更多、更慢的錢包文件全讀、全寫操作,以及頻繁的修復數據和偶爾出現的ResetBlockchain操作,這其實才是導致此災難的根源 。
Jim618的最終解決方案是在新版MultiBit中提供了一個檢測私鑰的功能,我們團隊則是在比太錢包v0.0.8及之前的版本中將加密后的私鑰在手機ROM中額外備份一份,以保障用戶的私鑰安全,這都是不得不做的權宜之計 。
因為Bitcoinj的架構會導致嚴重的性能問題,而性能為題又會導致很多“莫名其妙”的錯誤,小概率事件下甚至有可能會導致“災難” , 最終我們決定,重新設計并開發Bitherj 。
Bitherj的架構是關系模型的(基于SQLite數據庫引擎)、更穩定、更可靠、更高性能的Java語言比特幣協議庫 , 我們會盡可能保持它與Objective-C語言版本的Bitheri保持一致,并且不斷改進和發展這兩個庫 。
如果您也是一位比特幣錢包開發者 , 在基于Bitcoinj開發時遇到了很多古怪問題,不妨與我們團隊聯系,我們在Bitcoinj上所糾結過的“坑”甚至比Jim618還要多,您所遇到的問題我們應該早就遇到、并嘗試解決過,我們團隊之前的經驗應該能對您有所幫助 。
如果您是位普通用戶 , 您應該了解修復交易數據和重置區塊鏈發生的原因,并保管好您的私鑰 。畢竟對于比特幣來說,私鑰意味著一切 。
感謝您的閱讀!

相關經驗推薦