bitcoin與工做量證實

來自簡書ruby

btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHfide

挖礦的時候須要常常聽到一個詞 工做量證實 , 即Proof Of Work,簡稱POW.ui

POW是個什麼鬼, 咱們先拋開這個概念, 玩個遊戲.3d

假若有不少人喜歡問我很八卦的問題, 但我 只想答有限的幾個,
那讓誰答呢? 我出個遊戲規則:code

1 先把問題列出來, 重複的問題我不回答啊
你有異裝癖麼遊戲

2 作hash運算, 就作sha256吧資源

require 'Digest'
Digest::SHA256.hexdigest("你有異裝癖麼")

獲得4f65c9ca420e5f191d9f2730c4f99c7fe8f2301a431bade918de9d38f7401a4e字符串

3 計算hash值, 這個難度過低了, 身邊的一堆程序猿都會算.
我但願 你的問題 加上一個天然數,合併成一個新的字符串,再作hash運算, 獲得新的hash值, 使得新的hahs值前4個都是0, 而且這個天然數是最小的, 那好,我就回答你的問題.get

一言不合就擼碼hash

require 'Digest'

10000.times do |n|
 issue = "你有異裝癖麼"
 val = issue + n.to_s
 
 ret = Digest::SHA256.hexdigest(val)

 if ret[0..3] == "0000" #判斷hash值的前4位是0麼
   puts val
   puts n
   puts ret
   break
 end

end

#你有異裝癖麼3699
#3699
#00007ed47ec0280ca933ed5dc9396892fee27c9dbec9c07f95f0247169df1bee

獲得 3699,
Digest::SHA256.hexdigest("你有異裝癖麼3699")的結果符合前4位是0.
你把問題 你有異裝癖麼3699給我, 我經過驗證, 就回答這個問題.


你有疑惑了, 爲啥要從 [1,10000] 這個區間順序計算呢?
不能隨便從一個數字算麼?

由於hash運算的結果是無序的, 並且不能進行逆運算, 順序計算比較方便, 沒有遺漏. 經過這個方式獲得的天然數, 也是符合遊戲規則的最小天然數, 由於是順序計算的啊

嗯的, 在回到這個遊戲, 你們都遵照這個規則, 我也在回答這個問題,
又過了一段兒時間, 須要回答的八卦問題仍是太多了, 我吃不消了,囧.

我定個新規則, 其餘的不變, hash值前5位是0的, 我纔回答.
而後繼續運行, 到了我又吃不消的時候, 繼續改, 前6位, 前7位, 前8位,
前n位是0.

若是你繼續算下去, 你會發現, 算的時間會愈來愈長,咱們能夠說難度增長了. 有這樣直觀的感受, 前幾位是0的個數越多, 這個難度越大, 計算時間越長.

難度到底有多大, 也就是時間到底有多長呢?
我拿本身的 2014年款的 mac pro中款粗略算了下,語言是ruby,
時間就是金錢, 這個時間仍是比較可觀的.

Digest::SHA256.hexdigest("shooter36")      #04b4ee0f1b56950f1f9880d076b7449c66705d5712a939a36a49d9973dd50ab3    2ms
Digest::SHA256.hexdigest("shooter578")     #002bae033279e48835e9a3c8b71a6835bf171a202b700a10ba4bd63710bfcb49    15ms
Digest::SHA256.hexdigest("shooter4434")    #00072b50cc7963a310962af33efcd5109cdfb6ac633ce6bb275ce243f3ec247b    406ms
Digest::SHA256.hexdigest("shooter35786")   #00002d8c31f6eb29d848cdf520b499cd9f729b1d4d037275d82935b7766eaa3e    4309ms
Digest::SHA256.hexdigest("shooter717095")  #00000178662b978d8d7cf930a1caceae70f097354b4fe6423eef2a45ccfb9ce7    82468ms
Digest::SHA256.hexdigest("shooter2038373") #0000001ef511d494ecdddcd2abfded0a34df87a9c76410452e01e0a2958bf0a5    272266ms

說了這麼多, 這個遊戲規則其實就是POW.
用到bitcoin上,無非是要替換些東西, 八卦問題 => bitcoin須要的數據,
替換bitcoin須要的難度. 理解這個思想很重要, 別的細節慢慢聊.

bitcoin系統的難度有多大呢?

塊高度477,360 的hash 000000000000000000e8af89716e0ea8a2aa7c7b789935e98f0a32a4a319247f有18個0.
Nonce 是十六進制的0x71eee8ca,即算了 1911482570次, 能夠試試用通常的筆記本計算19億次hash須要多長時間.


POW有什麼特色呢?

1 運算不可逆, 就表明誰也不可能偷懶
2 每一個值的hash都不同, 意味着不一樣的問題都要算, 換個新問題, 就要從新算.
3 你算起來很費勁, 花費時間長
4 我驗證起來很簡單, 把結果hash一下, 符合規則的我就回答, 不符合的拋棄
5 這個規則實現仍是比較簡單的

結果就是 遵照遊戲規則的人很艱難的算出一個結果,會很珍惜,由於你付出了不少的計算資源跟時間, 你但願我能承認你的努力.

這個概念在bitcoin系統中很重要

參考:

https://www.bilibili.com/vide...
https://en.bitcoin.it/wiki/Pr...

相關文章
相關標籤/搜索