區塊鏈保持一致性的法寶

買賣虛擬貨幣
關於區塊鏈如何保持資料一致性的問題,是我在【區塊鏈研習社】裡的第四次課程,由於一致性問題涉及到區塊的結構以及與區塊鏈的不可篡改這個重要特性,因此這一課對大家深入瞭解區塊鏈技術非常重要,我也有必要將之前課程的內容進行整理,同時再結合更詳細的說明,供大家學習。1、什麼是雜湊如果你懂一些程式設計,相信對這個概念非常熟悉。但是對於一些沒有程式設計基礎的人而言,對其卻相當陌生,陌生到買了一本區塊鏈的書籍卻完全看不下去。雜湊函式在區塊鏈裡使用得太普遍,以至於它所有對使用者展示的內容,比如地址,公鑰,私鑰等,都是透過雜湊函式生成的,所以在這裡有必要重點對這個概念闡述一下,即便懂得程式設計,聽過這個概念,希望你也能再看一遍,就當是回顧了。雜湊,英文對應為Hash,一般說的都是雜湊函式,百度百科的解釋是:Hash,一般翻譯做“雜湊”,也有直接音譯為“雜湊”的,就是把任意長度的輸入(又叫做預對映, pre-image),透過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。簡單來講,就是將一個較長的字串a轉換為一個固定長度的字串b,然後用b這個串去代表之前的a,比如一個比特幣地址1DQe9F3agsDcr4qoTZ3Sush4e88Nv9tNxa,就是一個雜湊值。經過雜湊轉換後,無法透過b還原出原來的a。
雜湊演算法在檔案校驗、數字簽名及鑑權協議都有很好的應用。在Java程式設計裡,可直接透過hashCode函式獲取一個字串的雜湊值,雜湊演算法是一個非常高效的演算法,所以使用非常頻繁。2、簡單的判斷一致性方法你應該經常下載過東西,可能對一個檔案重複下載了兩次,甚至現在還會不小心在一些釣魚網站下載了一些惡意程式,那麼你是如何判斷檔案的一致性以及識別程式是否有問題呢?你可能想到的方法有:1)比較檔案大小,如果不一致,則說明是不同的檔案;2)檢視檔案內容,但是並不是所有的程式都是文字可讀的;3)檢視檔案的一些標註資訊是否一致,等等。但是這些方法都相當初級,對於一些高階的作弊手段無法識別,正因如此,一些良心網站都會提示比較檔案的MD5值,很多細心的朋友應該能發現這個提示,但是基本也很少按照這個提示去做,畢竟我們大部分人都習慣了在網上“裸奔”。上面提到的MD5,就是一種被廣泛使用的雜湊函式。現在越來越多的網站都會公佈檔案的MD5值,使用者在下載檔案後可自己進行運算並進行比對,如果一致則說明所下載檔案沒被篡改過。

由於工作需要,這兩天我準備下載一個mangodb,這是下載頁面的截圖,透過截圖大家應該能有一個直觀的認識:

當然MD5只是雜湊演算法的一種,上面的截圖還顯示了其他支援的方法,不過這些都是使用雜湊演算法的特性用於校驗檔案的一致性的。

3、區塊鏈如何保持資料的一致性——默克樹

下面這個圖是比特幣的區塊結構圖,它相當重要以至於每一本區塊鏈書籍都會介紹,也希望每一個研習社的朋友能掌握:

在上表的第三行“Merkle樹的根值”正是一個雜湊值,和上面提到的一樣,區塊鏈技術正是利用這個雜湊值來判斷區塊的資料是否被篡改過的。

但是,事情可能還沒想的那麼簡單。因為一個區塊可能包含幾百個甚至更多的交易,其內容會非常多,對整體進行雜湊運算效率是非常低下的,因此,才會出現上圖大家可能還相對陌生的詞“Merkle樹”,翻譯為默克樹,這才是保持一致性的關鍵。

默克樹,全稱“默克爾雜湊樹”,是一種二叉或多叉的資料結構,透過對每一個葉子節點進行雜湊計算,並不斷往上遞迴,最後構建成一個樹形結構。因此默克樹是一種被廣泛用於快速歸納和對大規模資料進行完整性校驗的資料結構。

在比特幣的實現中,不用儲存每一個交易的雜湊值,而是將所有交易構建成這樣一個默克樹,並以樹的根節點的雜湊值作為所有交易內容的一個對映,存放於區塊的頭部結構中,從而在保證資料完整性,防止被惡意篡改的同時,極大減少了運算量,提高了運算效率,而且,如果一旦被篡改,還能進行快速定位。簡直是妙不可言!

下面是一張默克樹的圖,大家姑且看之,不懂也無所謂,全當欣賞:

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;