在區塊鏈系統中,分散式網絡中各節點,需要透過共識機制去決定以哪個節點所生成區塊為系統中的新區塊,而工作量證明 Proof-Of-Work (POW) 就是其中一種。
工作量證明 Proof-Of-Work (POW)
顧名思義,工作量證明就是用來證明你做了一定量的工作,可用工作成果來證明完成相應的工作量。
簡單來說,在現實生活中,你通過了完成一系列課程得到的課程證書,其他人也可以從你這張證書中知道你是曾經完成了這一系列的課程。
歷史
工作量證明(POW),1993 年由 Cynthia Dwork 和 Moni Naor 提出,POW 被用於阻止拒絕服務攻擊(DDOS)、反垃圾郵件等一些服務濫用的經濟對策。
第一个POW 應用是1996年 Adam Back 開發的 "Hashcash" 應用,它採用工作量證明共識機制來過濾垃圾郵件,微軟也將其應用在 Hotmail, Exchange, Outlook 等電郵服務上。具體做法是要求所有收到的郵件都使用強 POW 附件。此系統使得垃圾郵件發送者在大量發送郵件時在經濟成本上不可行,但卻允許個人在需要的時候互相發送信息。時至今日這種算法也被賦予新的意義,即以"挖礦"形式作為比特幣安全核心。
工作量證明(POW)共識機制算法採用了SHA-256 運算 Hash 值,特點是難以運算,卻容易驗證。
我們知道改變 Hash 值的原始數據中的任何一部份,所產生的 Hash值也會隨之變化,因此我們只需在運算 Hash 值時,加入一個不斷改變的隨機數,亦總是可以計算出以 0 開頭的 Hash 值。所以要找到符合要求的區塊 Hash 值,則需要經過進行大量運算,運算時間取決於節點的運算速度。當某個節點提供出一個符合要求的 Hash值,就說明該節點確實經過了大量的嘗試運算。當然,並不能代表說已進行了多少次運算的次數,因為尋找符合要求 Hash值是一個概率事件。
換言之,當節點擁有佔全網 N%的算力時,該節點即有 N/100的概率找到符合要求的 Hash值。
看以下的例子就會清楚:
我們首先確定一個字符串:“Samson's blog-:“ 及驗證結果的條件:在這個字符串後增加一個叫個Nonce整體值(隨機數),然後對整個字符串進行SHA-256 運算,運算出正確的Hash值結果,且符合難度值,是以"000開頭的"。如果運算出來的Hash值不符合要求,則通過遞增Nonce的值,重新運算。
開始運算:
1 2 3 4 5 6 7 8 9 10 11 12 | </p> Samson's blog-:0 1d4256cbf78a0dd19a70187009ab37f3d90e273d184c37fa20512c0a4c0b348f Samson's blog-:1 7443a7f641c853daa7e869e7adf45391ae061bdb78785f45455617aee370182f Samson's blog-:2 67bf130ec93610c29d73fecfc5858fbdc27881bbbdc298b141b6fa8f5254b026 : : Samson's blog-:1577 000cea98062b7a38be7333fdfedcd6093624e1c3b9148ec8d52379c6015bde1e<b> |
按照以上的條件,我們經過運算了1577次後找到符合條件(前3位為0)的Hash值。
那為什麼條件是以000開頭,那0000、00000開頭可以嗎?
前3位為0只是這個例子的設定。其實在比特幣在生成區塊的過程中,一個符合要求的區塊 Hash 是由N個前導零構成的,而零的位數就取決於當時網絡中的難度值,也就是說,前導零的位數越多,就代表越難。
SHA-256生成的 Hash值都為256 位元,Hash值是由數字和大小寫字母構成的字符串,每一位有62種可能性(可能是 26個大寫字母、26個小寫字母,10個數字中其中一個),假設任何一個字符出現的概率是均等的,那麼第一位為0的概率是1/62,理論上需要嘗試 62次Hash運算才會出現一次第一位為0的情況,如果前兩2位為0,就得嘗試62的平方次Hash運算,以N個0開頭就需要嘗試62的N次方次運算。
所以
如果要達到以0000開頭的 Hash值,理論上要嘗試 62^4 = 14776336 次。
如果要達到以00000開頭的 Hash值,理論上要嘗試 62^5 = 916132832 次。
當然並不是純粹算有幾個前導零就解決了,否則每次難度值的調整就只能以2 的次方倍數來進行,實作上採用小於目標值的方式能更精確地調整難度值。
當前最新運算量分析(截至 2018-02-09 20:00)
根據 https://blockchain.info 上最新的區塊顯示Hash值有18個0開頭,理論上需要嘗試62的18次方次,這個數字是非常龐大的。如此大的運算量需要投入大量的運算設備、電力。
驗證
當節點找到了滿足條件的 Hash值,就會立即廣播全網打包好的區塊,其他節點收到廣播的打包區塊,之後其他節點怎麼驗證這個 Hash值?很簡單,只需對這個字符串做一次SHA-256 運算,得到Hash值,而且符合難度值,則視為驗證通過。
如果驗證通過,則代表已經有節點成功打包區塊,其他節點就停止不再為當前區塊打包,而是轉為接納這個區塊,並加入到自己的帳本中,然後參與下一區塊的競爭(挖礦)。
如果驗證不通過,將代表節點廣播的打包區塊有問題,可能是區塊被修改或者其他違規行為,其他節點將直接扔掉這個區塊,這個區塊則無法記錄到總賬本中,而該節點所消耗的運算成本就浪費了。正正因為這樣,所有節點都自覺自律地遵守共識機制,從而保障了整個系統賬本唯一性及安全。
下一篇:[入門解說] 區塊鏈 Blockchain – 工作量證明 (下)
原文授權轉載自《Samson's Blog》「區塊鏈 Blockchain – 共識機制之工作量證明 Proof-Of-Work」
新增留言