這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
第四期 挖礦的相關演算法(2)
卡酷少
Wechat:13260325501
看過(1)篇,相信你一定對挖礦的機制有了一點瞭解。那麼本篇,我們來一起看一下挖礦中演算法。
下面的文章中,如果在文章的前半篇你遇到了不理解的詞彙,也許在文章的後半段就會給出答案。最後關於不理解的部分歡迎大家在文章下面留言,我會及時給出回覆。
區塊鏈的區塊到底是什嗎?
- 挖礦是為了產生一個區塊,那麼區塊到底是什嗎?區塊的作用又是什嗎?一個區塊又包含了哪些資訊呢?
- 簡單理解的話,一個區塊可以理解為一個結構體。我們知道結構體可以儲存不同類型的資訊,這些資訊可以是字串,可以是數字,也可以是日期。那一個區塊裡包含了哪些資訊呢?這裡我們給出一張圖來,先來瞭解一下區塊資訊有幾大類。
- 圖1
- 一個區塊中資訊按類別劃分,主要分為的這四大類,這點大家只做概念性瞭解即可。真正有作用於產生區塊的資訊,主要是區塊頭中這幾項:
- index(記錄當前是第幾個區塊)
- current hash(當前雜湊值)
- previous hash(承接的上一區塊的雜湊值,可保證區塊按時間串聯)
- timestamp(時間戳記,記錄該區塊的產生時間)
- data(交易詳情,詳細記錄了每筆交易的轉出方和收入方,金額及數位簽章)
- nounce(隨機數,即全網礦工一起pk計算的的,能滿足雜湊難度要求的答案)
- 其中希望大家先對nounce值有個印象。這個nounce值不僅與挖礦有關,也在之後的代碼實現中有非常重要的身份。
- 給出一個簡單的列表:
- 圖2
什麼是雜湊和雜湊值?
- 為理解挖礦的代碼機制,首先解決幾個概念。第一個就是“雜湊”。
- 在上一篇挖礦中我們提到了算力。也說到算力就是一台礦機每秒鐘能做多少次雜湊碰撞。那麼,什麼是雜湊,什麼又是雜湊碰撞呢?
- 簡單理解的話,雜湊就是一個函數。雜湊碰撞的本質,就是cpu在隨機窮舉數值的過程中,不斷尋找能夠產生匹配現階段比特幣“難度”條件的數值。一旦找到這個數值,那麼就產生了一次成功的雜湊碰撞。
- 現在你一定很好奇雜湊是一個什麼樣的值呢?我們通過 ==SHA256== hash演算法來瞭解一下。
- 這裡提供一個網址,感興趣的同學可以跟我一起做一些測試。
link
- 測試之後,我們可以發現,雜湊函數有一些非常獨特的特徵:
- 任意內容都可以產生雜湊值。
- 雜湊值為十六進位表示的數,且長度固定。
- 不同的內容產生不同的雜湊值。哪怕非常相似的內容產生的值也完全不同,且無規律可循。
- 相同的內容每次都會輸出相同的雜湊值。
- 通過對比"hello","helloworld",“hello world”和“hello,world”的輸出結果,可以驗證驗證我們對於雜湊演算法的總結。感興趣的同學可以再驗證別的數值,你會發現,無論多麼微小的差別,都會導致雜湊值完全無跡可尋的改變。
- 也正是雜湊值的這些特點,賦予了其加密資訊時更高的安全性。
有關挖礦的“難度”
- 最後一個概念就是挖礦的難度。這裡的難度,由淺及深,我們先舉個例子來理解它的原理。
- ,比如我們將一個5位元進行排列組合,分個十百千萬位。假如第一個排列組合,我指定萬位和千位都是5,其他位元不限;第二個排列組合,我只指定萬位為5,那麼得到誰的幾率大,得到誰的幾率小呢?
- ——答案是第一個機率小,第二個機率大。因為被限定的個數越多,其他可選的可能性也就越少了。
- 同理,挖礦就是去匹配已經被指定了位元的雜湊值。而挖礦的“難度”,就是由被指定位元的多少來決定的。這和被指定的是十六進位下的那個數無關。
- 如框內所示,當雜湊值難度設定了前四位為“0”的時候,只有當匹配上前四位為“0”的時候,才產生了一次成功的雜湊碰撞。如果設定的“0”的個數越多,那麼雜湊成功的難度也越大,挖礦的難度也就越大。
- 在比特幣最開始的時候,難度是很小的,只有第一位為“0”及碰撞成功。那是的挖礦是非常簡單的。而現在隨著全網算力的增加,挖礦的難度也大大,現在的雜湊難度已經是十幾個“0”了。