來自簡書ruby
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
ide
挖礦的時候須要常常聽到一個詞 工做量證實 , 即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...