OreCrux

首頁/挖礦原理/比特幣是怎麼挖出來的

比特幣是怎麼挖出來的

比特幣是怎麼挖出來的封面:紙白工作板底色,右側為程式化生成的岩層條帶母題
封面為程式化生成,非 AI 生圖。

很多人對挖礦的第一印象是「用電腦跑一個程式,幣就會慢慢冒出來」。這個印象不算錯,但它跳過了最有意思的部分 —— 幣為什麼會冒出來、憑什麼冒到你帳上、以及那些電到底買到了什麼。

先給結論:挖礦不是從哪裡刨出幣來,而是全網的機器在反覆猜一個數字,誰先猜中誰就獲得把這一批交易打包記帳的資格,並領走這個區塊新發行的幣和裡面的交易手續費。「挖」這個字是個比喻,真正發生的事情是競爭記帳權

這篇想把這件事從頭講一遍,講到你能用自己的話複述出來為止。我們儘量不用一個專業詞去解釋另一個專業詞 —— 如果哪一段做不到,那是我們沒寫好,歡迎寫信指出來。

為什麼記個帳還要「挖」

先退一步。比特幣要解決的問題其實很樸素:一群互相不認識、也沒有共同上級的人,怎麼維護同一本帳。

你在銀行轉帳,銀行的伺服器說了算,它記一筆你就少一筆。這套辦法能跑,是因為大家都預設銀行不會亂改帳本。但如果沒有銀行呢?如果這本帳要放在幾萬台互不信任的電腦上,誰來決定「下一頁寫什麼」?

最直覺的想法是投票,一台機器一票。問題是網路上「一台機器」這個身份幾乎不花錢 —— 我可以偽造出一萬個身份,投票就沒有意義了。這個問題在計算機領域被討論了很多年,中本聰在 2008 年那份九頁的論文裡給的答案是:別按身份投票,按算力投票。

算力是要花錢的。你想在這個系統裡獲得更大的話語權,就得投入更多真實的電和裝置。偽造身份很便宜,偽造算力不行。這就是挖礦存在的全部理由 —— 它是把「誰說了算」這件事,從「你是誰」換成了「你付出了多少」。

雜湊:一台只能往前走的絞肉機

要理解怎麼「按算力投票」,得先認識一個東西:雜湊函式。

你可以把它想成一台絞肉機。你往裡扔任何東西 —— 一句話、一本書、一部電影 —— 它都會吐出一串固定長度的字元。比特幣用的這台機器叫 SHA-256,吐出來的永遠是 256 個二進位,寫成十六進位就是 64 個字元。

這台絞肉機有三個性質,缺一個比特幣就不成立:

第三條是關鍵。它意味著這台機器製造了一種只能用蠻力解決的問題。而蠻力,是可以用錢買的。

那個猜數字的遊戲,具體長什麼樣

現在把遊戲規則擺出來。

礦工手上有一個叫區塊頭的東西,八十位元組,裡面裝著幾樣固定的資訊:版本號、上一個區塊的雜湊、這批交易的摘要(叫默克爾根)、時間戳、當前的難度目標,以及最後一格 —— 一個可以隨便填的數字,叫隨機數(nonce)。

礦工要做的事是:不停地改那個隨機數,把整個區塊頭扔進絞肉機,看吐出來的 64 個字元是不是足夠小。

「足夠小」是什麼意思?系統會規定一個門檻值。你算出來的那串數必須小於這個門檻才算數。因為雜湊結果本質上是個巨大的隨機數,要它小於某個很小的門檻,就像要它開頭連著好幾十個零 —— 機率極低,只能靠試的次數堆。

這裡最容易誤解

礦工不是在解一道有答案的數學題,沒有什麼公式能推出正確答案。它就是在窮舉。你的機器每秒能試幾百萬億次,全網每秒能試的次數還要再多幾百萬倍 —— 所有這些嘗試裡,絕大多數都是廢的,只有極少數剛好撞上門檻以下。這個「浪費」不是設計缺陷,恰恰是設計目的,後面會講到。

隨機數那一格只有 32 位,也就是四十多億種可能。以現在的機器速度,這四十多億種組合零點幾秒就試完了。所以礦工還會同時改另外幾個地方 —— 比如打包進去的交易略微調整、時間戳走一秒、或者動一下自己那筆獎勵交易裡的一段自由資料。這些都會讓整個區塊頭變樣,絞肉機就得重算。

難度:讓「十分鐘」這個數字穩住的機制

門檻不是固定的。如果它固定,那麼隨著全世界接入的機器越來越多,出塊速度就會越來越快,幣會被提前發完。

比特幣的處理辦法是定期調整門檻:每產生 2016 個區塊,系統回頭看一眼這 2016 個塊實際花了多久。理想情況下,按平均十分鐘一個算,應該花兩週整。

這個調整有個上限,單次最多變化四倍,防止極端情況下系統失控。除此之外它完全自動,沒有人在中間做決定,規則寫在程式碼裡,每個節點各自算、各自驗證。

所以「大約十分鐘出一個塊」不是一個觀測結果,是一個被主動維持的目標。實際的出塊間隔忽長忽短,幾十秒出一個和半小時出一個都很常見,只是長期平均被拉回十分鐘附近。想直觀感受這一點,可以去 mempool.space 這類區塊瀏覽器上看最近幾十個區塊的實際時間戳,間隔的參差程度會比你想的大。

難度這件事對算帳的人有個直接後果:你的機器速度沒變,但你能分到的東西會隨著別人不斷加入而變少。這是很多人初算回本週期時漏掉的一項,我們在礦機多少錢、多久回本裡單獨展開。

礦工的錢從哪來:兩筆,不是一筆

搶到記帳權的人能拿到兩部分收入。

第一部分是區塊獎勵。這是系統憑空發行的新幣,寫進這個區塊的第一筆交易裡(這筆交易有個專門的名字叫 coinbase 交易,和某個交易所同名純屬巧合)。目前每個區塊的發行量是 3.125 BTC,這是 2024 年第四次減半之後的數字。

第二部分是交易手續費。這個區塊裡打包的每一筆用戶交易,都會給出一點手續費,全部歸打包者。網路擁堵的時候,大家為了插隊會把手續費出得很高,這部分可以變得相當可觀;網路清閒的時候,它可能只佔礦工收入的很小一塊。

順帶說一句機制上的細節:新挖出來的幣不能馬上花。協議規定這筆獎勵要等 100 個區塊之後才可動用,大約十六七個小時。這是為了防止鏈發生短暫重組時,憑空多出一筆無效的錢在市面上流轉。

減半,和 2100 萬這個上限的關係

區塊獎勵不是一直不變的。協議規定:每產生 210,000 個區塊,獎勵減半一次。按十分鐘一個塊推算,大約四年一次。

區塊獎勵的遞減路徑 · 協議規則,不隨行情變
階段每個區塊發行大致時間
起始50 BTC2009 年起
第一次減半後25 BTC2012 年
第二次減半後12.5 BTC2016 年
第三次減半後6.25 BTC2020 年
第四次減半後(當前)3.125 BTC2024 年

把這條路徑一直加下去 —— 50 加 25 加 12.5 加 6.25,每一項都是前一項的一半 —— 得到的是一個收斂的和。這就是總量上限 2100 萬的來源。它不是有人拍板定了個整數,而是「每四年折半」這條規則自然算出來的結果。

對礦工來說,減半是一件很硬的事:收入的一半在某個區塊高度之後憑空消失,而電費一分不少。每次減半前後,成本高的那批機器會被擠出去,全網算力短暫回落,難度隨之下調,剩下的人分到的多一點,逐漸重新平衡。這個過程我們在減半對礦工意味著什麼裡單獨講。

走一遍:一個區塊從誕生到被承認

把上面的零件拼起來,看一個區塊完整的一生:

  1. 交易進入等候區。你從錢包發出一筆轉帳,它會被廣播到全網,暫時待在各個節點的記憶體池裡,還沒被記進帳本。
  2. 礦工挑單打包。礦工從等候區裡挑交易 —— 通常優先挑手續費出價高的 —— 裝進一個候選區塊。同時把給自己的那筆獎勵交易放在第一位。
  3. 算摘要。把這批交易兩兩配對做雜湊,一層層往上歸併成一個值,也就是默克爾根,塞進區塊頭。這樣做的好處是:任何一筆交易被改動,這個根值都會變,篡改藏不住。
  4. 開始猜。改隨機數、算雜湊、比對門檻,沒中就再改。每秒重複幾百萬億次。
  5. 撞上了。某台機器算出的雜湊小於門檻,立刻把這個區塊廣播出去。
  6. 全網驗證。其他節點收到後各自核一遍:雜湊對不對、有沒有小於門檻、裡面的交易合不合法、獎勵金額有沒有超發。驗證只需要算一次雜湊,非常快 —— 找答案很難,驗答案極容易,這個不對稱是整套機制的支點。
  7. 接上鍊。大家認可後,把它接在鏈的末端,然後立刻開始基於它爭奪下一個塊。

如果兩台機器幾乎同時撞上,網路上會短暫出現兩個都合法的候選。這時各節點先接受自己先收到的那個,直到下一個區塊出現 —— 接在誰後面,誰就成為主鏈,另一條上的那個塊就作廢了,行話叫孤塊或者陳塊。挖出孤塊的礦工什麼也拿不到,白乾。這也是為什麼大額交易通常要等幾個確認才算安心。

為什麼必須「浪費」這麼多電

這是外界對比特幣最集中的批評,也是最容易被誤解的一點。所以值得單獨說清楚。

那些算廢了的雜湊,看起來確實什麼也沒產生。但它們買到了一樣東西:改寫歷史的代價。

假設你想篡改三個月前的一筆交易。你得重算那個區塊,還得把它之後所有區塊全部重算一遍,而且要算得比全網其他人加起來還快,才能造出一條更長的鏈讓大家接受。這需要的算力和電,是天文數字。正是因為過去那些電真的被燒掉了,帳本才不可能被便宜地改寫。

所以這套機制的安全性和它的能耗是同一件事的兩面 —— 能耗降下來,攻擊成本也就跟著降下來。想看這件事在數量級上是什麼規模,劍橋大學有一個長期在做的比特幣電力消耗指數,方法學和口徑都公開寫著,比大部分二手引用可靠。

需要說明的是,這個取捨是有爭議的。以太坊就選擇了另一條路,在 2022 年把共識機制換成了權益證明,用抵押代幣代替燒電 —— 挖礦這條路在那邊已經不存在了,細節見以太坊還能挖嗎。哪種更好不在這篇的討論範圍內,我們只說清楚比特幣這一套是怎麼運作的、代價是什麼。

誰在挖:從一台筆記本到一整片廠房

最早的幾年,普通電腦的處理器就能挖到幣,中本聰自己也是這麼挖的。後來大家發現顯示卡更適合幹這種重複計算,效率高出一大截;再後來出現了專用晶片 —— 只會算 SHA-256、別的什麼都幹不了,但幹這一件事的效率又高出幾個數量級。

這條路一旦走上,就回不去了。今天用通用裝置挖比特幣,在能效上和專用機器差著幾個數量級,電費遠高於產出。這一點我們在用電腦和顯示卡還能挖比特幣嗎裡用具體的量級算給你看。

另一個後果是單打獨鬥幾乎不可能挖到東西。一台現代礦機的算力在幾百 TH/s 的量級,全網在幾百 EH/s 的量級,中間隔著大約一百萬倍。按十分鐘一個塊推算,單機獨立挖到一個區塊的期望等待時間要用幾十年來計。所以絕大多數人通過礦池參與,把算力湊在一起、按貢獻分帳 —— 這是什麼是礦池那篇的內容。

51% 攻擊:為什麼它比聽起來難

既然記帳權按算力分配,那麼一個自然的問題是:如果有人掌握了全網一半以上的算力,會怎麼樣?

先說他能做什麼。掌握超過一半算力的人,可以比其他所有人加起來更快地造區塊。這讓他有能力做兩件事:把自己發出的某筆交易從歷史裡抹掉(先花一筆錢,然後造一條不包含這筆交易的更長的鏈,讓網路接受),以及拒絕把某些交易打包進區塊

再說他不能做什麼 —— 這部分常被誇大。他不能憑空造出不屬於自己的幣,因為每一筆轉帳都要有對應私鑰的簽名,算力再大也變不出簽名。他不能改動別人錢包裡已有的餘額。他不能修改區塊獎勵的數額或者提前把 2100 萬挖完,那些規則由每一個執行完整節點的人各自驗證,不合規的區塊會被直接拒收。

所以這種攻擊的破壞力是有邊界的:它能撤銷攻擊者自己近期的交易,不能沒收別人的資產。而代價是要持續投入超過全網其餘部分總和的算力和電 —— 這是個巨大的數字,而且一旦被發現,他手上那些裝置和幣的價值會一起崩掉。用來攻擊的成本,和攻擊成功後能拿到的東西,通常不成比例。這就是這套機制的實際防線:不是「不可能」,而是「不划算」。

順帶一提,這也是為什麼大額收款方要等確認數。確認數越多,攻擊者要重算的區塊就越多,翻盤所需的算力優勢和時間就越離譜。

三個反覆出現的誤解

誤解一:挖礦是在解有意義的數學題。不是。那些雜湊計算除了證明「有人花了力氣」之外,沒有任何數學或科學價值,算出來的結果也不能拿去幹別的。有些項目試圖把這份算力導向有用的計算,但比特幣這套沒有 —— 它要的恰恰是一種無法走捷徑、也無法複用的消耗。這一點也解釋了為什麼礦機不能拿來渲染影片或者跑模型:那顆晶片除了算 SHA-256 什麼都不會。

誤解二:幣挖完了礦工就不幹了。按當前節奏,最後一枚比特幣要到下個世紀才會被髮行完。而且區塊獎勵歸零之後,礦工還有另一部分收入 —— 交易手續費。設計上,隨著獎勵逐次減半,手續費會逐漸成為主要激勵。這個過渡能不能順利完成,在技術圈裡仍有爭論,但「獎勵一沒礦工立刻全走」不是機制的本意。

誤解三:全網算力越大,出塊越快、幣發行得越快。正好相反 —— 出塊速度是被難度調整鎖定的。算力翻倍,難度也會跟著翻上去,平均出塊間隔還是十分鐘左右。所以算力增長不會讓幣發得更快,只會讓每一台機器分到的那份變薄。這句話是理解挖礦收益為什麼會衰減的關鍵,也是下一篇算帳的起點。

這套機制對你意味著什麼

如果你是抱著「能不能挖點幣」的念頭點進來的,把上面這些串起來,其實已經能得到幾個判斷:

接下來最該看的一篇是現在個人還能挖嗎:把帳算給你看 —— 那篇把電費、裝置、難度、回本週期逐項擺出來算。這一篇講的是機器怎麼轉,那一篇講的是這筆帳算不算得平。

幾個容易卡住的問題

挖礦到底在計算什麼?

在反覆計算區塊頭的雜湊值。礦工不停改動區塊頭裡的一個隨機數,每改一次就算一次雜湊,看結果是否小於系統設定的門檻。這個過程沒有捷徑,只能一個一個試,所以誰的機器每秒能試更多次,誰中籤的機率就更大。

為什麼出塊時間是十分鐘?

這是協議設定的目標值,靠難度調整來維持。每產生 2016 個區塊,系統會回看這段時間的實際耗時:比預期快就調高難度,比預期慢就調低。實際的單個區塊間隔忽長忽短,十分鐘是被主動維持的長期平均值。

礦工的收入只有區塊獎勵嗎?

不是,有兩部分。一部分是協議憑空發行的區塊獎勵,當前每個區塊 3.125 BTC;另一部分是這個區塊裡打包的所有交易支付的手續費。網路擁堵時手續費那部分會明顯變大。

為什麼比特幣總量是 2100 萬?

這不是拍板定的整數,是規則算出來的結果。區塊獎勵從 50 BTC 開始,每 210,000 個區塊減半一次,把這個不斷折半的序列全部加起來,得到的和收斂到 2100 萬附近。

兩個人同時挖到區塊會怎樣?

網路上會短暫出現兩條都合法的分支,各節點先接受自己先收到的那個。等下一個區塊出現,接在誰後面誰就成為主鏈,另一條上的區塊作廢,行話叫孤塊。挖到孤塊的礦工拿不到獎勵。

這篇講的是協議層面的規則:出塊目標約十分鐘、每 2016 個區塊調一次難度、當前區塊獎勵 3.125 BTC、總量上限 2100 萬。這些寫在程式碼裡,不隨行情變,所以我們直接寫。凡是會變的數字(電價、機器價格、全網算力)都在其他文章裡以量級區間加查證年月的方式給出。

署名紀川是筆名,我們不給它編造資歷 —— 判斷這篇值不值得信,請核裡面的規則和演算法,不是核作者頭銜。寫法和數字處理原則見關於,發現問題請寫信到 [email protected],更正會記進更正記錄