第四期 挖礦的相關算法(2)
卡酷少
Wechat:13260325501html
看過(1)篇,相信你必定對挖礦的機制有了一點了解。那麼本篇,咱們來一塊兒看一下挖礦中涉及的算法。算法
在本篇文章中,若是在前半篇你遇到了不理解的詞彙,也許在文章的後半段就會給出答案。另外本篇主要是零散知識點的介紹,邏輯上不會有那麼強。最後關於不理解的部分歡迎你們在文章下面留言,我會及時給出答覆。安全
區塊鏈的區塊究竟是什麼?
- 挖礦是爲了生成一個區塊,那麼區塊究竟是什麼?區塊的做用又是什麼?一個區塊又包含了哪些信息呢?
- 簡單理解的話,一個區塊能夠理解爲一個結構體。咱們知道結構體能夠存儲不一樣類型的信息,這些信息能夠是字符串,能夠是數字,也能夠是日期。那一個區塊裏包含了哪些信息呢?這裏咱們給出一張圖來,先來了解一下區塊信息有哪幾大類。
- 圖1
![image image](http://static.javashuo.com/static/loading.gif)
如圖一個區塊中信息按類別劃分,主要分爲的這四大類,這點你們作爲了解便可。其中區塊頭包含了以下信息,這些信息也是真正有做用於生成區塊的信息,咱們來列舉其中的重要項:函數
- index(記錄當前是第幾個區塊)
- current hash(當前哈希值)
- previous hash(承接的上一區塊的哈希值,可保證區塊按時間串聯)
- timestamp(時間戳,記錄該區塊的生成時間)
- data(交易詳情,詳細記錄了每筆交易的轉出方和收入方,金額及數字簽名)
- nounce(隨機數,即全網礦工一塊兒pk計算的的,能知足哈希難度要求的答案)
其中但願你們先對nounce值有個印象。這個nounce值不只與挖礦有關,也在以後的代碼實現中有很是重要的身份。區塊鏈
![image image](http://static.javashuo.com/static/loading.gif)
什麼是哈希和哈希值?
- 爲理解挖礦的代碼機制,首先解決幾個概念。第一個就是「哈希」。
- 在上一篇挖礦中咱們提到了算力。也說到算力就是一臺礦機每秒鐘能作多少次哈希碰撞。那麼,什麼是哈希,什麼又是哈希碰撞呢?
- 簡單理解的話,哈希就是一個函數。哈希碰撞的本質,就是cpu在隨機窮舉數值的過程當中,不斷尋找可以生成匹配現階段比特幣「難度」條件的數值。一旦找到這個數值,那麼就產生了一次成功的哈希碰撞。
- 如今你必定很好奇哈希是一個什麼樣的值呢?咱們經過hash算法 ==SHA256== 來測試一下。這裏提供一個網址,感興趣的同窗能夠跟我一塊兒作一些測試。
link測試
![image image](http://static.javashuo.com/static/loading.gif)
![image image](http://static.javashuo.com/static/loading.gif)
![image image](http://static.javashuo.com/static/loading.gif)
![image image](http://static.javashuo.com/static/loading.gif)
- 測試以後,咱們能夠發現,哈希函數有一些很是獨特的特徵:
- 任意內容均可以生成哈希值。
- 哈希值爲十六進制表示的數,且長度固定。
- 不一樣的內容生成不一樣的哈希值。哪怕很是類似的內容生成的值也徹底不一樣,且無規律可循。
- 相同的內容每次都會輸出相同的哈希值。
- 經過對比"hello","helloworld",「hello world」和「hello,world」的輸出結果,能夠驗證驗證咱們對於哈希算法的總結。感興趣的同窗能夠再驗證別的數值,你會發現,不管多麼微小的差異,都會致使哈希值徹底無跡可尋的改變。
- 也正是哈希值的這些特色,賦予了其加密信息時更高的安全性。好比「公鑰」「私鑰」,之後咱們會作出介紹。
有關挖礦的「難度」
- 最後一個概念就是挖礦的難度。這裏的難度,由淺及深,咱們先舉個例子來理解它的原理。
![image image](http://static.javashuo.com/static/loading.gif)
- 如圖所示,好比咱們將一個5位數進行排列組合,分個十百千萬位。假如第一個排列組合,我指定萬位和千位都是5,其餘位數不限;第二個排列組合,我只指定萬位爲5,那麼獲得誰的概率大,獲得誰的概率小呢?
- ——答案是第一個機率小,第二個機率大。由於被限定的個數越多,其餘可選的可能性也就越少了。
- 同理,挖礦就是去匹配已經被指定了位數的哈希值。而挖礦的「難度」,就是由被指定位數的多少來決定的。這和被指定的是十六進制下的哪一個數無關。
![image image](http://static.javashuo.com/static/loading.gif)
- 如上圖框內所示,當哈希值難度設定了前四位爲「0」的時候,只有當匹配上前四位爲「0」的時候,才產生了一次成功的哈希碰撞。若是設定的「0」的個數越多,那麼哈希成功的難度也越大,挖礦的難度也就越大。
- 在比特幣最開始的時候,難度是很小的,只有第一位爲「0」及碰撞成功。那是的挖礦是很是簡單的。而如今隨着全網算力的增長,挖礦的難度也大大,如今的哈希難度已是十幾個「0」了。哈希的難度的設定也不是人爲操做的,區塊鏈系統會根據當前全網的算力作出調整,將難度保持在可以每10分鐘生成一個區塊的程度。