區(qū)塊鏈技術(shù)中的各種底層技術(shù)介紹
一、區(qū)塊鏈技術(shù)
1.什么是區(qū)塊鏈?
去中心化的、分布式的、區(qū)塊化存儲(chǔ)的數(shù)據(jù)庫(kù)
存儲(chǔ)全部賬戶余額及交易流水的總賬本
每個(gè)節(jié)點(diǎn)有完整的賬本數(shù)據(jù)
賬本數(shù)據(jù)記錄了全部的歷史交易數(shù)據(jù)
交易數(shù)據(jù)存儲(chǔ)在區(qū)塊上
每個(gè)區(qū)塊包含前一區(qū)塊ID及HASH,形成鏈
2.區(qū)塊鏈基本原理
如果把區(qū)塊鏈作為一個(gè)狀態(tài)機(jī),則每次交易就是試圖改變一次狀態(tài),而每次共識(shí)生成的區(qū)塊,就是參與者對(duì)于區(qū)塊中所有交易內(nèi)容導(dǎo)致狀態(tài)改變的結(jié)果進(jìn)行確認(rèn)。
交易(Transaction):一次操作,導(dǎo)致賬本狀態(tài)的一次改變,如添加一條記錄
區(qū)塊(Block):記錄一段時(shí)間內(nèi)發(fā)生的交易和狀態(tài)結(jié)果,是對(duì)當(dāng)前賬本狀態(tài)的一次共識(shí)
鏈(Chain):由一個(gè)個(gè)區(qū)塊按照發(fā)生順序串聯(lián)而成,是整個(gè)狀態(tài)變化的日志記錄。
3.區(qū)塊鏈要解決的問題
如何去中心化地共享數(shù)據(jù)?
如何確保賬戶不被冒用?
如何確保賬戶余額足夠?
如何確保交易記錄不被篡改?
誰(shuí)負(fù)責(zé)記賬?
怎么保障記賬者的可信?
怎么保障記賬者的積極性?
4.區(qū)塊鏈特性
去中心化
開放性(沒有限制,開源,數(shù)據(jù)公開)
去信任(僅信任機(jī)器)
自治性,集體維護(hù)
可靠的數(shù)據(jù)庫(kù)(不可更改,永遠(yuǎn)可訪問)
匿名性,隱私保護(hù)
5.核心技術(shù)
P2P網(wǎng)絡(luò)、數(shù)字簽名、區(qū)塊化數(shù)據(jù)庫(kù),競(jìng)爭(zhēng)記賬權(quán)、共識(shí)算法、交易回溯。
二、P2P網(wǎng)絡(luò)及通信技術(shù)(分布式計(jì)算網(wǎng)絡(luò))
1.自動(dòng)發(fā)現(xiàn)
通過種子文件,獲取初始節(jié)點(diǎn)(地址及端口)
連接初始節(jié)點(diǎn),獲取初始節(jié)點(diǎn)知道的Peer
把自己的地址及端口廣播給各個(gè)Peer
接收各個(gè)Peer廣播的地址信息,構(gòu)建出網(wǎng)絡(luò)的全貌或片段
2. 技術(shù)領(lǐng)域
分布式存儲(chǔ)、分布式計(jì)算、分布式協(xié)同
組播
流媒體
搜索引擎
3.通信協(xié)議
napster 、Gnutella、eDonkey、 Bittorrent(文件分發(fā)協(xié)議)
XMPP、Jabber(即時(shí)通信協(xié)議)
Paxos 、Gossip(分布式系統(tǒng)狀態(tài)同步協(xié)議)
JXTA
4.使用HASH算法及非對(duì)稱加密及簽名技術(shù)
每個(gè)節(jié)點(diǎn)、每個(gè)人有唯一的一對(duì)公鑰及私鑰
公鑰同時(shí)也是每個(gè)節(jié)點(diǎn)、個(gè)人的地址和賬號(hào)
私鑰是證明”我就是我“的唯一手段
HASH算法對(duì)數(shù)據(jù)進(jìn)行規(guī)整
5.算法
RSA、Elgamal、D-H、ECC
SHA256、 RIMPED160
6.通常使用橢圓曲線算法生成密鑰對(duì)
比特幣密鑰長(zhǎng)度:256位
公鑰哈希值=RIMPED160(SHA256(公鑰))
比特幣地址=1+Base58(0+公鑰哈希值+校驗(yàn)碼)
校驗(yàn)碼=前四字節(jié)(SHA256(SHA256(0+公鑰哈希值)))
7. 加密
發(fā)送方使用接收方的公鑰加密數(shù)據(jù)
接收方使用本方的私鑰解密數(shù)據(jù)
通常使用本方面交換對(duì)稱加密的Key
8.簽名
發(fā)送方使用HASH算法計(jì)算數(shù)據(jù)的HASH值
發(fā)送方使用本方的私鑰加密HASH值,得到簽名
接收方使用HASH算法計(jì)算數(shù)據(jù)的HASH值
接收方使用發(fā)送方的公鑰解密簽名得到發(fā)送的HASH值
比較兩個(gè)HASH值的一致性
9.參考
ElGamal算法,是一種較為常見的加密算法,它是基于1984年提出的公鑰密碼體制和橢圓曲線加密體系。既能用于數(shù)據(jù)加密也能用于數(shù)字簽名,其安全性依賴于計(jì)算有限域上離散對(duì)數(shù)這一難題。在加密過程中,生成的密文長(zhǎng)度是明文的兩倍,且每次加密后都會(huì)在密文中生成一個(gè)隨機(jī)數(shù)K,在密碼中主要應(yīng)用離散對(duì)數(shù)問題的幾個(gè)性質(zhì):求解離散對(duì)數(shù)(可能)是困難的,而其逆運(yùn)算指數(shù)運(yùn)算可以應(yīng)用平方-乘的方法有效地計(jì)算。也就是說(shuō),在適當(dāng)?shù)娜篏中,指數(shù)函數(shù)是單向函數(shù)。
橢圓曲線密碼體制是目前已知的公鑰體制中,對(duì)每比特所提供加密強(qiáng)度最高的一種體制。解橢圓曲線上的離散對(duì)數(shù)問題的最好算法是Pollard rho方法,其時(shí)間復(fù)雜度為,是完全指數(shù)階的。其中n為等式(2)中m的二進(jìn)制表示的位數(shù)。當(dāng)n=234, 約為2117,需要1.6×1023 MIPS 年的時(shí)間。而我們熟知的RSA所利用的是大整數(shù)分解的困難問題,目前對(duì)于一般情況下的因數(shù)分解的最好算法的時(shí)間復(fù)雜度是子指數(shù)階的,當(dāng)n=2048時(shí),需要2x1020MIPS年的時(shí)間。也就是說(shuō)當(dāng)RSA的密鑰使用2048位時(shí),ECC的密鑰使用234位所獲得的安全強(qiáng)度還高出許多。它們之間的密鑰長(zhǎng)度卻相差達(dá)9倍,當(dāng)ECC的密鑰更大時(shí)它們之間差距將更大。更ECC密鑰短的優(yōu)點(diǎn)是非常明顯的,隨加密強(qiáng)度的提高,密鑰長(zhǎng)度變化不大。
DH Diffie-Hellman算法(D-H算法),密鑰一致協(xié)議,是由公開密鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡(jiǎn)單的說(shuō)就是允許兩名用戶在公開媒體上交換信息以生成”一致”的、可以共享的密鑰。換句話說(shuō),就是由甲方產(chǎn)出一對(duì)密鑰(公鑰、私鑰),乙方依照甲方公鑰產(chǎn)生乙方密鑰對(duì)(公鑰、私鑰)。以此為基線,作為數(shù)據(jù)傳輸保密基礎(chǔ),同時(shí)雙方使用同一種對(duì)稱加密算法構(gòu)建本地密鑰(SecretKey)對(duì)數(shù)據(jù)加密。這樣,在互通了本地密鑰(SecretKey)算法后,甲乙雙方公開自己的公鑰,使用對(duì)方的公鑰和剛才產(chǎn)生的私鑰加密數(shù)據(jù),同時(shí)可以使用對(duì)方的公鑰和自己的私鑰對(duì)數(shù)據(jù)解密。不單單是甲乙雙方兩方,可以擴(kuò)展為多方共享數(shù)據(jù)通訊,這樣就完成了網(wǎng)絡(luò)交互數(shù)據(jù)的安全通訊!該算法源于中國(guó)的同余定理——中國(guó)馀數(shù)定理。
三、區(qū)塊鏈化數(shù)據(jù)庫(kù)
1.典型特征
去中心化的、分布式的、區(qū)塊化存儲(chǔ)的數(shù)據(jù)庫(kù)
區(qū)塊(Header + Body)
鏈
隨機(jī)數(shù)
時(shí)間戳
包含父區(qū)塊創(chuàng)建之后、本區(qū)塊創(chuàng)建之前的全部交易;
滿足某個(gè)條件的區(qū)塊HASH;
a) SHA256(SHA256(version + prev_hash + merkle_root + nTIme + nbits + x )) 《 TARGET
b) Target值由動(dòng)態(tài)的難度系數(shù)確定,Target越小,難度越高;
2. 參考
默克爾樹是一種二叉樹,由一組葉節(jié)點(diǎn)、一組中間節(jié)點(diǎn)和一個(gè)根節(jié)點(diǎn)構(gòu)成。最下面的大量的葉節(jié)點(diǎn)包含基礎(chǔ)數(shù)據(jù),每個(gè)中間節(jié)點(diǎn)是它的兩個(gè)子節(jié)點(diǎn)的哈希,根節(jié)點(diǎn)也是由它的兩個(gè)子節(jié)點(diǎn)的哈希,代表了默克爾樹的頂部。默克爾樹的目的是允許區(qū)塊的數(shù)據(jù)可以零散地傳送:節(jié)點(diǎn)可以從一個(gè)源下載區(qū)塊頭,從另外的源下載與其有關(guān)的樹的其它部分,而依然能夠確認(rèn)所有的數(shù)據(jù)都是正確的。
默克爾樹協(xié)議對(duì)比特幣的長(zhǎng)期持續(xù)性可以說(shuō)是至關(guān)重要的。在2014年4月,比特幣網(wǎng)絡(luò)中的一個(gè)全節(jié)點(diǎn)-存儲(chǔ)和處理所有區(qū)塊的全部數(shù)據(jù)的節(jié)點(diǎn)-需要占用15GB的內(nèi)存空間,而且還以每個(gè)月超過1GB的速度增長(zhǎng)。簡(jiǎn)化支付確認(rèn)(SPV)協(xié)議允許另一種節(jié)點(diǎn)存在,這樣的節(jié)點(diǎn)被成為“輕節(jié)點(diǎn)”,它下載區(qū)塊頭,使用區(qū)塊頭確認(rèn)工作量證明,然后只下載與其交易相關(guān)的默克爾樹“分支”。這使得輕節(jié)點(diǎn)只要下載整個(gè)區(qū)塊鏈的一小部分,就可以安全地確定任何一筆比特幣交易的狀態(tài)和賬戶的當(dāng)前余額。
四、記賬權(quán)競(jìng)爭(zhēng)及獎(jiǎng)勵(lì)制度(挖礦)
1.概述
為防止可預(yù)期的記賬節(jié)點(diǎn)被控制或攻擊,導(dǎo)致錯(cuò)誤記賬行為,區(qū)塊鏈技術(shù)采用競(jìng)爭(zhēng)記賬權(quán)的做法:
任何一個(gè)節(jié)點(diǎn)均可以參與記賬,因而記賬節(jié)點(diǎn)無(wú)法預(yù)期,也就不容易被控
競(jìng)爭(zhēng)的過程就是看誰(shuí)最先計(jì)算出滿足條件的HASH值
每次計(jì)算必須以最后1個(gè)有效的區(qū)塊為起點(diǎn),必須消耗大量的計(jì)算機(jī)CPU,增加偽造記賬數(shù)據(jù)的成本
計(jì)算的結(jié)果必須得到大部分節(jié)點(diǎn)的認(rèn)可(共識(shí)算法),才會(huì)成為新的區(qū)塊。實(shí)際算法中,如果該區(qū)塊位于最長(zhǎng)的區(qū)塊鏈上,則為正式被認(rèn)可的區(qū)塊,也即大部分節(jié)點(diǎn)認(rèn)可計(jì)算結(jié)果,并愿意在該結(jié)果下繼續(xù)計(jì)算
這個(gè)過程被稱為挖礦,或工作量證明(POW)。參與挖礦的節(jié)點(diǎn)稱為礦工,協(xié)同挖礦的礦工聯(lián)合體稱為礦池
a ) 以前1區(qū)塊為起點(diǎn),計(jì)算滿足條件的HASH值;
b ) 將計(jì)算的結(jié)果廣播給其他節(jié)點(diǎn);
c ) 其他節(jié)點(diǎn)驗(yàn)證計(jì)算結(jié)果無(wú)誤時(shí),認(rèn)可該結(jié)果,并以該結(jié)果為起點(diǎn)重新進(jìn)行計(jì)算;
d ) 單位時(shí)間內(nèi)達(dá)到共識(shí)認(rèn)可要求時(shí),該區(qū)塊成為正式認(rèn)可的區(qū)塊。
這個(gè)過程被稱系統(tǒng)為鼓勵(lì)挖礦的積極性,給予競(jìng)爭(zhēng)成功的記賬節(jié)點(diǎn)獎(jiǎng)勵(lì)
a ) 給予每個(gè)區(qū)塊挖礦者直接的“現(xiàn)金”獎(jiǎng)勵(lì)。例如,比特幣網(wǎng)絡(luò)給予25個(gè)比特幣,以太坊給予5個(gè)以太幣;
b ) 以太坊:納入該區(qū)塊的交易的手續(xù)費(fèi),由發(fā)起節(jié)點(diǎn)和記賬節(jié)點(diǎn)分成(發(fā)起75%,記賬25%)。
2. 參考
比特幣使用的SHA256算法,會(huì)有2^256種輸出,如果我們進(jìn)行2^256+1次輸入,那么必然會(huì)產(chǎn)生一次碰撞;甚至從概率的角度看,進(jìn)行2^130次輸入就會(huì)有99%的可能發(fā)生一次碰撞。不過我們可以計(jì)算一下,假設(shè)一臺(tái)計(jì)算機(jī)以每秒10000次的速度進(jìn)行哈希運(yùn)算,要經(jīng)過10^27年才能完成2^128次哈希!這時(shí)要考慮一種情況:如果同時(shí)有兩個(gè)礦工各自得到一個(gè)正確答案,并各自生成了一個(gè)區(qū)塊廣播出去會(huì)發(fā)生什么呢?這時(shí)候在區(qū)塊鏈上同一個(gè)位置就有了兩個(gè)區(qū)塊,所謂的“分叉”就出現(xiàn)了。分叉是絕對(duì)不允許的,所以當(dāng)?shù)V工發(fā)現(xiàn)區(qū)塊鏈分叉之后,會(huì)選擇最長(zhǎng)的一條繼續(xù)計(jì)算,短的那條區(qū)塊鏈會(huì)被丟棄。這里的長(zhǎng)短,不是簡(jiǎn)單意義上的長(zhǎng)短,而是工作量證明合計(jì)值最大的那個(gè)鏈。