什麼是挖礦

區塊鏈中常常會聽到挖礦這個名詞,由於它和現實中的挖礦不同,因此不少人對這個詞很費解。爲何那麼多人去挖礦呢?由於挖礦成功後會有獎勵。爲何挖礦須要大量的礦機呢?由於有大量的哈希計算。這個計算的過程就被稱爲挖礦。算法

哈希函數

要想明白什麼是挖礦,就必需要先了解計算機中的一類函數——哈希函數。好比md五、sha256等都是哈希函數的一種實現方式,它們最終都是將任意長度的數據都轉換爲固定長度的數據。就如同你去辦身份證同樣,無論你高矮胖瘦、貧富貴賤,給你的身份證id都是一個18爲的數字,這個過程就如同進行了一次哈希。函數

咱們來簡單感覺一下sha256哈希函數:區塊鏈

1. 輸入可變,輸出定長

不論輸入的是多長,都能獲得一個固定長度的字符串spa

hash("a")
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
hash("hongtao")
7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26

2. 對數據敏感

只要數據有一點變化,那麼就能獲得一個徹底不同的字符串3d

hash("hongtao")
7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26
hash("hongtaofu")
1059ac7a8f6d4eb9024231eb260bfcc30d23fdf1b461164741f71835c4968906

3. 單向性

給定一個字符串,好比「hongtao」,咱們能夠立刻計算出他的哈希是:code

「7530e08344cf1ec5157f34e2447182d7ec7040a36fba24fc7006499513d96c26」。

可是給你一個哈希:blog

「3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d」,

要想計算出他的一個原像,這比登天還難內存

4. 不可被碰撞

好比給定一個字符串「a」,他的哈希是:md5

「ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb」。

你不可能經過計算或者暴力破解去找到另一個字符串,使得他的哈希也是:資源

「ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb」

5.從機率的角度分析

sha256函數:實際上輸出的值就是256個bit(比特),若是咱們想隨機去碰撞一個哈希值,那麼他的機率是多少呢?每個bit能夠是0或者1,256位要求所有相同,那麼機率就是1 / 2^256 ≈ 1 / 10^77。而宇宙的總原子量是10^79個,總質量10^56 g。大型計算機的速度在10^20 Hz/s,我的計算機計的速度在10^10 Hz/s,我的電腦哈希計算速度在10^5 H/s。因此若是要想去碰撞哈希的話,這徹底是不可能的。

挖礦

先上一副全網挖礦統計圖:
挖礦統計圖

當前全網算力是95.21EH/s,1EH/s = 百億億次哈希/秒。而比特幣的全部礦工大概須要計算十分鐘,纔會有一個礦工碰巧找到知足要求的哈希

1. 一個哈希的部分碰撞

好比有一個數據和一個隨機數(nonce),咱們對它們做哈希,但願獲得的哈希前面有6個0

Hash("hongtao"+nonce)=000000xxxx..50...xxxx(十六進制,共64位);

這個時候咱們修改nonce,哈希也會發生變化,須要通過

16 x 16 x 16 x 16 x 16 x 16 = 16,777,216

次哈希計算,才能獲得想要的哈希。

hash("hongtao623022891")
0000000bd07143fcbb02e54dc5b68f0e391f80a44d72f9ebe53ae7cc31434056

筆者的電腦是2.9GHz x 6核,大概用了1分鐘才計算完,這個時候任何人想要修改前面的數據,好比把hongtao修改成taohong,修改事後都須要進行一分鐘的計算才能找到合法的隨機數

若是前面要求不是6個0,而是16個0,就須要計算16^10 x 1分鐘。筆者的電腦須要計算2091917年才能計算出來。

如今咱們就能夠利用一個哈希的部分碰撞去保證數據的很難修改了,最終達到我的、組織或國家沒法修改的難度。當區塊被連接起來事後,歷史數據將達到全部國家都沒法修改的難度

2.什麼是挖礦

咱們先看看比特比區塊的數據:
區塊鏈

  • 難度:這個難度前面講過,是根據以往的2016可區塊計算出來的,表示這個區塊頭的哈希須要知足前面有多少個0。
  • 隨機數nonce:這個就是礦工不停修的數字,而後去獲得知足相應要求的哈希,若是算出來了,就表明成功挖到這個區塊的礦了。將得到這個區塊的獎勵

注:(nonce定義的空間比較小,後面須要修改幣基交易的信息才能繼續挖礦)

咱們來看一個區塊頭的信息:
區塊頭信息

能夠看到,當前區塊的哈希和上一個區塊的哈希,前面都是0。0越多表明挖礦難度越大,0越少表明挖礦難度越小。如今要求的挖礦難度是17個0。咱們前面計算了須要16個0的話須要挖2091917年,因此如今的比特幣,想要用我的電腦去挖礦,簡直是比中彩票、比隕石撞擊地球還難。

注:這裏爲了方便你們的理解,直接將難度說成了前面須要多少個0,實際上對難度的定義是經過其餘表達式來表示的

最後

因此挖礦須要大量的礦機,這些礦機實際上就是計算機,只是這些計算機對哈希的計算能力進行了加強。好比將哈希算法固定到硬件上面,以此來得到高速的哈希計算能力。還有的機器經過顯卡挖礦,這是由於顯卡也具備必定的計算能力,這樣能夠充分利用計算機的資源。因爲計算機的速度知足摩爾定律,每過18個月,速度就會翻倍。而計算機內存的速度增加卻很緩慢,大概每一年7%,因此有的虛擬幣挖礦須要求結合內存,這樣你們的挖礦就相對於平等一些。挖礦是一個很消耗資源的,尤爲是電力,因此礦機通常都選擇電費便宜的地方。

相關文章
相關標籤/搜索