初探BlockChain——哈希和電子簽名

昨天在B站學習到北京大學肖臻老師的《區塊鏈技術與應用》的公開課,感到豁然開朗。

BlockChain涉及到密碼學的兩個方面:哈希和電子簽名。

1.哈希。有計算機基礎的童鞋都比較清楚其機制,這裏再簡單說一下其基本原理。

哈希的意思就是引入隨機數量的輸入數據,將其加密,然後得出一個固定輸出數據,就叫做哈希。

輸入可以是任何數據,只要能代表單個字節,一個MP3文件,整本小說,你的銀行賬單,甚至是整個互聯網。關鍵在於輸入可以無限大。哈希算法可以根據你的需求來進行選擇,現在公開的也有很多種算法。關鍵點在於,這些算法會將無限的輸入,轉換成固定數量的字節。例如,256字節。

常用的哈希加密算法有:MD5(Message-Digest  Algorithm,MD5消息摘要算法)和SHA(Secure  Hash  Algorithm,安全散列算法),除了這兩個之外,還有:DES(Data  Encryption  Standard,數據加密標準)以及AES(Advanced  Encryption  Standard,高級加密標準)。

在BlockChain中涉及到的哈希算法是SHA-256,實際上是雙重SHA-256,

即SHA-256(SHA-256(Block_Header))。

哈希的用處很廣,比如檢查自己上傳雲的數據重新下載之後是否被篡改過等等,這裏不必贅述。

BlockChain是這樣使用哈希的:

區塊鏈使用哈希,來表現整個區塊鏈網絡現在的狀態。輸入則是區塊鏈的整個狀態,也就是說近期完成的所有轉賬,輸出就是哈希代表的區塊鏈現在的狀態。哈希就被用來在區塊鏈網絡中讓各方相信,整個狀態都是相同的。

首個哈希是爲第一個區塊或者是創世區塊(Genesis block)所計算的,通過區塊內部的轉賬數據得出。初始轉賬的順序被用來計算創世區塊的區塊哈希。後來每挖出的新區塊,之前的區塊哈希也會被使用,同時還有這個區塊的轉賬信息,作爲輸入值,來確定區塊的哈希。這就是區塊鏈的形成方式,每個新區塊哈希指向的是之前區塊的哈希。

這種哈希系統保證了任何轉賬記錄都不會被改變,因爲如果任何部分的轉賬記錄改變,那麼歸屬於這個區塊的哈希值也會改變,那麼任何接下來的區塊哈希也會被改變。那麼你可以簡單地將哈希對比,就很容易去分辨出哪兒發生了改變。這就非常棒了,因爲區塊鏈上的每個人只需要對這256個字節達成共識,就可以代表區塊鏈的狀態。以太坊區塊鏈現在是10MB,但是區塊鏈狀態只有256字節代表的哈希。

可以在下面鏈接裏看到BlockChain Demo,如下圖:

https://anders.com/blockchain/tokens

每一個區塊Block包括Block Header和Block Body。Block Body存儲交易數據,這些交易數據通過MerkleTree(每個區塊所包含的交易組成Markle Tree,具體的會下篇詳細介紹)計算出一個哈希。

BlockHeader包括六部分,如圖。

人們所說的挖礦用簡單的表述是這樣的:

H(Block_Header) < Target

在Block_Header中有一個field叫做nonce,這個隨機數數就是我們所需要找到的符合條件的數。提到這裏就不得不說工作量證明了,及Proof of Work(POW)。因爲想要得到nonce,是沒有捷徑的,需要強大的算力不停地去計算,所有可以被用來當做一種工作的證明。Nonce,Number used once或Number once的縮寫,在密碼學中Nonce是一個只被使用一次的任意或非重複的隨機數值。

舉個栗子:

給定的一個基本的字符串"Hello, world!",我們給出的工作量要求是,可以在這個字符串後面添加一個叫做nonce的整數值,對變更後(添加nonce)的字符串進行SHA256哈希運算,如果得到的哈希結果(以16進制的形式表示)是以"0000"開頭的,則驗證通過。爲了達到這個工作量證明的目標。我們需要不停的遞增nonce值,對得到的新字符串進行SHA256哈希運算。按照這個規則,我們需要經過4251次計算才能找到恰好前4位爲0的哈希散列。

"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7

...

"Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965

"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6

"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

通過這個示例我們對工作量證明機制也有了一個初步的理解。

2.電子簽名

電子簽名,和真實簽名一樣,爲了證明某人的身份,但是使用加密算法,會使得簽名更加安全,不像手寫的那種,可以很容易地修改。數字簽名可以證明這個信息是從某個特定的人那兒來的,而且不是任何其他人。

在區塊鏈上創造賬號是並不需要在任何地方進行註冊的。通過非對稱加密,可以獲得祕鑰對——公鑰和私鑰(對非對稱加密和對稱加密的童鞋可以再自行查閱一些資料。)私鑰意味着隱祕的信息,用來簽署電子信息,併發送給別人。簽名包含在信息中,以至於接受者可以驗證發送者的公鑰。這樣地話,接收者就可以保證只有發送者可以發送這條消息。也就是說在區塊鏈中的簽名是用私鑰來加密,公鑰是讓其他人來驗證。

而且區塊鏈上的任何交易都是由發送者使用私鑰進行電子簽名後纔行。這個簽名保證了只有賬戶擁有者可以轉移其中的資產。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章