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