1,密碼學原理
密碼學原理
1,collision resistance
哈希函數 ,目前還是很安全的,沒有找到任何不同的內容其哈希是一致的情形。哈希碰撞(這個在數學上面是沒法證明的,都是日常的實踐表明,無法找到對于不同事物的對其進行哈希運算之后,得到的哈希值是一致的。MD5 被人為制造的哈希碰撞攻破,表明其機制的不安全)
2,hiding(輸入空間要足夠大,分布要均勻)
單向的 x -> H(x),輸入到輸出,單向
3,puzzle friendly
事先不知道結果,沒有捷徑,只能不斷的嘗試
簽名
- 公鑰無需保密,比如雙方溝通,需要使用對方的公鑰加密,然后對方收到加密信息之后使用私鑰解密,就可以看到原始信息。
- 公鑰相當于銀行賬號,私鑰相當于銀行的密碼。
- 發起交易,比如我轉給張三10個比特幣,這個需要使用我的私鑰加密,然后將這條消息、秘文、公鑰一起廣播,別人通過我的公鑰解密秘文,如果結果和發布的消息一致,就驗證我的身份。
2,數據結構
- 數據結構 哈希指針(要求無環)
- 哈希指針不光存儲地址,也要存儲哈希值(判定內容是否被篡改)
- Merkle tree(是基于binary tree的改進,使用哈希指針代替了普通的指針)
區塊包含
- Block header : 交易的根哈希值
- 宏觀信息:比特幣的版本協議、指向區塊鏈的前一個指針、整個Merkle tree的根哈希值、挖礦的難度、隨機數 ?
- Block body : 交易的列表
節點
- 全節點:保存全部信息驗證每一個交易
- 輕節點:無法獨立驗證(大多數)
Merkle prood
- Merkle proof (從交易體 到根節點的路徑)
- 全節點 Block header + Block body
- 輕節點 Block header
輕節點的驗證流程
如果驗證的過程,人為制造對面那個分支的(H()向全節點請求),想制造哈希碰撞,但是根據collision resistance原則,實際上并不可行。
?3,針對電子錢幣的傳統攻擊方式?
1,雙花攻擊
- 定義:將一份帶有央行密鑰簽名的貨幣復制多份,花費多次。
- 使用 唯一ID,標識每一份央行密鑰簽名的貨幣,這樣花費的時候就會判定是否花費過。但是,每次花費都需要央行的確認,就相當于中心結構的方式,就不是去中心化的方式了。
- 比特幣的產生流程 (防止雙花攻擊)
A鑄幣交易的哈希 要和 A轉賬的哈希要一致,否則無法證明A的幣的來源的正確性。
分布式共識
分布式哈希表
- 1,不可能結果 : FLP,即 如果網絡傳輸是異步請求的,網絡傳輸沒有上限,如果系統中一個用戶是faulthy,那么系統也不會達到共識。
- 異步請求:網絡傳輸時延沒有上限。CAP(Consistency、availability、partition tolerance)三者最多只能滿足兩個
比特幣的共識協議
- 存在惡意節點,但是大多數節點是好的。既然大多數節點是好的,發布投票,大家檢測其中包含的交易,如果存在非法的交易,投票低點,如果收到的票數達到一半以上,就代表贊成。
問題
- 不能保證所有節點都投票
- 效率(網絡延遲)
- 投票(首先需要確立投票權利)
2,女巫攻擊
- 定義:創建大量的賬號,投票,控制一半以上的賬戶
- 比特幣使用 (計算力)進行投票,即使創建一堆賬號,也不能保證計算力的提升
3,分叉攻擊 (交易回滾)
4,比特幣的實現
UTXO(Unspent Transaction output)
- 為了防止雙重支付問題,檢測double spending。
- 輸入 等于 輸出,輸入可以來自多個來源,此時需要多個簽名。
問題
M具有記賬權利,發布一筆交易A轉給M10比特幣,但是這個是需要A的簽名,這個是不可以偽造的。即使將其強制寫在區塊鏈上,但是誠實節點不接受這個區塊,會沿著上一個節點繼續挖掘。
雙重支付問題
需要多等幾個區塊,只有包含自身交易的區塊后面的區塊越多,說明篡改的難度越大。一般為6個區塊。
Selfish mining
自己挖完礦之后,得到一個區塊,不是立刻發布,而是繼續接著挖,直到自己的鏈最長,然后同時發出。修改之前的交易。
5,比特幣網絡
Application layer :Bitcoin block chain
Network layer :p2p overlay network 所有節點的身份地位相同,不存在超級節點(super?node/master?node),加入比特幣網絡,需要和種子節點聯系,然后種子節點會告訴你他所知道的網絡中的其他節點。節點之間使用tcp鏈接,可以穿透防火墻,退出的時候,不需要任何的操作,當其余節點接收不到你的消息就會將你刪除列表。
Simple , robust ,but not efficient
比特幣設計的原則是簡單、魯棒而不是高效。使用flooding的方式,當一個節點收到消息之后,會將這條消息轉發給相臨近的鄰居,并且記錄這個消息,下次再收到這個消息的時候就不會再次轉發。這個鄰居的含義不是物理層次的,即中國和中國用戶之間轉賬和中國用戶和美國用戶之間轉賬的花費時間是一致的。
有一個大的集合,存儲所有等待寫入區塊鏈的數據,當一條消息第一次加入集合,需要進行轉發給鄰居節點,第二次就不轉發了,避免無限轉發。如果有兩筆交易,A->B和A->C分別被不同的節點接收,假設這兩筆交易使用的是同一個比特幣,接收第一條消息的節點會拒絕接收第二條消息,同樣,接收第二條消息的節點會拒絕接收第一條消息。如果交易被寫入到區塊鏈中,集合存儲的交易就會被刪除。假設,A->B這條消息被存儲到區塊鏈上之后,那么A->C同樣也會被拒絕。
節點每次都會檢查內部存儲的交易的合法性以及十分處于最長節點。
由于網絡的原因,不是所有的節點都會接收到同一筆交易,以及接收到消息的次序不同,以及有的節點不轉發消息1?M字節,因為比特幣耗帶寬。
6,比特幣挖礦難度
為什么要控制挖礦的難度,使其每10分鐘可以出一個區塊?出塊速度快不好嗎?
- 出塊時間很短,那么分叉會成為常態,很有可能會形成一堆的分叉,無止盡。
- 系統的誠實節點越多,系統越來越安全。如果出塊時間縮短,會大幅度降低系統的計算能力,容易被51%估計。惡意節點只需要沿著一條鏈挖礦,很快就會使其成為最長的鏈條。這個時候甚至不需要51%的算力,就可以做惡。
7,全節點和輕節點
合法性檢驗
- 驗證區塊中的每一筆交易是否合法
- 發布的區塊是否符合難度要求
- 區塊是否在最長的鏈上
挖礦歷程
- CPU
- GPU(通用并行計算)
- ASIC芯片(Application?Specific?Integrated?Cirad)專有芯片,只有使用同一個mining?puzzle才可以使用同一個型號的ASIC專屬芯片
相關內容補充
- 貨幣設計的時候采用 ASIC?resistance,防止ASIC專屬芯片挖礦。
- 趨勢:礦池(pool?manager全節點驅動很多礦工(miner),礦工只負責哈希運算,剩余功能全部由礦主負責,比如監聽是否有人挖出區塊,以及分配任務)。
- 參考鏈接:https://www.odaily.com/post/5135179
8,礦工和礦池
如果你運行一個礦池,你將如何給礦工布置任務和發放回報?
礦池就是通過網絡把成千上萬的礦工連接起來聯合挖礦。原理可以簡單理解為:礦池管理員將當前區塊目標 Hash指的計算拆分為更為簡單的目標值給礦工們,比如區塊目標值是需要 Hash 值前面有 70 個 0,礦池管理員會讓礦工們去找滿足 前面有 50 個 0 的 Hash 值;這樣在礦工大量提交的有 50 個 0 開頭的 Hash 指里面,有可能能找到有 70 個 0 開頭的 Hash 值從而贏得該區塊在網絡上的打包權和獎勵。而礦工的工作量統計就可以通過礦工提交的滿足礦池目標 Hash 值的次數來計算。具體回報的發放又可以分為單純按工作量或者根據礦池實際獎勵分紅等方式。
礦池的作用是減小單個礦工的收入不確定性,讓礦工挖礦能成為一個相對波動比較小的固定收入。但礦池管理員同樣會面臨非常有挑戰的問題:如何合理設計礦池獎勵策略、如何面對其他礦池的競爭、如何面對硬件設備的更新換代等。即使這些問題都解決的很好,礦池的獲利還要依賴于對 BTC 價格會上漲的假設;如果投資挖礦還不如直接購買 BTC 來的更具投資屬性,那還有什么人愿意挖礦呢。這就是被稱為 Bitcoin 有可能出現的 “死亡螺旋” 現象:不斷下降的 BTC 價格導致挖礦無利可圖,礦工們因此而退出挖礦,導致全網算力下降,繼而進一步導致價格下跌。
9,匿名性
Privacy:不需要真正的名字,只需要公私鑰
- 比特幣的匿名性分析:輸入地址轉化為 付款地址+找零地址,利用UTXO可以將輸入地址和找零地址關聯起來
- 虛擬賬戶和現實賬戶相互關聯(資金的轉入/轉出),支持比特幣支付的場所,根據消費記錄,將比特幣賬號和實際的人關聯起來。
提高匿名性
- Application?layer:將不同的人發起的交易混在一起,(洗錢網站,將錢幣發過去,再將別人的幣發給我們,有可能會跑路)
- Network?layer:洋蔥路由
- 區塊鏈的不可篡改性對于匿名性是一個災難,如果一次交易行為的不當,泄漏了身份,但是由于不可篡改性,無法修改區塊。
- 參考鏈接?https://www.odaily.com/post/5133827
10,零知識證明
定義:是指一方(證明者)向另一方(驗證者)證明一個陳述是正確的,但是不需要向其透露除了該陳述是正確的以外任何信息。
零知識證明是一種基于概率的驗證方式,驗證的內容包括“事實類陳述”和“關于個人知識的陳述”。驗證者基于一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。零知識證明系統包括兩部分:宣稱某一命題為真的示證者(prover)和確認該命題確實為真的驗證者(verifier)。證明是通過這兩部分之間的交互來執行的。在零知識協議的結尾,驗證者只有當命題為真時才會確認。但是,如果示證者宣稱一個錯誤的命題,那么驗證者完全可能發現這個錯誤。
這里我們給出一個有關零知識證明的非常經典的例子,來幫助大家理解:
阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有打開石門的口令,同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。如果強盜舉起左手,阿里巴巴就使用口令將石門打開,如果舉起右手,就將石門關閉。阿里巴巴就在這個距離下向強盜展示了石門的打開和關閉。如果每次都能正確打開和關閉大門,則證實阿里巴巴確實知道石門的密碼。這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用信息(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道打開石門的方法)是正確的。
11,相關基礎內容
同態隱藏
盲簽
12,專門為了匿名性設計 零幣/零鈔
比特幣在花費的時候會驗證這個幣的產生流程,而零幣只需要證明這個幣沒有被花過即可。不可以溯源,無法關聯。
13,思考
哈希指針是一種抽象的概念,就其數據結構而言,仍然是哈希,沒有指針。使用的是key和value的形式實現的。使用的是levelDB,使用key?value從level?DB里面關聯每一個區塊。
14,區塊戀 引出 安全性
假設戀人雙方一起購買比特幣,將私鑰256位進行拆分,每人掌握128位,或者合伙人每人掌握一段私鑰地址,但是存在一個問題。單獨的破解整個私鑰需要2的256位數的難度,如果進行截取,只需要破解2的128位,這個破解難度不是對半降低的,因為他們之間的難度是遠遠大于的關系。
因此,使用多重簽名來防范安全。每個私鑰都是單獨產生的,還具有只需要m中的n份就可以。
15,公鏈,聯盟鏈,私鏈的劃分
業界對區塊鏈的劃分一般從兩個角度,一個角度按需要達成的共識范圍,分為公鏈(public),聯盟鏈(consortium),私鏈(private),另外一個角度是從賬本生產者加入的方式,分為無許可鏈(permissionless),許可鏈(permissioned),私鏈(private)。
參考鏈接
- 無幣區塊鏈代表未來?淺談聯盟鏈以及對 Hyperledger、 Corda、FISCO BCOS 的比較
- 區塊鏈的技術世界觀