在過去,身為一位軟體專案的專案經理,我時常必須透過工程師寫出來的系統設計文件 (Design document) 來了解這個專案中開發的系統的運作細節,有時設計出來的系統會比我想像中複雜,以至於開發時程會超出我的預期許多,這時我會換位思考,思考如果我是工程師,我會以什麼方式來解決客戶遇到的問題、提出來的需求,如此,我便能大致了解,這些複雜的設計是否有必要.....
一直以來,我都對比特幣的一些關鍵字 (像是 "去中心化"、"挖礦"、"工作証明" 等等) 並不陌生,然而,我卻不了解它們的真正意涵,我不了解為何這些機制有存在的必要,以至於我不完全明白比特幣為什麼要這樣運作。於是,我把自己換位成比特幣的創造者 "中本聰",以他/她的角度來思考,順著他/她的思路來理解他/她到底想要解決什麼問題,而當他/她確立了一個解決問題問題的大方向,過程中他/她還需要解決哪些小問題來完善這個大方向,於是這樣一路思索下來,我總算是搞懂這些創新的機制存在是為了什麼......
如果你也想多了解比特幣背後的運作方式,那我接下來會試著用非理科生都能懂的白話文來解釋比特幣為何要那樣 ~
2008 年 9 月,美國由於龐大的次級房貸爛帳,引發了一場至今都令投資人心有餘悸的金融海嘯,當時捲入其中的幾間大到不倒的投資銀行也在美國聯準會拒絕提供資金支持援助後應聲倒地,而美國政府當時甚至動用國庫資金 7000 億美元以為了一些岌岌可危的大銀行進行紓困,以防止情勢繼續惡化。而這場金融危機為世人揭示了傳統金融系統的脆弱性,尤其是過度依賴大銀行和政府機構的問題,而銀行倒閉、政府救市和資金挪用更讓許多人對現行的貨幣和金融體制失去了信任......
同年 10 月,一位名為 "中本聰" (Satoshi Nakamoto) 的神秘人士於 metzdowd.com 的密碼學論談發表了一篇名為 "Bitcoin : A Peer-to-Peer Electronic Cash System" (比特幣:一種點對點的電子現金交易系統) 的論文 (又稱 "比特幣白皮書"),正式揭竿起義。在此之後,人們知道,有一個金錢交易的系統,可以讓人們擺脫既有的金融系統以及由大有為的政府所發行的貨幣,在不需透過所謂的信賴第三方、也不需知道彼此的身份、更不用被抽取高額的手續費,便可以隨時隨地輕鬆地完成金錢交易的動作.......
回顧完比特幣的誕生史,讓我們重新回到 2008 年,把自己當成比特幣創造者的角度來思考一個問題,那就是,該提供什麼機制讓人們可以隨心所欲不受第三方約束就可以把錢透過點對點的方式轉給另一個人?
我們都知道,現在你之所以可以透過信用卡、電子支付、甚至是透過網銀把錢轉給另一個人是因為扮演中間人的銀行或是中間的其他機構可以確定這筆轉帳來自於你、而且在帳本上你的確有你足夠的錢可以支付你要轉出的錢,但如果有一天我們我們不想再把錢存在這些銀行裡,或是想要跳過這些扮演中間人的金融機構,那該怎麼做才能將需轉出的金錢正確地轉至另一方呢?
這時,中本聰可能在想到,要擺脫現今金融體系的關鍵在於 "帳本" 及 "身份確認"。有關帳本,如果不想讓某個單位獨立擁有這個帳本,那不如讓 “大家” 都看得到帳本、可以共同管理帳本如何......
好,這就是所謂去中心化 (Decentralization) 的起點了……
那所謂的 "大家" 是誰?如果不能是特定的某些人,那肯定就是 "任何人",任何能連上網路並有安裝可以連上比特幣網路的程式的電腦,而這台加入比特幣網路的電腦就應該可以看到帳本、甚至參與維護帳本…….
既然帳本是公開透明的,那就會產生很多需要克服的問題,那就是該由誰來維護帳本?如何保証帳本的正確性、沒有被竄改?又由於帳本是公開的,那該如何在確保隱私的情況下確定這筆交易是由擁有人發出?又該如何知道交易的發送方有足夠的錢?稍為想一下,要達到 "公開透明" 的目標,要下的功夫還真不少.......
於是這裡就需要有人扮演帳本的維護者,而它的工作便是確認交易的正確性並且更新帳本,那要怎麼讓人願意投入資源來做這些事呢?當然是有錢能使鬼推磨囉,也就是說,如果有人願意投入資源來幫忙確認交易的正確性、維護比特幣交易帳本,那他就會得到一些錢做為獎勵,而這個錢,就是 “比特幣”,而這也是產出新的比特幣的唯一方法,人稱 “挖礦” (Mining),幫忙確認交易的正確性的電腦節點又稱 “礦工” (Miner),而專門用來做比特幣交易確認的工作的電腦又稱 “礦機”……
而在比特幣的交易中,完成交易確認工作的礦工可以得到兩筆獎勵,一筆是 “燃料費” (Gas fee),是發送方需要支付的手續費,而另一個獎勵就是會得到一些比特幣,又稱 “區塊獎勵” (Block reward)。那每一次要給出去多少比特幣做為完成交易確認工作的區塊獎勵呢?1 個?10 個?100 個?給太多的話比特幣供給量太大,會影響比特幣的價值,可是給太少就沒有人想當礦工....... 我在想,中本聰會不會在這裡卡關想很久 XD
有關區塊獎勵,我們回頭再說 ~
因為任何人都可以參與帳本的維護,那誰可以得到獎勵、誰可以挖到新的比特幣呢?那當然就是動作最快的那個人囉 ~
那要怎樣可以成為動作最快的人?因為確認交易不外乎是要做些動作來確認資料正確性,在電腦的世界裡,那就是誰有強大的運算力誰就可以最快完成工作……
好,為了搶到頭香,成為最快完成交易確認的那個人,於是大家都進入一個軍備競賽的狀況、爭相投入運算力最強的電腦……
那如果是這樣,那會不會大家的電腦都跑太快,快到不到 0.1 秒就可以把交易確認完?如果這樣的話,運算力超強的電腦不就可以把所有交易確認的工作都搶過來做?
如果要把交易確認工作讓參與比特幣網路的電腦都有機會分到一杯羹,那交易確認的工作必須讓即使運算力很強的電腦也無法一下子就完成,如此才可以為算力較弱的電腦掙取一些贏得區塊獎勵的機會......
那要怎麼讓電腦很忙呢?在比特幣的設計中,礦工除了確認交易的正確性 (該交易的確是由發送方發出的),它還要猜對一個隨機數 (Nonce) 以計算出一個符合要求 (小於一個特定的目標值)、又能代表這個新的區塊的內容的一串數值 - 又稱 “哈希值” (Hash 這個字的音譯,由 0-9 & a-f 的數字/英文字組成,可以把它想成是這個區塊的識別碼,它是獨一無二的,而且會根據區塊中的交易內容而改變)。對,就是 “猜”,因為要一個數字一個數字地猜,這件事會需要電腦跑一小段時間,而且更恐佈的是,當網路中的礦工數量增加,要猜中這個隨機值的難度也會隨之增加,而這就是人們常垢病比特幣的交易都要消耗一些能源的原因。不過這個設計也和現實世界中取得黃金的過程相同,都是需要耗費一些能源 (人力也算),也因為取得不易,這些透過能源轉換後取的的資源才會顯得更有價值…….
而以上描述的動作,就是所謂的 "工作証明" (Proof of Work; PoW),以誰先完成交易驗証的工作 (包括計算出哈希值、猜出隨機值),誰就可以得到獎勵......
那除了要模擬現實世界中採礦的難度,還有什麼理由需要礦工耗費資源來挖礦 (猜隨機值以計算哈希值)?依我的了解,這個設計有可能一次可以滿足三個願望 😏......
一、讓比幣特網路中的礦工都有機會完成交易驗証的工作,不會讓所有的交易驗証工作都落入運算能力比較強大的礦工手中
二、控制產生新的區塊的速度,而這也等同於控制產生新的比特幣的速度
三、讓礦工無法竄改帳本........
講到不可竄改,這件事可是金錢交易的信任根基,但在人人都能處理帳本的設計中,如何能避免中間有人手腳不乾淨呢?
既然礦工可以驗証交易,那會不會手腳不乾淨,在驗証的過程偷偷竄改過去的交易?這裡要講一下這個帳本的格式,就是 “區塊鏈” (Blockchain).....
區塊鏈是一種資料結構,你可以把它想像這個帳本是一個順序不能被更改、被一片一片黏起來的 “便條貼鏈” 😅,每一張便條貼就是一個 “區塊”,一個區塊中記載數千筆交易 (誰轉多少錢給誰)、上一個區塊的哈希值 (編號、識別碼)、以及這個區塊的哈希值,重點是,每個區塊的哈希值是根據 “交易內容” + “上一個區塊的哈希值” 算出來的,而每次算哈希值都要猜一個很難猜的隨機值,所以代表,如果改了過去某個區塊中的某筆交筆,那這個礦工除了要重算那個被修改的區塊的哈希值 (猜隨機數後算哈希值),同時還要重算那個被修改的區塊的後面接續的所有區塊的哈希值,因為每次重猜隨機數、重算哈希值都要花一點時間,如果還要處理其他區塊,那勢必無法成為最快完成帳本確認的那個人,因此就無法得到區塊獎勵、挖到新的比特幣,這是之所以區塊鏈很難被竄改的其中一個原因……
既然改過去的區塊中的交易不可行,那礦工可不可以不如實申報、在處理新的區塊時隨意修改新交易的內容?
這裡其實要解決的問題是,如何才能知道某筆交易是由持有人發出的呢?而他/她發出來的交易內容沒有被竄改?
這裡要講到一個聽起來小複雜、但即使用超白話講也還是會覺得有點燒腦的公鑰 (Public key)、私鑰 (Private key)、錢包地址 (Wallet address) 及數位簽章 (Digital signature) 之間的關係.......
當有人從他/她的錢包發出一筆交易,比如 “A → B,$100”,這筆交易被送到比特幣網路時會帶上 A 用私鑰簽名的數位簽章以及 A 的公鑰 ,也就是說,這筆交易如果有被修改過,那用 A 的公鑰驗証這筆交易就會失敗……
另外,基於共識機制 (少數服從多數),如果有不肖礦工廣播出不真實的區塊 (把交易打包到區塊中,完成工作証明,就可對網路中的節點進行廣播),也會因為這個區塊跟其他礦工手上掌握的區塊帳本不同而被打槍。當網路中的節點發現其他節點傳來兩條不同版本的區塊鏈,這時它們會先同時保留兩條鏈,一直到其中一條鏈變得更長,因為只有被多數認可的鏈才會被延續下去,所以最終只有最長的那條鏈會被視為正確版本.......
好,現在應該大致了解比特幣產生的過程,那如果你是中本聰,你會認為最終該產生多少個比特幣?每隔多久產生一個呢?這個數字除了考慮到比特幣的流通性,還要避免過量而產生通膨,最後造成幣值的稀釋…….
其實設計一個系統,最困難的地方就是在這些初始值、最大/最小值等這些參數的設定,設定的不好可能會讓系統最後運行起來的結果和預期有所偏差,於是通常對於這些參數的設定都會需要做一些精密的計算......
可惜,中本聰並沒解釋這些參數設定背後的理由,而這其實是我對比特幣最好奇的地方......
在中本聰的設計中,比特幣總共產量僅 2100 萬顆,而以控制計算哈希值的難度來讓比特幣網路維持每 10 分鐘僅能產生一個新的區塊速度,而每產生一個新的區塊、完成工作証明 (PoW = 挖礦 = 交易驗証 + 計算哈希值) 的礦工可以獲得 N 個比特幣做為區塊獎勵……
而這個 “N” 值是變動的,在第一個比特幣 (又稱 "創世區塊";Genesis block) 被挖出來的 2009 年是 “50”,而為了不讓比特幣一下子就被挖完,所以區塊獎勵在每隔 210,000 個區塊產生後、大約每隔四年就會減半 (Halving) 一次,最近的一次減半發生在 2024/4/20,區塊獎勵由 6.25 減為 3.125 比特幣,下次的區塊獎勵減半可能會發生在 2028 年 3 月 (將由 3.125 減為 1.5625)。另外,根據這個速度,最後一顆比特幣被挖出來的時間會落在 2140 年,距離現在大約是 116 年後.......
不負責推論 -> 根據這個減半的速度,代表在 12 年後、於 2036 年發生的第 7 次減半後區塊獎勵會來到只剩下 0.390625,如果到時比特幣還在流通,而礦工還能在僅獲得和現在相比將近只有 1/10 (3.125 VS 0.390625) 的區塊獎勵下營運,那代表一枚比特幣的價值至少會是現在的 10 倍 (USD 60,000 -> USD 600,000) 🤯 ~
小祕密 -> 比特幣的最小單位為 0.00000001,又稱為 "聰" (Satoshis),所以 1 BTC 其實等於 "1 億個聰" (100,000,000 聰 )。於 2136 年的第 32 次減半後,區塊獎勵會接近比特幣的最小單位 (為 0.000000012),而於 2140 年的第 33 次減半後,區塊獎勵會小於 1 聰 (為 0.000000006),這代表到時將無法再產生新的比特幣........
其實我曾經想過,為什麼設計一套新的點對點的電子交易系統非得要創立一個新的 "單位" (比特幣) 來做價值交換?難道不能直接用法幣嗎?其實答案很簡單,因為一旦用了法幣,就會有觸法律的問題 (變成地下交易),而且這個交易的單位將無法與現實世界的幣值脫鉤 (像市值最大的穩定幣、又稱虛擬美元的 USDT 其價值就必須和美元掛鉤),更不要說大家會更難理解為何要透過像區塊鏈這樣新的技術來達到舊有系統就能達到的事。總之,比特幣之所以是比特幣是因為我們需要一個像比特幣這樣新的 "單位" 來讓我們完成交易罷了 😅
很多人說,比特幣的設計過於完美,可能來自外星人或未來人,或者不可能來自於一人之手,對於這個關點,某種程度我是同意的。就我過往參與系統設計的經驗,一個去中心化的 "公開" 系統要兼具正確性、安全性、及時性、可擴展性是困難的,更不要說在第一個比特幣區塊被中本聰產生出來後,這個比特幣網路在無特定人士的維護之下仍然日漸茁壯、生生不息,這世界上,還有哪個系統能出其右呢?我想沒有.......
所以你能想像在比特幣被挖完的 2140 年,這個世界會是以什麼樣的機制在做金錢交易呢?還是用紙鈔?銀行仍然存在?出國仍要換匯才能交易?每個人的金錢及資料仍然被大機構、科技巨頭所掌握?雖然這是我看不到的未來,但我能想像到那個時候,人們應該可以在數位的世界過著暢行無阻的自由生活,而使用比特幣交易,將會是日常......