導(dǎo)語:本文主要介紹了區(qū)塊鏈的基本概念,對(duì)基本術(shù)語進(jìn)行解析,有利于初學(xué)者更好地了解什么是區(qū)塊鏈,區(qū)塊鏈核心的技術(shù)有哪些,為后面深入學(xué)習(xí)打下理論基礎(chǔ)。
區(qū)塊鏈的三個(gè)基本構(gòu)成
交易:一次賬本的操作,導(dǎo)致賬本狀態(tài)的一次改變
區(qū)塊:一段時(shí)間內(nèi)的所有交易和狀態(tài)結(jié)果,共識(shí)機(jī)制生成新的區(qū)塊
鏈:區(qū)塊按順序串鏈,是整個(gè)賬本的日志記錄
區(qū)塊鏈如何工作?(以比特幣為例)
比特幣客戶端發(fā)起一筆交易,廣播到比特幣網(wǎng)絡(luò)中等待確認(rèn)
網(wǎng)絡(luò)中所有節(jié)點(diǎn)將一段時(shí)間內(nèi)收到的所有等待確認(rèn)的記錄打包,包含前一個(gè)區(qū)塊頭部的hash值,組成一個(gè)候選的區(qū)塊。
通過找到一個(gè)合適的隨機(jī)值放到候選區(qū)塊中,是的候選區(qū)塊的hash結(jié)果滿足一定的條件。找到這個(gè)合適hash值的過程,稱之為“挖礦”;而尋找這個(gè)合適hash值的人或組織機(jī)構(gòu),稱之為“礦工”;由于這一個(gè)過程需要花費(fèi)大量的算力,自熱而然就出現(xiàn)了“礦池”。而這種基于算力尋找合適隨機(jī)串的共識(shí)機(jī)制,被稱之為工作量證明PoW(Proof of Work)。
候選區(qū)塊在網(wǎng)絡(luò)中廣播,其他節(jié)點(diǎn)收到候選區(qū)塊,進(jìn)行驗(yàn)證,符合約定條件的區(qū)塊將會(huì)被添加到自己維護(hù)的區(qū)塊鏈上。
當(dāng)大部分節(jié)點(diǎn)都將候選區(qū)塊添加到自己的維護(hù)的區(qū)塊鏈上,該區(qū)塊就會(huì)被網(wǎng)絡(luò)所接受,區(qū)塊中的所有交易就會(huì)得到確認(rèn)。
區(qū)塊鏈的分類
共有鏈:任何人都可以參與和維護(hù),信息完全公開,例如比特幣
私有鏈:只有授權(quán)的部分人可以使用,信息不公開
聯(lián)盟鏈:介于兩者之間,有若干組織一起合作維護(hù),帶有權(quán)限的訪問。
目前,私有鏈和聯(lián)盟鏈在現(xiàn)實(shí)生活中的商戶場景中得到更多的應(yīng)用和落地。
分布式核心問題
一致性問題:一致性并不代表結(jié)果正確與否,而是系統(tǒng)對(duì)外呈現(xiàn)的狀態(tài)一致與否。分為:強(qiáng)一致性和弱一致性(順序一致性;線性一致性)。
共識(shí)算法:分布式系統(tǒng)中多個(gè)節(jié)點(diǎn)之間,批次對(duì)某個(gè)狀態(tài)達(dá)成一致結(jié)果的過程。
常見的共識(shí)算法:
(1)CFT:Crash Fault Tolerance
(2)BFT:Byzantine Fault Tolerance
FLP不可能原理:在網(wǎng)絡(luò)可靠,但允許節(jié)點(diǎn)失效(即便只有一個(gè))的最小化異步模型系統(tǒng)中,不存在一個(gè)可以解決一致性問題的確定性共識(shí)算法。(不要浪費(fèi)時(shí)間,去為異步分布式系統(tǒng)設(shè)計(jì)在任意場景下都能實(shí)現(xiàn)共識(shí)的算法)
CAP原理
(1)一致性(consistency):任務(wù)操作都是原子的。
? ?(2)可用性(availability):在有限的時(shí)間內(nèi),任何失敗的節(jié)點(diǎn)都能應(yīng)答請(qǐng)求。
? ?(3)分區(qū)容忍性(partition):網(wǎng)絡(luò)可能發(fā)生分區(qū),即網(wǎng)絡(luò)節(jié)點(diǎn)間的通信不可保障
? ? ? ? ? ?簡單的理解:在網(wǎng)絡(luò)可能出現(xiàn)分區(qū)的情況下,是無法同時(shí)保證一致性和可用性的。要么犧牲可用性,要么犧牲一致性。
?ACID原則
(1)原子性(atomicity):每次操作都是原子的,要么成功,要么不執(zhí)行
(2)一致性(consistency):最終狀態(tài)是一致的,沒有中間態(tài)
(3)隔離性(isolation):各個(gè)操作之間是互不影響的
(4)持久性(durability):狀態(tài)的改變是持久的,不可改變
Paxos 算法與 Raft算法(系統(tǒng)中存在故障,但不存在惡意節(jié)點(diǎn))
(1)paxos算法
提案者(proposer):提出一個(gè)提案,等待大家批準(zhǔn)為結(jié)案
接受者(acceptor):負(fù)責(zé)對(duì)提案進(jìn)行投票,接受提案
學(xué)習(xí)者(learner):獲取批準(zhǔn)結(jié)果,并可以幫忙傳播,不參與投票過程
(2)raft算法
領(lǐng)導(dǎo)者(leader):選舉
候選領(lǐng)導(dǎo)者(candidate):
跟隨者(fllower):
拜占庭問題與算法(系統(tǒng)中存在故障,且存在惡意節(jié)點(diǎn))
N >= 3F+1,其中N為節(jié)點(diǎn)數(shù),叛變將軍數(shù)為F
可靠性指標(biāo)
(1)服務(wù)的可用性
服務(wù)承諾SLA
服務(wù)指標(biāo)SLI
服務(wù)目標(biāo)SLO
(2)兩個(gè)核心時(shí)間
MTBF: 平均故障隔間時(shí)間,反映故障發(fā)生的頻率
MTTR: 平均修復(fù)時(shí)間,反映故障發(fā)生后恢復(fù)的時(shí)間
密碼學(xué)與安全技術(shù)
hash算法:能將任意長度的明文,映射為固定長度的二進(jìn)制串
[x]正向快速
[x]逆向困難
[x]輸入敏感
[x]沖突避免:hash碰撞
常見算法:MD5和SHA系列算法,目前MD5和SHA1算法已經(jīng)被破解,一般推薦至少用SHA-256或更安全的算法
hash攻擊與保護(hù)
(1)hash算法并不是一種加密算法,不能用于對(duì)信息的保護(hù)。
(2)主要的攻擊包括字典攻擊和彩虹表攻擊(只保存一條has鏈的首尾值,相對(duì)字典攻擊可用節(jié)省存儲(chǔ)空間)
(3)防范措施:加鹽,hash結(jié)果和鹽分別存放在不同的地方,只要不是兩者同時(shí)泄漏,攻擊者就很難破解
數(shù)字摘要
數(shù)字摘要是對(duì)數(shù)字內(nèi)容進(jìn)行hash運(yùn)算,獲取唯一的摘要值來替代原始完整的數(shù)字內(nèi)容
加解密算法
[x]對(duì)稱加密算法:加密和解密的密鑰匙相同
優(yōu)點(diǎn):加密效率和強(qiáng)度高
缺點(diǎn):參與方都需要維護(hù)密鑰,在不安全通道中分發(fā)密鑰也是一個(gè)問題(可通過Diffie-Helman協(xié)議或非堆成加密方式解決)
基本原理:分組密碼(DES,3DES,AES,IDEA)和序列密碼
適用場景:大量數(shù)據(jù)加解密,提前分發(fā)密鑰匙短板
[x]非對(duì)稱加密算法:加密和解密的密鑰匙不相同
優(yōu)點(diǎn):公鑰可用在不安全通道中分發(fā)缺點(diǎn):加解密速度慢,加密強(qiáng)度不如對(duì)稱加密,依賴數(shù)學(xué)問題保證安全性(大數(shù)質(zhì)因子分解,離散對(duì)數(shù),橢圓曲線)
基本原理:公鑰加密,私有解密
代表算法:RSA,Diffie-Helman密鑰交換,ELGamal,橢圓曲線算法,SM2
適用場景:簽名和密鑰協(xié)商,不適用于大量數(shù)據(jù)加解密
[x]混合加密算法:利用非堆成加密協(xié)商一個(gè)對(duì)成加密密鑰,然后再通過對(duì)稱加密算法對(duì)數(shù)據(jù)加密
消息認(rèn)證碼
含義:消息認(rèn)證碼匙給予對(duì)成加密,可用用于對(duì)消息完整性進(jìn)行保護(hù)。包括三個(gè)要素:K為提前共享的對(duì)成密鑰;H為協(xié)商的hash算法;M為消息內(nèi)容
場景:證明身份
代表算法:HMAC
數(shù)字簽名
含義:基于非對(duì)稱加密,既可以用于證實(shí)數(shù)字內(nèi)容的完整性,又同時(shí)可用確認(rèn)來源,具有不可抵賴性。
場景:數(shù)字簽名
代表算法:DSA,ECSDA
數(shù)字證書
數(shù)字證書的出現(xiàn)是未來解決非對(duì)稱加密算法及數(shù)字簽名中公鑰分發(fā)帶來的安全風(fēng)險(xiǎn)。根據(jù)保護(hù)公鑰的用戶,可分為兩類
[x]加密數(shù)字證書:保護(hù)用于加密信息的公鑰
[x]簽名驗(yàn)證數(shù)字證書:保護(hù)用于解密簽名進(jìn)行身份驗(yàn)證的公鑰
PKI體系
CA:負(fù)責(zé)證書的頒發(fā)和作廢,接受來自RA的請(qǐng)求
RA:對(duì)用戶身份進(jìn)行驗(yàn)證,校驗(yàn)數(shù)據(jù)合法性,負(fù)責(zé)登記,審核通過了就發(fā)給CA
證書數(shù)據(jù)庫:存放證書
Merkle樹
主要特點(diǎn):
(1)最下面的葉子節(jié)點(diǎn)包含存儲(chǔ)數(shù)據(jù)或hash值
(2)非葉子節(jié)點(diǎn)都是它的兩個(gè)孩子節(jié)點(diǎn)內(nèi)容的hash值
應(yīng)用場景:
(1)快速比較大量數(shù)據(jù):只需要比較根節(jié)點(diǎn)hash值是否相同
(2)快速定位修改:某個(gè)節(jié)點(diǎn)的數(shù)值變化
(3)零知識(shí)證明
布隆過濾器:某個(gè)元素是否在某個(gè)集合中
(1)基于hash的快速查找
(2)更高效的布隆過濾器:基于多個(gè)hash函數(shù),提高空間利用率,可用使用較少的空間來表示較大集合的存在關(guān)系
同態(tài)加密
對(duì)密文直接進(jìn)行處理,根對(duì)明文處理后再對(duì)處理結(jié)果加密,得到的結(jié)果相同??梢员WC實(shí)現(xiàn)處理者無法訪問數(shù)據(jù)自身的信息。
比特幣原理和設(shè)計(jì)
?基本交易過程
一筆合法的交易,引用某些已存在的交易的UTXO作為交易的輸入,并生成新的輸出。轉(zhuǎn)賬方通過簽名腳本來證明自己的事UTXO的合法使用者,并指定輸出腳本來限制未來的交易的使用者為收款方。每筆交易總輸入不能低于總輸出,總輸入多于總輸出的部分稱為交易費(fèi)用,為生成包含該交易區(qū)塊的礦工所得。
重要概念
賬戶/地址:比特幣賬戶地址其實(shí)就是用戶公鑰經(jīng)過一系列hash(hash160,或先進(jìn)行sha256,然后進(jìn)行ripemd160)及編碼運(yùn)算后生成的160位(20字節(jié))的字符串。
?? ?交易:
?? ?交易腳本:腳本是保障交易完成的核心機(jī)制,主要用于教研交易是否合法。包括輸出腳本和認(rèn)領(lǐng)腳本:輸出腳本一般又付款方對(duì)交易設(shè)置鎖定,用戶對(duì)能動(dòng)用這筆交易輸出的對(duì)象(收款方)進(jìn)行權(quán)限控制;認(rèn)領(lǐng)腳本用來證明自己可以滿足交易輸出腳本的鎖定條件。
?區(qū)塊:對(duì)完整區(qū)塊的驗(yàn)證,只需要驗(yàn)證區(qū)塊頭即可
?? ?避免作惡:利用經(jīng)濟(jì)博弈論,來規(guī)避作惡。礦工首先要付出挖礦的代價(jià),進(jìn)行算力消耗,越想拿到新區(qū)塊的決定權(quán),意味著抵押的算力越多,一旦失敗,這些算力就會(huì)被沒收掉,稱為沉沒成本。
?? ?負(fù)反饋調(diào)節(jié):比特幣網(wǎng)絡(luò)中的礦工越多,比特幣網(wǎng)絡(luò)就越穩(wěn)定,比特幣的價(jià)值就越高,但挖到礦的概率就越低。反之,比特幣中的礦工越少,比特幣網(wǎng)絡(luò)就越不安全,比特幣價(jià)值就越低,但挖礦的概率會(huì)提高。
?? ?挖礦:參與維護(hù)比特幣網(wǎng)絡(luò)的節(jié)點(diǎn),并協(xié)助生成新區(qū)塊來獲取一定新增比特幣的過程。礦工綜合上一個(gè)區(qū)塊的hash值,上一個(gè)區(qū)塊生成之后的新的驗(yàn)證過的交易內(nèi)容,用自己的猜測的一個(gè)隨機(jī)數(shù),一起打包到一個(gè)候選新區(qū)塊,讓新區(qū)塊的hash值小于比特幣網(wǎng)絡(luò)中給定的一個(gè)數(shù)。算力一般以每秒多少次hash計(jì)算位單位,記為h/s 。
?共識(shí)機(jī)制:
(1)工作量證明PoW
? ? 最長鏈
(2)權(quán)益證明PoS
閃電網(wǎng)絡(luò):解決比特幣交易網(wǎng)絡(luò)性能問題:全網(wǎng)每秒7筆左右的交易速度;同時(shí),等待6個(gè)區(qū)塊的可信確認(rèn)將導(dǎo)致約1個(gè)小時(shí)的最終確認(rèn)時(shí)間。引入智能合約的思想來完善鏈下的交易渠道。
(1)RSMC :可撤銷的順序成熟合同,類似于資金池機(jī)制。保障兩個(gè)人之間的直接交易可以在鏈下完成。
(2)HTLC ?:哈希的帶時(shí)鐘的合約。保證任意兩個(gè)人之間的轉(zhuǎn)賬都可以通過一條支付通道來完成。
?側(cè)鏈:
側(cè)鏈協(xié)議允許資產(chǎn)在比特幣區(qū)塊鏈和其他區(qū)塊鏈之間互轉(zhuǎn)。比特幣區(qū)塊鏈作為主鏈,其他區(qū)塊鏈作為側(cè)鏈,二者雙向掛鉤,實(shí)現(xiàn)比特幣從主鏈轉(zhuǎn)移到側(cè)鏈進(jìn)行流通。
? ? (1)簡單支付驗(yàn)證證明SPV Proof:SPV客戶端只需要下載所有區(qū)塊的區(qū)塊頭,并進(jìn)行簡單的定位和計(jì)算工作,就可以給出驗(yàn)證結(jié)論。
(2)雙向掛鉤:實(shí)現(xiàn)比特幣在主鏈和側(cè)鏈之間的轉(zhuǎn)移和返回,主鏈和側(cè)鏈需要對(duì)對(duì)方的特定交易做SPV驗(yàn)證。
Trade -off:
?? ?(1)區(qū)塊上限 1MB:更大的區(qū)塊容量可以帶來更大的交易吞吐量,但會(huì)增加挖礦的成本,帶來中心化的風(fēng)險(xiǎn),同時(shí)增大存儲(chǔ)的成本。
?? ?(2)出塊間隔時(shí)間:更短的出塊時(shí)間可以縮短交易的確認(rèn)時(shí)間,但也可能導(dǎo)致分叉增多,降低網(wǎng)絡(luò)可用性。
?? ?(3)腳本支持程度:更強(qiáng)大的腳本指令集可以帶來更多的靈活性,但也可能帶來更多的安全風(fēng)險(xiǎn)。
?分叉:比特幣網(wǎng)絡(luò)的升級(jí)會(huì)帶來分叉
? ? (1)軟分叉:舊節(jié)點(diǎn)能夠接受新節(jié)點(diǎn)產(chǎn)生的交易和區(qū)塊
?? ?(2)硬分叉:舊節(jié)點(diǎn)不能接受新節(jié)點(diǎn)產(chǎn)生的交易和區(qū)塊
以太坊的核心概念
1.智能合約
? ? 以計(jì)算機(jī)程序來運(yùn)行各種締結(jié)和合約。通過圖靈完備的高級(jí)語言,包括solidity,serpent,viper等來開發(fā)智能合約,智能合約運(yùn)行在以太坊虛擬機(jī)中。
2.賬戶
? ? 比特幣中沒有賬戶的概念,而是通過采用UTXO模型記錄整個(gè)系統(tǒng)的狀態(tài)。通過交易歷史來推算用戶的余額信息,而以太坊采用賬戶來記錄系統(tǒng)的狀態(tài),每個(gè)賬戶存儲(chǔ)余額信息,智能合約代碼和內(nèi)部數(shù)據(jù)出存儲(chǔ)等。具體可分為兩種類型:
(1)合約賬戶:存儲(chǔ)智能合約代碼
(2)外部賬戶:以太幣擁有者賬戶,對(duì)應(yīng)到某公鑰。
3.以太幣:主要用于購買燃料,支付給礦工,以維護(hù)以太坊網(wǎng)絡(luò)運(yùn)行智能合約的費(fèi)用。
4.燃料:控制某次交易執(zhí)行指令的上限。沒執(zhí)行一條合約指定會(huì)消耗固定的燃料。
超級(jí)賬本—面向企業(yè)的分布式賬本