陳 勝, 曾 靖, 左 春(中國科學院軟件研究所 互聯網金融技術研究中心, 北京 0090)(中科軟科技股份有限公司, 北京 0090)
基于區塊鏈項目開發語言選型的初探①
陳 勝1, 曾 靖1, 左 春21(中國科學院軟件研究所 互聯網金融技術研究中心, 北京 100190)2(中科軟科技股份有限公司, 北京 100190)
區塊鏈技術及持續發展的各種開源區塊鏈項目, 正吸引著越來越多開發者的目光. 而繁多的主流編程語言及特色各異的區塊鏈項目, 使得開發者在開發基于區塊鏈的系統與應用時, 在技術選型上難免會有所困惑. 為此, 對12個較知名的開源區塊鏈項目, 使用了源碼統計工具Cloc統計其源代碼, 并進一步通過閱讀相關代碼及文檔, 分析和比較了其開發語言的構成. 同時, 以圖表的形式呈現其體量和關注度, 從而為區塊鏈開發者在選型上提供參考信息和建議.
區塊鏈; 開源; 編程語言; 統計
區塊鏈是起源于比特幣實驗的分布式數據庫技術.該概念在中本聰的白皮書[1]中被首次提出.
比特幣網絡中的所有全節點以區塊鏈的方式共享交易數據庫的完整副本. 交易由交易發起者或生成區塊的挖礦者簽名, 并被打包在區塊中. 每個區塊包含了指向前一個區塊的哈希值, 以此構造出一條不可篡改的, 從最新區塊指向創世區塊的鏈. 每個全節點也可由此推算出在區塊鏈上的任意歷史點以及任意地址/賬戶的未花費余額.
盡管針對不同行業不同場景的區塊鏈應用存在衍生功能個性差異, 但是它們都被貼上了“區塊鏈”的標簽, 這些應用在基本功能和系統結構方面也就存在著諸多共性. 這些共性的基本功能包括:
① 用戶密鑰對以及賬戶/地址的生成;
② 交易的構造和簽名以及驗證簽名;
③ P2P消息應答以及數據傳輸;
④ 共識機制以及交易的打包入塊與成鏈.
這些基本功能, 是形成區塊鏈應用網絡不可或缺的部分. 除此之外, 伴隨著區塊鏈生態的發展, 也衍生出了其他輔助功能. 例如: 命令行人機交互(cli)、更友好的錢包(wallet)應用以及區塊鏈的web瀏覽檢索(explorer)等.針對比特幣實驗所暴露的問題以及應用場景的各自特點, 區塊鏈應用通常對基本功能進行改進以符合其需求. 例如, 為了改進出塊性能, BitShares[2]在共識機制方面采用授權股份證明(Delegated Proof of Stake, DPoS)[3]代替比特幣的工作量證明(Proof of Work, PoW). 為了解決數據膨脹危機, 在鏈形態上, Lisk采用主側鏈加DApp(Decentralized Application)機制代替比特幣的單一主鏈[4]. 而以太坊(Ethereum)則將比特幣的腳本機制發展為圖靈完備的智能合約, 允許開發者編寫和發布可以運行在以太坊虛擬機之上的分布式智能合約程序[5].
無論是基本功能, 還是衍生功能, 具體到它們的編程實現, 目前主流的編程語言均可以勝任. 在動手搭建自己的區塊鏈應用之前, 有必要對目前的相關開源項目進行一番審視, 從而針對具體的應用場景, 選擇合適的編程語言及區塊鏈入門項目. 本文對較知名的12個開源區塊鏈項目進行源碼統計, 并根據相關源碼與文檔, 分析其開發語言的構成. 同時, 結合各項目的體量與熱度, 給出選型建議.
通常去中心化的區塊鏈應用會相應地開放源碼.本文采用以下標準:
① 已公開發布的開源競爭幣, 包括: 比特幣(Bitcoin[6])、以太坊(Ethereum[7])、比特股(BitShares[8])、NXT[9]及LISK[10];
②某些項目將相對獨立的功能集合分拆為獨立的git工程, 例如: Lisk項目下的LiskHQ/lisk和LiskHQ/lisk-ui、LiskHQ/lisk-cli. 相應地對每個項目建立一個父目錄blockchain以容納多個git工程的代碼(見圖1).針對特定行業或領域的開源區塊鏈代表, 包括: 超級賬本(HyperLedger[11], 智能合約)、公證通(Factom[12], 公證防偽)、IPFS[13](分布式文件)、比特信(BitMessage[14],社交通訊)、OpenBazaar[15](電子商務)、Storj[16](文件存儲)以及RSCoin[17](中心化數字貨幣).
2.1 源代碼獲取
上述入選項目都采用了github作為代碼倉庫, 在本地安裝一個git客戶端, 通過命令行即可將代碼clone到本地文件目錄以進行分析:
例: git clone git@github.com:bitcoin/bitcoin.git有兩種情況必須加以考慮:
① 同一項目存在多種編程語言實現的, 例如: 比特幣、以太坊等, 選取star數最高的語言實現納入統計.

圖1 獲取源碼后的目錄結構
2.2 代碼分類統計
CLOC(Count Lines of Code)是一款開源的跨平臺代碼統計工具, 可以在終端下以命令行方式在線下載安裝.
2.2.1 初步統計
在終端下進入blockchainlisk目錄, 使用cloc默認命令: “cloc .”, 結果如圖2所示.

圖2 初步統計lisk源碼的結果
2.2.2 可疑的JSON
顯然, 占據榜首的JSON很可能不是源代碼, 進一步使用命令: “cloc . --by-file --include-lang=JSON”單獨對JSON文件進行統計, 結果如圖3所示.

圖3 單獨統計lisk中JSON文件所得結果
通過閱讀官方文檔, 可以獲知genesisBlock.json是用于創建預挖礦創世區塊的定義文件, 應該排除出源碼統計.
類似地, 應該排除其它項目中用于本地化顯示的以及以太坊中用于測試用例的JSON文件. 另外比特信使用了39227行TypeScript作為本地化文件, 也在排除之列.
Cloc提供了過濾參數“--exclude-lang=”用于排除指定類別語言. 我們使用“--exclude-lang=JSON, TypeScript”可以達到上述目的.
2.2.3 項目體量
應用上述命令, 首先針對每個項目統計代碼, 然后用“cloc --sum-reports”合并統計, 結果1如圖4.

圖4 合并統計所得結果
代碼行數反映項目體量. 從圖4中可以發現, 同樣定位為智能合約平臺的競爭幣, Lisk的體量尚不及以太坊(Ethereum)的十分之一. 如果希望完整學習及理解一款區塊鏈平臺, Lisk將會是更好的選擇.
2.2.4 項目熱度
托管平臺上項目的star數及fork數可體現該項目受關注的熱度. 根據從github及bitbucket上所獲取的數據, 可得到如圖5所示的各項目的star數及fork數情況.
圖5中, 除NXT的數據來源于bitbucket外, 其他項目的數據均來自github. 并且由于bitcoin的star數與fork數分別為9839與6564, 遠大于其余11個項目的, 故圖5未顯示bitcoin的情況. 同樣以Lisk和以太坊做對比說明: 以太坊的受關注熱度是Lisk的約20倍. 因此如果不是想自己另起爐灶, 而是融入主流生態, 現階段融入以太坊的生態才是更合理的選擇.

圖5 各項目的star數及fork數對比
2.2.5 語言熱度
對于上述12個項目, 分析對比它們對編程語言的選擇, 對區塊鏈開發者在技術選型上也會有所幫助.我們單獨審視各個項目, 并對編程語言進行投票, 投票規則如下: 如果該項目使用某種語言的代碼量超過其總代碼量的1/10, 那么此項目投了該語言一票.
根據上述投票規則, 得到的統計結果如圖6所示.圖中各語言得票情況的對比正好符合一個趨勢: 近年來腳本語言的興起, 已經在越來越多的領域代替傳統的編程語言.

圖6 各編程語言得票情況
具體到本文考察的開源區塊鏈項目, 就主要開發語言的選擇上, bitcoin和bitshares采用了C++, NXT采用Java, 而其他項目均采用腳本語言或兼具了腳本語言優點的Go語言作為主開發語言.
在前端界面, javascript占據著主導地位. 且Lisk和Storj采用了Nodejs實現, 故在前后端均采用javascript, 而其他采用javascript的項目均將其用于前端或客戶端.
而在后端, 腳本語言又常常通過擴展機制借助C語言實現性能卓越的加密/解密以及簽名這樣的基礎功能. 比如, Lisk引用了用C語言實現的ed25519密鑰對生成模塊, 同樣地, 其所引用的用于加密/解密, 簽名/驗證的crypto模塊是對C語言實現的OpenSSL的封裝.
盡管對比特幣試驗本身褒貶不一, 但比特幣通過結合數學原理與網絡共識, 成功建立和生長出的試驗網絡給人們帶來了新的認知, 即構建去中心化的信任是可行的.
針對比特幣的不足并結合具體的應用場景, 形形色色的區塊鏈應用正不斷涌現. 從Lisk那樣的小型團隊到超級賬本那樣的大型團隊, 無論是普通程序員還是行業巨頭, 都對區塊鏈表現出了濃厚的興趣, 并切身地參與其中. 而面對如此眾多, 各具特點的開源項目, 選擇適合自己的項目就顯得不太容易了. 本文從分析各個項目所采用的編程語言的組成入手, 直觀地展示項目的體量、關注度并關注開發人員對各種編程語言的結合使用.
相比較傳統形態的應用, 區塊鏈仍未形成系統性的軟件生態. 未來也許會出現主導行業的規約或者架構. 但現階段各類應用仍處于演化過程中. 故在選型開源項目之前, 區塊鏈開發者需要審視如下問題.
自行維護主鏈生態, 還是開發寄生在其他主鏈生態上的應用, 前者開發難度較大, 而后者只需要理解DApp(Decentralized Application)或智能合約的編程思想; 開發一個同樣的區塊鏈平臺, 如Lisk, 還是針對特定行業的區塊鏈應用, 如Storj, 雖然都主要采用腳本語言來實現, 但后者需要的代碼體量可能會少很多;選擇編譯型語言, 還是解釋型語言來開發區塊鏈項目,也需要對開發效率、運行效率、平臺適應性及應用場景等多種因素進行綜合考量.
1 Nakamoto S.Bitcoin: A peer-to-peer electronic cash system. https://bitcoin.org/bitcoin.pdf. 2009.
2 Consensus technology. https://docs.bitshares.org/bitshares/whatis. html. 2016.
3 Delegated proof of stake. https://docs.bitshares.org/bitshares/ dpos.html. 2016.
4 Lisk. What is Lisk? And what it isn’t. https://blog.lisk.io/what -is-lisk-and-what-it-isnt-e7b6b6188211#.joflk4qbs. 2016.
5 White Paper. https://github.com/ethereum/wiki/wiki/White-Paper#ethereum. 2016.
6 Bitcoin. https://github.com/bitcoin. 2016.
7 Ethereum. https://github.com/ethereum. 2016.
8 Bitshares. https://github.com/bitshares. 2016.
9 NXT. https://bitbucket.org/JeanLucPicard/nxt/overview. 2016.
10 LISK. https://github.com/LiskHQ. 2016.
11 超級賬本. https://github.com/hyperledger. 2016.
12 公證通. https://github.com/FactomProject. 2016.
13 IPFS. https://github.com/ipfs. 2016.
14 比特信. https://github.com/Bitmessage/PyBitmessage. 2016.
15 OpenBazaar. https://github.com/openbazaar. 2016.
16 Storj. https://github.com/Storj. 2016.
17 RSCoin. https://github.com/gdanezis/rscoin. 2016.
Discussion of Selection for Languages Based on Blockchain Projects Development
CHEN Sheng1, ZENG Jing1, ZUO Chun21(Institute of Software, Chinese Academy of Sciences, Research Center for Internet Finance Technology, Beijing 100190, China)2(Sinosoft Company Limited, Beijing 100190, China)
More and more developers are being attracted by blockchain technologies and sustainable development of various open source blockchain projects. Nevertheless, the various popular programming languages and distinctive blockchain projects could perplex the developers inevitably when they commence to develop systems or applications based on blockchain. So, this paper utilizes a tool named Cloc to count the lines of source code in 12 well-known open source blockchain projects. By further reading codes and documents associated, we try to analyze and compare the programming language constitutions of the projects. Moreover, the paper demonstrates their project sizes and the attention degree to them in the form of charts. Finally, some reference information and suggestions about selections are given to the blockchain developers.
blockchain; open source; programming language; statistics
2016-07-18;收到修改稿時間:2016-10-12
10.15888/j.cnki.csa.005775