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