定義
BTC密碼學原理
Hash
z = hash(x)
-
哈希碰撞
如果x != y晋被,但hash(x) == hash(y) 代表碰撞
-
collision resistance
如果z = hash(x)铺罢,由于x和z的取值范圍很大朝刊,那么 x != y 可以大概率推出 hash(x) != hash(y) 。
hiding
hash不可逆半等,并且x的取值非常大,無法通過枚舉和算法呐萨,根據(jù)z反推出x-
Puzzle friendly
加入過z的范圍是256位的十六進制數(shù)
要求hash x后的z滿足前200位都是零杀饵,保證z的取值范圍足夠小
那么礦工只能通過不斷的改變x算hash值,來證明自己的算力
而無法通過z的取值范圍反推x
這叫puzzle friendly
簽名
一對公私鑰對谬擦,通過私鑰簽名切距,來代表這筆交易是用戶發(fā)生。
礦工通過公鑰驗證簽名的合法性惨远,如果驗證通過谜悟,則代表交易合法
BTC數(shù)據(jù)結構
Hash pointer
通過數(shù)據(jù)塊的hash值來構成鏈表的指針關聯(lián)话肖,而不是通過內(nèi)存地址來代表指針的值
通過hash關聯(lián)數(shù)據(jù)塊,可以達到葡幸,礦工很難對中間的某一塊數(shù)據(jù)進行數(shù)據(jù)篡改最筒,因為一旦篡改,會使得hash值改變蔚叨,那么后續(xù)的所有數(shù)據(jù)塊的hash值都會改變床蜘,再加上挖礦的難度非常大,因此篡改數(shù)據(jù)變成了一項幾乎不可能完成的任務
Merkle Tree
區(qū)塊鏈的每個區(qū)塊的數(shù)據(jù)域只保存hash值
把交易組成一顆樹蔑水,通過hash指針關聯(lián)
Merkle proof
交易是放在Markle tree的data塊
全節(jié)點保存整個區(qū)塊鏈的數(shù)據(jù)
輕結點只保留區(qū)塊塊頭的信息
發(fā)生交易的數(shù)據(jù)要求證明交易是否已經(jīng)在區(qū)塊鏈上
全節(jié)點會把區(qū)塊鏈中包含交易的Merkle tree路徑上的hash值發(fā)給輕結點
輕結點通過從底到上的運算hash值邢锯,最終得到塊頭的hash值,并比較
來確定交易是否已經(jīng)在鏈上
去中心化
-
貨幣由誰發(fā)行
通過挖礦發(fā)行
-
發(fā)行多少
每發(fā)布21萬區(qū)塊搀别,區(qū)塊獎勵減半
-
如何解決double spend問題
通過hash指針丹擎,指明交易的資金來源
-
共識機制
-
POW
相信大部分結點都是好結點
每個節(jié)點都去找尋nonce
找到了nonce則獲得記賬權,并發(fā)布區(qū)塊
其他大部分結點去驗證區(qū)塊的合法性歇父,并添加到區(qū)塊鏈中國
繼續(xù)挖礦
-
問題:
-
合法區(qū)塊被拒絕
由于大部分結點都會接收合法區(qū)塊蒂培,并繼續(xù)往下挖
這會讓這個區(qū)塊存在于最長合法鏈
-
分叉攻擊
黑客可以通過分叉攻擊,把花出去的錢回滾掉
除非黑客擁有超過半數(shù)以上的算力
否則庶骄,這個新的分叉不會成為最長合法鏈
-
-
-
-
激勵機制
- 挖出區(qū)塊的結點獲得出塊獎勵
- 引入交易費
UTXO
unspend transaction output
區(qū)塊中的交易的每一塊資金毁渗,要么不花,要么全部花出
UTXO記錄哪些區(qū)塊是還沒有花出去的
維護這樣一個數(shù)據(jù)結構单刁,是為何快速判斷一個交易的合法性和避免double spend 攻擊
網(wǎng)絡
- 一個結點要加入網(wǎng)絡灸异,先要知道一個種子結點
- 通過種子結點告知自己網(wǎng)絡中有哪些結點
- 結點之間通過TCP協(xié)議傳輸數(shù)據(jù)
- 結點需要離開不需要任何操作,其他結點一定時間沒有收到離開結點的消息羔飞,則會自動把它剔除
- 消息通過隨機選擇鄰居結點發(fā)送
- 如果結點發(fā)現(xiàn)消息處理過了肺樟,則不會再往外發(fā)送
- 如果同一來源金額有兩個消費,則先到優(yōu)先
- 區(qū)塊大小限制1M以內(nèi)
BTC挖礦難度
通過計算交易塊的SHA-256是否達到nonce的要求
H(block header) <= target
target越小逻淌,難度越大
出塊時間要維持在10min
通過以下公式調(diào)整難度
target = target * actual time/expected time
分叉
如果挖礦協(xié)議改變么伯,有可能造成分叉
硬分叉
升級的礦工,認可新特性和舊特性卡儒,會挖出一條鏈
沒有升級的礦工田柔,不認可新特性,會挖出另外一條鏈
軟分叉
升級的礦工骨望,認可新特性硬爆,不認可舊特性
沒有升級的礦工認可新特性和舊特性
最終都升級后,它們會合成一條鏈
ETH概述
ETH針對出塊時間擎鸠、共識協(xié)議缀磕、反ASIC芯片的mining puzzle對BTC作出改進,和增加了去中心化的合約
ETH賬號
通過賬號,記錄賬戶金額和計數(shù)器
計數(shù)器用來防止重放攻擊
- 外部賬號:使用公私鑰來產(chǎn)生袜蚕,存有賬戶余額和計數(shù)器
- 合約賬號:不通過公私鑰產(chǎn)生糟把,存有余額,計數(shù)器牲剃、代碼和數(shù)據(jù)
數(shù)據(jù)會發(fā)生變化遣疯,但是代碼是不可篡改的
ETH數(shù)據(jù)結構
Patricia tree
Merkle Patricia tree
根結點保存整棵樹的hash值
用于Merkle proof
Modified Patricia tree
引入版本控制,每次修改一小部分的賬號颠黎,形成新的Patricia tree
ETH賬號樹
通過Modified Patricia tree存儲
ETH交易樹和收據(jù)樹
通過Merkel Patricia tree存儲
通過bloom過濾器另锋,定位收據(jù)的位置,用于更復雜的查詢功能
ETH GHOST協(xié)議
ETH出塊降低到15s狭归,BTC出塊10min夭坪,這導致很多礦工在相近時間挖出區(qū)塊
為了補償?shù)貌坏匠鰤K獎勵的其他成功挖出區(qū)塊的礦工,適當?shù)慕o出補償
提出了GHOST協(xié)議
- 每個挖出的區(qū)塊可以最多包含兩個叔父區(qū)塊过椎,并得到額外的1/32的出塊獎勵
- 叔父根據(jù)隔了多少代遞減得到獎勵室梅,最多個7代
- 只認第一個叔父區(qū)塊
反ASIC挖礦算法
基本版
ASIC芯片擅長計算hash
但如果加入訪問內(nèi)存,則可以抑制計算能力
通過引入一個巨大無比的內(nèi)存數(shù)組
以一個seed疚宇,一個接一個的計算hash值
每次進行hash時亡鼠,必須隨機的包含三個hash值
這強迫挖礦時,必須多次訪問內(nèi)存
問題:Merkle proof時敷待,輕結點無法存入這么大的內(nèi)存
改進版
維護一個16M的隨機數(shù)組
通過16M的隨機數(shù)據(jù)hash 256次间涵,得到1G的數(shù)據(jù)
挖礦時需要多次訪問1G的數(shù)組
權益證明POS
通過所占權益,進行投票榜揖,達成共識
預挖礦
給ETH開發(fā)者預留一部分貨幣勾哩,等數(shù)據(jù)貨幣成熟后,則可以有錢起來
挖礦難度
PH為父區(qū)塊難度
x是調(diào)整難度系數(shù)
難度炸彈是一個指數(shù)函數(shù)举哟,用于限制POW思劳,發(fā)展POS
難度炸彈如果塊數(shù)大于三千萬,則會成為指數(shù)增長
歷史上妨猩,ETH回退了一次難度系數(shù)
智能合約
通過代碼實現(xiàn)合約
代碼在區(qū)塊鏈上一旦發(fā)布不可篡改
寫代碼時要注意重入攻擊和數(shù)字計算溢出問題
外部賬號通過調(diào)用智能合約代碼潜叛,實現(xiàn)智能合約的買入和賣出
ref:
https://blog.nowcoder.net/n/30cbdb37108b4d93b3a5a93b8226ae31