比特幣淺析

騰訊雲加社群發表於2018-03-13

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

作者:沈星繁,該成員來自雲+社群翻譯社

本文的目標是使讀者對比特幣有一個感性認識,對讀者的技術水平不作要求。

與本文相關的內容有:

“比特幣被儲存在數字錢包中”,“區塊鏈技術可以被用於傳遞資金”。類似這樣的內容越來越多的出現在了大眾媒體上。對於一般人來說,這些內容似乎複雜難懂,甚至會形成誤導。閱讀本文可以幫助你自如的參與到有關比特幣的話題之中,而不再是一個”不明覺厲“的聽眾。

比特幣簡介

儘管人們稱比特幣為去中心化的數字貨幣,但我更願意將其形容為一種 數字資產。對於一種陌生的貨幣,人們總會想知道其依託的政府,以及設定其利率的機構是什麼。但要理解比特幣,第一步就是拋開這些有關”貨幣“的成見。

作為一種數字資產,你可以購買,擁有,或者轉讓比特幣。目前(2015年9月)已經產生了約1400萬個比特幣。比特幣以每10分鐘25個的速度增加,最大限額為2100萬個。按照這個速度,最後一個比特幣將會在2139年末產生。

通常,比特幣賬戶發起一筆交易後,在幾秒鐘內就能收到來自全球範圍內的確認,大約一小時後這筆交易就可以被認為是安全完成了。比特幣有相應的價格(通常以美元為單位,但也可以換算為其他任何東西)。與石油和黃金類似,這一價格是由比特幣交易所中的市場供求關係決定的。

比特幣的設計初衷

2008年,中本聰釋出了比特幣白皮書,其中關於比特幣的定義是:

一種基於P2P技術的電子現金,允許支付款項通過網路直接轉讓到目標賬戶,而不必經由第三方金融機構操作。

所以,電子現金的意義就是:它是一種無記名資產,就像你口袋裡的現金一樣,你可以隨意使用它而不需要得到第三方的許可。

在比特幣之前,並沒有嚴格意義上的電子現金:儘管資金在銀行或 Paypal 等金融機構中以數字的形式儲存,但我們必須遵守這些機構的條款才能設立賬戶,轉移資金也必須通過這些機構進行。

為什麼要使用比特幣?

我認為比特幣和國際上承認的其他貨幣類似,只不過它依託的是網際網路,而不是任何具體的地理位置。換句話說:如果網際網路是一個國家,比特幣就是它的貨幣。這是我們第一次擁有完全數字化的資產,它不依託於任何機構,任何人都可以向現金那樣簡單的使用它。

比特幣交易

比特幣可以無視地理位置或者國境的限制進行交易 。比特幣支付速度相對較快 - 初步確認可以在幾秒鐘內完成,並在大約一小時內得到”清算“。在正常金融體系缺失的情況下,比特幣不失為經由網際網路進行價值交換的一種有效手段。

潛在使用場景

由於傳統的實體銀行天然帶有成本壓力,因此對於某些地區,它們不會提供足夠的金融服務。此時比特幣就可以成為一種有效的補充手段。此外,一些國際交易可能存在較大風險,或者需要較長時間(通常可達數日),而且還需要人工手續和繳納稅金。使用比特幣則可以避免這些煩惱。 有些人在銷售數字商品時可能希望使用數字貨幣。比特幣也可用於小額交易場景(數額對應人民幣在”分“的級別),當前基於信用卡的收費結構對於這種情況的處理不夠簡單。當然還有更多的用途等待我們發現。

價格波動

就像其他貨幣一樣,比特幣的價格也會波動。比起其他貨幣,比特幣的價格波動相當大(儘管波動率在下降)。因此如果你用當地貨幣來計算你的財富,購買比特幣本質上是一場對其未來價格變化的賭局。你可以在Tradeblock的網站上看到歷史價格曲線。

貨幣兌換

和其他貨幣類似,假如你想把手上的貨幣(比如說英鎊)兌換成比特幣,你必須找到一個賣家和你交易。顯然這一過程伴隨著額外支出:有時候它們以手續費的形式出現;也可能直接被計入了兌換價格之中。隨著時間的推移,比特幣交易所將會在世界各地出現,兌換比特幣的費用也會越來越低。

保持理性

很多時候比特幣被形容為“交易迅速”,“交易免費”或“低交易成本“的。雖然對於只涉及比特幣的交易來說確實如此,但在其他情況下保持理性仍然是必要的。一旦涉及到其他傳統貨幣,貨幣轉換所產生的額外兌換費用仍需仔細考慮。

儘管比特幣被大眾廣泛使用還不太現實,但對於新興經濟體中,沒有銀行或Paypal等服務的自由開發者/設計師來說,比特幣可以幫助他們將提供勞動力和獲取報酬完全數字化。當然,如何將比特幣轉為當地貨幣的問題仍然需要解決,但這比如何在沒有足夠金融服務的情況下獲得報酬簡單多了。

值得注意的是,雖然比特幣催生了許多其他類似的加密貨幣,如萊特幣(Litecoin),狗狗幣(Dogecoin),但由於其網路效應和相對較高的安全性和健壯性,比特幣仍然是最受歡迎的加密貨幣。

比特幣的實現原理

比特幣交易經由一個龐大的計算機網路完成。這一網路驗證並追蹤每一筆交易,隨後將其新增到一張列表中,這張列表記錄了全部的比特幣交易。

交易跟蹤:比特幣區塊鏈

有一個名為“比特幣區塊鏈”的檔案(當然,被分割成了若干個部分),被儲存在世界各地的數千臺電腦上,包括我家裡的膝上型電腦。當你看到“區塊鏈”這個詞時,可以聯想一下“資料庫”或者是“列表”。有關區塊鏈的簡單介紹,請參閱區塊鏈技術的簡介。

我電腦中的區塊鏈檔案截圖。你可以看到區塊鏈檔案被分割成了多個部分,每個部分都是 134MB,總共佔據了將近 50GB 空間。

區塊鏈檔案包含所有的比特幣交易歷史,即從一個賬戶到另一個賬戶的比特幣交易資訊。這通常被稱為比特幣賬簿,類似於銀行賬戶的交易記錄。

簡化的銀行分類賬和比特幣賬簿,它們非常相似

比特幣網路

所有儲存區塊鏈檔案的計算機還同時執行著一個可以聯網的程式。通過該程式,這些計算機組成了一個可以互相聯絡的網路,並不斷交換如下資訊:

  1. 新的交易(截至寫作時,平均每秒鐘就有一筆新的比特幣產生,當然這些交易並不是穩定產生的)
  2. 更新比特幣區塊鏈(每隔10分鐘左會有一個包含有效交易的“頁”或者說“區塊”產生。隨後區塊會被確認並分發至網路上的其他計算機)

當你進行一筆新的比特幣交易時,一個交易指令會被髮送給比特幣網路上的其他計算機。網路上的計算機會驗證這一指令並將其轉發給其他計算機。經過一段時間後,你的交易資訊會被包含在某個區塊內,隨後被新增到網路中所有計算機上的比特幣區塊鏈檔案中。

點對點網路(P2P)

比特幣資料的分發基於 P2P 而非 C/S 模型。P2P 就像是一個朋友圈,每個人都會向周圍的人分享新聞(關於新交易和新區塊),最終這些資訊會傳達給網路中的每個人。C/S 模型則正好相反,後者更像是傳統組織中的上下級關係,上級只負責分發資訊,是所有資訊的來源;下級只負責接收資訊。一旦上級出現了問題,整個資訊分發就會失敗。

P2P 模型比起 C/S 模型來說有一個巨大優勢:對於 P2P,整個網路並不依賴於可能會出問題的一箇中心點。

C/S 模型與 P2P 模型對比

比特幣如何儲存?

每個比特幣都會和一個“比特幣錢包地址“相關聯,而比特幣區塊鏈負責跟蹤每個比特幣的具體歸屬。事實上,用於管理地址,餘額和交易的比特幣”錢包“應用並不實際儲存比特幣,它只儲存進行交易所需的金鑰或密碼。

比特幣帳戶:錢包地址

在銀行中,你可以通過建立多個賬戶的方式來分開存錢;在比特幣中對應的”賬戶“就是錢包地址。比特幣錢包地址與銀行帳號類似,但也有一些差異。

下面是一個比特幣錢包地址的例子:1MKe24pNsLmFYk9mJd1dXHkKj9h5YhoEey。就像使用銀行賬戶一樣,如果你要從其他人那裡收款,你需要提供你的比特幣錢包地址,這樣付款方才知道應該向誰付款。下圖是一個典型的進行比特幣交易時的聊天記錄:

BTC 或者 XTC 都是比特幣的官方縮寫(原文使用 BTC 表示比特幣),就像 GBP 代表英鎊一樣

比特幣錢包

在銀行中,我可以使用同一個使用者名稱/密碼控制多個賬戶(例如工資賬戶,儲蓄賬戶,稅務賬戶等)。同樣的,一個比特幣錢包應用可以控制多個比特幣錢包地址,顯示它們的餘額或者用特定錢包地址傳送和接收比特幣。

為了獲取準確的錢包資訊,你需要連線到網路或者某個區塊鏈檔案。隨後錢包會讀取區塊鏈裡面的交易記錄並計算出每個錢包地址相應的餘額。

你可以使用比特幣錢包的建立錢包地址功能獲得用於收款/付款的地址。比特幣錢包還帶有許多增加易用性的功能等待你去發現。

比特幣使如何被髮送的?

比特幣交易

每個比特幣地址都有一個用於付款的私鑰。私鑰可以被看作是一種密碼,只不過私鑰是通過數學方法由地址計算出來的。因此私鑰和傳統密碼或者 PIN 不同,它具有唯一性且不可更改。

對於之前提到的地址(1MKe24pNsLmFYk9mJd1dXHkKj9h5YhoEey),其對應私鑰為:5KkKR3VAjjPbHPzi3pWEHVQWrVa3C4fwD4PjR9wWgSV2D3kdmeM。任何擁有這個私鑰的人,包括現在正在閱讀的你,都可以從這個地址付款。

私鑰既不是由某些機構頒發的(例如銀行),也不是由個人隨意編造出來的,而是由錢包程式自動地通過地址計算得出。

私鑰

顯然私鑰需要被妥善保管且永不公開。由於私鑰無法被更改,記住長長的私鑰是相當令人痛苦的。因此大多數錢包應用會用你的密碼對私鑰進行加密。隨後每當支付時,你只需要輸入你所設定的密碼即可。

錢包並不會實際“儲存”比特幣,事實上比特幣錢包儲存的是允許你轉移或“花費”比特幣的私鑰。因此複製錢包並不會使你擁有的比特幣數量增加一倍,而只是生成了一個擁有相同金鑰的副本。如果有人設法複製並讀取你的錢包,他們甚至可以直接清空你的賬戶。這就像你把銀行保險櫃密碼告訴了另外一個人,你們都可以開啟保險櫃,但保險櫃本身並不會被複制。

比特幣錢包只儲存私鑰,而不是比特幣!

比特幣付款的流程

比特幣付款的實質就是將一定數目的比特幣從付款方的地址上解除關聯,然後將它們與收款方的地址相關聯。

你很容易就可以想到一個付款指令所應該包含的內容:

  1. 傳送比特幣的數目
  2. 付款方錢包地址
  3. 收款方錢包地址

數字簽名

付款指令生成後,程式會使用付款方地址對應的私鑰對其進行加密。這一數字簽名用於證明付款操作的發起者是付款方錢包地址的所有者(正常情況下只有錢包所有者才知道私鑰)。

簽名後的付款指令會被錢包應用傳送到網路上的其他所有計算機(稱為“節點”或者“驗證節點”)。

驗證節點

當第一臺計算機收到付款指令時,它會檢查一些技術細節以及業務邏輯細節(例如,該付款操作是否試圖憑空建立比特幣?這些比特幣是否已經傳送到了其他地方?等等)。

驗證節點進行的技術細節和業務邏輯驗證

如果這些測試全部通過,那麼該計算機會將指令轉發給網路上的其他節點,每個節點都會對收到的指令執行相同的驗證測試。請記住,在這個網路上,節點之間不會相互信任,因此它們會對所有收到的指令執行相同的測試。最終,網路上的所有節點都收到了這筆付款,且它在這些計算機上的狀態都被顯示為“未經確認的交易”。為什麼是未經確認的?因為這筆付款雖然已經通過了驗證,但它尚未新增到比特幣賬簿中。

比特幣是如何被跟蹤的?

交易記錄是如何被新增到每個人的區塊鏈上的?

除了傳遞彼此之間交易的資訊外,某些特定的節點(網路裡的一部分的計算機)還可以將這些交易以塊的形式新增到區塊鏈中。這就是大家所熟知的“挖礦”。這一操作這通常被描述為“通過解決複雜的數學計算來獲得比特幣”。事實上,這個過程並沒有這麼複雜,你甚至可以在沒有計算器的情況下手動完成這個任務; 它只是故意採用了許多暴力的計算步驟。

挖礦

挖礦實際上是一種猜謎遊戲,獲勝機會的大小取決於你的計算機效能在所有正在執行的計算機中的排名。最先猜到正確數字的計算機會生成並分發一個新的區塊。網路上的其他計算機都會對收到的區塊進行快速驗證,確認收到的區塊合規後將其新增到自己的區塊鏈中。礦工在挖礦這一過程中能收穫什麼呢?每個區塊的成功提交者都能獲得一定數目的比特幣獎勵(本文寫作時是每個區塊獎勵 25 個比特幣,大約每 4 年減半,2016 年 7 月時降為每區塊獎勵 12.5 個比特幣)。大約每 10 分鐘就會有一個新的區塊生成。

點選此處 瞭解更多關於比特幣挖礦的內容。

這一獎勵機制促使了比特幣挖礦產業的火熱,甚至催生出了專門生產比特幣挖礦硬體(稱為 ASIC)的公司。這些硬體專為數字密集運算設計,能夠快速解決猜數字一類的問題。

比特幣在設計上要求生成區塊的時間穩定在 10 分鐘左右,由於交易記錄被存放在區塊中,因此這也是一筆比特幣交易被最終確認所需要的時間。

慢一點,更安全

通過在設計上故意減緩區塊的生成速度(事實上,絕大多數時間都被耗在了猜測數字上,生成區塊這一操作本身是相當快的),而且使生成區塊這一操作需要大量算力投入,攻擊方偽造區塊的成本將大大超出其收益。

更重要的是,偽造的區塊仍然需要通過其他計算機的驗證,這就意味著即使是偽造的交易,其業務邏輯也必須是正確的,憑空創造比特幣是不可能的。

比特幣安全

本節分為兩個部分:

  1. 支付安全
  2. 區塊控制

支付安全

就像上文提到的,付款方錢包地址的私鑰是進行比特幣支付的唯一憑證。你需要在私鑰被盜的風險和備份以防丟失的風險之間平衡。曾有人把存有私鑰的舊電腦扔掉,而那個私鑰控制著價值數百萬的比特幣。

區塊控制

區塊控制包含兩個部分。首先是由一些專業節點執行的區塊建立(“挖礦”); 其次是由所有節點進行的區塊驗證。就像讓一大群會計師和審計師各自獨立審計同一本分類賬,比特幣的願景是讓成千上萬的獨立節點參與驗證以保持系統誠實可靠。區塊交易的獨立和多重驗證可以有效避免出現單一個人或團體控制整個網路區塊鏈的情況。

然而,在實踐中,礦工們聯合進入“礦池”,以便更頻繁地產生區塊。在礦池中,一個人建立候選塊,其他人開始“挖掘”它。如果由任何參與者成功算出區塊,獲得獎勵會和礦池分成。這樣每個參與者的都能更頻繁的獲取獎勵,但是數量會減少,就像彩票聯合會一樣。這種穩定的資金流更有利於裝置成本的支付。因此,礦池所有者對比特幣網路有更大的影響力。這一影響力包括區塊的建立,協議的更改,甚至是潛在的重寫區塊的可能。

簡單的說,如果你能夠重寫最近的區塊,你就可以“撤回”你的付款,也就是雙重付款攻擊。假設你向收款方傳送了一些比特幣,並且這筆交易已經被寫入到了區塊之中。接下來你又建立了多個不包含這筆交易的區塊,根據最長區塊鏈原則,系統將拋棄之前的區塊鏈,轉而選擇你所建立的區塊鏈。當然你還需要覆蓋掉之前那筆交易,你可以建立一筆金額相同的交易,只不過收款方是你自己或是你的朋友。如果你將這筆交易寫入了你所建立的新區塊鏈之中,那麼你之前交易就會被覆蓋掉。這個連結 裡有一個雙重付款攻擊的例子。點選 這個連結 可以瞭解更多有關區塊鏈不變性的內容。

這種“洗牌”的能力隨著你投入挖礦的算力增加而增加,但隨著你想替換區塊鏈的長度增加而減少(越老的區塊越難以替換)。由於每個區塊都需要一定的算力投入,替換區塊就意味著你需要與整個網路的算力對抗。

欺詐風險

說到比特幣的安全性,不得不提到傳言被盜的 Mt Gox,一個早期的比特幣交易所。比特幣交易所是提供購買或出售比特幣服務的網站。如果你想購買比特幣,你首先要將相應的資金打入交易所的銀行賬戶。當交易所確認資金到達之後,你才可以從交易所的賣家處購買比特幣。同樣地,比特幣賣家在出售比特幣之前需要將待出售的比特幣打入交易所的錢包裡,隨後才能進行出售。交易所作為代管方,同時保管資金和比特幣,等到交易完成後才允許轉出。

目前還不確定 Gox 發生了什麼,但傳言包括私鑰被盜,審計出現問題,允許無抵押交易等。就像你們不會把花旗銀行資金滯留或資金被盜問題怪到美元頭上一樣,Gox 資金被盜一事和比特幣網路本身並沒有關聯,而是交易所在實際操作上的問題。

什麼是去中心化?

讓我們回到“比特幣是一種去中心化的數字貨幣”。我們已經看到,比特幣是數字化的,但並不算是一種真正的貨幣(儘管比特幣很易於使用,也有一個由市場決定的價格)。那麼什麼是“去中心化”呢?

分散式驗證

“中心化”意味著網路中有一箇中心控制點;“去中心化”則相反,網路控制權由所有參與者共享。在比特幣網路中,每個參與者可以成為驗證節點或區塊的建立者。比特幣規則的制定遵循“少數服從多數”,每個參與者根據其算力都具有相應的投票權。只要準備好足夠的資金去購買算力(包含硬體,電力和維護費用),任何人都可以成為驗證節點並獲得更高的投票權。因此,比特幣網路的規則只由所有驗證節點的共識制定,而非由單一的某個機構制定。

驗證的規則(一個有效的交易應該是什麼樣的?)被寫入到所有驗證節點都執行著的軟體中。

開原始碼

程式碼開源意味著每個驗證節點都可以確切地看到他們正在執行的程式的原始碼。最常用的版本(稱為'參考實現')儲存在這裡。任何人都可以為參考實現貢獻程式碼,不過提交的更改還需要經過社群維護者的檢查才能合併到參考實現裡。

從理論上講,只要符合比特幣的技術和業務協議,任何人都可以自己實現一個比特幣客戶端。例如,你可以編寫你自己的比特幣客戶端,擁有更酷的特效或更友好的介面。但是,如果你想更改某些協議規則,則需要說服大多數驗證節點(礦工)使用根據新規則編寫的客戶端。以下是對技術協議進行了一些更改的示例版本

改變規則

綜上所述,只要你達成多數共識就可以改變規則(有流言說比特幣 2100 萬枚的上限是無法更改的,事實上,只需要一行程式碼就可以修改這個上限,然而你必須說服比特幣網路上的大多數人執行你的規則)。讓其他礦工同意執行你的程式碼才是真正的挑戰,因為他們已經為老版本投入了大量資金,並不願意接受任何可能損害他們挖礦獎勵的東西 -

“火雞不會為聖誕投票”

結語

現在你可能已經猜到,比特幣遠遠不止我上文提到的內容。為了給出一個簡單的介紹,我不得不將許多複雜精細的概念簡化。但我仍然希望你能通過這個部落格學到更多比特幣相關的知識,例如挖礦數字令牌以及更底層的區塊鏈技術……

問答

與社群達人一起,揭祕區塊鏈神祕技術

相關閱讀

什麼是區塊鏈?

簡明區塊鏈原理

如何學習區塊鏈技術

此文已由作者授權騰訊雲+社群釋出,轉載請註明文章出處

原文連結:https://cloud.tencent.com/developer/article/1058091