區(qū)塊鏈技術(shù)與應(yīng)用(一)

北京大學(xué)肖臻老師《區(qū)塊鏈技術(shù)與應(yīng)用》筆記 - BTC篇

BTC 密碼學(xué)原理

  • Hash

    • hash碰撞不易發(fā)生
      • 特點(diǎn):
        • 存在兩個(gè)輸入 x, y, 使得 hash(x) == hash(y); 通常來講hash碰撞是不可避免的, 因?yàn)檩斎肟臻g >> 輸出空間
        • 不存在一個(gè)好的方法, 主動(dòng)制造hash碰撞, 唯一的方法就是暴力枚舉.
        • 對(duì)于一個(gè)hash結(jié)果是256位的結(jié)果來說, 通過暴力枚舉, 根據(jù)輸出求輸入, 理論上是可行的, 但是實(shí)際上是不可以行的, 因?yàn)楣ぷ髁刻罅?
      • 作用:
        • 可用來計(jì)算某個(gè)輸入是否被修改, 先 hash(input) = r0并將r0保存, 再次使用input時(shí)候不確定input是否被修改, 先計(jì)算hash(input) = r1, 然后通過判斷 r0 == r1 是否成立來確定input是否被修改.
    • 函數(shù)計(jì)算過程單向, 不可逆
      • 特點(diǎn)
        • 已知輸入x, 輸出y = hash(x), 無法通過y計(jì)算出x的值.
      • 作用
        • 配合hash碰撞的特點(diǎn)可以實(shí)現(xiàn)密封信封的結(jié)果, 比如hash(預(yù)測(cè)結(jié)果) = r0, 當(dāng)結(jié)果出來之后, hash(結(jié)果) = r1, 然后判斷 r0 == r1 是否成立來判斷預(yù)測(cè)結(jié)果是否準(zhǔn)確.
    • hash值的結(jié)果, 事先不可預(yù)測(cè).
      • 特點(diǎn)
        • 無法通過觀察, 直接計(jì)算出某個(gè)輸入的hash運(yùn)算后的結(jié)果在某個(gè)區(qū)間內(nèi), 只能通過暴力枚舉一個(gè)一個(gè)的去試.
  • 簽名
    - 比特幣開戶, 只需要生成一對(duì)公私鑰. 使用私鑰簽名, 使用公鑰驗(yàn)證簽名.
    - 非對(duì)稱加密解決了對(duì)稱加密秘鑰在網(wǎng)絡(luò)傳輸中的不安全的問題.
    - 想通過自己不斷生成公私鑰, 然后對(duì)比某個(gè)用戶的公鑰, 當(dāng)公鑰相同時(shí)候, 就有了對(duì)方的公私鑰, 理論上方法可行, 但是概率太小, 小到忽略不計(jì).

BTC 數(shù)據(jù)結(jié)構(gòu)

  • hash指針
    • 特點(diǎn)
      • 區(qū)塊鏈?zhǔn)且粋€(gè)使用hash指針的鏈表, 只需要保存最新的區(qū)塊的hash指針, 如果中間的區(qū)塊發(fā)生改變, 就可以檢測(cè)到.
      • 保存結(jié)構(gòu)體的地址的同時(shí)保存這個(gè)結(jié)構(gòu)體的hash值, 這樣可以判斷這個(gè)結(jié)構(gòu)體是否被修改過. 當(dāng)修改了區(qū)塊鏈中某個(gè)塊的內(nèi)容, 那么這個(gè)塊中的hash值就會(huì)改變, 那么下一個(gè)塊的指向這個(gè)塊的hash指針就會(huì)變化, 然后后邊的每個(gè)塊的hash指針都會(huì)變化.
      • 可以只保存最近的1000個(gè)區(qū)塊, 當(dāng)用到某個(gè)區(qū)塊時(shí)候, 直接問別的區(qū)塊索要本地保存的最早的區(qū)塊的上一個(gè)區(qū)塊, 然后通過判斷本地保存的區(qū)塊的上一個(gè)區(qū)塊的hash指針和上一個(gè)區(qū)塊的hash值是否相等來判斷索要的區(qū)塊是不是一個(gè)惡意區(qū)塊.
  • Merkle tree
    • 特點(diǎn)
      • 使用hash指針代替普通指針
      • 只需要保存最新的root hash, 如果其他的區(qū)塊發(fā)生改變, 就可以檢測(cè)到.
      • 比特幣中每個(gè)區(qū)塊之間使用hash指針連接, 每個(gè)區(qū)塊內(nèi)交易組織成Merkle tree的形式.
    • 用途
      • 提供 merkle proof 如下圖: 可以驗(yàn)證某個(gè)交易在這區(qū)塊中 復(fù)雜度是log(n), 但是如果驗(yàn)證某個(gè)交易不在這個(gè)塊中 復(fù)雜度是n, 為了解決復(fù)雜度的問題, 可以使用布隆過濾器(布隆過濾器如果驗(yàn)證不存在, 就一定不存在 ,如果驗(yàn)證存在, 有可能存在.).


        8b7fb9b7eb5b42329bc041e9134c4723.png
  • block
    • block header : 本區(qū)塊所包含的所有交易組成的 Merkle tree的root hash 保存在block header中.
    • block body : 保存所有交易的列表.
    • 輕節(jié)點(diǎn)只包含 block header; 全節(jié)點(diǎn)同時(shí)包含 block header 和 block body;

BTC 協(xié)議

  • 貨幣的發(fā)行
    • 通過挖礦發(fā)行貨幣
  • 雙花問題
    • 每筆交易都用hash指針指向btc的input和output 其中input是(btc的來源交易和來源交易中接收方的公鑰)和output(本次交易的收款方的公鑰的hash). 通過判斷廣播時(shí)候發(fā)送方的公鑰 == input中的公鑰相等判斷是否是合法的交易.
  • 區(qū)塊的驗(yàn)證
    • 區(qū)塊的驗(yàn)證其實(shí)就是每個(gè)節(jié)點(diǎn)收到區(qū)塊的時(shí)候, 驗(yàn)證這個(gè)新的區(qū)塊是不是一個(gè)合法的區(qū)塊, 如果認(rèn)為這個(gè)區(qū)塊是合法的, 就會(huì)接著這個(gè)區(qū)塊后邊繼續(xù)拼接, 如果認(rèn)為這個(gè)區(qū)塊不是合法的就會(huì)放棄這個(gè)區(qū)塊, 等待一個(gè)合法的區(qū)塊, 然后再合法的區(qū)塊后邊繼續(xù)拼接.
  • 區(qū)塊的結(jié)構(gòu)
    • block heder

      • nVersion 版本號(hào): 區(qū)塊的版本號(hào)
      • hashPrevBlock上一個(gè)block header的 hash : 前一個(gè)區(qū)塊的hash值, SHA256(SHA256(preview block header));
      • hashMerkleRoot merkle tree的root hash : 所有交易組成的merkle tree的根節(jié)點(diǎn)的hash值, SHA256(SHA256(根節(jié)點(diǎn)));
      • nTime 時(shí)間戳 : 區(qū)塊產(chǎn)生的時(shí)間
      • 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個(gè)字節(jié)當(dāng)做extra-nonce來使用, 所以真正挖礦的時(shí)候, 會(huì)有兩層循環(huán), 外層循環(huán)調(diào)整coinbase域的extra-nonce,算出block header里的根Hash值之后,內(nèi)層循環(huán)再調(diào)整block header里的nonce。
      • 通常在塊時(shí), 出塊獎(jiǎng)勵(lì)的那個(gè)交易的input是沒有輸入的, 通常這個(gè)input的字段的被稱為coinBase域, 通常改變coinbase域, 會(huì)改變header中的hashMerkleRoot 從而改變 header的hash.


        image.png
    • block body

      • 交易列表
  • 節(jié)點(diǎn)分類
    • 全節(jié)點(diǎn): 通常是挖礦即爭(zhēng)奪記賬權(quán),打包區(qū)塊的時(shí)候使用.
      • 一直在線
      • 從本地硬盤上維護(hù)完整的區(qū)塊鏈信息
      • 從內(nèi)存里維護(hù)UTXO集合, 以便快速檢驗(yàn)交易的正確性
      • 監(jiān)聽比特幣網(wǎng)絡(luò)上的交易信息, 驗(yàn)證每個(gè)交易的合法性
        • 有沒有合法的簽名
        • 是不是double spending
      • 決定那些交易會(huì)被打包到區(qū)塊中
        • 合法的交易
        • 交易費(fèi)符合要求
      • 監(jiān)聽別的礦工挖出來的區(qū)塊, 驗(yàn)證其合法性
        • 區(qū)塊中的每個(gè)交易都必須合法, 包括鑄幣交易.
        • 有沒有篡改 block reward, 發(fā)布的區(qū)塊是否符合難度要求, block header中的難度目標(biāo)閾值設(shè)置是不是正確的
        • 區(qū)塊是在延伸最長(zhǎng)合法鏈.
      • 每?jī)芍馨凑毡忍貛艆f(xié)議的要去調(diào)整挖礦難度
      • 挖礦
        • 缺省情況下沿著最長(zhǎng)合法鏈挖下去.
        • 當(dāng)出現(xiàn)等長(zhǎng)的分叉的時(shí)候, 缺省情況下是沿著最先接收到的分叉繼續(xù)挖下去的.
    • 輕節(jié)點(diǎn) : 通常只轉(zhuǎn)賬, 不挖礦時(shí)候用輕節(jié)點(diǎn).
      • 不是一直在線
      • 不用保存整個(gè)區(qū)塊鏈, 只要保存每個(gè)區(qū)塊的塊頭.
      • 不用保存全部交易, 只保存與自己相關(guān)的交易.
      • 無法驗(yàn)證大多數(shù)交易的合法性(因?yàn)闆]有保存完整的交易信息, 無法檢測(cè)double spending), 只能檢測(cè)與自己相關(guān)的那些交易的合法性.
      • 無法檢測(cè)網(wǎng)上發(fā)布的區(qū)塊的正確性(無法檢測(cè)區(qū)塊中所包含的交易的合法性)
      • 可以驗(yàn)證挖礦的難度
      • 只能檢測(cè)哪個(gè)是最長(zhǎng)鏈, 不知道那個(gè)是最長(zhǎng)合法鏈.
  • 賬本的內(nèi)容要取得分布式共識(shí)
    • pow(工作量證明)機(jī)制, 通過算力(并且通過驗(yàn)證, 即 1. 有合法的簽名; 2. 沒有雙花問題)決定誰有權(quán)利寫入下一個(gè)區(qū)塊.
    • 通常新生成的區(qū)塊是拼接在尾部的, 如果一個(gè)新生成了區(qū)塊是接在中間位置的, 通常這個(gè)區(qū)塊是不會(huì)別接受的.
      • 區(qū)塊鏈能接受的區(qū)塊應(yīng)該是在擴(kuò)展最長(zhǎng)的合法鏈;
      • 所謂接受這個(gè)區(qū)塊, 是指的沿著這個(gè)區(qū)塊繼續(xù)往下擴(kuò)展, 就視為接受了這個(gè)區(qū)塊.
  • 最長(zhǎng)鏈原則
    • 當(dāng)同時(shí)有兩個(gè)區(qū)塊同時(shí)生成并將自己廣播出去, 那么其他用戶可能有的用戶先收到block1, 有的用戶先收到block2, 這時(shí)候會(huì)分叉成兩個(gè)鏈, 直到其中一個(gè)鏈領(lǐng)先又提交了下一個(gè)區(qū)塊. 這時(shí)候就以先提交區(qū)塊的鏈作為最長(zhǎng)合法鏈.

BTC 實(shí)現(xiàn)

  • 記賬方式
    • UTXO(還沒有被花出去的交易的輸出, 比特幣中使用, 可以有效的抵御雙花問題) : 比特幣的全節(jié)點(diǎn)需要在內(nèi)存中維護(hù)UTXO的數(shù)據(jù)結(jié)構(gòu), 以便快速檢測(cè)雙花問題. UTXO集合中的每個(gè)元素需要給出產(chǎn)生輸出的這個(gè)交易的hash值以及他在這個(gè)交易中是第幾個(gè)輸出,通過這兩個(gè)信息可以定位出一個(gè)UTXO的輸出, 每個(gè)要花出去的幣必須是在這個(gè)集合中才是合法的, 如果不在這個(gè)集合中就是不合法的. 通過這個(gè)集合可以找出每個(gè)幣的來源. 每個(gè)交易會(huì)消耗一些輸出同時(shí)也會(huì)產(chǎn)生新的輸出.
    • 基于賬戶的記賬方式(以太坊中使用)
  • 比特幣激勵(lì)機(jī)制
    • 打包獎(jiǎng)勵(lì) : 將交易打包到區(qū)塊中的獎(jiǎng)勵(lì). 這樣可以讓每個(gè)節(jié)點(diǎn)去打包更多的交易.
    • 出塊獎(jiǎng)勵(lì) : 打包出區(qū)塊的獎(jiǎng)勵(lì). 讓更多人去參與挖礦.
  • 交易確認(rèn)
    • 在比特幣協(xié)議中,默認(rèn)在包含該交易的區(qū)塊后有6個(gè)新增的區(qū)塊,這時(shí)才能認(rèn)為交易成功。以平均10分鐘的出塊時(shí)間記,需要在交易發(fā)起一小時(shí)后才能確認(rèn)交易。

BTC 網(wǎng)絡(luò)

  • 比特幣協(xié)議工作在應(yīng)用層, 它的底層是一個(gè)P2P網(wǎng)絡(luò),
  • 各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)之間使用tcp通信(穿透防火墻), 當(dāng)某個(gè)節(jié)點(diǎn)離開時(shí)候, 無需通知其他節(jié)點(diǎn), 其他節(jié)點(diǎn)在長(zhǎng)時(shí)間收不到某個(gè)節(jié)點(diǎn)的消息時(shí)候, 會(huì)將這個(gè)節(jié)點(diǎn)自動(dòng)刪除.
  • 每個(gè)節(jié)點(diǎn)都會(huì)維護(hù)一個(gè)交易池, 存放未確認(rèn)的交易, 當(dāng)節(jié)點(diǎn)第一次收到某個(gè)交易時(shí), 先確認(rèn)這是一個(gè)合法的交易, 然后會(huì)將這個(gè)交易放入交易池中, 并將這個(gè)消息轉(zhuǎn)發(fā)給鄰居節(jié)點(diǎn)(鄰居節(jié)點(diǎn)選取是隨機(jī)的, 可能一個(gè)在自己家樓下, 另一個(gè)在鄰居節(jié)點(diǎn)在另一個(gè)國(guó)家) , 之后在收到這個(gè)交易就不會(huì)轉(zhuǎn)發(fā)了, 避免交易在網(wǎng)絡(luò)上無限傳輸.
  • 比特幣協(xié)議對(duì)區(qū)塊的大小限制在1M字節(jié)大小

BTC 挖礦難度

  • 比特幣使用SHA-256的hash算法, 產(chǎn)生的hash值是256位的. 比特幣通過調(diào)整目標(biāo)空間占輸出空間的比例(hash值的前多少位是0)來調(diào)整挖礦難度; 比如對(duì)于256位的hash值來說, 要求前邊至少有70個(gè)0;
  • 挖礦難度和目標(biāo)閾值成反比, difficulty = difficulty_1_target/target, difficulty_1_target指挖礦難度為1時(shí)的目標(biāo)閾值位target,也就是說挖礦難度的最小值是1;
  • 為什么需要調(diào)整挖礦難度
    • 隨著系統(tǒng)總算力越來越強(qiáng), 不調(diào)整難度, 出塊時(shí)間就會(huì)越來越短, 如果出塊時(shí)間 >> 塊在網(wǎng)絡(luò)上發(fā)布的傳輸時(shí)間(>>表示遠(yuǎn)遠(yuǎn)大于), 別的節(jié)點(diǎn)在收到這個(gè)塊之前還會(huì)繼續(xù)沿著已有的區(qū)塊鏈繼續(xù)擴(kuò)展, 如果同一時(shí)間出現(xiàn)多個(gè)節(jié)點(diǎn), 就會(huì)分叉, 而分叉過多是不利于分布共識(shí)的, 而且還會(huì)分散礦工算力(系統(tǒng)中的礦工分散在多個(gè)節(jié)點(diǎn)上), 這樣惡意節(jié)點(diǎn)攻擊的成本會(huì)降低(原本惡意節(jié)點(diǎn)攻擊成功的要求是掌握51%的算例, 現(xiàn)在只要多個(gè)惡意節(jié)點(diǎn)同時(shí)攻擊某一條鏈可能只要15%的算力就可以了).
    • 在比特幣中, 每隔2016個(gè)區(qū)塊(2個(gè)星期), 就會(huì)調(diào)整一次挖礦難度. 公式 : newTarget = lastTarget?(最近的2016個(gè)區(qū)塊挖出的耗時(shí)(單位是min)/2016 * 10) . 實(shí)際上,上調(diào)和下調(diào)都有四倍的限制,即實(shí)際時(shí)間超過8個(gè)星期,也只能按4倍算,目標(biāo)閾值增大最多只能增大4倍。
    • 如果惡意節(jié)點(diǎn)不調(diào)整target, 檢查不通過,其它節(jié)點(diǎn)就不會(huì)接受該區(qū)塊. nBits是target編碼后的版本,在blocke header里沒有直接存儲(chǔ)target的域。因?yàn)閠arget的域是256位,直接存儲(chǔ)的話要32個(gè)字節(jié),nBits只有4個(gè)字節(jié),所以可以認(rèn)為nBits是target編碼后的。如果有惡意節(jié)點(diǎn)在該調(diào)的時(shí)候不調(diào),它生成的區(qū)塊在發(fā)布到網(wǎng)絡(luò)上時(shí),其它節(jié)點(diǎn)會(huì)先檢查該區(qū)塊的合法性。檢查的內(nèi)容就包括nBits,檢查不通過,其它節(jié)點(diǎn)就不會(huì)接受該區(qū)塊.

BTC 挖礦

  • 如何保證安全性
    • 密碼學(xué)的保證
      • 別人沒有私鑰就無法偽造簽名,就無法將賬上的前轉(zhuǎn)走.
    • 共識(shí)機(jī)制
      • 系統(tǒng)中擁有大多數(shù)算力的礦工是誠(chéng)實(shí)礦工.不會(huì)接受沒有合法簽名的交易.
  • 挖礦設(shè)備
    • CPU -> GPU -> ASIC
  • 礦池
    • 職責(zé)劃分
      • 礦主: 實(shí)現(xiàn)除了挖礦以外的全節(jié)點(diǎn)的其他功能.
      • 礦工: 只實(shí)現(xiàn)挖礦的功能. 只計(jì)算hash值.
    • 獎(jiǎng)勵(lì)分配
      • 按照貢獻(xiàn)率分配獎(jiǎng)勵(lì), 礦工的貢獻(xiàn)采用的也是POW的方式, 通常挖礦的難度是70個(gè)0, 礦池要求的難度會(huì)降低, 例如計(jì)算貢獻(xiàn)的難度是60個(gè)0, 每個(gè)礦工挖礦的時(shí)候如果產(chǎn)生60個(gè)0就將這個(gè)計(jì)算結(jié)果提交給礦主, 然后礦主統(tǒng)計(jì)貢獻(xiàn)率.
    • 好處
      • 加入礦池之前, 礦工之后挖出區(qū)塊才會(huì)有收益, 但是通過加入礦池, 礦工收入的穩(wěn)定性提高了, 因?yàn)槿绻腥送诔鰠^(qū)塊, 就會(huì)按照貢獻(xiàn)率分配給礦工.
    • 超大礦池產(chǎn)生的問題
      • 很多礦池開始通過降低管理費(fèi)吸引大量礦工, 這就導(dǎo)致了超大礦池的出現(xiàn), 超大礦池的出現(xiàn)可能會(huì)出現(xiàn)某些礦池的算力 > 全網(wǎng)算力的51%, 這使得分叉攻擊變得容易, 還可以拒絕將某個(gè)賬戶的的交易上鏈, 但是還是無法都去他人的賬戶的比特幣.
        • 分叉攻擊: 當(dāng)一個(gè)塊已經(jīng)產(chǎn)生后已經(jīng)有6個(gè)確認(rèn)塊了, 這時(shí)候很多人認(rèn)為這個(gè)交易已經(jīng)安全了, 但是如果這時(shí)候大型惡意礦池生成一個(gè)新的塊并將這個(gè)新的塊添加到區(qū)塊的前一個(gè)區(qū)塊, 就會(huì)產(chǎn)生分叉, 而此時(shí)惡意礦池的算力 > 51%, 隨著時(shí)間的推移這個(gè)新產(chǎn)生的分叉的長(zhǎng)度最終終會(huì)>之前產(chǎn)生分叉的長(zhǎng)度, 這時(shí)候新產(chǎn)生的分叉就成了最長(zhǎng)合法鏈.
        • 拒絕將某個(gè)賬戶的的交易上鏈: 每當(dāng)有人把包含某個(gè)人賬戶的交易的區(qū)塊發(fā)布到區(qū)塊鏈上, 惡意礦池馬上進(jìn)行分叉(不需要等待6個(gè)確認(rèn)區(qū)塊). 產(chǎn)生一個(gè)不包含這個(gè)交易的區(qū)塊. 所有和這個(gè)交易有關(guān)的區(qū)塊/和這個(gè)賬戶有關(guān)的交易都不包含在區(qū)塊中.
      • 惡意競(jìng)爭(zhēng)
        • 當(dāng)?shù)V工挖到了區(qū)塊,但是不將這個(gè)結(jié)果發(fā)送給礦池,礦池就不會(huì)得到出塊獎(jiǎng)勵(lì)。礦池之間是競(jìng)爭(zhēng)關(guān)系,可能將自己的節(jié)點(diǎn)加入對(duì)手的礦池,搞一些破壞,分散對(duì)手的算力。

BTC 挖礦腳本

BTC 分叉

  • 硬分叉 : 協(xié)議升級(jí), 未升級(jí)協(xié)議的節(jié)點(diǎn)不認(rèn)可特性, 認(rèn)為節(jié)點(diǎn)特性是非法的. 而升級(jí)協(xié)議的節(jié)點(diǎn)認(rèn)特性.
    • 區(qū)塊大小變?yōu)?M, 這時(shí)候未升級(jí)的節(jié)點(diǎn)認(rèn)為這是非法區(qū)塊, 而系統(tǒng)中擁有多數(shù)算力的節(jié)點(diǎn)更新了協(xié)議, 認(rèn)可這個(gè)節(jié)點(diǎn)特性. 這時(shí)候系統(tǒng)運(yùn)行起來, 只要舊的節(jié)點(diǎn)不升級(jí), 那么這個(gè)分叉就會(huì)永久存在. 不會(huì)消失.
    • 必須系統(tǒng)中所有的節(jié)點(diǎn)都節(jié)點(diǎn)都升級(jí), 系統(tǒng)才不會(huì)出現(xiàn)永久性的分叉. 如果系統(tǒng)中少部分的節(jié)點(diǎn)一直不更新, 系統(tǒng)就會(huì)分成兩條鏈.
  • 軟分叉: 協(xié)議加一些限制, 未升級(jí)的協(xié)議的節(jié)點(diǎn)認(rèn)為這個(gè)節(jié)點(diǎn)特性是合法的, 而升級(jí)的協(xié)議認(rèn)為這個(gè)節(jié)點(diǎn)特性是非法的.
    • 區(qū)塊大小限制為0.5M, 這時(shí)候未升級(jí)的節(jié)點(diǎn)認(rèn)為這個(gè)是合法的區(qū)塊, 而系統(tǒng)中擁有多數(shù)算力的節(jié)點(diǎn)更新了新的協(xié)議, 不認(rèn)可這個(gè)節(jié)點(diǎn)特性, 這時(shí)候系統(tǒng)運(yùn)行起來, 因?yàn)樾鹿?jié)點(diǎn)不認(rèn)可舊的節(jié)點(diǎn), 舊的節(jié)點(diǎn)認(rèn)可新的節(jié)點(diǎn), 這時(shí)候, 新節(jié)點(diǎn)就會(huì)成為最長(zhǎng)合法鏈, 舊的節(jié)點(diǎn)挖出了區(qū)塊只能也不會(huì)被認(rèn)可, 這種分叉不是永久保留的.
    • 只要系統(tǒng)中擁有半數(shù)以上算力的節(jié)點(diǎn)更新了軟件,系統(tǒng)就不會(huì)出現(xiàn)永久性的分叉, 可能有一些臨時(shí)性的分叉, 但是不會(huì)有永久性的分叉.

BTC 匿名性

  • 網(wǎng)絡(luò)層的匿名性
    • BTC 本身具有匿名性, 但是如果BTC和現(xiàn)實(shí)世界產(chǎn)生交互(購(gòu)物, 提現(xiàn)) 匿名性就會(huì)遭到破壞.
  • 匿名性的實(shí)現(xiàn)方案
    • 使用多路徑轉(zhuǎn)發(fā), 消息不是由發(fā)出者直接發(fā)送給接收者, 中間經(jīng)過多次轉(zhuǎn)發(fā), 中間的每個(gè)節(jié)點(diǎn)只知道上一個(gè)節(jié)點(diǎn)是誰, 但并不知道最早發(fā)出消息的人.
    • 應(yīng)用層的匿名性
      • 把不同的人的幣混在一起(coin mixing). 用戶將幣發(fā)給做coin mixing的網(wǎng)站, 網(wǎng)站內(nèi)進(jìn)行重組, 然后再把幣取回來, 這時(shí)取出的bi不再是發(fā)布到網(wǎng)絡(luò)上的幣, 而是隨機(jī)抽取的幣.
      • 還可以通過交易所實(shí)現(xiàn)應(yīng)用層的加密, 交易所天然具有coin mixing的特性.
  • 零知識(shí)證明
    • 證明者向驗(yàn)證者證明一個(gè)陳述是正確的, 而無需透漏該陳述是正確的外的任何信息.
  • 同態(tài)隱藏
    • 加密數(shù)值E不會(huì)出現(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 零碎知識(shí)

  • hash指針
    • 實(shí)際上所謂的hash指針知識(shí)一個(gè)形象的說法, 時(shí)機(jī)系統(tǒng)中用的時(shí)候, 只有hash, 沒有指針, 通常全節(jié)點(diǎn)會(huì)把這些區(qū)塊保存在key-value的數(shù)據(jù)庫(kù)(levelDB)中, hash值作為key, 區(qū)塊作為value, 所謂的區(qū)塊鏈這種鏈表的結(jié)構(gòu)實(shí)際上是在levelDB里面用hash值計(jì)算出來的. 只要有最后一個(gè)區(qū)塊的hash值, 就可以通過levelDB查找到對(duì)應(yīng)的區(qū)塊, 然后找到這個(gè)區(qū)塊, 在這個(gè)區(qū)塊頭中就可以找到上一個(gè)區(qū)塊的hash, 通過這個(gè)hash就可以找到上一個(gè)區(qū)塊.
    • hash指針保存的是本地的內(nèi)存地址, 這種地址只有在本地計(jì)算機(jī)上才有意義, 發(fā)送到其他計(jì)算機(jī)上市沒有意義的, 那么在發(fā)布區(qū)塊的時(shí)候hash指針是怎么通過網(wǎng)絡(luò)傳輸?shù)哪?
  • 不可以將一個(gè)私鑰分成多斷, 然后每個(gè)人保存一部分,
    • 因?yàn)樗借€是256位的, 如果兩人保存, 那么每個(gè)人就是 128位, 如果四個(gè)人保存, 每人64位, 這樣私鑰猜出的難度就會(huì)指數(shù)級(jí)的下降.
  • 加密和hash是不同的, 是兩回事, 加密是為了將來還能解密, 取hash是無法解密的 是有數(shù)據(jù)丟失的
    知識(shí)改變命運(yùn), 但是對(duì)知識(shí)的一知半解有可能是你的命運(yùn)變得更差
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容