2016年11月29日 星期二

區塊鏈如何運作?

source: https://www.inside.com.tw/2016/09/01/how-does-the-blockchain-work


原文為《How Does the Blockchain Work?》。譯者簡志偉,為軟體開發者,譯文刊載於 Medium 。INSIDE 獲授權部分轉載,完整文章請至譯者 部落格 觀看。
這篇文翻譯自」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),並且妥善保存你的錢包密碼或私鑰。