甚麼是比特幣 — 白皮書導讀

於2008年11月1日,一名自稱為中本聰(Satoshi Nakamoto)的人在P2P Foundation 上發佈了一篇名為《比特幣 — 一個點對點的電子現金系統》的白皮書,一石激起千重浪,開啟了區塊鏈的新時代。這本白皮書不算長,只有8頁內容,但門檻不算低,因為內容涉及不少金融學、密碼學、數學等等的概念。雖然如此,絕對鼓勵有心認識區塊鏈的朋友親自看一看。官方連結為:

比特幣的願景

比特幣的定位如白皮書的名稱所說,是一個“點對點的電子現金系統”。點對點,意即沒有中間人,例如A君向B君買一個蘋果,A君直接給B君某個量的硬幣,然後B君給A君某個量的蘋果,交易完成,就這麼簡單。你沒有看錯,我們常用的硬幣或紙幣,就是一個點對點的現金系統。但當:

  1. 交易量越來越大:假設你要買車、買樓,還希望現金交收嗎?更何況商業世界的交易額還要更大;
  2. 地域範圍越來越廣:貨幣由貴金屬演化到紙質,其中一個好處就是方便攜帶做交易。貿易已慢慢發展成跨市甚至跨國、跨洲交易,不禁令人設想有沒有比紙質貨幣更便捷的方法;
  3. 類型越來越多樣:買賣股票、衍生合約、網購、網遊等,它們的性質和頻率都令面對面現金交收不合時宜;

我們意識到經濟發展需要一個比硬幣紙幣更有效的現金系統,由金融中介人(主要為銀行)提供的服務應運而生。直到通訊科技發展一日千里,我們已可以透過銀行這些金融業中介人,進行近乎全球性、相對快速的支付。而且,在現代貨幣系統“部份準備金制度”下,商業銀行已成為該制度中發行貨幣的重要組成部份。

在這個制度運行多年,但金融中介人引發國際金融海嘯的背景下,中本聰寫這份白皮書所針對的,是支付系統需依賴第三方運作的問題,尚未見有透露對政府、對濫發貨幣的不信任和不滿(時代背景都有關係,政府是2008年金融海嘯後才大開印錢水喉)。所以,比特幣要做的,是要讓現金支付不需要依靠第三方,但又可善用電子支付的跨地域性和快捷。

需要注意的是,白皮書只是比特幣的設計框架,開發者們認同中本聰的理念而加參與開發,過程當中可以再加強、優化某些內容,亦可能有些內容在開發過程當中是不可行、或困難重重的。更重要的是,沒有人知道中本聰是誰,不像以太坊有一班創辦人一直參與開發工作。但要了解區塊鏈行業,這是一個重要的起點。

比特幣的解決方案

依賴第三方如銀行,是所謂“以信任為基礎”的模式。中本聰認為其問題為:

  1. 交易難免有紛爭,而第三方作為交易雙方所信任的一方,有其調解紛爭的需要,所以由第三方處理的交易紀錄,不能夠做到“不能更改”或“不能逆轉”;
  2. 既然能夠更改或逆轉,某程度上欺騙行為變得難以避免,而各方都需要做更多的工作或準備,去避免被騙。這變相增加了交易成本;
  3. 而這些交易成本亦令金額細小的交易不可能(事實是,現時以傳統金融為基礎的電子支付可做到細小金額的交易,但加密貨幣的交易費高得令人卻步。);

中本聰提出的解決方案是,以加密學技術去取代“以信任為基礎”的第三方模式。他認為比特幣需要做到:

  1. 交易記錄不能逆轉,此舉可有效保障交易賣方,因為賣家收到錢的記錄不能逆轉;
  2. 常規性的第三方托管機制(Routine Escrow Mechanisms),此舉可有效保障交易買方。一般來說,第三方托管機制是由雙方可信任的第三方(比特幣不是要“去中介人”嗎?!)先保管起交易金,待賣方完成責任,第三方才會將交易金付予賣方。這是為了保障買方付款後取得應有的貨品或服務(但我沒有見到白皮書有篇幅去闡述這部份的解決方案,也見不到現時的比特幣有這機制,這是我的一大問號);
  3. 有效的交易會以電腦運算而得出加密證明(運用加密技術),而根據證明產生的時間會加上時間戳(Timestamp),以便順時序記錄。而該些順時序記錄是存放於一套點對點、分散式的伺服器中。這是為了防止多重消費問題(Double Spending),因為沒有了可信的第三方去核對記錄,同一筆錢有可能同時付給不同的賣方;

比特幣的系統設計

中本聰由:

  1. 交易設計
  2. 時間戳伺服器
  3. 工作證明共識機制
  4. 網絡運作
  5. 獎勵制度
  6. 儲存空間管理
  7. 簡化交易確認流程
  8. 價值的合併和分割
  9. 隱私
  10. 攻擊者的成功率

等10個方面去解釋比特幣的系統設計。

交易設計

解釋交易之前,我假設讀者未太認識加密貨幣,先解釋一些觀念:

  1. 比特幣的”錢包”概念,是一組公鑰和私鑰所組成。簡單來說,公鑰是你的銀行賬戶號碼,可以公開(但也不要到處公開,因為全世界都會知道你的錢包有多少錢),而私鑰是你的銀行賬戶密碼;
  2. 每一個”錢包”都會連接一個節點,當一個節點中的”錢包”要進行交易,會將交易傳送給所有其他的節點;
  3. 比特幣的加密是以雜湊演算法(Hash Function)去進行的。簡單來說,將輸入值(Input)理解為豬肉,Hash Function是香腸工廠。Hash Function絞碎豬肉、加調味料再重組成香腸(散列值Hash Sum)。你很難從香腸重組回豬肉原本的模樣,但豬肉經工廠的常規生產過程一定會成為香腸。這就是Hash Function 被稱為Deterministic (確定性)的原因。同一組輸入值,一定會得出同一組散列值,但由散列值不能推算出輸入值。而好的Hash Function是要防衝突的(Collision Resistance),意即不同的輸入值得出同一組散列值的機會,微乎其微。
  4. 比特幣系統有很多不同的人參與成為節點(Node)。節點會儲存比特幣的總賬簿,各個節點都會儲存一份,所以是“分散式賬簿系統”
Hash Function 圖解(網上圖片)
Hash Function 圖解(網上圖片)

以中本聰的說法,比特幣是一連串的數碼簽名所組成的。意思是,每個交易都會有前一個交易連接著:

假設A傳送1 BTC 給B

A本身的1 BTC 從何而來?可以是賣貨品或服務所得、可以是別人送的、亦可以是在交易所買的、或是挖礦所得。在任何情況下,A的1 BTC 是由另一個交易而來(交易0)。而在A傳送1 BTC 給B的交易當中(交易1),會將交易0加上B的公鑰進行Hash Function 運算,而所得的散列值會以A的私鑰簽署,成為交易1的電子簽名。其他人可利用A的公鑰去核實電子簽名是由A所簽發的。然後,該交易會廣播給所有比特幣的節點。

比特幣的交易電子簽名構成(來源:比特幣白皮書)
比特幣的交易電子簽名構成(來源:比特幣白皮書)

為防止Double Spending 問題,所有節點只會處理第一個收到的交易。如果A將交易0同一時間支付給B(交易1)和C(交易2),假設節點們先收到交易1,交易2將不獲處理。

白皮書內沒有提及,但比特幣的交易設計被稱為“未花費的交易輸出”(Unspent Transaction Outputs “UTXO”)。在上述交易中,交易0是輸入值(Input),交易1是輸出值(Output)。

  1. 每一個輸出值在比特幣的總賬簿內都被記錄為未花費(Unspent)或已花費(Spent);
  2. 每一個未花費的輸出值都有機會成為另一項新交易的輸入值,其時狀態會由未花費更新為已花費;
  3. 已花費的輸出值不可以成為另一項交易的輸入值;
  4. 每一項交易的輸入值和輸出值中的比特幣數量都必須是等值;

在這個概念下,輸入值和輸出值都可以被合併或分割,例如:

  1. 假如你收到10 BTC,打算支付5 BTC 給別人,自己保留5 BTC。那交易的內容會是輸入值為10 BTC,而兩個輸出值分別為給別人的5 BTC,以及給自己的5 BTC;
  2. 假如你收到兩筆BTC,一筆是7 BTC,另一筆是 3 BTC,並打算支付10 BTC 給別人。那交易的內容會是兩個輸入值分別為7 BTC和 3 BTC,而輸出值為給別人的10 BTC ;

不同交易會用以上的原則去組合而成。

比特幣的交易輸入和輸出值(來源:比特幣白皮書)
比特幣的交易輸入和輸出值(來源:比特幣白皮書)

工作量證明及時間戳

沒有了可信任的第三方,誰來決定交易能否記錄於不能更改的總賬簿中?這是區塊鏈中所謂“共識機制”的課題。工作量證明不是由中本聰發明(或許是,誰知道?),是一位名為Adam Back的英國加密學家(其實他亦是疑似中本聰的候選人之一)於1997年所發明的Hashcash 系統所演化而來的。Hashcash 的用途是為電郵系統防止垃圾電郵,原理是每一封電郵發出時,需要花費少量運算能力去取得一個Hash Sum,而電郵接收方的系統透過Hash Sum可確認電郵有否經過所需的運算。由於垃圾電郵一般是大量發出,所以當每一封電郵所需的運算量加總在一起,會大大加重了垃圾電郵營運者的成本。

回到比特幣的設計上。當節點(礦工)收到不同的交易,會將交易匯合並打包成區塊。如要想將區塊加到總賬簿(即最長的區塊鏈,後文會解釋)中,節點需要進行Hash Function運算並找出所需答案,這步驟就是工作量證明(或挖礦)。工作證明的重點是,當上一個區塊被打包並加進了總賬簿後,所有節點要鬥快進行Hash Function運算,目標為找出以0為開頭的Hash Sum,以取得將手頭上的區塊加入總賬簿的資格。比特幣工作量證明中的Hash Function,數學上暫時未有方法取巧破解,只能以所謂的Brutal Force方式,以電腦不斷用不同輸入值(Input)去試出答案為止。情形就好像有一班人手上各有一個密碼鎖,所有鎖的密碼一樣而大家都不知道密碼,該批密碼鎖的密碼可能性為000 至 999,假設該鎖沒有其他破解方法,大家只能鬥快試出這一千個可能性中的密碼。

你可能會問,如果我試出了一次正確答案,不可以重覆使用該輸入值嗎?區塊鏈之所以為鏈,是因為區塊會以加入總賬簿的次序連接在一起。連接的方法,就是在進行挖礦時,Hash Function 的輸入值必須為新區塊的資料 + 上一個成功區塊的Hash Sum + 一個隨機值(Nonce),所以節點們很容易就可以核實區塊鏈的完整性或次序是否正確。隨機值就是節點們(礦工)要依靠電腦運算能力,不斷以試錯方式試出正確答案的數值。

工作量證明圖解(來源:比特幣白皮書)
工作量證明圖解(來源:比特幣白皮書)

被挖礦成功的區塊會被加上時間戳,以證明該區塊內的交易在該時間點上存在。所以,上述提及的 “上一個成功區塊的Hash Sum” 是包含時間戳的。

時間戳圖解(來源:比特幣白皮書)
時間戳圖解(來源:比特幣白皮書)

中本聰亦考慮到電腦運算能力會越來越快,為了維持一個較公平的競爭環境,工作量證明的難度會因應每小時的區塊製造速度去調整。雖然白皮書內沒有指明,但現時平均每10分鐘會有一個新區塊加入到總賬簿中。前段提及過,工作量證明的決定勝負方式為,所有節點要鬥快進行Hash Function運算,目標為找出以0為開頭的Hash Sum。難度調整的方法就是加減Hash Sum開頭0的數量,難度會因應0的數量增加而以倍數增長。

中本聰亦探討了工作量證明相比其他取得共識的方法,例如每一個IP位址一票的投票方式。IP位址較容易取得,所以有該技術能力的人很容易會破壞共識獲取的去中心性,甚至整個系統的安全。而電腦運算能力成本較高,加上某程度上的隨機性(運氣)令工作量證明較為公平、安全。

網絡運作

相信各位已經明白到,比特幣網絡由很多不同的節點所組成。每一個交易都會被廣播給所有節點,而節點收集交易後會打包成區塊,然後進行工作量證明。如節點贏得該區塊的工作量證明,會將區塊及證明廣播給所以其他節點。

其他節點會檢查不同的事項,以決定是否接受該區塊。中本聰在白皮書中沒有詳細解釋,但我認為最少要有以下事項﹕

  1. 勝出的區塊資料 + 上一個區塊的Hash Sum + Nonce 是否真的能得出規定要求的Hash Sum;
  2. 區塊內的交易是否有按規定由付款者私鑰所簽發的電子簽名;
  3. 交易輸入值是否未花費;
  4. 交易輸入值是否等於輸出值;

如果節點接受該區塊,會將區塊加入其伺服器內的總賬簿,並以該區塊的Hash Sum 開以挖礦。而如果節點因為以上(或更多)的檢查發現有問題,不會接受該區塊。白皮書內沒有說明區塊被拒絕後,網絡的處理方法。但可想像的是,正常誠實的節點都會發現到有問題的區塊並拒絕,並會開始處理其他區塊。

比特幣的總賬簿就是最長那條鏈,因此所有節點都會跟隨最長的鏈去進行工作量證明。可以想像,有可能多於一個節點同時解出工作量證明,並且廣播給其他節點。但由於廣播有先後之分(因應節點網絡的連接方式,先廣播給“附近”的節點,如此類推),不同節點所收到的第一個區塊可能會有所不同,導致不同的節點的賬簿紀錄會出現分歧。解決方法是,每個節點都會先處理第一個收到的區塊,但同時會儲存其他區塊。節點們會分開各自進行工作量證明直至其中一方較快完成(即建立了最長的鏈),那較快那方的區塊鏈會成為總賬簿,較慢那方的節點會自動轉換到總賬簿繼續工作。

而有關區塊廣播的時間差問題,因為區塊鏈是以區塊的時間戳和 Hash Sum相連接,節點很容易會發覺區塊鏈是否完整。如發覺沒有接收到總賬簿中的某區塊,可向網絡要求取回。

獎勵制度

你可能會問,為甚麼節點會願意浪費電力和運算能力去進行工作量證明?原因是當一個節點最快解出工作量證明並且將區塊加入總賬簿,會獲得比特幣作獎勵。中本聰將此類比為挖礦,因為礦工投放勞力並獲得黃金/礦物,所以節點又被稱為礦工,工作量證明即是挖礦。獎勵分為新發行幣和交易費兩部份,中本聰沒有在白皮書寫出確實數字但原則如下:

  1. 每次交易發行新幣的數量為固定數(白皮書沒有明確數字);
  2. 比特幣總發行量都是固定(白皮書沒有明確數字);
  3. 交易費是交易輸出值的一部份;
  4. 當全部比特幣都已發行,獎勵只會剩下交易費,但沒有交代計算方式;
  5. 由於發行量固定,所以比特幣最終會是抗通漲的

事實上,比特幣最多發行2100萬枚。最初每一次成功挖礦會發行50 BTC 作為獎勵,並且每210,000個區塊被挖後,獎勵就會減半。以下是一幅來自Binance 的減半事件記錄:

比特幣減半事件簿(來源:Binance)
比特幣減半事件簿(來源:Binance)

而交易費用方面,官方網站的說法如下:

交易費用會是多少?

大部份的交易都不需要手續費,但是鼓勵用戶付少量的自願費用來得到對他們的交易的更快確認同時獎賞一下挖礦者們。需要支付的手續費通常也不會超過一兩便士的價值。在必須的時候,你的 Bitcoin 客戶端一般都會估算一個合理的費用。

交易費是用來防範用戶傳送會使網路超負荷的交易的。具體的收費規則還在開發過程中,而且會不時改變。因為這個費用與要發送的比特幣的數額沒有正比關係,它看起來就非常的低(用0.0005 BTC支付一筆1,000 BTC 的匯款) 或者出奇的高(0.004 BTC 來支付 0.02 BTC)。這個費用由交易的數據和交易的循環情況等特質而定。例如,如果您接收一筆數額很小,但是數字很長的支付,那麼發送的費用就會高些。這種支付就像用便士來給餐館支付一樣。快速地花費您的比特幣的小部份也可能需要支付手續費。如果您的活動遵循常規的交易模式,這個費用應該還是會非常的低。

儲存空間管理

隨著時間的累積和交易量的增長,節點所需要儲存的總賬簿會越來越大。為了減少節點的負擔,交易會以一種叫 Merkle Tree 的加密方式儲存在區塊內,所以與一個新交易相關的舊”已花費”交易可被壓縮儲存。運用了這個方式,以每10分鐘一個新區塊加入總賬簿計算,區塊會每年為總賬簿增加4.2MB的數據量,以現時的電腦存儲能力來說非常合理。

Merkle Tree和數據壓縮圖解(來源:比特幣白皮書)
Merkle Tree和數據壓縮圖解(來源:比特幣白皮書)

簡化交易確認流程

一般比特幣使用者,如想確認某個交易,只需要向節點取得總賬簿中區塊的標題(Block Headers),就可以根據當中以Merkle Tree 所產生的Hash Sum,確定某個交易已被紀錄在總賬簿中。整個過程不需要取得總賬簿的所有資料。

以Header去確認交易圖解(來源:比特幣白皮書)
以Header去確認交易圖解(來源:比特幣白皮書)

隱私

傳統金融的隱私在於,當我們透過可信任的第三方進行交易,一般公眾是不會知道交易內容,但該第三方機構內部就掌握很多資料。而相對地,比特幣的隱私體現在“錢包”持有人不需經過身份認證,因此當所有交易都是公開可查,但大家都不知道交易背後的人是誰。

但事實是否如此?先不論政府最終會否強制中心化交易所進行身份認證(我認為是大眾接受加密貨幣,傳統金融連接去中心化金融重要的一步),因為交易時需要提供公鑰,而透過公鑰就可以將你的交易和資產查得一清二楚,這是加密貨幣需要解決方案的問題之一。

傳統金融vs.比特幣隱私圖解(來源:比特幣白皮書)
傳統金融vs.比特幣隱私圖解(來源:比特幣白皮書)

攻擊者的成功率

網絡運作一節中有提及到,會有攻擊者製造虛假交易的可能性。首先,攻擊者必須是節點,因為如沒有節點參與,不合規格的交易本身已不會獲打包入區塊。而如果攻擊者是節點,又成功地完成挖礦並廣播區塊給其他節點。正常的節點如發現區塊內有不合規的交易,都不會確認該區塊。不合規格的交易例如:

  1. 攻擊者憑空為自己錢包充值。在UTXO中這是不可能的,因為每一單交易都要有一個輸入值,而輸入值只會是:a. 其他人給攻擊者的付款(見點2 );b. 攻擊者先前付款的餘額;c. 完成挖礦而得的獎勵(系統生成,所謂“Coinbase”類交易)。
  2. 從其他錢包偷錢。這亦是不可能的,若非攻擊者掌握了被偷者的私鑰,否則偽造不了電子簽名,除非Hash Function 被破解了。

故此,節點作為攻擊者,只能以總賬簿的最長鏈原則為切入點,嘗試撤銷已完成的交易以取得額外利益。例如,攻擊者以50 BTC 購買了一間屋,完成所有收屋手續後撤銷50 BTC 的付款,那就免費獲得一間屋了。

這種攻擊的做法是,假設一個總賬簿只有三個區塊,第一個是創世區塊,第三個是攻擊者的付款交易。攻擊者要利用其他交易(要合規格的交易,否則無論如何都不會獲正常節點所接受)打包成新區塊,並以第二個區塊開始進行挖礦,目的是由第二個區塊開始製造一條新的最長區塊鏈,這樣其他節點就會以攻擊者的鏈為總賬簿繼續運作,而原本的第三個區塊就作廢了。但要製造出最長的區塊鏈,攻擊者需要持有非常大的運算力,要比其他正常誠實的節點的運算力總和要高,才有機會成功(51%攻擊)。大家要注意,當攻擊者從第二個區塊開始挖礦時,其他節點已開始從第三個區塊挖礦,每當一個新的區塊加入到原本的總賬簿中,攻擊者要追上成為最長鏈的難度就會以倍數增長。以下是中本聰計算出,一個攻擊者在區塊數量落後於總賬簿的情況下,能追上並製造出最長鏈的可能性。q 是攻擊者成功挖礦的可能性(1為100%),z 是落後區塊數,P是追上的可能性:

而比特幣官方認為,完成交易後再等多6個區塊,基本上交易就不甚可能被攻擊者撤銷。

另外,攻擊者要獲得大量運算能力的成本非常高,但只得撤銷交易的可能性。那麼對攻擊者來說,認真作為礦工或以其他方式騙取加密貨幣,成本效益可能更高。而且,攻擊比特幣系統而令自己手上的比特幣價值歸零,亦是不明智的。所以,這種攻擊的可能性事實上是非常低。

結語

可見,比特幣的背後各項技術由來以久,但中本聰(或團隊?)以其巧思組合成一個新應用,最終發展成一個非常龐大的新產業,更成為未來互聯網3.0、元宇宙等等的基礎。但不得不否認的是,比特幣缺少了如以太坊般有一個創始人團隊一直帶領社群前進,而且作為先來者其技術已經是相對落後。由於是去中心化運作,比特幣的改進方案 (Bitcoin Improvement Proposals “BIP”)比較難達到共識,亦出現過多次硬分叉,所以發展停滯不前。所以,無論作為愛好者或投資者亦需要多了解其他後來者的新發展。

我會繼續寫其他區塊鏈的白皮書導讀文章,請各位Follow繼續支持。

Subscribe to 創業會計佬h的學習筆記
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.