區塊鏈如何運作?

這篇文翻譯自”How Does the Blockchain Work?”全文。作者Michele D'Aliessi用淺白易懂的文字闡述比特幣(Bitcoin)和區塊鏈(Blockchain)的運作原理,是一篇很棒的入門文章,因此我決定挑戰翻譯看看,讓更多人了解這個技術。

本翻譯文已取得Michele D'Aliessi的同意,全文如下:

自網路問世以來,區塊鏈技術可能是目前為止最棒的發明。它讓我們不用倚靠在無形的信賴或權威機構來做利益交易。舉例來說,我和你打賭50元明天舊金山的天氣。我賭它會是晴天,你賭它會是雨天。我們會有三種方式來完成交易:

  1. 我們信賴彼此。不論結果是晴天或雨天,輸家要給贏家50元。如果我們是朋友,這會是一個好的交易方式。然而,即便是朋友,也有可能會賴皮不認輸而不願付錢,更何況是陌生人。
  2. 我們可以訂定合約,如果有任何一方不願付錢,贏家可以告輸家。但要花錢花時間打官司,只為了討回50元,實在是得不償失。
  3. 我們找一個中立的第三者,每人分別先給她50元,結果揭曉後,她再把所有的錢100元給贏家。無奈的是,這個第三者有可能捲款潛逃。

我們無法信任陌生人,也覺得打官司勞神傷財。區塊鏈技術很有趣,因為它幫我們實現第三個交易方式,而且安全、快速和便宜。

我們可以只寫幾行程式碼,讓它執行在區塊鏈網絡(Blockchain Network)上,進行交易。以打賭天氣的例子,這支程式會確保100元的安全,並且一到明天會自動確認天氣狀況,結果揭曉後,也會自動將100元匯到贏家的帳戶裡。在區塊鏈網絡上的交易,是無法被竄改或停止,而且益於大型交易,如賣一間房子或一家公司。

本文的目的是不用艱澀的技術用詞來解釋區塊鏈是如何運作,給讀者技術背後擁有的邏輯和機制的基本概念。

比特幣是最為人所知的一項使用區塊鏈技術的應用。電子貨幣可被用來做物品交換,就像美元、歐元、人民幣和其他國家的貨幣。我們先來說明比特幣是如何運作,說明過程中會一點一點帶入區塊鏈的概念。

“比特幣讓人們第一次可以在網路上交易身家財產,而且是安全的,沒有人可以挑戰其合法性。”
-Marc Andreessen

所以,什麼是比特幣?

一塊比特幣就是一個單位的電子比特貨幣(BTC),並且就像真實的一塊錢貨幣一樣,本身是沒有價值的,只有在進行物品交易時才會產生價值。

在比特幣系統裡,有一本帳本(ledger),它是一個電子檔案記錄著所有的交易紀錄。

圖1. 比特幣電子帳本

這帳本不是存放在一個中央機構,像是銀行,或是一個資料庫。它擁有無數份副本,散佈存放在區塊鏈網絡上的每一台電腦裡,而每台電腦我們稱為“節點(node)”。

如果David想用比特幣轉帳給Sandra,他就送一個訊息告訴網絡說:他的帳戶減5 BTC,然後Sandra的帳戶加5 BTC。在網絡中的每個節點都會收到訊息,並且將這筆交易記錄到自己的帳本裡,然後更新帳戶的餘額。

圖2. 請求交易訊息

說到這裡,關於帳本是由一群電腦共同維護,而不是由一個類似銀行的中心機構來掌管,有三個啟發:

  • 在銀行系統中,我們只知道自己的交易紀錄和帳戶餘額,而在區塊鏈網絡裡,每個人可以知道任何人的交易紀錄。
  • 一般來說你信任你的銀行,而比特幣是分布式系統,運行在網路上,任何事情發生錯誤,是沒有客服人員可以幫你的。
  • 區塊鏈不是建構在信賴情感上,其安全性和可靠性是透過特殊的數學函數和程式碼達到的。
“我們可以定義區塊鏈是一個系統,它讓一群互聯的電腦安全地共同維護一份帳本。”

為了能在區塊鏈網絡裡進行交易,你需要一個錢包(wallet),它讓你可以存放和交易你的比特幣。只有你可以花費你的比特幣,所以每個錢包被特殊的加密法所保護著,使用一對獨特且配對的鑰匙:公鑰和私鑰,才能解鎖。

如果一個訊息被公鑰加密,只有配對的私鑰才能解密讀到訊息。反之,如果你用你的私鑰加密訊息,只有配對的公鑰可以解密。所以當David想要轉帳,他需要用他的私鑰將轉帳訊息加密後,送到網絡裡,然後每個節點使用David的公鑰將訊息解開,以確認是由David發送的。

在加密完成時會產生一個電子簽名,它會被節點們用來確認交易訊息的發送來源和真偽。電子簽名內容是一串文字,它是由交易訊息和私鑰所組成的,所以不能用在其他的交易訊息上。如果你更改交易訊息中任何一個字元,電子簽名也會跟著改變,所以駭客很難更改你的交易訊息或是得知交易金額。

圖3. 電子簽名與加密交易

錢包的公鑰其實是網絡裡的一個位址(send to address),所以當你轉比特幣給某人時,你其實是將比特幣轉公鑰的位址。而且你必須證明你是私鑰的所有人,才能進行轉帳。請注意,在網絡裡的交易訊息已經是被加密過的,你不用揭示你的私鑰。

每個節點都保有一份帳本,但節點是如何知道你的帳戶餘額?區塊鏈系統並沒有記錄每個人的帳戶餘額(譯注:所以帳本實際上不是像圖1一樣),事實上,它只有紀錄網絡上每筆交易紀錄(如圖4)。為了得知你的帳戶餘額,你必須分析和驗證所有曾經跟你錢包產生交易的紀錄。

圖4. 區塊鏈網絡的帳本

“帳戶餘額”的計算和驗證需要靠之前的交易紀錄。舉個例子,為了轉出 10 BTC給John,Mary先發起一個交易訊息,它包入了之前部分的轉入交易紀錄,只要這些紀錄的轉入金額加總起來剛好或大於10 BTC即可發送訊息。這些包入的交易紀錄稱作輸入(inputs),每個節點會驗證這些輸入的金額加總是等於或大於10 BTC。這些計算和驗證會由錢包和節點自動完成,使用者不需要煩惱。

圖5. 區塊鏈的交易訊息結構

至於,系統如何信任這些輸入?它去確認你的錢包在之前所有的轉入交易紀錄中是否真的有這些輸入。為了簡化和加速驗證的過程,每個節點會保留一份特殊的資料來達到目的,也因為這個驗證過程,錢不可能會無緣無故多出來。

“持有比特幣代表的是,帳本上你還未變成輸入的交易紀錄。”

在比特幣網絡上執行交易的程式碼都是開源的,這表示任何人只要有電腦和網路就可以進行交易。然而,程式的錯誤有可能導致你的比特幣會不見。還記得嗎?比特幣是分散式網絡,並沒有專屬的客服人員替你找回遺失的錢或錢包密碼。所以你想要用比特幣進行交易,建議使用正式的比特幣錢包軟體(例如Bitcoin Core),並且妥善保存你的錢包密碼或私鑰。


嗯,了解,但它真的安全嗎?而且它為什麼叫做區塊鏈?

任何人都可以透過匿名連線(例如TOR networkVPN network)進到比特幣網絡,並且只需要揭示他的公鑰就可以進行交易。如果一直使用同一個公鑰,所有的交易紀錄就會指向同一個帳戶。比特幣網絡允許你產生多個錢包,每個錢包都擁有自己的公鑰和私鑰。這麼做可以讓你用不同的錢包做消費。沒有一個公開的方式可以知道你是這多個錢包的擁有者,除非你將每個錢包的比特幣轉到同一個錢包去。

比特幣位址(Bitcoin addresses),也就是錢包,的總數是 2¹⁶⁰或1461501637330902918203684832716283019655932542976。在讓任何人都可以擁有錢包的情況下,用這麼大的數字可以防止一些可能的攻擊。

話雖如此,仍有一個安全漏洞會被利用:如果把錢轉出後馬上取消交易。交易訊息會在網絡裡的節點間傳遞,所以兩個交易訊息抵達同一個節點的時間會不一樣。駭客送出一個交易訊息,在等商家把貨物寄出後,再送出一個取消交易的訊息。這情況下,有些節點會先收到第二個訊息,而把第一個訊息視為非法。如何知道交易訊息之間的優先順序?使用時間戳(timestamp),但它容易被偽造。因此這會發生一些舞弊現象。

節點間會為了交易的順序而意見不合,所以區塊鏈系統設計的一套機制讓所有節點可以遵循一致的交易順序。

比特幣網絡為了將交易訊息排出順序,所以將它們包成一組,稱為區塊(block),每個區塊包含的若干個交易訊息和一個連到前個區塊的連結。隨著時間,一個區塊跟著另一個區塊,形成一條時間鏈,這就是區塊鏈。

圖6. 區塊鏈的序列結構

在時間序列上,同個區塊內的交易訊息被認為是同時發生,還未被打包進區塊的交易訊息會被視為未確認狀態。每個節點都可以將若干個交易訊息打包成區塊發送到網絡上,並建議其為鏈上的最新候選區塊。因為任何節點都可以發送候選區塊,系統如何決定誰才是可以放在鏈上的最新區塊?

區塊鏈系統使用加密哈希函數(cryptographic hash function)設計了一道複雜的數學題,候選區塊只要有正確答案,就可以成爲鏈上的最新區塊。這個答案是由節點計算後一起被打包進區塊。答案是一個數字,得到答案的唯一方法就是用猜的,猜到對為止。一台普通規格的電腦需要花一年的時間才能猜對答案。所謂團結就是力量,區塊鏈網絡裡有很多台電腦(節點),一起猜的結果,只需要平均10分鐘就可找到答案。哪個節點先猜到了答案,它就先有權利將它的候選區塊放到鏈上。

要找碴的話:如果兩個節點同時猜到答案,同時將各自的候選區塊放在鏈上,會怎麼樣?每個節點都有一份區塊鏈副本,當節點拿到其他節點丟出來的候選區塊(已有正確答案的),就會把區塊放到副本鏈上,同時系統會要求節點搜尋網絡裡有沒有比它的副本鏈更長的鏈,如果有,捨棄原有的鏈,取用更長的鏈。

圖7. 解決鏈模糊邏輯

事實上,節點同時猜對答案的發生機率很低,所以整個區塊鏈會很快地穩定下來,收斂成單一條鏈。話雖如此,不一致的鏈尾區塊仍存著潛在的安全問題。如果區塊屬於較短的鏈尾上(如圖7的區塊B),一旦系統決定取用其他更長的鏈(如圖7的區塊A和N),則區塊B內的所有交易訊息會被設定回到未確認狀態。

我們來看看Mary如何利用鏈尾模糊現象來進行攻擊。Mary要付錢給John,John要出貨給Mary,因為節點總是取用長鏈執行其上的交易訊息,這個時候Mary假造一個更長的鏈,裡面包含了一個取消交易的訊息,於是John可能會財貨兩失。

圖8. Mary的攻擊方法

系統如何防止這類攻擊?剛提到所有節點會合力找到數學題的答案才能把候選區塊放到鏈上,單靠一台電腦去猜是非常困難,Mary必須比網絡上所有的節點更快找到答案,才可能把假造的候選區塊放到鏈上。就算她成功假造了第一個區塊,還有第二個、第三個區塊,每次都要跟整個網絡上節點們做競賽。如果Mary用一台超級快的電腦呢?因為網絡上有大量的節點,Mary不可能在確切的時間點假造多個區塊來進行攻擊。

如果她控制了網絡上一半的節點,她有50%的機率可以成功假造區塊,但如果要連續假造兩個區塊,機率降到25%。想假造越多的區塊,Mary的成功機率越低。

“比特幣區塊鏈系統的交易訊息是被數學競賽保護著:駭客是跟整個網絡做競速。”

所以,交易訊息隨著時間越來越安全。越舊的區塊比越新的區塊更安全。平均10分鐘就有一個新的區塊加到鏈上,大概一個小時後,裡面的交易訊息有很高的機率已經被執行了,而且是不可逆的。

圖9. 區塊鏈的交易安全

為了轉錢出去,你的錢包必須先驗證有錢轉進來過,網絡上所有的交易都會經過這樣的驗證。雞生蛋,蛋生雞,但一開始的比特幣從哪來?

為了平衡軟體錯誤或錢包密碼遺失所造成的通貨緊縮,系統會把一些回饋金給解開數學題的節點。為了得到回饋金而去執行軟體的行為,稱為“挖礦” — 就像挖金礦一樣。

回饋金是一種激勵,推動人們去建立節點,順帶貢獻一些計算效能來幫助整個網絡的運算和穩定。

因為一台電腦需要花很長的時間解題(大約平均一年),所以幾個節點可以組成一個群組一起解題。這種方式會比較快,而且平分得到的回饋金。這種群組稱為挖礦池(mining pools)

有些挖礦池很大,可能擁有整個網絡超過20%的計算效能。這可能會有安全性問題,就像剛剛Mary那個例子。但就算挖礦池得到50% 的計算效能,時間越久,交易訊息就越安全。

然而,有些挖礦池會限制節點的數量避免過大的計算效能來保障網絡的安全。

而且隨著時間整個網絡的計算效能會提升,例如技術的創新或節點數量的增加,區塊鏈網絡會重新調整數學題的難度,讓產生新的區塊的時間保持在10分鐘。這麼做可以促使網絡的穩定和安全。

再者,每四年挖礦的回饋金會減半,所以隨著時間人們對挖礦的興趣會減少。為了避免節點停止挖礦,系統允許每筆交易訊息可以附帶一點回饋金,節點便可以獲得額外的利益。因為這個機制,如果交易訊息帶有較高的回饋金,就會比較快被執行。這表示你想要你的交易快點被執行,就得附加比較高的回饋金。跟銀行的手續費來比,比特幣的交易回饋金顯得比較少,而且跟交易量無關。

圖10. 比特幣交易(來源 blockr.io)

現在你已經對區塊鏈有一個初步的了解,我們來快速看一下它為什麼有趣。

使用區塊鏈技術有幾個相當顯著的好處:

  • 你可完全控制自己的身家財產,沒有第三方機構組織保管或限制你使用它。
  • 交易成本非常低,讓我們可以實現小額支付(micropayments)
  • 財產可以在幾分鐘內就完成轉移,交易紀錄可以在幾個小時內獲得保障。
  • 任何人可以在任何時間驗證每個交易紀錄,區塊鏈具有高透明度。
  • 應用區塊鏈技術可以打造任何去中心化的應用軟體,它可以讓快速且安全管理和傳送資料。

然而,有一些挑戰需要克服:

  • 交易紀錄都是匿名的。一方面來說保障了用戶的隱私,另一方面來講管制機構無法追蹤非法的交易行為。
  • 即使很多交易平台興起,仍不容易使用比特幣買東西。不過,它們會變得越來越受歡迎。
  • 比特幣就像其他的虛擬貨幣,非常不穩定:在市場上不容易取得而且需求劇烈變化。比特幣的價格很容易受到虛擬貨幣市場的突發事件影響。
  • 區塊鏈技術還處於起步階段,每天都有新的發展讓區塊鏈更安全且穩定。

整體來說,區塊鏈技術在許多行業上也具有潛在的革命性,例如從廣告到能源。它的主要影響力是源自於去中心化的概念和不需要無形的信賴。很多的應用正在發展中(例如Decentralized Autonomous Organizations 或稱 DAOs),有興趣可以看看底下連結。


“網路之於資訊,區塊鏈之於價值。”

有用的連結

  • Have a look at the Bitcoin blockchain transactions in real time here
  • I want to create my Bitcoin wallet — link (beginner) — link (pro)
  • I want to start mining Bitcoin — link (beginner) — link (pro)
  • I want to learn more about decentralized applications — link
  • I want to learn how to code decentralized applications — link
  • Wait, what? Tell me more about DAOs! — link