比特幣挖礦工作量證明
『壹』 挖礦到底在計算什麼
比特幣挖礦到底在計算什麼?如何看待比特幣挖礦,比特幣的挖礦對於不同的礦工而言是一種競爭記賬權的合作記賬行為,在合作的大框架下有序地競爭。也就是利用電腦硬體計算出比特幣的位置並獲取的過程稱之為挖礦。挖礦既能生產比特幣,又能保障交易信息,下面來具體解釋挖礦。
比特幣在2017年底暴漲至將近20萬人民幣一枚,不僅火了數字貨幣行業,更是火爆了區塊鏈行業,正因為如此,很多人想方設法去挖礦,獲取比特幣來實現自己的財富自己,首先,”比特幣“挖礦是怎挖的,比特幣是一中虛擬貨幣,基於區塊鏈技術。如果我們簡單地把區塊鏈的區塊比作一個個的賬本,那麼”挖礦“就是“打包”過去十分鍾整個區塊鏈網路的交易,把這些交易寫入新的區塊,那麼就“打包”完成,那就是完成了“挖礦”旅搭譽。完成了挖礦之後就獲得了系統分發給你的比特幣。這就是比特幣“挖礦”比較簡化的說法,當中的原理和運行還是相當復雜的。
如何分配“打包權”
比特幣的價格超過2w元一個,每一次獲得“打包權”,完成工作就會獲得12.5個比特幣(會隨時間遞減),獲利可謂相當豐厚。
天下熙熙皆為利來天下攘攘皆為利往,只要有利潤的地方就有人。網路上礦工眾多,那麼如何確定應該分配給哪個礦工去做這事呢?
比特幣的創始人中本聰採用這種方法:採用一種叫“工作證明(Proof Of Work,簡稱POW)機制,即工作量的證明。
這種方法通常來說只能從結果證明,因為監測工作過程通常是繁瑣與低效的。這是用來確認你做過一定量的工作,但是監測工作的整個過程極為低效,而通過對工作的結果進行認證來證明完成了相應的工作量,則是一種非常高效的方式。
我們可以比喻成,要證明您會開車技術好,企業不可能給您幾天時間,跟著您在市區上走。但是,你可以提供駕駛證和之前在公交車公司當公交車司機的工作證明, 來說明您得能力。你要獲得這個能力需要付出大量的時間和精力,但是企業驗證卻非常簡單。
比特幣這種加密系統所使用工作量證明機制的證明是哈希現金,需要算出對應的哈希函數。哈希現金是一種工作量證明機制,它是亞當·貝克在1997年發明的,主要用於抵抗郵件的拒絕服務攻擊及垃圾郵件網關濫用。在比特幣之前,哈希現金被用於垃圾郵件的過濾,也被微軟用於hotmail等產品中。
對於比特幣這種加密系統所使用的哈希函數,它需要具備以下的性質:
1. 免碰撞,即不會出現輸入x≠y,但是H(x)=H(y)
2. 隱匿性,也就是說,對於一個給定的輸出結果H(x),想要逆推出輸入x,在計算上是不可能的。
3. 不存在比窮舉更好的方法,可以使哈希結果H(x)落在特定的范圍。
比特幣在區塊鏈的生枝鋒成過程中使用了POW機制,一個符合要求的區塊哈希函數由N個前導零構成,零的個數取決於網路的拆段難度值。
要得到合理的區塊哈希碼需要經過大量嘗試計算。當某個節點提供出一個合理的區塊哈希值,那就是說明該節點確實經過了大量的嘗試計算,那麼系統就把”打包權“分配給該節點(礦工)
當然這不能得出計算次數的絕對值,因為尋找合理hash是一個概率事件,所以當節點(礦工)擁有佔全網n%的算力時,該節點基本上就是有n/100的概率找到區塊哈希。那就是意思上說比拼算力。
當能不能記住前面幾個0,然後可以使用呢?不能的,因為難度值不一樣, 0的數量就不一樣。而且要證明的數是一個哈希碼,而且需要驗證的工作量證明非常龐大,基本上無法造假。只存在一個方法:窮舉!
那麼意味著,你不僅要算出你的哈希值,還需要對比對不對,如果不對的話繼續算。
所以需要大量的顯卡進行大量的並行運算,獲取哈希值。讓我們來看看,礦場是一個怎麼樣的存在:
這些礦場都是用很貴的顯卡來算,他們的算里是人工的N倍。如果單靠人力,算十年都沒有它們工作一小時的工作量大。
比特幣和傳統貨幣不同,美元和英鎊這種法幣由央行和金融機構管理,進行轉賬交易時這些機構也同時參與,而比特幣只在分布式賬本中進行交易,每一項交易就儲存在比特幣的全球網路節點中,不可復制,不可篡改。所以每個儲存數據的節點都會有相應的獎勵,目前已經開採的節點有1700萬個,比特幣總量只有2100萬個,意味著還有400萬個比特幣待開采。
『貳』 FileCoin: 有用的工作量證明
有用的工作量證明(Proof of Useful Work)是由著名的去中心化存儲項目 FileCoin 在它的白皮書里提出來的一個概念。工作量證明,Proof of Work,POW 是實現區塊鏈的一個重要共識方式,FileCoin 要實現一個基於區塊鏈的存儲平台。所以它也要做共識,它選擇的就是工作量證明共識。
首先我們來解釋一下常規的工作量證明。它是區塊鏈實現共識的一種方式。是比特幣採用的方式,所以,工作量證明就是俗稱的「挖礦」。比特幣做為一個去中心化的點對點交易系統,要在不同的節點上維護一個共同的完全相同的帳本,來記錄所有的交易,而且確保交易不會重復,不會一筆錢多花,就需要一個維護這個賬本一致性的規則。大家一起遵守這個規則,就是共識。區塊鏈常用的方法是,把這個賬本分成很多頁,每個頁就是一個區塊。每個區塊由一個節點來記賬,然後分發給其他節點復制,這樣所有節點上的賬本都是一樣的。但是每個區塊都由哪個節點來記錄,就需要一個大家都能遵守的規則。比特幣採用的方法,是讓所有的節點做一道簡單的數學題,題目很簡單,但是計算量很大,一般要10分鍾左右才能做出答案來。得到答案雖然很費時間,但是驗證答案是否正確很容易。然後所有的節點同時做題,第一個做出來的節點,就得到下一個區塊的記賬權。因為每個區塊都只有唯一一個最早做出題的節點,所以,每個區塊的記賬權是唯一的,而且也是很容易被其他節點驗證的。節點一旦驗證到其他節點得到了區塊記賬權,就必須復制區塊,加到本地區塊鏈中,同時開始下一個區塊記賬權的競爭。通過這種方式,比特幣就能確保所有節點的區塊鏈是一致的。
節點通過大量計算競爭區塊記賬權的的過程,就是工作量證明。所以,工作量證明系統(或者說協議、函數),是一種應對拒絕服務攻擊和其他服務濫用的經濟對策。它要求發起者進行一定量的運算,也就意味著需要消耗計算機一定的時間。這個概念由 Cynthia Dwork 和 Moni Naor 1993 年在學術論文中首次提出。而工作量證明(POW)這個名詞,則是在 1999 年 Markus Jakobsson 和 Ari Juels 的文章中才被真正提出。
實現區塊鏈共識的方式還有很多,如POS,DPOS,POA,PBFT等等,但是工作量證明是唯一被時間驗證過(11年)的在公鏈上運行的區塊鏈共識機制。
工作量證明存在一個什麼樣的問題呢?還是用比特幣為例。比特幣節點為了獲取出塊權做得那個數學題,叫哈希運算。計算量非常大,每一台參與比特幣挖礦的礦機都要時刻進行這個計算,耗費大量的電力。這個計算不像其他的如大數據處理的計算,可以產生一些價值,它的唯一目的,就是競爭出一個節點,成為下一區塊的出塊者。目前比特幣每年消耗電量約25.5億瓦,這相當於全球電量的0.5%,是愛爾蘭一年的耗電量。反對POW的人紛紛指責挖礦將電力資源浪費在虛無縹緲的數字貨幣上,還稱之為自由主義的「泔水」。
但是,認為POW是浪費的電的人不知道,正是能源和算力打造了比特幣安全不可攻破的體系。
一張100元的現金不只是你我認為他值100,而是整個社會群體都認為他值100,價值就是來自於共識。比特幣是社區行為,來自不同國家的人聚集到社區,用互聯網來建立秩序,它的意義也是來自於群體共識,只要大家都相信比特幣有價值,只共識存在,那麼他就有價值,和法幣一模一樣。所以產生價值認同並不一定需要國家來驅動,比特幣改革了一種傳遞信任的載體和媒介,千百年來,人類社會通過多少流血戰爭建立的政權和共識,現在兵不血刃,只是耗費些電力就實現,豈不是更先進。
總結而言,要想設計一個去中心化而且安全的數字貨幣,能源和算力是必要的代價。工作量證明是以去中心化形式構建安全產權認證系統的唯一方案。所以認為POW是浪費的電的人不知道,正是能源和算力打造了比特幣安全不可攻破的體系。現在比特幣全網算力已經達到一個非常恐怖的地步,任何人想要發動51%算力攻擊已經是不可能的事情了,POW演算法使比特幣系統牢不可破。
為締造價值而產生的消耗不叫浪費。
但是,如此多的算力,是否可以用來創造更多的價值呢?用 FileCoin 的話說,工作量證明,還有沒有其他用途呢?
FileCoin 是分布式存儲行業的明星項目。他的開發團隊 Protocol Lab 就是開發 IPFS 協議的團隊,以至於很多人都分不清FileCoin 和 IPFS 的區別。可以說是2017年 FileCoin 的1CO,把這個行業推向巔峰,也引出了一系列的同類型項目。本文無意於贊譽或者貶低這個項目,只想結合自己從事這個行業的經驗,表達一些自己的觀點,盡量做到客觀公正。希望對從事這個行業的人有一些啟發。
FileCoin 在白皮書中提出要實現一個有用的工作量證明,實際上就是認可了,要打造一個安全不可攻破的區塊鏈,就必須消耗工作量。但是,他們不希望為這個工作量做出的計算完全被浪費,所以想把這個工作量利用起來。所以,他們想到的方法是,在工作量證明裡加入存儲空間的使用率。這樣,所有的節點為了形成共識,就必須提供存儲空間來存文件。這個存儲空間就可以存用戶數據,就是有用的。
那我們來看一下FileCoin是怎樣實現這種有用的工作量證明共識的。
Filecoin採用的共識機制並不是簡單的工作量證明,而是一種叫做預期共識(Expected Consensus,簡稱 EC)的機制。和其他主流共識機制目標一樣,讓礦工爭奪某一個高度唯一的出塊權而獲得獎勵。這個獲得出塊權的礦工叫做 Leader。在每一輪的出塊爭奪中,為了保證賬本的可靠性,都有一個唯一的 leader 來進行記賬。
也就是說,共識的核心就是選擇誰來當 Leader。選 Leader 的方式一般有兩種,互動式或者非互動式。互動式是要礦工之間互相投票的。比如 PBFT 就是互動式的,幾個參與選舉的人通過互發信息,得到多數票( 超過 2/3 )的人就是 Leader。預期共識採用了非互動式的方式來選舉 Leader。參與的各方根本不給彼此發消息,而是每個節點各自獨立私下進行運算。最後某個節點說,我贏得了選舉,然後提供一個證明,其他人可以很容易就驗證,他確實贏得了選舉。這個驗證方法就是零知識證明。
預期共識機制會為區塊鏈網路預設一個出塊的期望值。比如每1個紀元(epoch)生成1個區塊(block),但也有一個紀元可能出現空塊或多個區塊的情況。所以在 Filecoin 中,每個高度不是一個區塊,而是一個區塊集,叫做 TipSet,這個 TipSet 中可能包含了多個區塊。所以實際上 Filecoin 是 TipSet 鏈。預期共識無法保證每一輪只選舉出一個 Leader,所以會出現一輪中有多個 Leader 的可能,這樣鏈式結構就變成了DAG的網狀結構。所以 FileCoin 還會對 block 賦權重,實現有效收斂。
FileCoin 採用的 EC 共識有一個好處。對於傳統的 POS 共識機制來說,有一個重大問題就是無法控制分叉。也就是說,由於挖礦成本低,參與者可以同時挖多個鏈獲取利益。而預期共識對這一點做了設計,那就是通過權重和抵押機制來促使礦工選擇一條最好的鏈,對同時挖多個鏈的礦工進行懲罰,這樣可以非常快速地促進收斂。這說明 POW 和 POS 共同使用會是一種好的方式。
每一個礦工獲得出塊的可能與其當前有效存儲量佔全網總存儲量正相關。這種期望共識機制其實是更像是 POS 權益證明,只是它將POS里邊的權益(Staking)換成了有效存儲佔比。但是礦工的有效存儲從何而來呢?是通過存儲用戶數據得來。如何證明礦工存儲了用戶的數據,FileCoin 創造出一個新的證明機制叫 POST 時空復制證明。這個 POST 就是 FileCoin 的工作量了。把耗電的算力換成存儲有用數據的存儲空間,無意義的軍備競爭變成了存儲服務市場競爭。這確實是 FileCoin 的進步之處。只不過,為了成功的出塊,礦工通過預期共識被選為出塊節點後,必須在一個塊的時間里(現在是45秒)做個 POST 證明,成功提交,才能出塊。否則就失去機會。所以,為了確保礦工能在指定時間內出塊,最終官方還是決定要使用 GPU。雖然這 GPU 不是像工作量證明那樣一直不停的工作,但是在整個實現共識的過程中還是出現了跟有用的工作量證明思想相違背的耗能計算。
還有,談到預期共識的時候,我們說到每一個紀元出塊都不是一個塊,而是一組塊,那麼紀元這個概念就很重要了。怎麼控制紀元呢?每個礦工在參與選舉前,需要先生成一個 Ticket,這個 Ticket 實際上是一個隨機數,他需要走一個 VDF 和 VRF 的流程,這個 VDF 全稱 Verifiable Delay Function,可驗證的延時函數。他的計算流程是串列的,需要花費一定的時間,並且這個時間無法通過多核並行的方式進行縮減。這保證了每個礦工產生 Ticket 時必須要消耗的時間,沒有人可以通過優化硬體的方式來獲得加速。聽上去這函數很完美,可是,這個 VDF 根本還不存在!現在 FileCoin 測試網直接使用了一個等待函數 sleep,這是 UDF,Unverifiable Delay Function。現在最接近的 VDF 解決方案,也是需要消耗大量計算資源的。說白了,還是要耗電,還是不環保。
所以,有用的工作量證明,依然只是一個美好的願望,理想很豐滿,但現實很骨感。被譽為下一個比特幣的 FIL,還要繼續為實現這個顛覆性的共識而努力。
總結一下FileCoin存儲礦工獲取激勵的流程:用戶存儲數據,支付FIL費用 -> 礦工存儲數據 -> 生成復制證明 -> 完成時空證明 -> 經過EC共識,選出出塊Leader -> 獲取打包權 -> 礦工獲取FIL獎勵
在這個流程圖上,可以看到,礦工可以在兩個地方獲取獎勵。一個是存儲用戶文件的時候可以得到用戶的FIL獎勵。一個是在獲取區塊打包權後獲得FIL。而得到區塊打包權的一個前提就是存有足夠多的用戶數據。所以,在存儲需求不夠大的情況下,礦工會從用戶那裡收取很低廉的費用。在用戶不夠的情況下,甚至會倒貼錢自己付FIL存數據,只為能夠存足夠多的數據,在 EC 共識中被選成 Leader 得到打包獎勵。這樣產生的效果是,FileCoin 對用戶非常友好,存儲費用非常低。所以,一定會吸引很多的應用來這個平台上做開發。但是缺點也很明顯,如果存儲量不夠大,礦工根本沒法跟其他人爭奪出塊權,所以得不到獎勵。最後整個平台會朝著大礦工,大礦池的方向發展,這跟 FileCoin 想把所有閑散伺服器利用起來實現分布式存儲的初衷是違背的。或者說,一定要等到這個行業具有一定規模,技術更成熟,才有小礦機挖礦的機會。
我們先來簡單的講一講中心化存儲和去中心化存儲各自的利弊。中心化存儲設備統一管理,可靠性好,性能高,去中心化存儲數據天然分散,易於流通,容災性好,但是可靠性低。從經濟角度來說,中心化存儲是重資產投入,成本高。去中心化存儲通過區塊鏈激勵層,用戶自行加入,輕資產,可降低存儲總成本。未來應用數據的存儲和處理還會是以中心化存儲為主,而去中心化存儲因為是分布式網路,主要可用於熱門數據流量分發。同時,因為沒有中心化所有權,可以成為去中心化應用的首選。
市場上有一種說法是,去中心化網路適合冷數據的備份,其實這並不是去中心化存儲的優點,實在是因為把熱數據放到去中心化網路上太不可靠,處理性能也跟不上。所以,如果去中心化存儲能實現一定的規模效應,大大降低存儲成本,把冷數據備份當作核心業務,並把目標定位在今天因為成本太高沒被企業存儲的冷數據,會是一個很好的發展方向。
如此說來,從技術上講,去中心化存儲並不一定比中心化存儲有優勢。如果能推行一種新的模式,把去中心化的經濟激勵和中心化的存儲合在一起,就能吸收兩者的長處。真正實現有用的工作量。FileCoin 未來可能促成的大礦場模式的數據中心,可能更有市場。
在11年後的今天,比特幣並沒有實現它成為一個點對點的電子支付貨幣的初衷,但阻止不了人類前赴後繼的去買它,擁有它。同樣,我相信 FileCoin 已經得到足夠大的社群,礦工和開發者的支持,即使在可預見的未來,它不會促成分布式存儲應用的全面落地(也許這從來不是 FileCoin 的目標),但我還是相信會有很多人會因為它的共識去購買它,持有它。上升到哲學層面,人類在為真理買單。
那麼在實際生活中,何為有用,或者說,我們到底是在用存儲做共識還是用共識做存儲?FileCoin 是前者。FileCoin 想要基於存儲工作量實現的去中心化的共識,理論上是完美的,追求完美,人類是要付出代價的。這也是為什麼在這個項目上我們等待了這么長的時間。但是一旦實現,它可能會為人類帶來巨大價值,對市場帶來無窮大的號召力。
只不過去中心化不是萬物的靈葯。中心化的一個最大優勢是它的效率非常高。像dPOS或者聯盟鏈這樣的弱中心化共識兼顧兩者優勢,能更快速的把應用推向市場,提前啟動分布式存儲行業,推進分布式存儲應用落地。所以,我們既追求用存儲做共識,也追求用共識做存儲,根據實際需求來做出我們的選擇。在這個過程中,相信區塊鏈也會進一步發展,逐步優化,變得越來越有用。
『叄』 比特幣中怎麼證明是自己挖礦成功,而不是其他人呢
我們知道了信息計算Hash打包的過程:交易記錄、時間、賬本序號、上一個Hash值。也知道所有的計算和存貯是需要消耗計算機資源。在中本聰的設計里,完成記賬可以獲得系統給與比特幣獎勵,這個過程也就是比特幣發行過程,因此把記賬成為挖礦。
記賬工作
因為記賬是有獎勵,每次記賬都可以為自己增加一定個數的比特幣,因此大家爭相記賬,當然能也就引發了問題:出現記賬不一致的是後,系統引入工作量證明來解決這個問題,規則如下:
1.在一段時間內,只有一個人能記賬成功。
2.通過解決密碼學難題競爭獲得唯一記賬權
3.其他節點復制記賬結果
不過在進行工作量證明之前,記賬節點會做進行如下准備工作:
1.收集廣播中還沒有被記錄賬本的原始交易信息
2.檢查每個交易信息中付款地址有沒有足夠的余額
3.驗證交易是否有正確的簽名
4.把驗證通過的交易信息進行打包記錄
5.添加一個獎勵交易:給自己的地址增加12.5比特幣
如果爭奪記賬權成功的話,就可以得到12.5比特幣的獎勵。
工作量證明
每次記賬的時候會把上一個塊的Hash值和當前的賬頁信息一起作為原始信息進行Hash。為了確保10分鍾前後只有一個人可以記賬,就只有提高記賬的難度,用Hash的結果必須以若干個0開頭。為了滿足條件,進行Hash是引入一個隨機數變數。
用偽代碼表示一下:
1.Hash(上一個Hash值,交易記錄集) = 456635BCD
2.Hash(上一個Hash值,交易記錄集,隨機數) = 0000aFD635BCD
改變Hash的原始信息的一部分,Hash值也會不斷變化,因此在運行Hash的時候,不斷改變隨機數的值,總可以找到一個隨機數使得Hash的結果以若干個0開頭,率先找到隨機數的節點從此獲得記賬的唯一記賬權。
驗證
在節點成功找到Hash值之後,會馬上對全網進行廣播打包區塊,網路的節點收到廣播後會對其進行驗證。如果驗證通過,表明已經有節點成功解密,就不會在競爭當前區塊,而是選擇接受區塊,記錄到自己的賬本中,進行下一輪競爭猜謎。網路中只有最快解密的區塊才會添加到賬本中,其他的節點進行復制,確保整個賬本的唯一性。
如果節點有作弊行為,會導致網路的節點驗證不通過,直接放棄其打包的區塊,也無法記錄到總賬本中,那麼作弊節點的消耗成本就白費了。因此礦工自覺的遵守比特幣系統的共識協議,也確保整個系統的安全。
這個問題就好像你去工地搬磚,搬完一天磚,包工頭問你你怎麼證明自己一天在工地搬磚呢?
『肆』 比特幣挖礦機原理介紹 幾個方面來講解
1、最初的時候,用CPU就可以挖到比特幣,中本聰就是用他的電腦CPU挖出了世界上第一個創世區塊。然而,CPU挖礦的時代早已過去,現在的比特幣挖礦是ASIC挖礦和大規模集群挖礦的時代。
2、挖礦速度,專業的說法叫算力,就是計算機每秒產生哈希碰撞的能力。也就是說,我們手裡的礦機每秒能做的哈希碰撞次數,就是算力。
3、比特幣在宏觀上的原理,就如同黃金一樣。黃金在地球上的總量是一定的,而且比較稀少,可以作為一般等價物來使用,在紙幣大面積發行之前,一直作為貨幣的形式來使用。比特幣也是一個道理,之所以比特幣可以用來作為貨幣的形式來進行買賣,也是因為其總量是一定的,而且挖礦需要花費很大的成本,主要表現就是電力上的消耗。
4、工作量證明,簡單理解就是一份證明,用來確認你做過一定量的工作。監測工作的整個過程通常是極為低效的,而通過對工作的結果進行認證來證明完成了相應的工作量,則是一種非常高效的方式。
5、比特幣的背後是一個公共賬本,這個賬本每十分鍾需要重新記錄一遍,而成功記賬者會獲得一定數量比特幣的獎勵。在比特幣誕生之初,這個獎勵是50個比特幣,這一數字大約每4年減半。
『伍』 比特幣的工作量證明要怎麼理解
客戶端不需要知道真正的隨機數,客戶端(也是系統)其實就是要「隨機數」所求的哈希值小於某個值。
如:041665464(隨機數)的SHA256的值是:(16進制)0FFFFFFFFFF...(假如)
它不符合小於00FFFFFFFF的規定,所以不是區塊。
041665465(隨機數)的SHA256的值是:(16進制)000FFFFFFFF...(假如)
它符合小於00FFFFFFFF的規定,所以它是區塊。
實際上找小於一個哈希值的隨機數很難的,這正是工作量證明的原理。
要小於的這個值(00FFFF...)是可變的(難度),這個隨時間和計算力的大小而變化。
『陸』 工作量證明機制(pow)是什麼
工作證明(Proof Of Work,簡稱POW),顧名思義,即工作量的證明。通常來說只能從結果證明,因為監測工作過程通常是繁瑣與低效的。
比特幣在Block的生成過程中使用了POW機制,一個符合要求的Block Hash由N個前導零構成,零的個數取決於網路的難度值。要得到合理的Block Hash需要經過大量嘗試計算,計算時間取決於機器的哈希運算速度。當某個節點提供出一個合理的Block Hash值,說明該節點確實經過了大量的嘗試計算,當然,並不能得出計算次數的絕對值,因為尋找合理hash是一個概率事件。當節點擁有佔全網n%的算力時,該節點即有n/100的概率找到Block
Hash。
工作證明機制看似很神秘,其實在社會中的應用非常廣泛。例如,畢業證、學位證等證書,就是工作證明,擁有證書即表明你在過去投入了學習與工作。生活大部分事情都是通過結果來判斷的。
『柒』 比特幣的挖礦到底挖的是什麼
比特幣最吸引人的是挖礦。為什麼采礦如此迷人?因為挖礦可以得到比特幣。在寫這篇文章的時候,比特幣的價格是3900美元。如果能挖到一個區塊,可以獲得48750美元的開採收入和大約6000美元的交易費收入。這難道不令人著迷嗎?
那麼到底什麼是采礦呢?礦工如何通過挖礦獲得比特幣?這需要從比特幣區塊鏈系統採用的PoW(工作量證明)共識機制說起。
有一個村子,很多事情需要一起決定。比如有一天村長需要所有村民一起決定今天中午在村食堂包餃子還是卷面條。通常我們能想到的方式是投票——每個村民一票,少數服從多數。但是有些村民不願意在食堂吃飯,可能會把自己的票讓給別人,可能會導致不公平。大豎悔畢部分在食堂吃飯的人,可能都實現不了自己的願望。
於是村長換了一種方式。10點50分,他用喊話器向全體村民廣播:「中午我們在食堂選做餃子還是面條。想去食堂吃飯的,就推食堂門口的巨石。11點整,石頭會推到大門東邊,他們中午吃餃子;推余芹到大門西邊,中午吃面。」
於是想在食堂吃飯的人跑去推石頭。貢獻多的人最後實現了願望,貢獻少的人心甘情願,因為村裡一直就是這樣的規矩。
這個故事講述了一種在民眾中達成共識的方式,我們可以稱之為「工作量證明機制」。用努力的多少來證明自己的選擇意願。
在本系列的第一篇文章中,我們討論了可以保持每個人的賬簿一致的區塊鏈系統。這種保持所有節點數據一致的機制稱為共識機制。不同的共識演算法可以達到不同性能的共識效果,最終目的是保持數據一致。
注意第一個,在任何塊中,第一個都沒有轉出地址,也就是所謂的CoinBase (mining transaction)。沒有人付給礦工這些錢,但是礦工只是寫著他們得到了12.5個比特幣。所有節點都同意礦工這樣寫,所以礦工獲得采礦收入。
不同礦工填塊的時候,數據肯定是不一樣的,因為每個礦工的第一條規則肯定是不一樣的,礦工只會把開采所得轉到自己的地址。所以礦工邁克爾的CoinBase是「邁克爾獲得了12.5個比特幣」,礦工南希的CoinBase是「南希獲得了12.5個比特幣」。
每個礦工都填好了自己收集的交易和應該得到的收入。那麼,誰的記錄會得到大家的認可呢?比特幣使用工作量證明機制,讓礦工相互競爭來解決一個數學問題。誰先解決,誰就得到大家的認可。就像開篇故事中講述的那個村莊一樣,每個礦工都在用力推著巨石。一旦石頭壓住了他的賬戶頁面,他喊道:「我的工作量證明是成功的。快來看!」所有的礦工都來了,抄下那一頁賬目,貼在賬本後面,然後開始新的記賬流程。周而復始,生生不息,賬本一頁頁的增加,賬本越來越厚。
當中本聰決定採用工作量認證機制時,出發點是為了避免系統受到攻擊。「中本聰」認為,如果攻擊者想通過搞亂賬本來攻擊,他需要足夠的計算能力。換句話說,他比大多數推石頭的人都厲害。這樣他要付出巨大的成本,但回報不足以抵消成本,所以攻擊者沒有經濟動機去攻擊比特幣系統。
但是,現在由於比特幣的價格越來越高,推石頭的人已經不滿足於自己去推了,而是把家裡的大騾子大馬都派上去幹活了。在「中本聰」最初的設計里,一個CPU一票,用算力來決定哪個礦工記的賬成為最終的賬目。隨著比特幣價格的增高,開始出現了GPU挖礦,後來人們又不滿足於GPU的速度,開始製造專用晶元挖礦。專用晶元在計算比特幣問題的能力上是普通CPU的數萬倍,因此現在比特幣已經不是「一個CPU一票」了,這也背離了當初「中本聰」的設計,比特幣網路已經基本上被幾大礦池所壟斷,背離了去中心化貨幣這一初衷。
雷鋒網特約稿件,未經授權禁止轉載。詳情見轉載須知。
相關問答:顯卡挖礦是什麼意思?為什麼顯卡價格和挖礦有關?
作為一個曾經「夢想一夜暴富,最後血本無歸」的「老礦工」,來回答這個問題,本文盡量用通俗的語言來描述一下挖礦、顯卡挖礦和顯卡價格的一些相關問題。
「挖礦」是什麼意思?
簡單來講,挖礦就是產生數字貨幣的意思,數字貨幣有很多種,包括我們聽到過比特幣、萊特幣、以太坊、幣安幣、狗狗幣等。
這里,我們以比特幣為例,來大致了解一下,比特幣就是一種P2P形式的數字貨幣,P2P的去中心化特性與演算法本身可以確保無法通過大量製造比特幣來人為操控幣值。所以,比特幣其總數量有限,該貨幣系統曾在4年內只有不超過1050萬個,之後的總數量將被永久限制在2100萬個。
但是,與大多數貨幣不前手同,比特幣不依靠特定貨幣機構發行,它依據特定演算法,通過大量的計算機數據計算而產生,每隔一定時間就會通過「挖礦」產生一部分比特幣。
「顯卡挖礦」是什麼意思?
我們知道了「挖礦」的含義,簡單地說,不就是讓電腦進行大量計算嗎?這不正是電腦的長處嗎?
那麼,為什麼「挖礦」總要拿顯卡去挖,更為厲害的CPU,它不能挖嗎?畢竟,顯卡一般都是用來打游戲的,怎麼會和數字貨幣扯上關系呢?
這里就要提到一個詞語:算力。
我們要知道,挖礦最重要的就是電腦硬體的算力大小,相較於CPU的復雜運算,顯卡進行的則是通用計算,往往都會堆疊上千甚至幾千個流處理器。然而正好,挖礦只需要通用計算就能搞定,復雜運算卻完全利用不上,所以,顯卡的另外一個用武之地就是挖礦!
相當於什麼意思呢?舉個例子簡單的例子:我們需要在大量的白紙上面寫上一個數字1,我們安排10個老師和1000個小學生來做這件事,在相同時間內,這1000個小學生的完成量肯定要比10個老師完成的更多,雖然老師能力更強,但是在處理這種簡單事情上,架不住小學生人多啊。
其實,早期的「挖礦」,確實是用CPU來進行的,後來,由於挖礦的難度越來越大,CPU的通用計算你能力已經並無法滿足挖礦的需求了,所以就用到顯卡來挖礦。反而,對於我們平時注重的電腦性能提升的重點硬體CPU和內存要求並不高,有的時候僅僅需要能夠保證運行操系統和相關軟體就行。我當初自己配置的小型礦機,使用的CPU和CPU散熱都是二手貨,內存僅為4GB,使用的硬碟僅為60G,然而搭配的確是6塊顯卡和可以插6塊顯卡的主板。
為什麼顯卡價格和挖礦有關?
關於顯卡的價格與挖礦的關系,一般可以從新顯卡和二手顯卡市場的價格來分別說一下。
第一,新顯卡方面。
其實,新顯卡的價格上漲,主要是在前兩年,最近顯卡價格正在逐漸回落。而當初,顯卡價格上漲跟當時比特幣的市場行情有很大關系。當時的比特幣價格可謂是達到了瘋狂狀態,所以催生了大量的專業「礦工」和「挖礦公司」,當然,也包括大量的像我一樣的「挖礦散戶」。
當時,有媒體報道,有部分地區的網吧竟然關門歇業,戰而進行專業挖礦,其火熱程度可想而知。
後來,由於數字貨幣價格回落,並且相關監管部門對數字貨幣及挖礦項目的規范化管理,行業正逐步回歸理性和正規,加上挖礦行業與環境保護相悖,所以大量的礦工轉行、礦機關閉,同時,相關企業也研發出了專用的挖礦機器,造成顯卡需求持續下降,顯卡價格隨之下降。
大量的市場需求,導致顯卡的價格一漲再漲;市場需求降低,顯卡價格也逐步回落,這與市場的供需關系和價格浮動是相匹配的。
第二,二手顯卡方面。
挖礦用的顯卡,我們俗稱礦卡。隨著礦機對顯卡的大量需求,二手顯卡也被很多礦工所青睞;但又隨著大量礦機關閉,大量礦卡肯定流入二手市場,而很多良心人士,是不建議普通用戶購買二手礦卡的。所以,顯卡二手市場的的價格也就隨著挖礦行業的行情變化而變化。
舉個真實的例子,AMD曾推出了一款顯卡叫Radeon Ⅶ,於2019年2月發布,7月份停產,發布時價格僅為5000多。但是,在停產一年半過後,其二手價格竟高達8000元左右,而這僅僅是由於這塊顯卡各方面的性能數據更加有利於挖礦。
總體而言,顯卡挖礦就是一種利用顯卡本身的優勢來進行數字貨幣的生產,而挖礦行業的興衰,就直接影響了顯卡價格的波動。
在此,奉勸還未進入而又想進入「礦圈」的普通玩家,放棄吧,因為有可能,下一個「血本無歸」的,就是你!
『捌』 什麼是工作量證明
在區塊鏈里很重要一個概念就是工作量證明,英文全稱為Proof of Work,縮寫為POW。相信很多人剛接觸到這個概念的時候都很費解,「 咦,工作量證明?意思是要證明我做了多少工作嗎? 」;我更相信很多投資比特幣或者被一些所謂的「 可以一夜暴富 」的「 新型數字貨幣 」所忽悠的投資人,對這個概念更加「 耳熟能詳 」,因為他們聽到太多那些「貨幣」宣稱自己有更安全的演算法、更可靠的工作量證明機制。 因為聽得多,似乎很懂,但就是不真正理解它,這種認知上的不對稱,往往是傳銷幣等妖物有機可趁的主要原因。
之前給大家介紹「拜占庭將軍問題」的時候,提到過拜占庭將軍解決的主要是多個節點之間如何取得共識的問題(如果你忘了當時的故事背景是怎樣,那再去好好翻翻之前的課程吧),但是並沒有深入介紹如何進行共識。如何進行共識,是區塊鏈里最關鍵的一個問題,也是被討論得最多的一個,在區塊鏈誕生之前,分布式系統領域里對共識演算法就有很多研究,但是這里並不打算展開了。
1、工作量證明真的是用來證明你做了多少工作
其實,正如本文第一段提到的,很多人剛開始理解的那個概念,「工作量證明主要用來證明一個人做了多少工作」,基本是正確的,計算機領域並不是只有一些生澀的概念的,這個概念通俗易懂,反倒讓我們困惑了。
還是要回到拜占庭將軍問題的故事場景,在那個故事裡,我們應該信任誰,誰能擔此大任成為那個英雄卓絕的將軍呢?
可能因為城邦之間信息在不斷傳輸,傳輸量太大,每個城邦的將軍都王婆賣瓜,自賣自誇,到底該信任誰,基本上很難區分。細心的朋友可以好好發揮一下想像力。其實,有種最簡單粗暴的方法: 看誰最聰明!誰最聰明,我們就相信誰。
誰最聰明這個問題其實太主觀了,沒辦法,只能拿實力說話。就像我們經歷過無數的考試一樣——來,將軍們,大家做道題吧,解答准確且最快的人勝出。
於是,智多星旁白:請聽題兒, 請問在一個值比如123456789,後面追加一個5位隨機數,請找到一個隨機數,使得所計算的哈希值前5位都是0。
將軍們千萬不要懵逼,你不知道並不代表別人不知道,於是那個最聰明的將軍快速的算了出來,並 寫上自己的名字 ,交了試卷。老師一驗證,完全正確,於是選出他作為那個拜占庭將軍,號令群雄。
如果你不知道哈希演算法,請回去復習之前的課程。另外,這里提醒一點,將軍必須寫上自己的名字表明是自己算對的這道題,這在區塊鏈里也很重要,它表示簽名表明自己勝出,最後還能獲得獎勵喲。
以上介紹的這個有的意思的過程,就是所謂的工作量證明。
2、怎麼理解挖礦,礦機,礦池?
工作量證明最常見是在比特幣里,當大家還不太理解這個玩意兒的時候,已經很多地方見到「挖礦」「礦機」這些宣傳字眼了,那個時候我們根本不能理解的是,在電腦裡面怎麼挖礦?腦洞完全打不開啊。我也困惑了很久,當在淘寶上看到有人賣礦機的時候,我一臉鄙夷,說這一定是忽悠。
很多時候鄙視其實更多是自己不理解造成的,直到它長成龐然大物,直到羅胖提到的「旁邊有個物種坐了起來」,才發現我們理解地似乎有點晚了。即便如此,我們不能因此放棄對一個新鮮事物的認識呀。
所謂挖礦,其實就是計算機對上面提到的工作量證明進行的一個運算過程。大家或許會奇怪,將軍算題這么高大上的一個比喻到了這里怎麼變成挖礦這么苦逼的一個概念呢?其實,拜占庭將軍只是以一種有趣的方式描述了故事背景,及工作量證明的一些細節,而挖礦更貼近區塊鏈里工作量證明的一個過程——因為,確實很苦逼!
其實,上面提到的「智多星」或者「老師」,就是那個神秘人物中本聰,比特幣的發明人(或組織)。中本聰出的這道難題說白了就是一個傻瓜式地,只能吭哧吭哧,老老實實地,從1,2,3...n不斷嘗試計算的一個計算題,也即密碼學里提到的 暴力破解 的概念。這種計算過程,枯燥乏味,耗費精力時間,這么苦逼,用「挖礦」形容最好不過了。而這個「礦」就是比特幣,一種如黃金般稀缺的玩意兒。
但是我們不要忘了,這種機械化的計算是計算機最擅長的事兒了,於是所有的都交給計算機吧,這才有了「礦機」的概念。隨著技術的發展,大家發現,計算機功能太強大,完全沒有必要全部用來進行這種計算,於是不斷精簡,將挖礦演算法集成到一些晶元里,不僅節省能源,而且算得更快。這就有了CPU挖礦,GPU挖礦,FPGA挖礦,ASIC挖礦等這類說法。
而礦池的出現,是隨著比特幣數量的總數限制,以及四年減半的硬性要求,挖礦到後期競爭越來越激烈,挖到比特幣的難度越來越大,於是只能抱團並肩作戰,這個團體就叫做「礦池」。有礦機的人可以選擇加入某個礦池,礦池集合所有礦機的力量,進行類似上面算術難題的計算;在計算時,將隨機數號碼段進行分配,不同號碼段交給不同的礦機計算,於是計算的效率大大提升,這樣便可以集合作戰,共享收益。
其實上面介紹的一些概念都非常初級,目的還是希望很多沒有相關基礎的人都能搞懂,只有把這些最基本的概念都理解了,走到後面才更容易,不是嗎?
『玖』 為什麼比特幣需要挖礦
很多人很好奇,為什麼人們說比特幣是挖出來的。下面我給你解釋下,為什麼比特幣這樣的區塊鏈項目需要「挖礦」。
交易需要記賬人
為了達成交易,買賣雙方轉賬需要有可信賴的人、機構來記賬清算。
比如你通過支付寶把100元轉賬給朋友,支付寶就把你的賬戶減少100元,而朋友的賬戶增加100元。這個場景支付寶就是記賬人。
信息不對稱問題
可是比特幣生來沒有支付寶、微信、銀行來支持它。比特幣也不準備依賴於這些中心化機構。
其發明者中本聰設計,任何都可以來幫助記賬,記賬就可以獲取比特幣作為獎勵。可是問題來了,想要幫助記賬獲取比特幣的人很多,選擇誰來記賬出錯概率低呢?這實際是一個信息不對稱問題。
比特幣系統想選出可信的人來記賬,卻不了解想來記賬的眾多參與者。為了解決這個問題,眾多區塊鏈項目想出了不同招數。
為了使得記賬人可信,部分區塊鏈乾脆僅僅讓個別使用者自己記賬,這類項目稱為私有鏈,實際上區塊鏈用處不大
部分區塊鏈項目,加入前需要先經過其他成員審核同意,這類項目叫做聯盟鏈
還有一類區塊鏈項目,允許任何人自由加入記賬,被稱為公鏈,比特幣就屬於這一類
挖礦減少信息不對稱
公鏈要解決「記賬人是否可信」這個信息不對稱問題,就要用到一些手段。實際上各自挖礦方式就是在想辦法解決這個問題。
下面簡單介紹下常用的挖礦手段,以及解決信息不對稱問題的原理。
1、工作量證明(POW)
POW是Proof of Work的簡稱,參與者需要證明自己確實花費了足夠工作成本。
中本聰設計了一個解謎 游戲 ,要解開必須得花費大量的計算,需要購買設備、消耗電量、花費時間。誰最先解開了謎,就證明誰確實花費了不少的成本,於是讓他負責記賬並獲得獎勵。然後重新開始新一輪解謎,如此往復。這個過程你開著機器(電腦),在無數數字中尋寶,人們形象地比喻為「挖礦」。
POW其實是生活常用的減少信息不對稱的手段。比如:
你肯定想到了,POW證明不是那麼牢靠。早期就算付出了成本,當真的掌權也可能亂來,人性使然。對應地比特幣設計了一定的防攻擊措施,比如記賬內容至少要超過半數的算力認可。
2、權益證明(POS)
POS是Proof of Stake的簡稱,參與者需要證明自己擁有足夠的份額。
其假設是你有一個系統不少的股權,則你更加可信。每輪在參與者中,根據其持股的比例,給予相應概率被選為記賬人。
POS也是生活常用的減少信息不對稱的手段。比如:
3、POI、DPOS等其他方法
除了以上解決信息不對稱的方法,一些項目對以上方法進行組合,改進衍生出一些新方法。比如:
#比特幣[超話]# #數字貨幣# #歐易OKEx#
『拾』 詳解比特幣挖礦原理
可以將區塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網路中的每個參與者都把它看作一本所有權的權威記錄。
比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳的備份,這份總帳可以被視為認證過的記錄。
至今為止,在主幹區塊鏈上,沒有發生一起成功的攻擊,一次都沒有。
通過創造出新區塊,比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鍾產生一個新區塊,每一個新區塊都伴隨著一定數量從無到有的全新比特幣。每開采210,000個塊,大約耗時4年,貨幣發行速率降低50%。
在2016年的某個時刻,在第420,000個區塊被「挖掘」出來之後降低到12.5比特幣/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新幣的發行速度會以指數形式進行64次「二等分」。到那時每區塊發行比特幣數量變為比特幣的最小貨幣單位——1聰。最終,在經過1,344萬個區塊之後,所有的共20,999,999.9769億聰比特幣將全部發行完畢。換句話說, 到2140年左右,會存在接近2,100萬比特幣。在那之後,新的區塊不再包含比特幣獎勵,礦工的收益全部來自交易費。
在收到交易後,每一個節點都會在全網廣播前對這些交易進行校驗,並以接收時的相應順序,為有效的新交易建立一個池(交易池)。
每一個節點在校驗每一筆交易時,都需要對照一個長長的標准列表:
交易的語法和數據結構必須正確。
輸入與輸出列表都不能為空。
交易的位元組大小是小於MAX_BLOCK_SIZE的。
每一個輸出值,以及總量,必須在規定值的范圍內 (小於2,100萬個幣,大於0)。
沒有哈希等於0,N等於-1的輸入(coinbase交易不應當被中繼)。
nLockTime是小於或等於INT_MAX的。
交易的位元組大小是大於或等於100的。
交易中的簽名數量應小於簽名操作數量上限。
解鎖腳本(Sig)只能夠將數字壓入棧中,並且鎖定腳本(Pubkey)必須要符合isStandard的格式 (該格式將會拒絕非標准交易)。
池中或位於主分支區塊中的一個匹配交易必須是存在的。
對於每一個輸入,如果引用的輸出存在於池中任何的交易,該交易將被拒絕。
對於每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易將成為一個孤立的交易。如果與其匹配的交易還沒有出現在池中,那麼將被加入到孤立交易池中。
對於每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個確認。
對於每一個輸入,引用的輸出是必須存在的,並且沒有被花費。
使用引用的輸出交易獲得輸入值,並檢查每一個輸入值和總值是否在規定值的范圍內 (小於2100萬個幣,大於0)。
如果輸入值的總和小於輸出值的總和,交易將被中止。
如果交易費用太低以至於無法進入一個空的區塊,交易將被拒絕。
每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。
以下挖礦節點取名為 A挖礦節點
挖礦節點時刻監聽著傳播到比特幣網路的新區塊。而這些新加入的區塊對挖礦節點有著特殊的意義。礦工間的競爭以新區塊的傳播而結束,如同宣布誰是最後的贏家。對於礦工們來說,獲得一個新區塊意味著某個參與者贏了,而他們則輸了這場競爭。然而,一輪競爭的結束也代表著下一輪競爭的開始。
驗證交易後,比特幣節點會將這些交易添加到自己的內存池中。內存池也稱作交易池,用來暫存尚未被加入到區塊的交易記錄。
A節點需要為內存池中的每筆交易分配一個優先順序,並選擇較高優先順序的交易記錄來構建候選區塊。
一個交易想要成為「較高優先順序」,需滿足的條件:優先值大於57,600,000,這個值的生成依賴於3個參數:一個比特幣(即1億聰),年齡為一天(144個區塊),交易的大小為250個位元組:
High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000
區塊中用來存儲交易的前50K位元組是保留給較高優先順序交易的。 節點在填充這50K位元組的時候,會優先考慮這些最高優先順序的交易,不管它們是否包含了礦工費。這種機制使得高優先順序交易即便是零礦工費,也可以優先被處理。
然後,A挖礦節點會選出那些包含最小礦工費的交易,並按照「每千位元組礦工費」進行排序,優先選擇礦工費高的交易來填充剩下的區塊。
如區塊中仍有剩餘空間,A挖礦節點可以選擇那些不含礦工費的交易。有些礦工會竭盡全力將那些不含礦工費的交易整合到區塊中,而其他礦工也許會選擇忽略這些交易。
在區塊被填滿後,內存池中的剩餘交易會成為下一個區塊的候選交易。因為這些交易還留在內存池中,所以隨著新的區塊被加到鏈上,這些交易輸入時所引用UTXO的深度(即交易「塊齡」)也會隨著變大。由於交易的優先值取決於它交易輸入的「塊齡」,所以這個交易的優先值也就隨之增長了。最後,一個零礦工費交易的優先值就有可能會滿足高優先順序的門檻,被免費地打包進區塊。
UTXO(Unspent Transaction Output) : 每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是「未花費過的交易輸出」,也就是 UTXO。
塊齡:UTXO的「塊齡」是自該UTXO被記錄到區塊鏈為止所經歷過的區塊數,即這個UTXO在區塊鏈中的深度。
區塊中的第一筆交易是筆特殊交易,稱為創幣交易或者coinbase交易。這個交易是由挖礦節點構造並用來獎勵礦工們所做的貢獻的。假設此時一個區塊的獎勵是25比特幣,A挖礦的節點會創建「向A的地址支付25.1個比特幣(包含礦工費0.1個比特幣)」這樣一個交易,把生成交易的獎勵發送到自己的錢包。A挖出區塊獲得的獎勵金額是coinbase獎勵(25個全新的比特幣)和區塊中全部交易礦工費的總和。
A節點已經構建了一個候選區塊,那麼就輪到A的礦機對這個新區塊進行「挖掘」,求解工作量證明演算法以使這個區塊有效。比特幣挖礦過程使用的是SHA256哈希函數。
用最簡單的術語來說, 挖礦節點不斷重復進行嘗試,直到它找到的隨機調整數使得產生的哈希值低於某個特定的目標。 哈希函數的結果無法提前得知,也沒有能得到一個特定哈希值的模式。舉個例子,你一個人在屋裡打檯球,白球從A點到達B點,但是一個人推門進來看到白球在B點,卻無論如何是不知道如何從A到B的。哈希函數的這個特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機修改輸入,直到出現適當的哈希值。
需要以下參數
• block的版本 version
• 上一個block的hash值: prev_hash
• 需要寫入的交易記錄的hash樹的值: merkle_root
• 更新時間: ntime
• 當前難度: nbits
挖礦的過程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范圍是0~2^32, TARGET可以根據當前難度求出的。
簡單打個比方,想像人們不斷扔一對色子以得到小於一個特定點數的游戲。第一局,目標是12。只要你不扔出兩個6,你就會贏。然後下一局目標為11。玩家只能扔10或更小的點數才能贏,不過也很簡單。假如幾局之後目標降低為了5。現在有一半機率以上扔出來的色子加起來點數會超過5,因此無效。隨著目標越來越小,要想贏的話,扔色子的次數會指數級的上升。最終當目標為2時(最小可能點數),只有一個人平均扔36次或2%扔的次數中,他才能贏。
如前所述,目標決定了難度,進而影響求解工作量證明演算法所需要的時間。那麼問題來了:為什麼這個難度值是可調整的?由誰來調整?如何調整?
比特幣的區塊平均每10分鍾生成一個。這就是比特幣的心跳,是貨幣發行速率和交易達成速度的基礎。不僅是在短期內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鍾一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動態的參數,會定期調整以達到每10分鍾一個新區塊的目標。簡單地說,難度被設定在,無論挖礦能力如何,新區塊產生速率都保持在10分鍾一個。
那麼,在一個完全去中心化的網路中,這樣的調整是如何做到的呢?難度的調整是在每個完整節點中獨立自動發生的。每2,016個區塊(2周產生的區塊)中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鍾(兩周,即這些區塊以10分鍾一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的(或變難或變易)。簡單來說,如果網路發現區塊產生速率比10分鍾要快時會增加難度。如果發現比10分鍾慢時則降低難度。
為了防止難度的變化過快,每個周期的調整幅度必須小於一個因子(值為4)。如果要調整的幅度大於4倍,則按4倍調整。由於在下一個2,016區塊的周期不平衡的情況會繼續存在,所以進一步的難度調整會在下一周期進行。因此平衡哈希計算能力和難度的巨大差異有可能需要花費幾個2,016區塊周期才會完成。
舉個例子,當前A節點在挖277,316個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第277,316個區塊(父區塊為277,315)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。
比特幣共識機制的第三步是通過網路中的每個節點獨立校驗每個新區塊。當新區塊在網路中傳播時,每一個節點在將它轉發到其節點之前,會進行一系列的測試去驗證它。這確保了只有有效的區塊會在網路中傳播。
每一個節點對每一個新區塊的獨立校驗,確保了礦工無法欺詐。在前面的章節中,我們看到了礦工們如何去記錄一筆交易,以獲得在此區塊中創造的新比特幣和交易費。為什麼礦工不為他們自己記錄一筆交易去獲得數以千計的比特幣?這是因為每一個節點根據相同的規則對區塊進行校驗。一個無效的coinbase交易將使整個區塊無效,這將導致該區塊被拒絕,因此,該交易就不會成為總賬的一部分。
比特幣去中心化的共識機制的最後一步是將區塊集合至有最大工作量證明的鏈中。一旦一個節點驗證了一個新的區塊,它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。
節點維護三種區塊:
· 第一種是連接到主鏈上的,
· 第二種是從主鏈上產生分支的(備用鏈),
· 第三種是在已知鏈中沒有找到已知父區塊的。
有時候,新區塊所延長的區塊鏈並不是主鏈,這一點我們將在下面「 區塊鏈分叉」中看到。
如果節點收到了一個有效的區塊,而在現有的區塊鏈中卻未找到它的父區塊,那麼這個區塊被認為是「孤塊」。孤塊會被保存在孤塊池中,直到它們的父區塊被節點收到。一旦收到了父區塊並且將其連接到現有區塊鏈上,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的一部分。當兩個區塊在很短的時間間隔內被挖出來,節點有可能會以相反的順序接收到它們,這個時候孤塊現象就會出現。
選擇了最大難度的區塊鏈後,所有的節點最終在全網范圍內達成共識。隨著更多的工作量證明被添加到鏈中,鏈的暫時性差異最終會得到解決。挖礦節點通過「投票」來選擇它們想要延長的區塊鏈,當它們挖出一個新塊並且延長了一個鏈,新塊本身就代表它們的投票。
因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持一致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是, 每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。
當有兩個候選區塊同時想要延長最長區塊鏈時,分叉事件就會發生。正常情況下,分叉發生在兩名礦工在較短的時間內,各自都算得了工作量證明解的時候。兩個礦工在各自的候選區塊一發現解,便立即傳播自己的「獲勝」區塊到網路中,先是傳播給鄰近的節點而後傳播到整個網路。每個收到有效區塊的節點都會將其並入並延長區塊鏈。如果該節點在隨後又收到了另一個候選區塊,而這個區塊又擁有同樣父區塊,那麼節點會將這個區塊連接到候選鏈上。其結果是,一些節點收到了一個候選區塊,而另一些節點收到了另一個候選區塊,這時兩個不同版本的區塊鏈就出現了。
分叉之前
分叉開始
我們看到兩個礦工幾乎同時挖到了兩個不同的區塊。為了便於跟蹤這個分叉事件,我們設定有一個被標記為紅色的、來自加拿大的區塊,還有一個被標記為綠色的、來自澳大利亞的區塊。
假設有這樣一種情況,一個在加拿大的礦工發現了「紅色」區塊的工作量證明解,在「藍色」的父區塊上延長了塊鏈。幾乎同一時刻,一個澳大利亞的礦工找到了「綠色」區塊的解,也延長了「藍色」區塊。那麼現在我們就有了兩個區塊:一個是源於加拿大的「紅色」區塊;另一個是源於澳大利亞的「綠色」。這兩個區塊都是有效的,均包含有效的工作量證明解並延長同一個父區塊。這個兩個區塊可能包含了幾乎相同的交易,只是在交易的排序上有些許不同。
比特幣網路中鄰近(網路拓撲上的鄰近,而非地理上的)加拿大的節點會首先收到「紅色」區塊,並建立一個最大累計難度的區塊,「紅色」區塊為這個鏈的最後一個區塊(藍色-紅色),同時忽略晚一些到達的「綠色」區塊。相比之下,離澳大利亞更近的節點會判定「綠色」區塊勝出,並以它為最後一個區塊來延長區塊鏈(藍色-綠色),忽略晚幾秒到達的「紅色」區塊。那些首先收到「紅色」區塊的節點,會即刻以這個區塊為父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受「綠色」區塊的節點會以這個區塊為鏈的頂點開始生成新塊,延長這個鏈。
分叉問題幾乎總是在一個區塊內就被解決了。網路中的一部分算力專注於「紅色」區塊為父區塊,在其之上建立新的區塊;另一部分算力則專注在「綠色」區塊上。即便算力在這兩個陣營中平均分配,也總有一個陣營搶在另一個陣營前發現工作量證明解並將其傳播出去。在這個例子中我們可以打個比方,假如工作在「綠色」區塊上的礦工找到了一個「粉色」區塊延長了區塊鏈(藍色-綠色-粉色),他們會立刻傳播這個新區塊,整個網路會都會認為這個區塊是有效的,如上圖所示。
所有在上一輪選擇「綠色」區塊為勝出者的節點會直接將這條鏈延長一個區塊。然而,那些選擇「紅色」區塊為勝出者的節點現在會看到兩個鏈: 「藍色-綠色-粉色」和「藍色-紅色」。 如上圖所示,這些節點會根據結果將 「藍色-綠色-粉色」 這條鏈設置為主鏈,將 「藍色-紅色」 這條鏈設置為備用鏈。 這些節點接納了新的更長的鏈,被迫改變了原有對區塊鏈的觀點,這就叫做鏈的重新共識 。因為「紅」區塊做為父區塊已經不在最長鏈上,導致了他們的候選區塊已經成為了「孤塊」,所以現在任何原本想要在「藍色-紅色」鏈上延長區塊鏈的礦工都會停下來。全網將 「藍色-綠色-粉色」 這條鏈識別為主鏈,「粉色」區塊為這條鏈的最後一個區塊。全部礦工立刻將他們產生的候選區塊的父區塊切換為「粉色」,來延長「藍色-綠色-粉色」這條鏈。
從理論上來說,兩個區塊的分叉是有可能的,這種情況發生在因先前分叉而相互對立起來的礦工,又幾乎同時發現了兩個不同區塊的解。然而,這種情況發生的幾率是很低的。單區塊分叉每周都會發生,而雙塊分叉則非常罕見。
比特幣將區塊間隔設計為10分鍾,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。