北京大學(xué)肖臻老師《區(qū)塊鏈技術(shù)與應(yīng)用》筆記 - BTC篇
BTC 密碼學(xué)原理
-
Hash
-
hash碰撞不易發(fā)生
- 特點(diǎn):
- 存在兩個輸入 x, y, 使得 hash(x) == hash(y); 通常來講hash碰撞是不可避免的, 因?yàn)檩斎肟臻g >> 輸出空間
- 不存在一個好的方法, 主動制造hash碰撞, 唯一的方法就是暴力枚舉.
- 對于一個hash結(jié)果是256位的結(jié)果來說, 通過暴力枚舉, 根據(jù)輸出求輸入, 理論上是可行的, 但是實(shí)際上是不可以行的, 因?yàn)楣ぷ髁刻罅?
- 作用:
- 可用來計(jì)算某個輸入是否被修改, 先 hash(input) = r0并將r0保存, 再次使用input時候不確定input是否被修改, 先計(jì)算hash(input) = r1, 然后通過判斷 r0 == r1 是否成立來確定input是否被修改.
- 特點(diǎn):
-
函數(shù)計(jì)算過程單向, 不可逆
- 特點(diǎn)
- 已知輸入x, 輸出y = hash(x), 無法通過y計(jì)算出x的值.
- 作用
- 配合hash碰撞的特點(diǎn)可以實(shí)現(xiàn)密封信封的結(jié)果, 比如hash(預(yù)測結(jié)果) = r0, 當(dāng)結(jié)果出來之后, hash(結(jié)果) = r1, 然后判斷 r0 == r1 是否成立來判斷預(yù)測結(jié)果是否準(zhǔn)確.
- 特點(diǎn)
-
hash值的結(jié)果, 事先不可預(yù)測.
- 特點(diǎn)
- 無法通過觀察, 直接計(jì)算出某個輸入的hash運(yùn)算后的結(jié)果在某個區(qū)間內(nèi), 只能通過暴力枚舉一個一個的去試.
- 特點(diǎn)
-
hash碰撞不易發(fā)生
簽名
- 比特幣開戶, 只需要生成一對公私鑰. 使用私鑰簽名, 使用公鑰驗(yàn)證簽名.
- 非對稱加密解決了對稱加密秘鑰在網(wǎng)絡(luò)傳輸中的不安全的問題.
- 想通過自己不斷生成公私鑰, 然后對比某個用戶的公鑰, 當(dāng)公鑰相同時候, 就有了對方的公私鑰, 理論上方法可行, 但是概率太小, 小到忽略不計(jì).
BTC 數(shù)據(jù)結(jié)構(gòu)
-
hash指針
- 特點(diǎn)
- 區(qū)塊鏈?zhǔn)且粋€使用hash指針的鏈表, 只需要保存最新的區(qū)塊的hash指針, 如果中間的區(qū)塊發(fā)生改變, 就可以檢測到.
- 保存結(jié)構(gòu)體的地址的同時保存這個結(jié)構(gòu)體的hash值, 這樣可以判斷這個結(jié)構(gòu)體是否被修改過. 當(dāng)修改了區(qū)塊鏈中某個塊的內(nèi)容, 那么這個塊中的hash值就會改變, 那么下一個塊的指向這個塊的hash指針就會變化, 然后后邊的每個塊的hash指針都會變化.
- 可以只保存最近的1000個區(qū)塊, 當(dāng)用到某個區(qū)塊時候, 直接問別的區(qū)塊索要本地保存的最早的區(qū)塊的上一個區(qū)塊, 然后通過判斷本地保存的區(qū)塊的上一個區(qū)塊的hash指針和上一個區(qū)塊的hash值是否相等來判斷索要的區(qū)塊是不是一個惡意區(qū)塊.
- 特點(diǎn)
-
Merkle tree
- 特點(diǎn)
- 使用hash指針代替普通指針
- 只需要保存最新的root hash, 如果其他的區(qū)塊發(fā)生改變, 就可以檢測到.
- 比特幣中每個區(qū)塊之間使用hash指針連接, 每個區(qū)塊內(nèi)交易組織成Merkle tree的形式.
- 用途
-
提供 merkle proof 如下圖: 可以驗(yàn)證某個交易在這區(qū)塊中 復(fù)雜度是log(n), 但是如果驗(yàn)證某個交易不在這個塊中 復(fù)雜度是n, 為了解決復(fù)雜度的問題, 可以使用布隆過濾器(布隆過濾器如果驗(yàn)證不存在, 就一定不存在 ,如果驗(yàn)證存在, 有可能存在.).
8b7fb9b7eb5b42329bc041e9134c4723.png
-
- 特點(diǎn)
-
block
- block header : 本區(qū)塊所包含的所有交易組成的 Merkle tree的root hash 保存在block header中.
- block body : 保存所有交易的列表.
- 輕節(jié)點(diǎn)只包含 block header; 全節(jié)點(diǎn)同時包含 block header 和 block body;
BTC 協(xié)議
-
貨幣的發(fā)行
- 通過挖礦發(fā)行貨幣
-
雙花問題
- 每筆交易都用hash指針指向btc的input和output 其中input是(btc的來源交易和來源交易中接收方的公鑰)和output(本次交易的收款方的公鑰的hash). 通過判斷廣播時候發(fā)送方的公鑰 == input中的公鑰相等判斷是否是合法的交易.
-
區(qū)塊的驗(yàn)證
- 區(qū)塊的驗(yàn)證其實(shí)就是每個節(jié)點(diǎn)收到區(qū)塊的時候, 驗(yàn)證這個新的區(qū)塊是不是一個合法的區(qū)塊, 如果認(rèn)為這個區(qū)塊是合法的, 就會接著這個區(qū)塊后邊繼續(xù)拼接, 如果認(rèn)為這個區(qū)塊不是合法的就會放棄這個區(qū)塊, 等待一個合法的區(qū)塊, 然后再合法的區(qū)塊后邊繼續(xù)拼接.
-
區(qū)塊的結(jié)構(gòu)
-
block heder
- nVersion 版本號: 區(qū)塊的版本號
- hashPrevBlock上一個block header的 hash : 前一個區(qū)塊的hash值, SHA256(SHA256(preview block header));
- hashMerkleRoot merkle tree的root hash : 所有交易組成的merkle tree的根節(jié)點(diǎn)的hash值, SHA256(SHA256(根節(jié)點(diǎn)));
- nTime 時間戳 : 區(qū)塊產(chǎn)生的時間
- nBits 難度目標(biāo) : 工作量證明的算法的難度目標(biāo). hash(block header) <= target;
- nNonce 隨機(jī)數(shù) : 為了找到滿足條件的目標(biāo)所設(shè)定的隨機(jī)數(shù). 現(xiàn)在因?yàn)橥诘V難度變大, nonce的4字節(jié)算出的結(jié)果無法滿足難度目標(biāo), 所以開始使用coinbase域的前8個字節(jié)當(dāng)做extra-nonce來使用, 所以真正挖礦的時候, 會有兩層循環(huán), 外層循環(huán)調(diào)整coinbase域的extra-nonce耍铜,算出block header里的根Hash值之后,內(nèi)層循環(huán)再調(diào)整block header里的nonce。
-
通常在塊時, 出塊獎勵的那個交易的input是沒有輸入的, 通常這個input的字段的被稱為coinBase域, 通常改變coinbase域, 會改變header中的hashMerkleRoot 從而改變 header的hash.
image.png
-
block body
- 交易列表
-
-
節(jié)點(diǎn)分類
- 全節(jié)點(diǎn): 通常是挖礦即爭奪記賬權(quán),打包區(qū)塊的時候使用.
- 一直在線
- 從本地硬盤上維護(hù)完整的區(qū)塊鏈信息
- 從內(nèi)存里維護(hù)UTXO集合, 以便快速檢驗(yàn)交易的正確性
- 監(jiān)聽比特幣網(wǎng)絡(luò)上的交易信息, 驗(yàn)證每個交易的合法性
- 有沒有合法的簽名
- 是不是double spending
- 決定那些交易會被打包到區(qū)塊中
- 合法的交易
- 交易費(fèi)符合要求
- 監(jiān)聽別的礦工挖出來的區(qū)塊, 驗(yàn)證其合法性
- 區(qū)塊中的每個交易都必須合法, 包括鑄幣交易.
- 有沒有篡改 block reward, 發(fā)布的區(qū)塊是否符合難度要求, block header中的難度目標(biāo)閾值設(shè)置是不是正確的
- 區(qū)塊是在延伸最長合法鏈.
- 每兩周按照比特幣協(xié)議的要去調(diào)整挖礦難度
- 挖礦
- 缺省情況下沿著最長合法鏈挖下去.
- 當(dāng)出現(xiàn)等長的分叉的時候, 缺省情況下是沿著最先接收到的分叉繼續(xù)挖下去的.
- 輕節(jié)點(diǎn) : 通常只轉(zhuǎn)賬, 不挖礦時候用輕節(jié)點(diǎn).
- 不是一直在線
- 不用保存整個區(qū)塊鏈, 只要保存每個區(qū)塊的塊頭.
- 不用保存全部交易, 只保存與自己相關(guān)的交易.
- 無法驗(yàn)證大多數(shù)交易的合法性(因?yàn)闆]有保存完整的交易信息, 無法檢測double spending), 只能檢測與自己相關(guān)的那些交易的合法性.
- 無法檢測網(wǎng)上發(fā)布的區(qū)塊的正確性(無法檢測區(qū)塊中所包含的交易的合法性)
- 可以驗(yàn)證挖礦的難度
- 只能檢測哪個是最長鏈, 不知道那個是最長合法鏈.
- 全節(jié)點(diǎn): 通常是挖礦即爭奪記賬權(quán),打包區(qū)塊的時候使用.
-
賬本的內(nèi)容要取得分布式共識
- pow(工作量證明)機(jī)制, 通過算力(并且通過驗(yàn)證, 即 1. 有合法的簽名; 2. 沒有雙花問題)決定誰有權(quán)利寫入下一個區(qū)塊.
- 通常新生成的區(qū)塊是拼接在尾部的, 如果一個新生成了區(qū)塊是接在中間位置的, 通常這個區(qū)塊是不會別接受的.
- 區(qū)塊鏈能接受的區(qū)塊應(yīng)該是在擴(kuò)展最長的合法鏈;
- 所謂接受這個區(qū)塊, 是指的沿著這個區(qū)塊繼續(xù)往下擴(kuò)展, 就視為接受了這個區(qū)塊.
-
最長鏈原則
- 當(dāng)同時有兩個區(qū)塊同時生成并將自己廣播出去, 那么其他用戶可能有的用戶先收到block1, 有的用戶先收到block2, 這時候會分叉成兩個鏈, 直到其中一個鏈領(lǐng)先又提交了下一個區(qū)塊. 這時候就以先提交區(qū)塊的鏈作為最長合法鏈.
BTC 實(shí)現(xiàn)
-
記賬方式
- UTXO(還沒有被花出去的交易的輸出, 比特幣中使用, 可以有效的抵御雙花問題) : 比特幣的全節(jié)點(diǎn)需要在內(nèi)存中維護(hù)UTXO的數(shù)據(jù)結(jié)構(gòu), 以便快速檢測雙花問題. UTXO集合中的每個元素需要給出產(chǎn)生輸出的這個交易的hash值以及他在這個交易中是第幾個輸出,通過這兩個信息可以定位出一個UTXO的輸出, 每個要花出去的幣必須是在這個集合中才是合法的, 如果不在這個集合中就是不合法的. 通過這個集合可以找出每個幣的來源. 每個交易會消耗一些輸出同時也會產(chǎn)生新的輸出.
- 基于賬戶的記賬方式(以太坊中使用)
-
比特幣激勵機(jī)制
- 打包獎勵 : 將交易打包到區(qū)塊中的獎勵. 這樣可以讓每個節(jié)點(diǎn)去打包更多的交易.
- 出塊獎勵 : 打包出區(qū)塊的獎勵. 讓更多人去參與挖礦.
-
交易確認(rèn)
- 在比特幣協(xié)議中,默認(rèn)在包含該交易的區(qū)塊后有6個新增的區(qū)塊,這時才能認(rèn)為交易成功。以平均10分鐘的出塊時間記,需要在交易發(fā)起一小時后才能確認(rèn)交易强岸。
BTC 網(wǎng)絡(luò)
- 比特幣協(xié)議工作在應(yīng)用層, 它的底層是一個P2P網(wǎng)絡(luò),
- 各個網(wǎng)絡(luò)節(jié)點(diǎn)之間使用tcp通信(穿透防火墻), 當(dāng)某個節(jié)點(diǎn)離開時候, 無需通知其他節(jié)點(diǎn), 其他節(jié)點(diǎn)在長時間收不到某個節(jié)點(diǎn)的消息時候, 會將這個節(jié)點(diǎn)自動刪除.
- 每個節(jié)點(diǎn)都會維護(hù)一個交易池, 存放未確認(rèn)的交易, 當(dāng)節(jié)點(diǎn)第一次收到某個交易時, 先確認(rèn)這是一個合法的交易, 然后會將這個交易放入交易池中, 并將這個消息轉(zhuǎn)發(fā)給鄰居節(jié)點(diǎn)(鄰居節(jié)點(diǎn)選取是隨機(jī)的, 可能一個在自己家樓下, 另一個在鄰居節(jié)點(diǎn)在另一個國家) , 之后在收到這個交易就不會轉(zhuǎn)發(fā)了, 避免交易在網(wǎng)絡(luò)上無限傳輸.
- 比特幣協(xié)議對區(qū)塊的大小限制在1M字節(jié)大小
BTC 挖礦難度
- 比特幣使用SHA-256的hash算法, 產(chǎn)生的hash值是256位的. 比特幣通過調(diào)整目標(biāo)空間占輸出空間的比例(hash值的前多少位是0)來調(diào)整挖礦難度; 比如對于256位的hash值來說, 要求前邊至少有70個0;
- 挖礦難度和目標(biāo)閾值成反比, difficulty = difficulty_1_target/target, difficulty_1_target指挖礦難度為1時的目標(biāo)閾值位target,也就是說挖礦難度的最小值是1;
-
為什么需要調(diào)整挖礦難度
- 隨著系統(tǒng)總算力越來越強(qiáng), 不調(diào)整難度, 出塊時間就會越來越短, 如果出塊時間 >> 塊在網(wǎng)絡(luò)上發(fā)布的傳輸時間(>>表示遠(yuǎn)遠(yuǎn)大于), 別的節(jié)點(diǎn)在收到這個塊之前還會繼續(xù)沿著已有的區(qū)塊鏈繼續(xù)擴(kuò)展, 如果同一時間出現(xiàn)多個節(jié)點(diǎn), 就會分叉, 而分叉過多是不利于分布共識的, 而且還會分散礦工算力(系統(tǒng)中的礦工分散在多個節(jié)點(diǎn)上), 這樣惡意節(jié)點(diǎn)攻擊的成本會降低(原本惡意節(jié)點(diǎn)攻擊成功的要求是掌握51%的算例, 現(xiàn)在只要多個惡意節(jié)點(diǎn)同時攻擊某一條鏈可能只要15%的算力就可以了).
- 在比特幣中, 每隔2016個區(qū)塊(2個星期), 就會調(diào)整一次挖礦難度. 公式 : newTarget = lastTarget?(最近的2016個區(qū)塊挖出的耗時(單位是min)/2016 * 10) . 實(shí)際上砾赔,上調(diào)和下調(diào)都有四倍的限制蝌箍,即實(shí)際時間超過8個星期,也只能按4倍算暴心,目標(biāo)閾值增大最多只能增大4倍妓盲。
- 如果惡意節(jié)點(diǎn)不調(diào)整target, 檢查不通過,其它節(jié)點(diǎn)就不會接受該區(qū)塊. nBits是target編碼后的版本专普,在blocke header里沒有直接存儲target的域悯衬。因?yàn)閠arget的域是256位,直接存儲的話要32個字節(jié)檀夹,nBits只有4個字節(jié)筋粗,所以可以認(rèn)為nBits是target編碼后的。如果有惡意節(jié)點(diǎn)在該調(diào)的時候不調(diào)炸渡,它生成的區(qū)塊在發(fā)布到網(wǎng)絡(luò)上時娜亿,其它節(jié)點(diǎn)會先檢查該區(qū)塊的合法性。檢查的內(nèi)容就包括nBits蚌堵,檢查不通過买决,其它節(jié)點(diǎn)就不會接受該區(qū)塊.
BTC 挖礦
-
如何保證安全性
- 密碼學(xué)的保證
- 別人沒有私鑰就無法偽造簽名,就無法將賬上的前轉(zhuǎn)走.
- 共識機(jī)制
- 系統(tǒng)中擁有大多數(shù)算力的礦工是誠實(shí)礦工.不會接受沒有合法簽名的交易.
- 密碼學(xué)的保證
- 挖礦設(shè)備
- CPU -> GPU -> ASIC
- 礦池
- 職責(zé)劃分
- 礦主: 實(shí)現(xiàn)除了挖礦以外的全節(jié)點(diǎn)的其他功能.
- 礦工: 只實(shí)現(xiàn)挖礦的功能. 只計(jì)算hash值.
- 獎勵分配
- 按照貢獻(xiàn)率分配獎勵, 礦工的貢獻(xiàn)采用的也是POW的方式, 通常挖礦的難度是70個0, 礦池要求的難度會降低, 例如計(jì)算貢獻(xiàn)的難度是60個0, 每個礦工挖礦的時候如果產(chǎn)生60個0就將這個計(jì)算結(jié)果提交給礦主, 然后礦主統(tǒng)計(jì)貢獻(xiàn)率.
- 好處
- 加入礦池之前, 礦工之后挖出區(qū)塊才會有收益, 但是通過加入礦池, 礦工收入的穩(wěn)定性提高了, 因?yàn)槿绻腥送诔鰠^(qū)塊, 就會按照貢獻(xiàn)率分配給礦工.
- 超大礦池產(chǎn)生的問題
- 很多礦池開始通過降低管理費(fèi)吸引大量礦工, 這就導(dǎo)致了超大礦池的出現(xiàn), 超大礦池的出現(xiàn)可能會出現(xiàn)某些礦池的算力 > 全網(wǎng)算力的51%, 這使得分叉攻擊變得容易, 還可以拒絕將某個賬戶的的交易上鏈, 但是還是無法都去他人的賬戶的比特幣.
- 分叉攻擊: 當(dāng)一個塊已經(jīng)產(chǎn)生后已經(jīng)有6個確認(rèn)塊了, 這時候很多人認(rèn)為這個交易已經(jīng)安全了, 但是如果這時候大型惡意礦池生成一個新的塊并將這個新的塊添加到區(qū)塊的前一個區(qū)塊, 就會產(chǎn)生分叉, 而此時惡意礦池的算力 > 51%, 隨著時間的推移這個新產(chǎn)生的分叉的長度最終終會>之前產(chǎn)生分叉的長度, 這時候新產(chǎn)生的分叉就成了最長合法鏈.
- 拒絕將某個賬戶的的交易上鏈: 每當(dāng)有人把包含某個人賬戶的交易的區(qū)塊發(fā)布到區(qū)塊鏈上, 惡意礦池馬上進(jìn)行分叉(不需要等待6個確認(rèn)區(qū)塊). 產(chǎn)生一個不包含這個交易的區(qū)塊. 所有和這個交易有關(guān)的區(qū)塊/和這個賬戶有關(guān)的交易都不包含在區(qū)塊中.
- 惡意競爭
- 當(dāng)?shù)V工挖到了區(qū)塊沛婴,但是不將這個結(jié)果發(fā)送給礦池,礦池就不會得到出塊獎勵督赤。礦池之間是競爭關(guān)系嘁灯,可能將自己的節(jié)點(diǎn)加入對手的礦池,搞一些破壞够挂,分散對手的算力旁仿。
- 很多礦池開始通過降低管理費(fèi)吸引大量礦工, 這就導(dǎo)致了超大礦池的出現(xiàn), 超大礦池的出現(xiàn)可能會出現(xiàn)某些礦池的算力 > 全網(wǎng)算力的51%, 這使得分叉攻擊變得容易, 還可以拒絕將某個賬戶的的交易上鏈, 但是還是無法都去他人的賬戶的比特幣.
- 職責(zé)劃分
BTC 挖礦腳本
BTC 分叉
- 硬分叉 : 協(xié)議升級, 未升級協(xié)議的節(jié)點(diǎn)不認(rèn)可特性, 認(rèn)為節(jié)點(diǎn)特性是非法的. 而升級協(xié)議的節(jié)點(diǎn)認(rèn)特性.
- 區(qū)塊大小變?yōu)?M, 這時候未升級的節(jié)點(diǎn)認(rèn)為這是非法區(qū)塊, 而系統(tǒng)中擁有多數(shù)算力的節(jié)點(diǎn)更新了協(xié)議, 認(rèn)可這個節(jié)點(diǎn)特性. 這時候系統(tǒng)運(yùn)行起來, 只要舊的節(jié)點(diǎn)不升級, 那么這個分叉就會永久存在. 不會消失.
- 必須系統(tǒng)中所有的節(jié)點(diǎn)都節(jié)點(diǎn)都升級, 系統(tǒng)才不會出現(xiàn)永久性的分叉. 如果系統(tǒng)中少部分的節(jié)點(diǎn)一直不更新, 系統(tǒng)就會分成兩條鏈.
- 軟分叉: 協(xié)議加一些限制, 未升級的協(xié)議的節(jié)點(diǎn)認(rèn)為這個節(jié)點(diǎn)特性是合法的, 而升級的協(xié)議認(rèn)為這個節(jié)點(diǎn)特性是非法的.
- 區(qū)塊大小限制為0.5M, 這時候未升級的節(jié)點(diǎn)認(rèn)為這個是合法的區(qū)塊, 而系統(tǒng)中擁有多數(shù)算力的節(jié)點(diǎn)更新了新的協(xié)議, 不認(rèn)可這個節(jié)點(diǎn)特性, 這時候系統(tǒng)運(yùn)行起來, 因?yàn)樾鹿?jié)點(diǎn)不認(rèn)可舊的節(jié)點(diǎn), 舊的節(jié)點(diǎn)認(rèn)可新的節(jié)點(diǎn), 這時候, 新節(jié)點(diǎn)就會成為最長合法鏈, 舊的節(jié)點(diǎn)挖出了區(qū)塊只能也不會被認(rèn)可, 這種分叉不是永久保留的.
- 只要系統(tǒng)中擁有半數(shù)以上算力的節(jié)點(diǎn)更新了軟件,系統(tǒng)就不會出現(xiàn)永久性的分叉, 可能有一些臨時性的分叉, 但是不會有永久性的分叉.
BTC 匿名性
- 網(wǎng)絡(luò)層的匿名性
- BTC 本身具有匿名性, 但是如果BTC和現(xiàn)實(shí)世界產(chǎn)生交互(購物, 提現(xiàn)) 匿名性就會遭到破壞.
- 匿名性的實(shí)現(xiàn)方案
- 使用多路徑轉(zhuǎn)發(fā), 消息不是由發(fā)出者直接發(fā)送給接收者, 中間經(jīng)過多次轉(zhuǎn)發(fā), 中間的每個節(jié)點(diǎn)只知道上一個節(jié)點(diǎn)是誰, 但并不知道最早發(fā)出消息的人.
- 應(yīng)用層的匿名性
- 把不同的人的幣混在一起(coin mixing). 用戶將幣發(fā)給做coin mixing的網(wǎng)站, 網(wǎng)站內(nèi)進(jìn)行重組, 然后再把幣取回來, 這時取出的bi不再是發(fā)布到網(wǎng)絡(luò)上的幣, 而是隨機(jī)抽取的幣.
- 還可以通過交易所實(shí)現(xiàn)應(yīng)用層的加密, 交易所天然具有coin mixing的特性.
- 零知識證明
- 證明者向驗(yàn)證者證明一個陳述是正確的, 而無需透漏該陳述是正確的外的任何信息.
- 同態(tài)隱藏
- 加密數(shù)值E不會出現(xiàn)碰撞, 反過來說就是 如果E(x) == E(y), 那么 x== y;
- 加密函數(shù)不可逆, y = E(x), 可以通過 E(x) 計(jì)算出y, 但是無法通過 y 計(jì)算出x;
- 加密后的函數(shù)進(jìn)行某些代數(shù)運(yùn)算 == 輸入進(jìn)行代數(shù)運(yùn)算后直接進(jìn)行加密
- 同態(tài)加法: 加密值的和 == 和的加密
- 同態(tài)乘法: 加密值的積 == 積的加密
BTC 零碎知識
- hash指針
- 實(shí)際上所謂的hash指針知識一個形象的說法, 時機(jī)系統(tǒng)中用的時候, 只有hash, 沒有指針, 通常全節(jié)點(diǎn)會把這些區(qū)塊保存在key-value的數(shù)據(jù)庫(levelDB)中, hash值作為key, 區(qū)塊作為value, 所謂的區(qū)塊鏈這種鏈表的結(jié)構(gòu)實(shí)際上是在levelDB里面用hash值計(jì)算出來的. 只要有最后一個區(qū)塊的hash值, 就可以通過levelDB查找到對應(yīng)的區(qū)塊, 然后找到這個區(qū)塊, 在這個區(qū)塊頭中就可以找到上一個區(qū)塊的hash, 通過這個hash就可以找到上一個區(qū)塊.
- hash指針保存的是本地的內(nèi)存地址, 這種地址只有在本地計(jì)算機(jī)上才有意義, 發(fā)送到其他計(jì)算機(jī)上市沒有意義的, 那么在發(fā)布區(qū)塊的時候hash指針是怎么通過網(wǎng)絡(luò)傳輸?shù)哪?
- 不可以將一個私鑰分成多斷, 然后每個人保存一部分,
- 因?yàn)樗借€是256位的, 如果兩人保存, 那么每個人就是 128位, 如果四個人保存, 每人64位, 這樣私鑰猜出的難度就會指數(shù)級的下降.
- 加密和hash是不同的, 是兩回事, 加密是為了將來還能解密, 取hash是無法解密的 是有數(shù)據(jù)丟失的
知識改變命運(yùn), 但是對知識的一知半解有可能是你的命運(yùn)變得更差