1. 程式人生 > >區塊鏈: 技術驅動金融 - 第1章 密碼學及加密貨幣概述

區塊鏈: 技術驅動金融 - 第1章 密碼學及加密貨幣概述

來源:《區塊鏈:技術驅動金融》[美]阿爾文德-納拉亞南   納什-貝努   愛德華-費爾頓   安德魯-米勒   史蒂文-戈徳費德 著   林華  王勇  師初  蔡凱龍  許餘潔 李耀光  高曉婧  洪浩 譯

後續章節筆記將省略該說明。

1.1 密碼學雜湊函式

    一般性的雜湊函式(hash function)具有以下三個特性:

  • 輸入為任意大小的字串。
  • 輸出為固定大小的字串。
  • 可進行有效計算,即輸入n
    位字串,雜湊計算的時間複雜度為O(n)

    加密雜湊函式除了具備上述基本特性之外,還需要具備以下三個密碼學特性:

  • 碰撞阻力(collision-resistence)。對於不同的輸入,幾乎不可能得到相同的輸出,換句話說,要想找到兩個不同的輸入使得對映後的輸出相同,在計算上是不可能的。
  • 隱祕性(hiding)。給定雜湊函式的輸出,通過簡單的隨機選擇來確定輸入是不可行的。
  • 謎題友好(puzzle-friendliness)。給定雜湊函式的輸出,要尋找正確的輸入,沒有比窮舉法更好的辦法。

    在比特幣及其他領域中,最常用的一個雜湊函式是安全雜湊演算法(Secure Hash Algorithm 256,簡稱

SHA-256)

1.2 雜湊指標及資料結構

    雜湊指標是一個指向資料儲存位置及其位置資料的雜湊值的指標,如下圖所示:

雜湊指標

1.2.1 雜湊指標

    可以利用雜湊指標來構建兩個重要的資料結構:區塊鏈(Block Chain)默克爾樹(Merkle Tree)。這兩個資料結構是區塊鏈技術的基礎。

區塊鏈

    通過雜湊指標構建的連結串列稱為區塊鏈,如圖1.2.2。在區塊鏈中,每一個區塊包含兩個基本部分:區塊頭(Block Header)區塊主體(Block)

  • 區塊頭包含一些基本的元資料,其中一個就是上一個區塊的雜湊值(即雜湊指標)。
  • 區塊主體包含交易(transactions)資料。

 

1.2.2 區塊鏈示意圖

    區塊鏈的一個應用就是“防篡改日誌”。要理解區塊鏈如何防篡改,我們可以看一下攻擊者要怎麼進行篡改才能不被發現。

    假設攻擊者修改區塊k的資料,那麼根據雜湊函式的特性,區塊k的新雜湊值將和區塊k+1中儲存的雜湊值不匹配。為了使區塊k的新雜湊值和區塊k+1中儲存的雜湊值匹配,只好通過繼續修改區塊k-1k-2,……的資料。值得注意的是,繼續重複修改區塊k的資料是無法使得新雜湊值與k+1中儲存的雜湊值匹配,因為雜湊函式具有碰撞阻力。

    這樣,有兩個方面阻礙攻擊者進行資料篡改:1. 只要妥善鎖定區塊鏈頭部的資料,即第一個區塊,也叫創世區塊,那麼攻擊者就無法使得區塊k的新雜湊值與k+1中的匹配;2. 修改k-1k-2,……的資料使得區塊k的新雜湊值與k+1中的匹配,在計算上將是困難的。基於這兩點,沒有人會願意進行資料修改。

默克爾樹

    使用雜湊指標構造的二叉樹稱為默克爾樹,如圖1.2.3

1.2.3 默克爾樹示意圖

    在默克爾樹中,所有資料塊都被兩兩分組,指向這些資料的雜湊指標被儲存在上一層的父節點中,而父節點再次被兩兩分組,指向這些父節點的雜湊指標將繼續往上儲存,直到到達樹根節點,這個樹根節點被稱為默克爾樹根

    默克爾樹在防篡改上表現很好。假設攻擊者想要修改默克爾樹中某個區塊的資料,那麼就會導致這個區塊的父節點雜湊值不匹配,為了使之匹配,攻擊者就必須修改這個區塊的子節點資料,以此類推。和前述的區塊鏈結構一樣,繼續修改本區塊資料是難以做到雜湊值匹配的,因為雜湊函式具有碰撞阻力,所以,無論攻擊者再怎麼修改本區塊的資料,也難以得到一個和父節點雜湊值匹配的新區塊。本質上來說,攻擊者需要找一顆以這個區塊為根、高度相等的子樹,來替換原默克爾樹中的子樹。而要尋找這樣的子樹,在計算上是困難的。因此,沒有人願意花費這樣的計算力進行資料修改並保證不被發現。

1.3 數字簽名

    數字簽名(digital signatures)應該具備兩個基本特性:

  • 只有你可以製作你自己的簽名,但任何看到它的人都可以驗證其有效性。
  • 簽名只與某一特定檔案關聯,因此該簽名不能用於表明你同意或支援另一份不同的檔案。即一份檔案一個簽名,一一對應。直觀地說,就如同別人不能從你的手寫簽名檔案上把簽名剪下來,然後貼到另一份檔案的末尾,這樣的簽名是無效的。

    下面是通用的簽名方案,由三個演算法構成:

  • (sk, pk) := generateKeys(keysize)    generateKeys方法輸入keysize,生成一對私鑰和公鑰。私鑰用於簽名,公鑰用於驗證。
  • sig := sign(sk, message)    sign方法輸入sk、message,生成簽名。
  • isValid := verify(pk, message, sig)    verify方法輸入公鑰、訊息、簽名,輸出為真,表明簽名有效;輸出為假,表明簽名無效。

    對於上述簽名方案,要求以下兩個特性有效:

  • 有效簽名可以通過驗證,即verify(pk, message, sign(sk, message)) == true
  • 簽名不可偽造。

    顯然,第一個特性是對簽名有效的最基本要求。

    對於簽名不可偽造,說的是,儘管對手知道你的公鑰,並且看到過一些你已經簽名的訊息,但是對手仍然無法偽造你在新訊息上的簽名,因為對手還沒有看到你在新訊息上的簽名。也就是說,對手不能根據過去已知的簽名,“學習”出一種“萬能”的簽名,能夠對你未來的訊息進行有效簽名

1.4 公鑰即身份

    把公鑰pk認為是參與者或系統的一方,他可以用這個公鑰對應的私鑰來進行簽名,釋出宣告。

    將公鑰視為身份的一個結果就是,你可以隨時定製任意數量的新身份,即通過數字簽名方案中的generateKeys方法來生成不同的公鑰和私鑰對,然後用公鑰代表你的身份,用私鑰對訊息進行簽名。

去中心化身份管理

    公鑰和私鑰體系,幫助我們引入去中心化的身份管理。具體而言,你無需到中央機構進行使用者註冊,你只需要生成一對公鑰和私鑰,然後用公鑰代表你的身份即可。在比特幣語言中,這個身份表示地址,稍有不同的是,比特幣或其他加密貨幣中,不是直接用公鑰作為地址,而是用公鑰的雜湊值,因為公鑰有可能太長了

    去中心化身份管理具有很好的匿名性,因為你所建立的身份(公鑰)具有足夠的隨機性。當然,如果你長期用一個身份與其他人進行交流,那這個身份的行為可能會成為別人推斷你真是身份的依據,比如“天,這個人的行為很像Joe,可能這個人就是Joe”。

1.5 兩種簡單的加密貨幣

    略(參看原書)。