代碼是所有區塊鏈技術的基礎。如果代碼不好,使用DLT 系統甚至可能很危險。這就是為什麼我們加密貨幣資產分析研究所用一種創新的新方法分析了比特幣代碼庫。我們使用專門的算法來確定代碼的質量並檢測錯誤。比特幣的代碼庫顯示出與之前分析的萊特幣相似的結果,並且質量高於以太坊。比特幣的代碼並非沒有缺陷,未來必須進行改進。 —作者:Shourya Shirsha Nandi、Philipp Sandner、Christian Flasshoff
介紹
加密貨幣資產分析研究所(ICAA) 分析加密貨幣和其他DLT 解決方案的底層代碼庫(例如C++、Java)。我們確定代碼質量的分數,該分數易於理解和比較。此外,我們指出了改進代碼庫的可能性,但也指出了潛在的風險。以比特幣為例,我們分析了超過175,000 行代碼,並僅在2.5% 的代碼中發現了問題或可能的改進。在大多數情況下,這些問題都是次要的,並不嚴重,但也有一些代碼需要開發人員進行改進。 ICAA 旨在通過審查加密貨幣代碼提供透明度和見解,並支持投資者、分析師和其他區塊鏈愛好者評估加密貨幣項目。在審查比特幣代碼之前,讓我們了解比特幣技術。對於熟悉比特幣概念的每個人,請隨意跳過本節並繼續閱讀下一節。
比特幣技術
比特幣是區塊鏈技術的第一個概念驗證。比特幣是作為一種點對點在線支付系統開發的,它解決了雙花問題[1]. 比特幣區塊鍊是一個數字簽名鏈。付款人與收款人之間的交易發生在付款人對先前交易的哈希和收款人的公鑰進行數字簽名時。然後將此信息添加到硬幣的末尾。對收款人的公鑰進行散列運算得到收款人的地址。比特幣已經合併了一個時間戳服務器來防止雙重支出。當一堆交易被捆綁到一個塊中時,時間戳服務器獲取交易塊的散列,將時間戳添加到散列中,然後廣泛發布散列。哈希中的時間戳證明了數據在某個時間的存在。
比特幣交易由網絡的其他成員(礦工)在共識的幫助下進行驗證。比特幣的共識是通過使用工作量證明系統來實現的。塊的哈希包含一個隨機數。隨機數是加密貨幣學中用於身份驗證的隨機或偽隨機數。生成的nonce 只能使用一次,不能重複使用。當使用SHA-256 算法進行散列時,散列返回一個開頭具有一定數量的零位的值。比特幣礦工擴展他們的處理能力來實現這個算法,反過來通過接收一定數量的比特幣來獲得補償。生成數字的難題的複雜性以這樣一種方式變化,即無論礦工數量或應用程序中的系統功率如何,每十分鐘就會生成一個塊。
審查比特幣代碼庫
比特幣配備了在比特幣代碼庫中定義的點對點支付功能。代碼是比特幣軟件的主幹,運行在網絡的每個節點上。因此,該代碼庫的質量和安全性對於比特幣項目的長期成功至關重要。我們使用了一種創新的新方法來分析代碼的質量。在軟件的幫助下,我們自動分析了比特幣的C++ 代碼庫並確定了代碼的質量。由於比特幣代碼是根據MIT 許可條款發布的,因此可以在GitHub [2]上輕鬆訪問代碼庫。
系統的專用算法自動定義加密的分數,範圍從-5(最差分數)到+5(最好分數)。這種分類便於解釋結果並將其與其他區塊鏈解決方案進行比較。技術備註:我們的分析基於2018-06-24 的比特幣代碼版本,並與2018-02-21 的萊特幣代碼版本和2018-03-12 的以太坊代碼版本進行了比較。
圖1:加密貨幣代碼質量的評級量表 [-5, +5]分析:比特幣在 [-5, +5] 的範圍內得分可觀的2.53
本文的主要興趣是為比特幣打分。最大的加密得分為2.53,這是一個可觀的分數,有進一步改進的潛力。在本文的後續價格中,我們將更詳細地分析這個數字。分數可以進一步細分為四類:設計、指標、重複和代碼問題。對於每個類別,都會計算一個單獨的分數,這有助於確定問題的根源。圖2 可視化了2018-06-24 比特幣版本的所有子類別。下面對每個類別進行詳細解釋,並對結果進行解釋。這部分可能更具技術性,但對於非編碼人員來說仍然是合理的。
圖2:比特幣總分在 [-5, +5] 範圍內的分佈
設計問題。在這個類別中,代碼庫是根據代碼的設計來分析的。一個好的代碼設計的特點是易於遵循和高效的結構。這使新開發人員能夠輕鬆理解現有代碼並應用更改。即使具有設計良好的代碼或設計得不太好的代碼的軟件的功能可能相同,但還是希望開發出每個程序員都容易理解的代碼。正如之前對萊特幣和以太坊的評測中所討論的,代碼設計的質量可以在算法的幫助下自動分析,包括反模式的檢測。反模式是看起來可以工作但不是最佳構造的代碼部分。當添加新功能或更改開發人員對代碼的貢獻時,這些模式通常會隨著時間的推移而出現。反模式可能會導致錯誤並使代碼的維護變得非常困難。有幾種類型的反模式。在此分析中,我們將考慮Global Breakable。 Global Breakable 模式是系統組件的結構性反模式,當其他組件發生更改時,該組件通常會受到影響。全局易碎組件是不可取的,因為它們表明系統的脆弱性和缺乏模塊化。有各種反模式,但解釋它們超出了本文的範圍。比特幣代碼有297 個反模式問題。在297 個問題中,有81 個在關鍵性方面被評為“高”。大多數反模式問題都在“leveldb”組件(42)中,其次是“錢包”組件(36)和“qt”組件(31)。圖3 顯示了“leveldb”組件中的反模式示例。設計問題的評估給比特幣打了2.69 分,優於以太坊的得分為2.29,但低於萊特幣的3.08。
圖3:比特幣“leveldb”組件中的反模式示例
指標違規。下一個類別使用軟件指標跟踪代碼的質量。這樣的度量例如是“方法數量”(NOM)。該指標計算一個類中方法(函數)的總數。很明顯,更多的方法會使代碼更複雜並增加出錯的風險。其他指標例如“方法缺乏凝聚力”(LOCM),它衡量一個類的凝聚力或“訪問外部數據”(ATFD),它衡量從其他類訪問外部屬性的頻率。為了確定代碼的質量,我們使用的系統會在超出指標的不良閾值時進行報告,併計算指標違規的分數。比特幣代碼顯示總共有1,797 項指標違規,可以轉化為1.28 分。就像在設計問題中一樣,以太坊(0.47)和萊特幣(1.93)。
代碼重複。顧名思義,類別重複搜索重複的代碼。重複代碼通常是不可取的,因為它可能會增加代碼行數、降低性能或增加軟件漏洞。比特幣代碼庫的理想分數為3.91,只有2.01% 的代碼被重複。與比特幣相比,以太坊(4.13)和萊特幣(4.29)的重複得分都更高。
代碼問題。最後一類側重於代碼問題。與設計問題相比,代碼問題僅適用於代碼的本地部分。根據問題的特徵,對軟件性能的影響可能會有所不同。因此,對檢測到的代碼問題的影響進行分類非常重要。創新的算法將每個代碼問題在低、中、高和關鍵之間進行排序。在比特幣代碼庫中,有426 個代碼問題。 86% 的代碼問題被歸類為低級或中級,許多都在“secp256k1”組件中。低代碼問題的一個示例是代碼中未使用的標籤。這種未使用的標籤不會干擾軟件的正確功能,但可以刪除以使代碼更緊湊。剩下的14% 的代碼問題屬於高問題或關鍵問題。關鍵問題在“錢包”、“net_processing.cpp”和“arith_uint256.h”組件中。中等問題在“leveldb”組件中。圖3 顯示了“arith_uint256.h”組件中的關鍵代碼問題示例。高危代碼問題不一定會導致軟件功能障礙,但會增加代碼出現不良行為的風險。代碼問題較少的軟件往往運行更穩定,應該是每個程序員的目標。代碼問題的發生在計算機編程中很常見,並且是開發過程的一部分。然而,消除代碼問題對於改進軟件是必要的。值得一提的是,比特幣代碼在代碼問題類別中僅獲得4.27 分。該分數遠高於均獲得負分的以太坊和萊特幣。這以太坊和萊特幣的得分分別為-0.05 和-0.07。
圖4:比特幣“arith_uint256.h”組件中的代碼問題示例
總結:比特幣代碼需要改進
我們加密貨幣資產分析研究所自動分析了比特幣代碼,算法揭示了一個體面的代碼結構,具有未來改進的潛力。系統根據問題的緊迫性將結果分類為熱點。如圖5 所示,幾乎2% 的以太坊代碼被標記為“關鍵”,需要開發人員進一步關注。問題可以縮小到“錢包”組件,其中超過1,472 行代碼受到影響。而且,其他組件包含分類為“高”的熱點。即使代碼似乎運行正常,這些部分也應該由開發人員審查。由於比特幣是開源的,因此不同的程序員可以為該項目做出貢獻。這使得開發具有一致設計的代碼和避免反模式變得困難。以太坊,但質量不及萊特幣。顯然,也有好消息,超過58,000 行代碼沒有問題並展示了高質量。錯誤的分佈如圖5 的熱點分析所示。該K線走勢圖明,大多數關鍵問題都存在於“錢包”組件中,“leveldb”的問題數量最多。
圖5:比特幣代碼中的熱點分佈
未來,關注比特幣代碼的新發展,看看代碼是否會在代碼質量方面得到改進,將會很有趣。此外,還需要將這些結果與其他區塊鏈解決方案進行比較。加密貨幣資產分析研究所將跟踪比特幣的發展,並將分析擴展到未來的其他區塊鏈解決方案。