陳 勝, 曾 靖, 左 春(中國科學(xué)院軟件研究所 互聯(lián)網(wǎng)金融技術(shù)研究中心, 北京 0090)(中科軟科技股份有限公司, 北京 0090)
基于區(qū)塊鏈項目開發(fā)語言選型的初探①
陳 勝1, 曾 靖1, 左 春21(中國科學(xué)院軟件研究所 互聯(lián)網(wǎng)金融技術(shù)研究中心, 北京 100190)2(中科軟科技股份有限公司, 北京 100190)
區(qū)塊鏈技術(shù)及持續(xù)發(fā)展的各種開源區(qū)塊鏈項目, 正吸引著越來越多開發(fā)者的目光. 而繁多的主流編程語言及特色各異的區(qū)塊鏈項目, 使得開發(fā)者在開發(fā)基于區(qū)塊鏈的系統(tǒng)與應(yīng)用時, 在技術(shù)選型上難免會有所困惑. 為此, 對12個較知名的開源區(qū)塊鏈項目, 使用了源碼統(tǒng)計工具Cloc統(tǒng)計其源代碼, 并進一步通過閱讀相關(guān)代碼及文檔, 分析和比較了其開發(fā)語言的構(gòu)成. 同時, 以圖表的形式呈現(xiàn)其體量和關(guān)注度, 從而為區(qū)塊鏈開發(fā)者在選型上提供參考信息和建議.
區(qū)塊鏈; 開源; 編程語言; 統(tǒng)計
區(qū)塊鏈是起源于比特幣實驗的分布式數(shù)據(jù)庫技術(shù).該概念在中本聰?shù)陌灼鳾1]中被首次提出.
比特幣網(wǎng)絡(luò)中的所有全節(jié)點以區(qū)塊鏈的方式共享交易數(shù)據(jù)庫的完整副本. 交易由交易發(fā)起者或生成區(qū)塊的挖礦者簽名, 并被打包在區(qū)塊中. 每個區(qū)塊包含了指向前一個區(qū)塊的哈希值, 以此構(gòu)造出一條不可篡改的, 從最新區(qū)塊指向創(chuàng)世區(qū)塊的鏈. 每個全節(jié)點也可由此推算出在區(qū)塊鏈上的任意歷史點以及任意地址/賬戶的未花費余額.
盡管針對不同行業(yè)不同場景的區(qū)塊鏈應(yīng)用存在衍生功能個性差異, 但是它們都被貼上了“區(qū)塊鏈”的標簽, 這些應(yīng)用在基本功能和系統(tǒng)結(jié)構(gòu)方面也就存在著諸多共性. 這些共性的基本功能包括:
① 用戶密鑰對以及賬戶/地址的生成;
② 交易的構(gòu)造和簽名以及驗證簽名;
③ P2P消息應(yīng)答以及數(shù)據(jù)傳輸;
④ 共識機制以及交易的打包入塊與成鏈.
這些基本功能, 是形成區(qū)塊鏈應(yīng)用網(wǎng)絡(luò)不可或缺的部分. 除此之外, 伴隨著區(qū)塊鏈生態(tài)的發(fā)展, 也衍生出了其他輔助功能. 例如: 命令行人機交互(cli)、更友好的錢包(wallet)應(yīng)用以及區(qū)塊鏈的web瀏覽檢索(explorer)等.針對比特幣實驗所暴露的問題以及應(yīng)用場景的各自特點, 區(qū)塊鏈應(yīng)用通常對基本功能進行改進以符合其需求. 例如, 為了改進出塊性能, BitShares[2]在共識機制方面采用授權(quán)股份證明(Delegated Proof of Stake, DPoS)[3]代替比特幣的工作量證明(Proof of Work, PoW). 為了解決數(shù)據(jù)膨脹危機, 在鏈形態(tài)上, Lisk采用主側(cè)鏈加DApp(Decentralized Application)機制代替比特幣的單一主鏈[4]. 而以太坊(Ethereum)則將比特幣的腳本機制發(fā)展為圖靈完備的智能合約, 允許開發(fā)者編寫和發(fā)布可以運行在以太坊虛擬機之上的分布式智能合約程序[5].
無論是基本功能, 還是衍生功能, 具體到它們的編程實現(xiàn), 目前主流的編程語言均可以勝任. 在動手搭建自己的區(qū)塊鏈應(yīng)用之前, 有必要對目前的相關(guān)開源項目進行一番審視, 從而針對具體的應(yīng)用場景, 選擇合適的編程語言及區(qū)塊鏈入門項目. 本文對較知名的12個開源區(qū)塊鏈項目進行源碼統(tǒng)計, 并根據(jù)相關(guān)源碼與文檔, 分析其開發(fā)語言的構(gòu)成. 同時, 結(jié)合各項目的體量與熱度, 給出選型建議.
通常去中心化的區(qū)塊鏈應(yīng)用會相應(yīng)地開放源碼.本文采用以下標準:
① 已公開發(fā)布的開源競爭幣, 包括: 比特幣(Bitcoin[6])、以太坊(Ethereum[7])、比特股(BitShares[8])、NXT[9]及LISK[10];
②某些項目將相對獨立的功能集合分拆為獨立的git工程, 例如: Lisk項目下的LiskHQ/lisk和LiskHQ/lisk-ui、LiskHQ/lisk-cli. 相應(yīng)地對每個項目建立一個父目錄blockchain以容納多個git工程的代碼(見圖1).針對特定行業(yè)或領(lǐng)域的開源區(qū)塊鏈代表, 包括: 超級賬本(HyperLedger[11], 智能合約)、公證通(Factom[12], 公證防偽)、IPFS[13](分布式文件)、比特信(BitMessage[14],社交通訊)、OpenBazaar[15](電子商務(wù))、Storj[16](文件存儲)以及RSCoin[17](中心化數(shù)字貨幣).
2.1 源代碼獲取
上述入選項目都采用了github作為代碼倉庫, 在本地安裝一個git客戶端, 通過命令行即可將代碼clone到本地文件目錄以進行分析:
例: git clone git@github.com:bitcoin/bitcoin.git有兩種情況必須加以考慮:
① 同一項目存在多種編程語言實現(xiàn)的, 例如: 比特幣、以太坊等, 選取star數(shù)最高的語言實現(xiàn)納入統(tǒng)計.
圖1 獲取源碼后的目錄結(jié)構(gòu)
2.2 代碼分類統(tǒng)計
CLOC(Count Lines of Code)是一款開源的跨平臺代碼統(tǒng)計工具, 可以在終端下以命令行方式在線下載安裝.
2.2.1 初步統(tǒng)計
在終端下進入blockchainlisk目錄, 使用cloc默認命令: “cloc .”, 結(jié)果如圖2所示.
圖2 初步統(tǒng)計lisk源碼的結(jié)果
2.2.2 可疑的JSON
顯然, 占據(jù)榜首的JSON很可能不是源代碼, 進一步使用命令: “cloc . --by-file --include-lang=JSON”單獨對JSON文件進行統(tǒng)計, 結(jié)果如圖3所示.
圖3 單獨統(tǒng)計lisk中JSON文件所得結(jié)果
通過閱讀官方文檔, 可以獲知genesisBlock.json是用于創(chuàng)建預(yù)挖礦創(chuàng)世區(qū)塊的定義文件, 應(yīng)該排除出源碼統(tǒng)計.
類似地, 應(yīng)該排除其它項目中用于本地化顯示的以及以太坊中用于測試用例的JSON文件. 另外比特信使用了39227行TypeScript作為本地化文件, 也在排除之列.
Cloc提供了過濾參數(shù)“--exclude-lang=”用于排除指定類別語言. 我們使用“--exclude-lang=JSON, TypeScript”可以達到上述目的.
2.2.3 項目體量
應(yīng)用上述命令, 首先針對每個項目統(tǒng)計代碼, 然后用“cloc --sum-reports”合并統(tǒng)計, 結(jié)果1如圖4.
圖4 合并統(tǒng)計所得結(jié)果
代碼行數(shù)反映項目體量. 從圖4中可以發(fā)現(xiàn), 同樣定位為智能合約平臺的競爭幣, Lisk的體量尚不及以太坊(Ethereum)的十分之一. 如果希望完整學(xué)習(xí)及理解一款區(qū)塊鏈平臺, Lisk將會是更好的選擇.
2.2.4 項目熱度
托管平臺上項目的star數(shù)及fork數(shù)可體現(xiàn)該項目受關(guān)注的熱度. 根據(jù)從github及bitbucket上所獲取的數(shù)據(jù), 可得到如圖5所示的各項目的star數(shù)及fork數(shù)情況.
圖5中, 除NXT的數(shù)據(jù)來源于bitbucket外, 其他項目的數(shù)據(jù)均來自github. 并且由于bitcoin的star數(shù)與fork數(shù)分別為9839與6564, 遠大于其余11個項目的, 故圖5未顯示bitcoin的情況. 同樣以Lisk和以太坊做對比說明: 以太坊的受關(guān)注熱度是Lisk的約20倍. 因此如果不是想自己另起爐灶, 而是融入主流生態(tài), 現(xiàn)階段融入以太坊的生態(tài)才是更合理的選擇.
圖5 各項目的star數(shù)及fork數(shù)對比
2.2.5 語言熱度
對于上述12個項目, 分析對比它們對編程語言的選擇, 對區(qū)塊鏈開發(fā)者在技術(shù)選型上也會有所幫助.我們單獨審視各個項目, 并對編程語言進行投票, 投票規(guī)則如下: 如果該項目使用某種語言的代碼量超過其總代碼量的1/10, 那么此項目投了該語言一票.
根據(jù)上述投票規(guī)則, 得到的統(tǒng)計結(jié)果如圖6所示.圖中各語言得票情況的對比正好符合一個趨勢: 近年來腳本語言的興起, 已經(jīng)在越來越多的領(lǐng)域代替?zhèn)鹘y(tǒng)的編程語言.
圖6 各編程語言得票情況
具體到本文考察的開源區(qū)塊鏈項目, 就主要開發(fā)語言的選擇上, bitcoin和bitshares采用了C++, NXT采用Java, 而其他項目均采用腳本語言或兼具了腳本語言優(yōu)點的Go語言作為主開發(fā)語言.
在前端界面, javascript占據(jù)著主導(dǎo)地位. 且Lisk和Storj采用了Nodejs實現(xiàn), 故在前后端均采用javascript, 而其他采用javascript的項目均將其用于前端或客戶端.
而在后端, 腳本語言又常常通過擴展機制借助C語言實現(xiàn)性能卓越的加密/解密以及簽名這樣的基礎(chǔ)功能. 比如, Lisk引用了用C語言實現(xiàn)的ed25519密鑰對生成模塊, 同樣地, 其所引用的用于加密/解密, 簽名/驗證的crypto模塊是對C語言實現(xiàn)的OpenSSL的封裝.
盡管對比特幣試驗本身褒貶不一, 但比特幣通過結(jié)合數(shù)學(xué)原理與網(wǎng)絡(luò)共識, 成功建立和生長出的試驗網(wǎng)絡(luò)給人們帶來了新的認知, 即構(gòu)建去中心化的信任是可行的.
針對比特幣的不足并結(jié)合具體的應(yīng)用場景, 形形色色的區(qū)塊鏈應(yīng)用正不斷涌現(xiàn). 從Lisk那樣的小型團隊到超級賬本那樣的大型團隊, 無論是普通程序員還是行業(yè)巨頭, 都對區(qū)塊鏈表現(xiàn)出了濃厚的興趣, 并切身地參與其中. 而面對如此眾多, 各具特點的開源項目, 選擇適合自己的項目就顯得不太容易了. 本文從分析各個項目所采用的編程語言的組成入手, 直觀地展示項目的體量、關(guān)注度并關(guān)注開發(fā)人員對各種編程語言的結(jié)合使用.
相比較傳統(tǒng)形態(tài)的應(yīng)用, 區(qū)塊鏈仍未形成系統(tǒng)性的軟件生態(tài). 未來也許會出現(xiàn)主導(dǎo)行業(yè)的規(guī)約或者架構(gòu). 但現(xiàn)階段各類應(yīng)用仍處于演化過程中. 故在選型開源項目之前, 區(qū)塊鏈開發(fā)者需要審視如下問題.
自行維護主鏈生態(tài), 還是開發(fā)寄生在其他主鏈生態(tài)上的應(yīng)用, 前者開發(fā)難度較大, 而后者只需要理解DApp(Decentralized Application)或智能合約的編程思想; 開發(fā)一個同樣的區(qū)塊鏈平臺, 如Lisk, 還是針對特定行業(yè)的區(qū)塊鏈應(yīng)用, 如Storj, 雖然都主要采用腳本語言來實現(xiàn), 但后者需要的代碼體量可能會少很多;選擇編譯型語言, 還是解釋型語言來開發(fā)區(qū)塊鏈項目,也需要對開發(fā)效率、運行效率、平臺適應(yīng)性及應(yīng)用場景等多種因素進行綜合考量.
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