BTC/" target="_blank"">比特幣技術從2009年比特幣誕生開始不斷演化更新,如今早已是精彩紛呈百花齊放,不管是學術界還是企業界,不斷湧現出最新的技術和成果。由於區塊鏈的開源和分散式特性,所以從一開始它就是世界性的技術。
由於語言和網路限制的原因,中文世界的讀者很難接觸並讀懂國外優質的英文區塊鏈文章,它們並非看起來的那麼高大上和晦澀難懂,有很多文章非常易懂且並不淺顯,所以我覺得有必要將他們翻譯成中文讀者可以看懂的文章。
本文原文標題為 How Does the Blockchain Work? 副標題為 Blockchain technology explained in simple words. 以下內容在最大程度還原原文內容的前提下,做了一些方便中文讀者理解的改動,文末的閱讀原文可以檢視英文原文。由於原文太長,分兩篇文章呈現,本篇為第一篇。
區塊鏈技術也許是網際網路自身演化出來的最好的發明,它讓資料在不借助任何中心認證服務的前提下,以極低的信任成本完成交易。試想一種場景,我和你以50美金為賭注,賭舊金山明天的天氣,我賭晴天,你賭下雨,那麼今天我們有三個可選項:
我們可以相互信任對方,不管是晴天還是下雨,輸家都會給贏家50美金。如果我們是朋友,這將是一個非常好的解決方式,然而現實情況是,不管是朋友還是陌生人,都極有可能出現一方違約。
我們可以將賭約寫入合約中,並由雙方都認可的機構公證。然而一旦有一方違約,贏者不得不支付額外的訴訟費用和漫長的訴訟流程,對於小額交易來說,這絕不是一種最優的解決方案。
我們可以委託一箇中立機構,雙方各抵押50美金給第三方,贏家將會得到這兩筆錢,但是我們要時刻提防第三方攜款跑路的情況。
不管是信任機構還是合約都不是最優方案,陌生人信任成本太高,訴諸合約則需要時間和金錢,區塊鏈技術有趣的地方就在於它為我們提供了一個安全、快捷、便宜的解決方案。
我們可以在區塊鏈上寫一段上述賭約的合約程式碼,程式會安全地保管雙方的50美金,並且自動檢測明天的天氣情況,然後將100美金支付給贏家。雙方都可以稽覈合約的邏輯,一旦合約部署到區塊鏈上,它將無法被更改或者停止,也許你會覺得對於50美金的賭約有些小題大做,但如果是交易房產和公司呢?
以上並沒有從技術層面上解釋區塊鏈如何工作,但是已經呈現了區塊鏈的大致面貌和執行邏輯,接下來會詳細分析區塊鏈和比特幣的原理。
比特幣的基本原理
最被人所知且討論最多的區塊鏈應用無疑是比特幣,比特幣是一種可以被用來作為交易媒介支付產品和服務的數字貨幣,就像美元、歐元、人民幣以及其他國家法幣。接下來我會透過第一個區塊鏈應用來詳細分析區塊鏈是如何工作的。
比特幣第一次給了我們一種可以從一個網際網路使用者傳輸唯一數字資訊給另一個網際網路使用者的方式,這種傳輸方式可以保證足夠得安全,每個人都相信傳輸會發生,沒有人會挑戰傳輸的合法性,這種突破性的進展很難被誇大吹噓。
—— Marc Andreessen
數字賬本
一個比特幣就是一個BTC數字貨幣單元,就像美元一樣,一個比特幣自身沒有價值,它的價值來自於我們都同意用它來交易商品和服務,同時我們也相信別人會做同樣的事情。
為了記錄每個人擁有的比特幣數量,區塊鏈使用了一個包含所有交易資訊的數字賬本。這個賬本檔案不會像銀行或者中心化資料中心,將資料儲存在中心化的伺服器上。它透過網際網路被分散式地儲存在全世界各個地方的私人計算機(也叫節點)上,每個節點都會在本地儲存一份複製賬本。
如果 David 想要傳送比特幣還給 Sandra ,他將向網路中廣播一條資訊,該資訊指示他的賬戶應該減少 5BTC,同時 Sandra 的賬戶將會加上相同數量的 BTC。每個網路中的節點都會收到資訊,並且針對本地賬本執行這條交易請求,更新各個賬戶的餘額。
分散式的計算節點維護同一賬本相比類似銀行的中心化服務有以下幾個特點:
在銀行系統中,我們只能知道自己的交易記錄和賬戶餘額;在區塊鏈上任何人都可以看到其他人的交易資訊。
當你習慣信任並依賴銀行系統,比特幣由於其分散式特性,在出現問題時,並沒有提供客服電話和幫助請求。
區塊鏈被設計為透過特殊的數學演算法和程式碼來保證其安全性,故而不需要中心化的信任機構。
公私鑰
我們可以定義區塊鏈是一個允許一群相互連線的計算機共同維護同一份安全賬本的系統。為了在區塊鏈上傳送和處理交易,你需要一個可以儲存和交易比特幣的錢包軟體,錢包透過一對唯一且關聯的公私鑰和加密學方法保證其安全性。
如果一條資訊被指定的公鑰加密,那麼只有擁有相應私鑰的人才能解密讀取資訊,反過來也是同樣的道理,如果你用自己的私鑰加密資料,那麼也只能是相應的公鑰才能解密資料。如果 David 想要傳送交易,他需要透過自己錢包中的私鑰對交易資訊加密並廣播到網路中。由於只有 David 知道私鑰,所以也只有他才能傳送錢包中的比特幣。網路中的每個節點都可以透過公鑰來解密交易資訊以判定交易是否是由 David 傳送。
當你用錢包私鑰加密一個交易請求資料,實際上是生成了一個數字簽名,該數字簽名可以被區塊鏈中的節點驗證交易的合法性和所有權,數字簽名是交易資料和私鑰一起加密後得到的字串,故而一個數字簽名只能對應一筆交易。如果你更改了交易資料中的一個欄位,得到的數字簽名就會完全不同,因此可以防止重放攻擊或者人為更改交易金額。
為了必須要傳送比特幣交易,你需要用錢包中的私鑰進行簽名,唯有如此你才能證明這些比特幣屬於你,所以私鑰非常重要,千萬不能對任何人洩露,否則資產就極有可能被盜。
獲取錢包賬戶餘額
區塊鏈中的每個節點都維護著同一份賬本,那麼,節點如何知道某一個賬戶的餘額呢?事實上區塊鏈並不記錄每個賬戶的餘額,它只記錄每一筆驗證並確認過的交易。對於錢包來說,它需要分析某個賬戶在區塊鏈上發生的過往所有歷史交易,然後計算獲得最終的賬戶餘額。
Mary 如果想要傳送10BTC給 John,她必須要找到自己並未使用過的輸入連結(也稱為UTXO Unspent Transaction Output)來拼裝出一筆至少大於10BTC 的交易請求, 網路中的節點會驗證金額是否正確,UTXO是否未被使用。UTXO 一旦使用過,未來就不能再使用了,這就如同你在支付寶上花出去的一筆錢,就只能成為交易記錄,而不能再被花一次。
那麼系統如何驗證輸入的交易有效呢?事實上系統會驗證交易請求中給出的所有跟當前賬戶相關的UTXO,為了加速驗證過程,每個節點都會儲存 UTXO,正是這些安全驗證演算法,保證了比特幣不會出現雙花。擁有比特幣意味著數字賬本中包含跟你賬戶相關的UTXO,由於交易記錄是透明開源的,任何人都可以看到每個賬戶的交易情況。
上文提到區塊鏈是分散式系統,沒有客服電話或者人員幫你找回因為忘記錢包密碼而丟失的交易和資產,故而使用比特幣官方的開源錢包軟體來儲存私鑰會更安全一些。
以上是比特幣的基本原理,下一篇會繼續分析區塊鏈名稱的由來、區塊鏈如何保證交易的安全和防止雙花,以及比特幣挖礦的原理,最後會分析區塊鏈面臨的挑戰。