第4章 密碼學
一。哈希算法/哈希函數
碰撞:兩個不同的消息在同一個哈希函數作用下,具有相同的哈希值。
哈希函數:
(1)抗碰撞性(可做區塊和交易的完整性[是否被篡改]驗證)
(2)不可逆:通過輸入值能夠計算函數值,但知道函數值很難計算輸入值。(哈希函數隱藏了原始消息)
(3)指紋:哈希值作為原始消息的指紋(很難找到碰撞)
(4)固定長度:輸入長度不同,但哈希后的結果長度固定
最小熵:是信息理論中衡量某個結果的一個可預測性指標,用於度量最壞情形下的隨機性。
高最小熵:指的是變量呈平均分布(隨機分布)
區塊鏈中的哈希函數:
(1)MD5和SHA-1:廣泛應用的哈希函數。(均被破解,找到碰撞)
(2)SHA-2一族:SHA-224, SHA-256, SHA-384, SHA-512
(3) SHA-3一族:Keccak算法為官方唯一的標准SHA-3算法
比特幣系統:應用兩個密碼學哈希函數
(1)SHA-256:是構造比特幣區塊鏈所用的密碼學哈希函數,比特幣地址的生成過程也用到了SHA-256
比特幣系統基於尋找給定前綴的SHA-256哈希值,設計了pow的共識機制。
SHA-256算法被認為容易導致硬件礦機和礦池的出現,引發算力集中,違背去中心化原則。
(2)RIPEMD160:主要用於生成比特幣地址
以太坊:
(1)以太坊使用Ethash算法實現工作量證明機制。
(2)以太坊工作量證明基於改進的DaggerHashimoto算法
(3)以太坊的sha3_256, sha3_512哈希不是標准的sha-3算法,而是一種變體,通常稱為Keccak-256和keccak-512
萊特幣:
(1) SCRYPT算法被用來設計萊特幣(Litecoin)的工作量證明機制
(2)SCRYPT算法具有更強的抵御礦機的能力
誇克幣(Quark):應用6種公認的安全哈希算法(BLAKE,BMW,GROESTL,JH,KECCAK,SKEIN)
達世幣(前身暗黑幣):應用了11種哈希算法(BLAKE,BMW,GROESTL,JH,KECCAK,SKEIN,SKEIN,LUFFA,CUBEHASH,SHAVITE,SIMD,ECHO)
二。Merkle樹--默克爾樹,也稱哈希樹
Merkle樹是一類基於哈希指針的樹。利用Merkle樹可快速方便的進行信息完整性驗證。
1。哈希指針:是一種數據結構
它除了指示信息存儲的位置外,帶有這些信息的哈希函數值存儲在一起。使得哈希指針不僅可以檢索信息,也可檢測所指向信息的完整性。
(1)哈希指針 與 哈希指針鏈

注:初始區塊/創世區塊內容不可改變,即使將所有區塊hash值全部修改,到初始區塊也可檢測內容是否具有完整性。
2。Merkle哈希樹:是一類基於哈希指針的二叉樹或多叉樹
Merkle哈希樹其葉子節點上的值通常為數據塊的哈希值;
非葉子節點上的值是該節點的所有子節點的組合結果的哈希值。
驗證數據是否被篡改只需要驗證Merkle樹根即可。
Merkle哈希二叉樹

三。公鑰密碼算法
1。密碼算法簡介
簡化的加密模型:

Ka加密密鑰與Kb解密密鑰是否相等,分為:
(1)對稱加密算法(Ka=Kb):效率高
(2)非對稱加密算法(Ka != Kb,公開密鑰[公鑰]和私有密鑰[私鑰]):效率低
注:由公鑰導出私鑰是困難的。
現實應用:
使用非對稱加密算法為通信雙方傳輸或協商一個會話密鑰,
雙方通過這個密鑰,使用性能更高的對稱加密算法進行通信。
2。公鑰密碼算法
(1)RSA算法:典型,基於大整數因子分解的困難性
(2)DLP問題:離散對數的計算困難性
(3)橢圓曲線公鑰密碼算法:建立在橢圓曲線的點的離散對數的計算困難性問題上
3。區塊鏈中使用的橢圓曲線
(1)比特幣區塊鏈中采用了橢圓曲線公鑰密碼技術:所使用的橢圓曲線為Certicom推薦的secp256k1橢圓曲線
4。數字證書:是一個證書權威機構(CA)對一個實體所擁有的公鑰的認證證書
(1)A 向 B提供公鑰Pk,如何確定B收到的Pk就是A提供的Pk--解決方案(數字證書)
(2)CA是證書的簽發機構,為通信雙方所共同信任。承擔公鑰體系中公鑰合法性檢驗的責任。
(3)大量采用的數字證書格式遵循X.509國際標准
數字證書結構:

四。數字簽名
數字簽名是公鑰密碼體制的一個重要應用模式。
A(發送方):私鑰加密發送的信息形成數字簽名+原始信息 -》B(接收方):使用A公鑰驗證簽名(解密),確認信息確實為A所發送。
(1)數字簽名標准(DSA算法)與ECDSA算法
DSA算法:ElGamal簽名算法變種,其安全性基於離散對數難題
ECDSA算法:DSA算法變種,使用的是橢圓曲線群。
區塊鏈中應用的數字簽名算法是ECDSA算法。
其他的數字簽名方法:
(1)群簽名:
基本思想:一群人中的作何一個人可生成一群簽名(可追蹤簽名者)
(2)環簽名:一種特殊的群簽名
基本思想:從一群人中選擇部分成員構成群,生成一環簽名(完全匿名)
(3)盲簽名:保護所簽署消息的具體內容
基本思想:簽名者對盲化的消息進行簽名,消息擁有者對簽字除去盲因子,得到簽名者關於原消息的簽名。
盲簽名算法,消息內容對簽名者是不可見的,且在簽名被接受者公開后,簽名者不能追蹤簽名。
(4)多重數字簽名:需要多個用戶對同一消息進行簽名和驗證
A。有序多重數字簽名方案
包括:消息發送者,消息簽名者,消息驗證者
由消息發送者規定消息簽名順序,A發送消息(消息簽名)-》B(驗證A簽名,B簽名)-》C......
B。廣播多重數字簽名方案
包括:消息發送者,消息簽名者,消息驗證者,消息收集者
A消息發送者同時將消息+消息簽名 -》B,C(簽名)-》消息收集者(整理)-》簽名驗證者(驗證多重簽名有效性)
五。零知識證明/最小透露的證明
零知識證明:證明者向驗證者證明並使其相信自己知道或擁有某一消息,但證明過程不能向驗證者泄漏任何關於被證明消息的信息。
簡明非交互零知識證明(zkSNARKs)是成功應用於區塊鏈中的零知識證明技術,可在無須泄漏交易數據情況下,向驗證者證明某個交易是合法的。
Zcash使用了zkSNARKs,以太坊和Polkadol也計划采用zkSNARKs.
六。區塊鏈中的隱私問題
區塊鏈目前的隱私保護方案包括:
(1)混幣
通過割裂輸入地址和輸出地址之間的關系實現匿名。
(2)環簽名:簡化的群簽名
允許一個成員代表一組人進行簽名而不泄漏簽名者的信息。
A(私鑰)+B(公鑰)+C(公鑰)+......+N(公鑰)生成簽名(A不需要B,C..允許即可使用其公鑰)
驗證者僅知道簽名來自於這個環,並不知道真正簽名者。
(3)同態加密
對經過同態加密的數據進行處理得到一個輸出,將這一輸出進行解密,其結果與用同一方法處理未加密的原始數據得到的輸出結果是一樣的。
加法同態:如果存在有效算法⊕,E(x+y)=E(x)⊕E(y)或者 x+y=D(E(x)⊕E(y))成立,並且不泄漏 x 和 y。
乘法同態:如果存在有效算法 ,E(x×y)=E(x) E(y)或者 xy=D(E(x) E(y))成立,並且不泄漏 x 和 y。
混合乘法同態:如果存在有效算法 ,E(x×y)=E(x) y 或者 xy=D(E(x) y)成立,並且不泄漏 x。
減法同態:如果存在有效算法○- ,E(x-y)=E(x)○- E(y)或者 x-y=D(E(x)○- E(y))成立,並且不泄漏 x 和 y,則稱 E 為減法同態。
除法同態:如果存在有效算法○/ ,E(x/y)=E(x)○/ E(y)或者 x/y=D(E(x)○/ E(y))成立,並且不泄漏 x 和 y,則稱 E 為除法同態。
代數同態:如果 E 既是加法同態又是乘法同態。
(4)零知識證明
證明者向驗證者證明並使其相信自己知道或擁有某一消息,但證明過程不能向驗證者泄漏任何關於被證明消息的信息。
第5章 共識算法
1。分布式共識算法背景
分布式共識算法是分布式系統中保證系統狀態一致性的重要技術,是分布式文件系統,分布式DB的重要基礎。
(1)兩階段提交與三階段提交
均不能作為一個分布式共識算法,只能在通常情況下保障分布式系統的一致性。
(2)拜占庭將軍問題
定義1:拜占庭缺陷(Byzantine Fault)。任何從不同觀察者角度看表現出不同症狀的缺陷。
定義2:拜占庭故障(Byzantine Failure)。在需要共識的系統中由於拜占庭缺陷導致喪失系統服務。
定義3:宕機缺陷(Fail-Stop Fault)。在需要共識的系統中導致進程停止運行發生的缺陷;該缺陷不對系統產生其他副作用。
定義4:宕機恢復故障(Fail-Recovery Failure)。在需要共識的系統中導致進程停止運行發生的故障;該故障在重啟進程后恢復,不對系統產生其他副作用。
(3)FLP(Fisher-Lynch-Paterson)定理
在一個多進程異步系統中,只要有一個進程不可靠,那么就不存在一個協議,能保證有限時間內使所有進程達成一致。
FLP定理不考慮拜占庭故障,而只是一般的宕機故障。
FLP定理是關於分布式系統的共識問題
FLP定理,在異步通信情況下,不能同時滿足安全性和活性
(4)CAP(Consistency,Availablity,Partition Tolerance)定理
Partition Tolerance:對網絡分隔的容忍
Consistency:一致性
Availablity:可用性
任意一個數據共享系統,最多只能在三個屬性中選擇滿足兩個屬性。
CAP定理主要討論關於原子性數據存儲的一致性及和可用性的關系。
2。強一致性非拜占庭共識算法
假設條件不需要考慮拜占庭故障,而只是處理一般的宕機恢復故障。
3個處理宕機恢復故障的協議:
(1)Viewstamped Replication協議:VR
第一個分布式共識算法,主要用於分布式系統狀態復制服務(主從節點狀態復制)。
異步通信環境的共識協議
(2)Paxos協議
異步通信環境的共識算法,能容忍半數以上的宕機恢復(非拜占庭故障)節點並達成共識。
其他類Paxo共識協議:Raft, Chubby, Zookeeper, etcd...這些共識算法廣泛用於各種分布式系統。
谷歌GFS和BigTable使用Chubby分布式鎖協議
Yahoo的Hadoop系統和OpenStack,Mesos等采用了Zookeeper
kubernetes和CoreOS采用了etcd協議。
超級賬本fabric1.0采用基於Zookeeper的kafka做排序引擎。共識模塊將被設計成可插拔模塊,支持像PBFT, Raft等共識算法。
(3)Raft協議(區塊鏈項目中常見非拜占庭容錯的分布式共識算法)
Raft是一個基於Paxos的共識協議,也是基於狀態機復制的協議。
Raft將共識問題分解為3個相對獨立的子問題:
A。leader選舉 B。記賬 C。安全
3。強一致性拜占庭容錯共識算法
拜占庭容錯(PBFT)共識算法
應用於聯盟鏈和私有鏈(需要保證系統各節點的強一致性,即保證系統各節點按相同順序執行相同命令,形成相同結果,這些結果一旦共識則不可改變)
PBFT協議正常流程:

其他拜占庭共識算法:Fab Paxos,XFS,Zyzzyva,SBFT等。
4。非強一致共識算法PoW機制
PoW:工作量證明/算力
比特幣系統中使用的工作量證明函數是SHA-256
比特幣PoW共識算法流程:

比特幣的共識算法不適合於私有鏈和聯盟鏈。因為它是一個最終一致性共識算法而不是一個強一致性共識算法,且共識效率低。
5。PoS機制
(1)點點幣Pos機制:
權益證明要求用戶證明擁有某些數量的貨幣(即對貨幣的權益),點點幣(Peercoin)是首先采用權益證明的虛擬貨幣。
它采用混合共識機制,既用PoW工作量證明挖礦機制,同時又用權益證明PoS機制。采用幣齡概念。
點點幣引入了一個中心化的Checkpoint廣播機制,在每天幾次廣播checkpoint消息,以確認區塊鏈中的交易。確認后即為最終交易。
(2)未來幣NXT PoS機制
未來幣完全使用PoS權益證明的虛擬貨幣。它不采用幣齡概念。
(3)Tendermint PoS機制
Tendermint共識算法是第一個實現BFT的PoS共識算法。
(4)Ethereum Casper PoS機制
以太坊的casper的pos機制也具有BFT容錯能力
(5)LPoS(Leased Proof of Stake)機制--租借權益證明
Waves是采用LPoS的區塊鏈項目
(6)DPoS(Delegated Proof of Stake)機制--股份授權證明機制
DPoS主要解決PoW和PoS機制不足,比特股是一類采用DPoS機制的密碼貨幣。
TeZoS和EOS項目采用DPoS機制。
6。Ripple(瑞波)共識算法
UNL(Unique Node List)可信節點名單
Ripple共識算法只適合於許可鏈(Permissioned chain)
Ripple共識算法流程:

Ripple共識算法獨特之處在於它不是在全網一次性達成共識,而是在UNL子網中達成共識。
第6章 P2P網絡
1。P2P(Peer-to-Peer networking,對等網絡)網絡簡介
(1)TCP/IP與UDP協議
電腦要想相互交換信息必須使用“同一種語言”,這個語言就是所謂的“通信協議”。(類比不同國家人相互溝通)
互聯網協議族(Internet Protocol Suite,IPS)也稱為“TCP/IP協議族”(TCP/IP Protocol Suite | TCP/IP Protocols)
TCP/IP協議族兩個核心協定:TCP(傳輸控制協議)和IP(網絡協議)
互聯網協議可分為OSI分層模型和TCP/IP分層模型 (可理解為一門語言的不同解釋,如美式英語和英式英語)
A。OSI模型,即開放式通信系統互聯參考模型
B。TCP/IP參考模型

P2P網絡大部分應用UDP(User Datagram Protocol:用戶數據報文)協議
--不可靠的數據報文協議(數據一旦發送出去,不保留數據備份)
TCP與UDP區別:
A。TCP是一種面向連接的協議(兩台主機要建立可靠連接,類比兩個人通電話),
B。UDP是一種無連接的協議(不用建立可靠連接,類比電台廣播和收音機)
(2)SSL相關知識
A。Http與Https
a。Https將Http明文傳輸的協議進行加密,即使信息被截取,也無法破解
b。Https使用的加密方式是“對稱加密”
c。Https配置流程只需要申請pem和key文件(CA證書),在nginx中配置規則,開啟443端口即可
d。C端與S端https通信
C端與S端驗證對方證書的合法性
C端產生一個隨機數1,用S端公匙加密,產生隨機密碼1
S端用自己的私匙解析隨機密碼1,獲取隨機數1,此時,C端與S端使用相同的方式對隨機數1進行運算得到一個通訊密碼
C端與S端使用相同的通訊密碼對數據進行對稱加密
B。SSL是一種安全協議(
1。SSL針對HTTP進行了特別設計,HTTP協議能夠在SSL運行
2。https = http + ssl
3。https運行在443端口,http運行在80端口
4。https需要申請證書CA
)
C。TSL(傳輸層安全性協議)與SSL(協議層安全性協議)區別(
1。TSL使用x.509認證
2。SSL認證是客戶端到服務端的認證
3。TLS工作在傳輸層,應用層協議能透明地運行在TLS協議之上
)
(3)P2P原理
P2P網絡通信的原理主要包括:節點添加,消息路由,節點發現,節點刪除。
舉例:
若小明想通過P2P網絡發消息給小紅,但距離有點遠,超過了藍牙的最大通信距離,但他們中間剛好有個小芳,
小芳的手機剛好可以通過藍牙跟小明和小紅通信,即小明要發消息給小紅,必須通過小芳這個第三方節點。
此時:
小明的手機會不停地從P2P網絡發現並查找到合適的第三方節點(最短通信距離衡量),直到找到小芳手機,此過程叫“節點發現”;
發現可靠節點后,小明手機就會跟小芳手機通信,並通過小芳手機把他的消息發給小紅,此過程叫“消息路由”;
若小芳手機沒電了,小明手機又要重新查找新的第三方節點。這時小剛出現,剛好在小明與小紅間可以通過藍牙通信,小剛就加入到這個P2P網絡中,這叫“節點添加”;
而小芳的手機就可以從這個P2P網絡中直接刪除,這叫作“節點刪除”。
2。P2P網絡核心數據結構與算法
P2P協議分為非結構化的系統和結構化的系統
(1)非結構化的系統
每個節點存儲自身的信息或信息的索引(如指針和IP地址)
洪泛查找:廣播
(2)結構化的系統
每個節點只存儲特定的信息或特定信息的索引
DHT(分布式哈希表[Distributed Hash Table])技術
DHT網絡類比整個城市地圖,每個client相當於只包括一個街道的小地圖。
DHT協議:
A。緩沖隊列路由協議(CARP)
B。一致性哈希
一致性哈希基本解決了P2P環境中最為關鍵的問題
--如何在動態的網絡拓撲中分布存儲和路由(缺點:路由算法不足)
--每個節點僅需維護少量相鄰節點的信息,並且在節點加入/退出系統時僅有相關的少量節點參與到拓撲的維護中
C。Chord協議
--解決如何在P2P網絡中找到存有特定數據的節點
D。內容尋址網絡(CAN:Content-Addressable Network)
CAN是DHT的一個變種。
E。Pastry
包括:PAST和SCRIBE
3。區塊鏈P2P網絡協議
(1)比特幣區塊鏈
完整功能的比特幣網絡節點:

名詞:
全節點:是指維持包含全部交易信息的完整區塊鏈的節點(完整區塊鏈節點)
種子節點:長期穩定運行的節點
SPV節點/輕量節點:通過SPV(簡易支付驗證)方式完成交易驗證的節點
創世區塊:第一區塊(不可改變)
交易池:比特幣網絡中幾乎每個節點都會維護一份未確認交易的臨時列表,該表稱為“內存池”/“交易池”
UTXO池:有些比特幣客戶端還維護一個UTXO數據庫,也稱“UTXO池”,是區塊鏈中所有未支付交易輸出的集合
(2)以太坊區塊鏈
技術文檔:https://github.com/ethereum/devP2P/blob/master/rlpx.md
以太坊應用:DHT數據結構和類Kademlia算法(通過分布式哈希表實現的協議算法,UPD通信)
