區(qū)塊鏈(BlockChain),是區(qū)塊(Block)和鏈(Chain)的直譯,其數(shù)據(jù)結(jié)構(gòu)如圖1所示,即每個(gè)區(qū)塊保存規(guī)定時(shí)間段內(nèi)的數(shù)據(jù)記錄,并通過密碼學(xué)的方式,構(gòu)建一條安全可信的鏈條,形成一個(gè)不可篡改、全員共有的分布式賬本。比特幣的區(qū)塊分為區(qū)塊頭和區(qū)塊體兩部分。區(qū)塊頭的大小為80字節(jié),包括4字節(jié)的版本號(hào)、32字節(jié)(256位)的上一區(qū)塊哈希值、32字節(jié)的Merkle根節(jié)點(diǎn)、4字節(jié)的時(shí)間戳、4字節(jié)的難度值和4字節(jié)的隨機(jī)數(shù)。區(qū)塊體包含10分鐘內(nèi)選定的交易記錄,第一筆交易(coinbase交易)是用于獎(jiǎng)勵(lì)礦工比特幣的特殊交易,由礦工自己添加進(jìn)區(qū)塊。

基本概念
區(qū)塊鏈?zhǔn)呛芏喱F(xiàn)有技術(shù)交叉融合在一起的集成創(chuàng)新。因此,要了解區(qū)塊鏈,首先要了解區(qū)塊鏈到底集成了哪些技術(shù)。
【P2P網(wǎng)絡(luò)】
如圖2所示,P2P(Peer-to-Peer)網(wǎng)絡(luò)是一種端到端的網(wǎng)絡(luò)。P2P網(wǎng)絡(luò)分為結(jié)構(gòu)化(例如基于Chord的P2P網(wǎng)絡(luò))和非結(jié)構(gòu)化的P2P網(wǎng)絡(luò)(例如Gnutella)。比特幣的區(qū)塊鏈采用的是非結(jié)構(gòu)化P2P網(wǎng)絡(luò),整個(gè)網(wǎng)絡(luò)沒有中心化的硬件或管理機(jī)構(gòu),任一節(jié)點(diǎn)既是服務(wù)端,也是客戶端。任何節(jié)點(diǎn)只要安裝相應(yīng)的客戶端軟件,就能接入P2P網(wǎng)絡(luò)(例如BT軟件),參與區(qū)塊鏈的記錄和驗(yàn)證,不超過1/3節(jié)點(diǎn)的損壞、退出甚至被植入惡意代碼,都不會(huì)影響整個(gè)系統(tǒng)的運(yùn)作。

【加密算法和數(shù)字簽名】
加密技術(shù)分為對(duì)稱、非對(duì)稱和哈希(Hash)加密。對(duì)稱加密是指用同樣的密鑰來進(jìn)行加密和解密,非對(duì)稱加密是指用一個(gè)密鑰對(duì)來進(jìn)行加密和解密,哈希加密主要是通過對(duì)數(shù)據(jù)進(jìn)行哈希運(yùn)算,用固定的哈希結(jié)果值驗(yàn)證信息是否被篡改。
非對(duì)稱加密
在非對(duì)稱加密技術(shù)中,對(duì)外公開、分發(fā)出去的密鑰叫做公鑰,不能公開、自己留存的密鑰叫做私鑰。公鑰加密的,對(duì)應(yīng)的私鑰才能解密。反之亦然。如圖3所示。

非對(duì)稱加密算法有RSA、DSA和ECC等種類,區(qū)塊鏈?zhǔn)褂玫氖腔跈E圓曲線加密技術(shù)的數(shù)字簽名(ECDSA),具體實(shí)現(xiàn)是secp256k1。ECDSA相當(dāng)于是DSA和非對(duì)稱加密ECC的結(jié)合。相比RSA算法,ECDSA具有計(jì)算量小、存儲(chǔ)空間小、帶寬要求低等特點(diǎn)。
字簽名
基于數(shù)字簽名的通信機(jī)制工作原理,如圖4所示,發(fā)送報(bào)文時(shí),發(fā)送方用一個(gè)哈希函數(shù)從報(bào)文文本中生成文件摘要,然后用自己的私鑰對(duì)摘要進(jìn)行加密,加密后的摘要將作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給接收方。接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文摘要,接著再用發(fā)送方的公鑰來對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,如果得到的明文相同,那么接收方就能確認(rèn)傳輸?shù)奈募⑽词艿酱鄹?,是安全可信的?/p>

哈希加密
安全哈希算法(Secure Hash Algorithm,SHA)是由美國國家安全局研發(fā),由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的一系列密碼哈希函數(shù),包括SHA-0、SHA-1、SHA-2和SHA-3等系列。比特幣的區(qū)塊鏈?zhǔn)褂玫氖荢HA-256哈希加密算法,于2001年發(fā)布,屬于SHA-2分支。由于SHA256偽隨機(jī)性的特點(diǎn),只要是相同的數(shù)據(jù)輸入,一定會(huì)得到相同的結(jié)果,如果輸入數(shù)據(jù)稍有變化,將得到一個(gè)千差萬別的結(jié)果,如圖5所示。SHA256還是一個(gè)單向不可逆的算法,即根據(jù)一個(gè)輸入數(shù)算SHA256的結(jié)果很容易,但根據(jù)SHA256的結(jié)果反算輸入數(shù)幾乎是不可能。除此之外,比特幣還使用ripemd160算法來生成比特幣錢包的地址。

【梅克爾樹】
梅克爾(Merkle)樹是區(qū)塊鏈的基本組成部分。如果沒有梅克爾樹,區(qū)塊鏈也是可以運(yùn)轉(zhuǎn),但是要在區(qū)塊頭里包含所有交易記錄,擴(kuò)展性方面存在很大挑戰(zhàn)。如圖6所示,區(qū)塊鏈中的每個(gè)區(qū)塊,由區(qū)塊頭和區(qū)塊體構(gòu)成,區(qū)塊頭中含有一個(gè)Merkle根節(jié)點(diǎn)的字段,通過對(duì)區(qū)塊體中所有交易記錄,以二叉樹的形式迭代地兩兩拼接 、進(jìn)行哈希操作,可以得到一個(gè)最終的哈希值,我們稱之為Merkle根哈希。Merkle根哈希相當(dāng)于是對(duì)區(qū)塊中所有交易記錄進(jìn)行了一個(gè)快照,區(qū)塊中交易記錄的任意改動(dòng)都可以通過比較Merkle根哈希而很容易地察覺。Merkle根哈希主要用于簡單支付驗(yàn)證(SPV),在驗(yàn)證某個(gè)交易是否在區(qū)塊中時(shí),也能極大地減少網(wǎng)絡(luò)傳輸成本。

【工作量證明機(jī)制】
工作量證明機(jī)制,簡單地說,就是一種共識(shí)機(jī)制,用來確認(rèn)你是否做過一定量工作的證明。比特幣的區(qū)塊鏈主要是依托計(jì)算數(shù)學(xué)難題來衡量工作量。每個(gè)區(qū)塊,當(dāng)選定一定數(shù)量的交易記錄之后,填充版本號(hào)、時(shí)間戳、難度值,生成相應(yīng)的Merkle根哈希。很容易看到,這些數(shù)值在選定交易記錄以后,都是確定的,唯一能夠改變的就只有隨機(jī)數(shù)(Nonce)這個(gè)值。如圖7所示,系統(tǒng)根據(jù)難度值,要求計(jì)算整個(gè)區(qū)塊頭的兩次SHA256算法,得到的哈希結(jié)果要小于一個(gè)閾值。根據(jù)前面描述的SHA256算法的偽隨機(jī)性,只有通過不斷地嘗試和枚舉,才能找到相應(yīng)的隨機(jī)數(shù),證明自己的工作量。

除了工作量證明機(jī)制(PoW)這類共識(shí)機(jī)制之外,還有股權(quán)證明機(jī)制(PoS)、授權(quán)股權(quán)證明機(jī)制(DPoS)、拜占庭容錯(cuò)機(jī)制(BFT)、實(shí)用拜占庭容錯(cuò)機(jī)制(PBFT)這些在不可信環(huán)境下的共識(shí)機(jī)制以及要求在可信環(huán)境下的共識(shí)機(jī)制,例如PaxOS和Raft。表1是做了簡單的對(duì)比。

運(yùn)行機(jī)制
【接入網(wǎng)絡(luò)和驗(yàn)證】
節(jié)點(diǎn)通過安裝相應(yīng)的軟件(例如比特幣核心),接入?yún)^(qū)塊鏈。節(jié)點(diǎn)啟動(dòng)以后,主要是在P2P網(wǎng)絡(luò)上發(fā)現(xiàn)鄰居節(jié)點(diǎn)、鏈接鄰居節(jié)點(diǎn)、傳遞P2P消息和下載區(qū)塊鏈驗(yàn)證。節(jié)點(diǎn)可以選擇下載全量的區(qū)塊鏈進(jìn)行驗(yàn)證,或者是只下載區(qū)塊頭,通過Merkle樹節(jié)點(diǎn)來進(jìn)行簡單支付驗(yàn)證(SPV)。
錢包軟件可以分為移動(dòng)錢包、桌面錢包、互聯(lián)網(wǎng)錢包和紙錢包,都支持保存用戶的私鑰,錢包也可以根據(jù)私鑰是否是種子產(chǎn)生的,而分為決定性錢包和非決定性錢包,關(guān)鍵區(qū)別在于私鑰的備份和易恢復(fù)性。
【區(qū)塊鏈的存儲(chǔ)和接受】
比特幣的區(qū)塊鏈?zhǔn)褂肂erkeley DB(文件數(shù)據(jù)庫)作為錢包數(shù)據(jù)庫,使用LevelDB(鍵值數(shù)據(jù)庫)存儲(chǔ)區(qū)塊的索引和UTXO(Unspent Transaction Output,未開銷的比特幣交易輸出)。節(jié)點(diǎn)在啟動(dòng)的時(shí)候,將整個(gè)區(qū)塊鏈的索引從LevelDB加載入內(nèi)存。當(dāng)收到一個(gè)新區(qū)塊時(shí),節(jié)點(diǎn)對(duì)新區(qū)塊中的所有交易進(jìn)行檢測,驗(yàn)證交易格式、交易大小、交易簽名、UTXO是否匹配、交易簽名、腳本合規(guī)等方面。
如果驗(yàn)證成功,檢查上一區(qū)塊頭與鏈頭區(qū)塊哈希值是否一致,如果是一致,則更新UTXO數(shù)據(jù)庫和回滾交易數(shù)據(jù)庫,如果不是,則將該區(qū)塊放在孤兒區(qū)塊池中 。當(dāng)節(jié)點(diǎn)發(fā)現(xiàn)網(wǎng)絡(luò)中存在另一條更長的區(qū)塊鏈時(shí),就需要斷開現(xiàn)有的區(qū)塊并對(duì)區(qū)塊鏈進(jìn)行重組。如果驗(yàn)證不成功,會(huì)拋棄該區(qū)塊,繼續(xù)等待新區(qū)塊的到來(礦工會(huì)繼續(xù)計(jì)算新區(qū)塊的數(shù)學(xué)難題)。
【區(qū)塊鏈的工作量證明計(jì)算機(jī)制】
“礦工”角色的節(jié)點(diǎn)一直收集網(wǎng)絡(luò)中廣播的交易記錄,并致力于計(jì)算新區(qū)塊的數(shù)學(xué)難題,即工作量證明。如果其他節(jié)點(diǎn)發(fā)來的新區(qū)塊驗(yàn)證成功,節(jié)點(diǎn)除了更新UTXO數(shù)據(jù)庫和回滾交易數(shù)據(jù)庫,節(jié)點(diǎn)會(huì)立即開始下一個(gè)新區(qū)塊的計(jì)算。新區(qū)塊的構(gòu)建優(yōu)先選取交易內(nèi)存池中優(yōu)先級(jí)高的交易記錄。優(yōu)先級(jí)的計(jì)算方式為:
如果自己的工作量證明計(jì)算成功,節(jié)點(diǎn)會(huì)第一時(shí)間將這個(gè)區(qū)塊廣播至整個(gè)網(wǎng)絡(luò)中,其他節(jié)點(diǎn)收到該新區(qū)塊,如上所述,會(huì)進(jìn)行相應(yīng)的驗(yàn)證和存儲(chǔ)。
整個(gè)區(qū)塊鏈的運(yùn)轉(zhuǎn)機(jī)制如圖8所示。

其他相關(guān)
【腳本語言】
區(qū)塊鏈采用的腳本語言并不是圖靈完備的語言,不支持循環(huán),只能進(jìn)行堆棧式操作。這種腳本語言的好處是,不允許礦工提交一個(gè)死循環(huán)的腳本,更注重的是安全方面的考量,但其擴(kuò)展能力有限。從以太坊為首的區(qū)塊鏈編程平臺(tái)支持圖靈完備的編程語言,引領(lǐng)區(qū)塊鏈跨入2.0時(shí)代。由于支持循環(huán)等復(fù)雜操作,以太坊用Gas(燃料)機(jī)制來防止死循環(huán)的出現(xiàn),確保系統(tǒng)的安全。
【消息隊(duì)列】
比特幣區(qū)塊鏈采用Zero MQ(ZMQ)作為消息分發(fā)和消息隊(duì)列管理工具。與很多人熟悉的RabbitMQ相比,ZMQ不像傳統(tǒng)意義的消息服務(wù)器,更像一個(gè)底層的網(wǎng)絡(luò)通信庫,在多個(gè)線程、內(nèi)核和主機(jī)盒之間彈性伸縮,在Socket API之上將網(wǎng)絡(luò)通信、進(jìn)程通信和線程通信抽象為統(tǒng)一的API接口。
【挖礦設(shè)備和算法演進(jìn)】
挖礦設(shè)備從支持復(fù)雜指令(CISC)、適合串行計(jì)算的CPU礦機(jī)時(shí)代,經(jīng)由基于眾核體系、適合并行簡單計(jì)算的GPU挖礦和低功耗卻價(jià)格昂貴的FPGA挖礦,逐漸向集約高速的ASIC礦機(jī)和規(guī)模效應(yīng)的礦池演進(jìn)。
基于工作量證明機(jī)制的算法,容易導(dǎo)致礦工算力集中的問題。有人將這種“中心化”的責(zé)任歸咎于SHA256算法。此時(shí),基于SCRYPT算法的萊特幣(Litecoin)進(jìn)入了人們視線,其占用內(nèi)存多、計(jì)算時(shí)間長、并行計(jì)算困難的特點(diǎn),限制了礦工的“軍備競賽”。萊特幣的成功催生了更多算法的交叉融合,衍生出串聯(lián)算法(夸克幣)、并聯(lián)算法(HeavyCoin)和多用途算法(在工作量證明的同時(shí),尋找大素?cái)?shù)的素?cái)?shù)幣,PrimeCoin)。
開源項(xiàng)目和工具
【區(qū)塊鏈的開源項(xiàng)目】
BitCoin
BitCoin是最早、也是現(xiàn)網(wǎng)運(yùn)行區(qū)塊鏈最成功的一個(gè)開源項(xiàng)目,核心技術(shù)框架采用C++開發(fā),共識(shí)算法采用PoW,每秒交易量(TPS)為不多于7筆,開源許可協(xié)議為MIT。
- 官方編程語言:C++
- 開源許可協(xié)議:MIT
- 開源項(xiàng)目地址:https://github.com/bitcoin/bitcoin
Ethereum
以太坊(Ethereum)是一個(gè)支持圖靈完備腳本運(yùn)行的區(qū)塊鏈開發(fā)平臺(tái),基于智能合約,降低用戶搭建DApp應(yīng)用的門檻。目前以太坊正式運(yùn)行的版本是1.0,采用的是POW共識(shí)算法,公網(wǎng)TPS是25筆,未來將采用類POS的Casper算法,區(qū)塊鏈的確認(rèn)速度將得到大幅提升。在規(guī)劃的2.0版本中,TPS有望可以達(dá)到2000TPS。 - 官方編程語言:Go
- 開源許可協(xié)議:GPLv3
- 開源項(xiàng)目地址:https://github.com/ethereum
Hyperledger Fabric
Hyperledger Fabric是IBM開源的區(qū)塊鏈項(xiàng)目,開發(fā)環(huán)境可以適配多種環(huán)境(virtualbox虛擬機(jī)、自建網(wǎng)絡(luò)和IBM的BlueMix),支持Docker,共識(shí)算法插件化,注重角色的權(quán)限控制和企業(yè)級(jí)的安全機(jī)制。主要開發(fā)語言是Go語言,支持JavaScript、Java和Python等語言,交易頻率TPS最高能夠達(dá)到100K。其子項(xiàng)目Iroha助力區(qū)塊鏈移動(dòng)應(yīng)用程序的開發(fā),值得關(guān)注和進(jìn)一步跟蹤。 - 官方編程語言:Go
- 開源許可協(xié)議:Apache 2.0
- 開源項(xiàng)目地址:https://github.com/hyperledger/fabric
官方編程語言:Go
開源許可協(xié)議:Apache 2.0
開源項(xiàng)目地址:https://github.com/hyperledger/fabric
OpenChain
OpenChain 是區(qū)塊鏈技術(shù)公司Coinprism的開源工具,目標(biāo)是大型企業(yè)和金融機(jī)構(gòu),基于一種獨(dú)特的分布式賬本技術(shù),幫助用戶部署自己定制的區(qū)塊鏈,減少用戶的交易成本和結(jié)算時(shí)間。 - 官方編程語言:C#
- 開源許可協(xié)議:Apache 2.0
- 開源項(xiàng)目地址:https://github.com/openchain
BitShares
比特股(BitShares)提供的BitUSD等錨定資產(chǎn),是虛擬幣歷史上的一個(gè)最重要變革之一,消除了虛擬貨幣估值波動(dòng)大的問題。比特股創(chuàng)新地提出了DPoS共識(shí)算法,核心技術(shù)框架采用C++語言開發(fā),既適用于公有鏈,也適合于聯(lián)盟鏈。在比特股2.0中,交易頻率TPS最高能夠達(dá)到100K。 - 官方編程語言:C++
- 開源許可協(xié)議:MIT
- 開源項(xiàng)目地址:http://github.com/bitshares
Ripple
瑞波(Ripple)是世界上第一個(gè)開放的支付網(wǎng)絡(luò),也是目前最成功的區(qū)塊鏈技術(shù)公司。其核心產(chǎn)品Ripple協(xié)議本質(zhì)上是一個(gè)實(shí)時(shí)結(jié)算系統(tǒng),通過引入新的共識(shí)機(jī)制RPCA,只要特殊節(jié)點(diǎn)投票,就能在很短時(shí)間內(nèi)完成交易的驗(yàn)證和確認(rèn)。 - 官方編程語言:C++
- 開源許可協(xié)議:ISC
- 開源項(xiàng)目地址:https://github.com/ripple/rippled
Tendermint
美國公司Tendermint推出的Tendermint是第一個(gè)實(shí)施分片技術(shù)的公共區(qū)塊鏈。Tendermint主核心負(fù)責(zé)管理所有區(qū)塊鏈分區(qū),支持比特幣分區(qū)和以太坊分區(qū),具有很大的靈活性,共識(shí)引擎通過Tendermint套接字協(xié)議(TMSP)與應(yīng)用程序進(jìn)行連接,不依賴于某一特定的編程語言,所以開發(fā)人員可以使用任意一種編程語言來編寫智能合約。 - 官方編程語言:Go
- 開源許可協(xié)議:Apache2.0
- 開源項(xiàng)目地址:https://github.com/tendermint/tendermint
Corda
Corda是R3CEV于2016年12月初開源的區(qū)塊鏈平臺(tái),采用一種類區(qū)塊鏈的分布式賬本,基于產(chǎn)業(yè)標(biāo)準(zhǔn)工具,通過創(chuàng)新智能合約和數(shù)據(jù)處理,為金融服務(wù)設(shè)計(jì)一種新型分布式的分類帳平臺(tái)。 - 官方編程語言:Go
- 開源許可協(xié)議:Apache2.0
- 開源項(xiàng)目地址: https://www.corda.net/
具體對(duì)比圖如表2所示。
表2 開源項(xiàng)目的對(duì)比表
【以太坊的集成開發(fā)環(huán)境(IDE)】
Remix是以太坊官方IDE,它允許開發(fā)者在以太坊區(qū)塊鏈創(chuàng)建和部署合約及去中心化應(yīng)用。它包含一個(gè)Solidity源代碼排錯(cuò)器,Solidity是以太坊開發(fā)的智能合約語言,可以將智能合約代碼編譯成以太坊虛擬機(jī)(EVM)可識(shí)別的字節(jié)碼。此外,如要和以太坊節(jié)點(diǎn)交互,主要用到的Web3.js API;與節(jié)點(diǎn)進(jìn)行底層交互,需要用到JSON RPC API。以太坊主流項(xiàng)目的對(duì)比如表3所示。

總結(jié)
區(qū)塊鏈憑著數(shù)據(jù)公開透明、信息安全可靠、來源可證可溯等諸多特性,降低信任構(gòu)建成本,提高網(wǎng)絡(luò)協(xié)作效率,加速價(jià)值的全球流動(dòng),促進(jìn)下一代信息基礎(chǔ)設(shè)施持續(xù)演進(jìn)。本文著重從區(qū)塊鏈1.0的基本概念、運(yùn)行機(jī)制、相關(guān)技術(shù)和開源項(xiàng)目及工具四個(gè)方面進(jìn)行了簡單的介紹,希望能夠幫助讀者厘清概念、梳理思路和開拓視野,期待讀者針對(duì)各行各業(yè)痛點(diǎn),廣泛應(yīng)用區(qū)塊鏈技術(shù),有效改善商業(yè)規(guī)則,營造“區(qū)塊鏈+”的新浪潮。
文章來自《程序員》1月份月刊,這里僅做學(xué)習(xí)交流用
如有侵權(quán)或其它問題請(qǐng)發(fā)郵件到 xieyu559@163.com ,看到后會(huì)做處理。謝謝!
