學習視頻源鏈接:
https://www.bilibili.com/video/BV1Vt411X7JF/
本文是根據肖老師的視頻進行的筆記記錄
一、 cryptographic hash function
1.1. collision resistance抗碰撞性 :
collision 指的是hash碰撞
抗碰撞性 (Collision Resistance) 是密碼學哈希函數的一個重要安全屬性,指的是:很難找到兩個不同的輸入 x 和 y,使得它們的哈希值相同,即 hash(x) = hash(y)。
作用:
- 數字簽名安全性:防止攻擊者找到與已簽名文檔具有相同哈希值的偽造文檔
- 區塊鏈技術:確保交易和區塊的唯一性,防止偽造
- 數據完整性:保證數據沒有被篡改
- 在以太坊的上下文中,抗碰撞性在多個地方都很重要,比如:
- 區塊頭的哈希計算
- 交易哈希的生成
- Merkle樹的構建
- 賬戶地址的生成
后果: 如果一個哈希函數失去了抗碰撞性,攻擊者可能能夠構造碰撞來進行雙花攻擊或其他欺詐行為。(bitcoin這種pow就容易有double spending,以太坊po
以太坊主要使用Keccak-256(一種SHA-3變種)作為哈希算法,它被設計為具有強抗碰撞性。
(從數學上證明不出來抗碰撞行,就是實踐中驗證的。。。
md5 之前以為做不出來hash碰撞,但是后來證明可以做出了。。。)
1.1.2 hiding 單項One-way Function / Preimage Resistance
給定哈希值 h,計算上不可行找到任何輸入 x 使得 hash(x) = h
即從哈希值反推原始輸入在計算上是不可行的
成立前提:輸入的分布均勻,數量足夠大。
單向函數 (One-way Function)
1.1.1、1.1.2 兩個性質和起來的作用: 可以形成digital commitment /digital equivalent of a sealed envelope 。
數字承諾(Digital Commitment)
1.1.3 puzzle friendly
挖礦就是 一直尋找隨機數(none) 讓 block header+ none 進行運算后的hash 函數值,在target 目標內
所以這個才能 proof of work 。
difficult to solve ,but easy to verify
一到有人找到這個none ,發布出去之后,驗證算一下就行。
挖礦很難,驗證很容易
2. 簽名
公私鑰來自非對象加密的概念
一個公私鑰就是一個賬戶
加密和解密用的是同一個人的公鑰和私鑰
公鑰相當于你的銀行賬戶。
公私鑰用來簽名。
如果我想轉給你的錢,我要用自己的私鑰進行簽名,然后其他人用我自己的公鑰 驗證 ,我是不是真的想轉給你這筆錢。
如果兩個人生成的公私鑰恰好相同,可以嗎? 256位hash,出現兩個人相同的公私鑰,概率微乎其微。 (假設產生公私鑰的時候有一個好的隨機源
先對一個message 取hash 然后再對這個hash值簽名
二、 數據結構
2.1 hash pointers
區塊鏈: 一個一個區塊 組成的鏈表
block chain is a linked list using hash pointers。
哈希指針(Hash Pointer) : 有環鏈表不能使用hash pointer
第一個區塊: Genesis block
最后一個: most recent block
每一個區塊都有指向前一個區塊的指針。
每一個區塊的hash值時前面+自己的hashpointer 一起取的hash 值算出來的
我們通過這種數據結構可以實現 tamper- evident log
所以保證了區塊鏈中間東西不能變,如果改變前面任何一個區塊,都會引發多米諾骨牌效應
防篡改日志(Tamper-Evident Log)
2.2 merkle tree
相對于
binray tree
用hash 指針代替普通指針
Merkle樹(Merkle Tree)
好處: 只要記住根hash值,就能記住樹中 對任何的修改。 這叫 maerkle proof
Merkle證明(Merkle Proof)
proof of membership / proof of inclusion
Merkle非成員證明 (Proof of Non-membership)
Btc 只用了 membership的證明
proof of membership
三、 btc 協議
如何防范 double spending attack
比特幣與以太坊防范雙重支付(Double Spending)的機制
鑄幣交易:
btc每個區塊鏈的組成:
輸入部分: 幣的來源,指向前面某個交易
輸出部分: 收款人公鑰的hash (相當于收款人地址)
為什么要說明幣的來源? 證明這個錢不是憑空捏造的,也防范double spending
付款方需要知道 收款方的地址(公鑰的hash值)
收款方需要知道 付款方的公鑰 ,a的公鑰代表a的身份,代表知道從哪來的
所有節點也要知道付款方的公鑰,為了認證這筆交易是不是合法的。
認證原則:因為有的節點是惡意的,所有的節點驗證時,都要獨立驗證。
怎么才能知道付款方的公鑰?
我給你發送信息,我是用你的公鑰加密,然后你收到后用你的私鑰解密。
比特幣區塊的組成結構
全節點(Full Node)與輕節點(Light Node)的區別
哪些交易應該放到下一個區塊中? 哪一個時合法的?
區塊鏈: 賬本的內容鑰取得分布式共識—— 又繞到了分布式共識算法中。
3.2 分布式共識 :
eg: distributed hash table
需要取得共識的是 hash表中的kv
有很多impossibility result
eg. FLP
在一個異步的系統里(asynchronous ,如果有一個成員時faulty 的,那么也無法達成共識
eg. CAP theorem
雖然這些和btc 應用
假定系統中小部分為惡意節點,大部分是好的,所以如何處理consensus in bitcoin
比如 hyperledger(如fabric) ,當membership 是有門檻的,所以可以使用投票協議。
如果沒有門檻,還采用投票協議,會出現sybil attack
Sybil攻擊(Sybil Attack)
3.2.1 bitcoin 如何解決?
只有找到nonce ,才會有記賬權,
記賬權(Bookkeeping Rights)
分叉攻擊? forking attack 。bitcoin 的規則是: 連接到最長合法鏈 。
longgest valid chain 。
比特幣中被廢棄的分叉:孤塊(Orphan Block)與陳舊塊(Stale Block)
求解 puzzle friendly 就是靠算力來投票。看每秒鐘能試出多少個nasco數 ,hash rate 決定投票權重
四、 btc 實現
UTXO(Unspent Transaction Output)未花費交易輸出
utxo 檢測是不是double spending
交易型賬本 vs 賬戶型賬本
挖礦的時候用 block header就能保證這個鏈沒有篡改。
區塊頭(Block Header)與區塊體(Block Body)比較
比特幣的Extra Nonce與挖礦雙層循環
挖礦公平性保證: progress free
Progress-Free(無進展性)
比特幣的挖礦 除了比拼算力外,沒有任何意義,稀缺性是人為造成的,他越來越少是因為初塊獎勵人為減少。
但是!bitcoin is secured by mining
只要大部分算力掌握在誠實節點手里,那么系統安全就能得到保證。
是不是說挖礦動力越來越小呢? 恰恰相反,競爭越來越激烈,bitcoin的價格飆升
挖礦是比較大的概率落到誠實的節點上。
就算落到不誠實節點,由于不誠實節點雖然獲得記賬權,但是他不知道別人的私鑰,那么這個錢就轉不走。
如果不誠實的節點獲得記賬權,亂記,誠實的節點不會接受這個交易,誠實節點會向上追溯,鏈接到上面去。
拋棄不誠實的節點。
-
那么問題來了,不誠實的節點能做到double spending嗎?
不行,如果不合法,誠實節點不會接受。 -
那能不能分叉攻擊呢?
也不行,因為挖礦的時候,設置的block header里要填上前一個區塊的hash,所以要差到前面的區塊的話,一開始就要差到前面。
分叉攻擊的目的是什么? 干掉其他鏈。開始m->a 成功后,非要再來個下面的m->m, 干掉下面的m->a
如何防范? 后面跟一個區塊后,后面再跟6個區塊,然后才認為前面的是不可篡改的。
一個區塊是10分鐘。
mining 機制的設立為了維護系統安全性
假設大部分的算力掌握在誠實的礦工手里,也不能保證所有寫入區塊鏈的交易是合法的。挖礦給出的是概率上的保證。
- btc 網絡 : the bitcoin network
用戶把 交易發送的btc網絡上,節點收到交易,把這些交易打包到區塊里,然后把區塊發布到比特幣網絡上。
那么btc網絡怎么傳播呢?
application layer: bitcoin block chain
network layer: p2p overlay network
這個p2p節點很簡單,每個節點都是對等的
simple ,robust,but not efficient
消息節點采用flooding
鄰居節點是隨機的,不考慮網絡拓撲,這樣增強了魯棒性(robust),但是降低了效率 。
轉發的前提是這個交易是合法的,
每個節點要維護一個等待上鏈的交易集合:
傳播屬于best effort
越是大的區塊,在網絡上傳播越慢
帶寬是瓶頸。限制是1m
挖礦難度
H(block header) <= target
采用的是SHA-256
通俗來說要是合法的區塊,要求hash 前面有多少個0
51% attack
出塊 時間是10min
以太坊 出塊速度變快為 15s ,就需要設置新的共識協議 ghost ,會產生了很多orphan block ,但是對orphan block 也會有獎勵
如何調整挖礦難度?
2016個區塊調整一下難度 ,每個區塊十分鐘,大概是14天調整一下區塊。
調整公式: target= target x (actual time / expected time)
expected time = 2016 x10 min
actual time 最近的2016 個區塊實際花費的時間
5 btc 腳本
6 分叉
比特幣中的分叉類型全解析:Forking Attack、Deliberate Fork 與 Protocol Fork
P2SH (Pay-to-Script-Hash) 詳解
- 匿名性
bitcoin and anonymity
bitcoin 匿名性<銀行存款< 現金
bitcoin 完全公開
如何保證匿名性: 建議出入使用不同賬戶但是找零
7.1 找零
把不同的地址關聯在一起: 找零
輸出地址之間有可能是一部分是同一個的。
但是找零的地址雖然不是固定位置,但是可以分析出來 。
7.2 資金轉入轉出
bitcoin 和實體賬戶換錢
怎么辦? 去交易所、場外交易
7.3 用btc 支付
在實體世界用btc 支付
交易費貴
等待確認時間長
引起隱私泄露,你的虛擬賬戶和真實世界產生聯系了
hide your identity from whom?
在application layer 層
但是可以在network layer
在線錢包、交易所 天然的 coin mixing
不可篡改實際上對隱私保護并不合適,是摘難性的,賬戶之間的關聯性是要小心的
可摘難性(NP-hardness)解釋
7.5 零知識證明 (zero-knowledge proof)
零知識證明是指一方(證明者)向另一方(驗證者)證明一個陳述是正確的,而無序透露除該成熟時正確的歪的忍者信息
eg: 數字簽名 不一定是零知識證明,因為透露了公鑰
7.6 同態隱藏
如果x,y 不同,那么他們的加密函數值 e(x),e(y) 也不相同
給定e(x)的 值,很難翻推出x的值
給定e(x) 和 e(y)的值,我們可以很容易地計算出某些關于x,y 的加密函數值。
同態加法: 通過ex和 ey 計算出e(x+y)的 值
同態乘法: 通·過ex 和 ey 計算出e(xy)的值
擴展到多項式
同態隱藏(Homomorphic Hiding)
虛擬貨幣編號不能是央行產生的,這樣信息泄漏了。
和 bitcoin 不一樣。 零幣就是破壞了關聯性。
為什么這些匿名性 不是主流貨幣: 1. 性能不行, 2. 對初始化要求比較高。3. 需要強匿名性的用戶不是很多。4. 和實體發生交互的時候還是要暴露身份。
零鈔(Zerocash)和零幣(Zerocoin)
Bitcoin區塊鏈的創世區塊溯源