乾貨 | 究竟什麼是比特幣?
Hi 大家好。今天我們來聊一個最近火的一塌糊塗的話題:數字貨幣。
提起貨幣,你可能覺得再熟悉不過了。你的錢包里放著現金,銀行里有儲蓄,還有各種理財、投資。生活中的方方面面,似乎都離不開貨幣。
從人類發明貨幣那天至今,它的樣子發生過許多重大的變化,從原始粗糙的貝殼、金屬塊,到工藝精美的銅板、金幣,再到印刷考究、凝結著無數現代科技的防偽紙幣,這些都是看得見摸得著的實體貨幣。
而到了科技日新月異的今天,貨幣早已擺脫了實體形態,成為了一串虛擬的數字,也就是數字化的貨幣。比如早晨買早點,你用微信掃碼,付給賣早點的大媽 12 塊 8;再比如上個月你借給小張兩萬二買數碼產品,中午支付寶提示你收到了小張的還款,還附言說周末要請你吃飯;下午銀行發來簡訊,說你本月的房貸已經扣除,這個月又要吃土了呢。
數字化的貨幣凝結了現代科技的諸多成果,然而它仍然只是傳統貨幣的一個替代品。自從人類政府取得了貨幣的鑄造權,大部分貨幣本身的價值和它代表的價值就不再是一個概念了。例如,一張100美元紙幣的生產成本大約是7.8美分,而數字化貨幣的成本則可能更低。
在傳統的貨幣體系里,實體貨幣的價值由中央銀行的信譽來保證。例如在金本位貨幣體系里,你相信政府的承諾,用你的紙幣可以兌換等值的黃金。而數字化貨幣的價值則和實體法定貨幣掛鉤,你相信你在銀行、支付寶、微信里的賬戶餘額,可以在相應的服務機構里兌換成實體的法定貨幣。也就是說,傳統貨幣,包括數字化的傳統貨幣,其價值基於人們對於中央銀行這種權威中心機構的信任。
然而信任,並不是一件很容易達成的事情呢。如果沒有一個可信的中心機構,除了靠人品,還有什麼辦法來達成信任呢?
答案就是:多年以來,一直沒有太好的答案……
直到 2008 年,一位化名中本聰的神秘人士發表了一篇論文:《比特幣:一種點對點式的電子現金系統》,提出了一個基於區塊鏈技術的"去中心化"數字貨幣系統,它就是今天大名鼎鼎、人氣爆棚的比特幣。
比特幣不是世界上第一個不依賴權威中心機構的,所謂"去中心化"的貨幣系統,但它絕對是迄今為止世界上最成功的一個。從 2009 年比特幣系統正式啟動,到今天(2018年1月),它已經成為一個總市值超過兩千億美金的巨大體系了。
講到這裡,可能很多朋友腦子裡已經冒出了一大堆關於「比特幣」的問題。比如:
沒有一個權威中心機構,你擁有的比特幣保存在哪裡?
如何確保你的錢不會被別人拿去花?
如何保證你的賬戶餘額不會被黑客篡改呢?
比特幣怎麼發行,如何避免比特幣數量暴增帶來的通貨膨脹呢?
帶著這些問題,可樂帶你來探索比特幣系統巧妙的設計和背後的技術。
事實上,在比特幣系統中,並不直接記錄每個賬戶的餘額,而只是記錄交易流水。
例如,你的賬戶流水顯示,從古至今,你收到過一筆來自小 A 的 10 比特幣,以及一筆來自小 C 的 20 比特幣,並且這兩筆交易的收入都沒有被你花掉。那麼你就擁有來自小 A 的 10 比特幣和來自小 C 的 20 比特幣這兩條記錄。只有把這兩筆交易收入加起來,你才能知道自己總共擁有 30 個比特幣。
而假如你打算使用 25 個比特幣買套房,並且付出 0.001 比特幣的手續費。那麼你需要創建這樣一筆交易,它的輸入為來自小 A 的 10 比特幣和來自小 C 的 20 比特幣,輸出為付給房主小 D 的 25 比特幣,以及付給你自己的 4.999 比特幣找零。
現在你已經在自己的賬本上記錄下的「支付25個比特幣給小D」,那小D認不認可這筆交易呢?當然不認可。要知道,所有比特幣的參與者都可以保存一份賬本副本,如果你無法說服所有的人都幫你記這筆帳,那麼這筆賬不會受到大家的認可。
在比特幣系統中,所有參與系統的人通過網路互相連接,以平等的身份組成了一個錯綜複雜的網路,稱作點對點網路。你要做的,就是把你的交易進行簽名,並且廣播到這個網路里去。
那麼,問題來了。該如何給交易數據簽名,來證明這筆交易是你本人發出的呢?
在日常生活中,一個獨一無二的簽名可以證明你對一筆交易做了授權,除了少數天才,很少有人能夠精確仿製出一個簽名;而在數字的世界,複製是一件及其容易的事情,如何保證你的簽名不被別人複製,從而被用於偽造你的授權呢?
這裡可樂給大家介紹一下,計算機世界裡的數字簽名是如何進行的。首先,數字簽名技術基於一種被稱為"非對稱加密"的技術。在使用這種技術時,你擁有兩個鑰匙,一個稱作公鑰,一個稱作私鑰。在計算機的世界裡,公鑰和私鑰其實是兩個數字,這兩個數字是配對使用的。公鑰,顧名思義,是可以公開給別人的,而私鑰則是需要使用方嚴格保密的。
使用私鑰,可以對一塊特定的數據進行一個計算,得出一個獨一無二的數字簽名。數據不同,輸出的數字簽名也不同。使用公鑰,可以對的消息,進行驗證。如果公鑰和私鑰是配對的,那麼驗證通過,否則驗證不會通過;通過私鑰可以很容易計算出配對的公鑰,而只知道公鑰卻極難推導出私鑰;正是由於公鑰私鑰這樣的性質,才使得我們可以用這種機制來進行數字簽名。
私鑰是你務必要妥善保存的,因為任何人掌握了你的私鑰,就意味著掌握了你的錢包,以及裡面的資產。而你的公鑰,事實上就是你的比特幣收款地址,其他人需要知道你的地址,才能轉賬給你。由於公鑰是一個又長又難記的數字,因此比特幣系統使用了一系列的編碼轉換,將公鑰表示成類似這樣(1NE5ZK9H4TBopmbq3jwin8uCjo1ZKZQNGx)的錢包地址。儘管仍然很難記,但是比原始的數字短了很多呢。
在真實的比特幣系統中,使用私鑰為一筆交易的輸入進行簽名,並且交易的輸出要綁定收款人的公鑰。例如,你之前收到來自小A 的10比特幣收入,小A使用了你的錢包地址,也就是公鑰來綁定這10比特幣,要求必須用這個公鑰對應的私鑰進行簽名,才可以花這筆錢。
當你打算花掉這10比特幣時,必須使用你的私鑰為它簽名。這樣,當網路中的其他節點收到你的交易信息,就可以用這10比特幣上綁定的公鑰,來檢驗你簽名的合法性。而你指定你的交易輸出為房主小D,也就意味著你使用小D的公鑰綁定了付給他的25比特幣。另外還有一筆找零,當然是綁定上你自己的公鑰了。
製作出一筆合法的交易記錄,然後簽名之後,需要廣播到比特幣網路中。那什麼又叫廣播到網路里去呢?簡單地說,就是把你的交易發送給網路中和你相鄰的計算機節點,然後這些節點驗證了你的交易簽名,又把它發送給他們相鄰的其他節點,一傳十,十傳百,最終你的交易就會被傳遍全網。
如果全世界都知道了這筆交易,那你就無法賴賬了。
這時,如果你再試圖創建一筆交易,把已經花掉的10比特幣和20比特幣當作輸入付給別人,網路中的所有人都會拒絕接受。不過,聰明的你可能會想,如果把買房的交易發給網路中一部分節點,而又用同一筆錢創建另一筆交易買豪車,發給網路中另一部分節點,那會產生什麼樣的結果呢?
首先,有一部分節點先收到了你的第一筆交易,他們會記錄下來,傳播出去;另一部分節點收到了你的第二筆交易,他們也會記錄下來,傳播出去。隨著時間的推移,有一些節點先後收到了你的兩筆交易。怎麼辦呢?很簡單,他們把先收到的交易記錄下來,然後認為後一筆收到的交易是不合法的,直接丟掉。
這時,網路中的節點出現了不一致:一部分節點認可你的第一筆交易,另一部分節點認可你的第二筆交易。作為一個貨幣系統,比特幣當然只會承認其中一筆。具體怎麼做呢?比特幣系統引入了一個競賽,讓節點們互相競爭,最終達成一致。
說到這裡,可樂有必要為大家介紹一下比特幣的底層技術--區塊鏈,是如何工作的。
在比特幣系統中,節點是這麼組織交易的:發生時間相近的交易會被放在一起,形成一個"區塊",然後每個區塊按照時間順序首尾相接,後一個區塊里會寫著前一個區塊的編號,所有區塊組成一個鏈條的形狀。這個鏈條從第一個區塊(也就是創始塊)開始,到最新的一個區塊為止,記錄了比特幣歷史上所有已經確認的交易記錄。
回到剛才的問題。網路中一部分節點認可了你的第一筆交易,把它放在了新生成的區塊里;另一部分節點認可了你的第二筆交易,也把它放在了他們新生成的區塊里。那麼,誰說了算呢?
畫外音:人多的說了算唄?
嗯,一定程度上是對的,不過比特幣系統還要更複雜一點。實際上,把一個區塊打包加入到區塊鏈里,也被設計成了一件非常困難的事情。
當一個節點收集到一批交易信息,製作出來一個區塊,它還需要先把這個區塊合法化,才能把它加入到區塊鏈里,被整個網路認可。中本聰在設計比特幣系統時,要求一個區塊必須滿足一個非常苛刻的條件,才能被認為是區塊鏈里的一個合法區塊。
簡單地說,所有新產生的區塊,除了交易記錄、上一個區塊的地址等數據之外,還必須添加一個(稱作 nonce 的)小塊數據,使得整個區塊經過一個(稱作哈希計算的)數學運算之後,得到的結果滿足指定的條件。而找到滿足這樣條件的小塊數字(nonce),至少對於現在計算機的計算能力來說,是一件非常困難的事情。
這裡,比特幣對區塊做的數學運算稱作哈希計算。在計算機科學裡,哈希計算是一系列計算的統稱,這類計算能夠將一塊數據,映射成一小串固定長度的數字,我們稱作哈希值。
哈希計算有幾個特點:
一是,給定輸入數據,可以很快計算出來它的哈希值;反之只給出哈希值,則幾乎不可能算出原始數據;
二是,輸入的數據哪怕只是改變一點點,算出來的哈希值也會發生翻天覆地的變化。
也就是說,通過哈希計算,我們的區塊(包含交易記錄、上一個區塊的地址以及額外的 一小塊數據),會算出一個固定長度的哈希值來。比特幣系統要求合法的區塊計算出來的哈希值小於某一個閾值,因此,比特幣中的計算節點們就需要不停嘗試不同的數字,使得整個區塊的哈希值滿足條件。
由於計算產生新區塊是一件非常困難的事情,為了鼓勵網路中參與區塊鏈建設的節點,比特幣系統協議允許生成合法新區塊的節點得到兩種收益。
一種收益是交易手續費,還記得你的買房交易里有一筆 0.001 比特幣的手續費嗎?這個手續費就是獎勵給把你的交易打包進區塊鏈的節點的。這個手續費是可選的,不過包含適量的手續費可以使得你的交易更快的被打包進區塊鏈。
另一種收益來自一種稱作 coinbase 的交易,這是比特幣系統中一個特殊的交易,也是唯一一種無需包含輸入,而只有輸出的交易。比特幣系統中的所有節點都認可這個規則,計算出合法區塊的節點,可以在區塊中包含一筆這樣的交易,寫上自己的錢包地址,獎勵給自己一些比特幣。最初這個獎勵的金額是 50 比特幣,大約每四年這個獎勵金額就會減半,按照系統設計,2140年這個獎勵就消失了,目前這個獎勵大約是 12.5 比特幣。
由於 coinbase 交易"憑空"創造出了比特幣,它也是比特幣發行的唯一方式。
參與比特幣記賬的節點要通過複雜而費力的計算工作來添加新區塊,從而得到交易手續費和系統獎勵,因此這種工作也被人們形象的稱為"挖礦",參與挖礦的計算機節點被稱作"礦機",控制礦機的人們則自稱「礦工」。
在比特幣系統中,並非所有參與者都會選擇成為礦工。事實上,大多數參與比特幣交易的普通人,只需要讀取數據或者發起交易。
有了經濟上的利益誘惑,所有參與記賬的礦工節點,在組成一個新區塊之後,就開始不停的計算,尋找這個能使整個區塊合法的數字。所有的節點都參與競爭,每當有一個節點率先算出來了合法的區塊,它就會興奮地通知周圍的節點,把這個新的區塊廣播給大家。
而當一個節點收到了別人傳來的合法區塊,它就會先去校驗這個區塊是否滿足合法條件。如果校驗通過,也就意味著自己在剛才這場競爭中失敗了,於是它就放棄自己正在進行的計算,把別人傳來的區塊加入到自己的區塊鏈中 ,然後重整旗鼓,參與下一個區塊的計算。
再回到前面的情況,當你把用同一筆錢 買房的交易和買車的交易都發送到網路上之後:一部分節點可能先收到了買房這筆交易,於是嘗試把這筆交易加入到它們的下一個區塊里,而 這些節點稍後再收到買車這筆交易時,就簡單地忽略掉它;而另一部分節點則可能剛好相反,它們嘗試把買車這筆交易加入到它們下一個區塊里。在絕大多數情況下,只有一方能夠先勝出。假設買房的交易先勝出,那麼當包含這筆交易的區塊迅速被網路上所有節點都認可之後,買車這筆交易就再也沒有機會被人接受了。
此外,由於在產生新區塊非常困難,想篡改區塊鏈中的交易記錄(造分叉)也成了一件很困難的事情。假設你付給房主小 D 房款之後,你的交易被打包到了一個最新的區塊 X 里,而 X 的上一個區塊是 W。如果你想賴賬,抹掉這筆交易,那麼你需要把區塊 X 里的交易拿出來,去掉你的交易,重新計算一個新的區塊 X_1。如果你成功了,那就意味著你在w之後製造了一個區塊鏈的分叉。
這時比特幣系統有一個簡單的策略來彌合分叉這種不一致的情況。那就是:所有比特幣網路中的節點,都只在當前最長的區塊鏈分叉上計算新塊,而忽略較短的分叉。
此時網路中所有其他的節點都在嘗試往 X 之後構建新的區塊 Y,你必須趕在他們之前構造出區塊X_1,然後在其他人算出 Y 之前,計算出X_1 後的新區塊 Y_1,這樣才能說服所有人放棄 X,切換到 X_1 和 Y_1 這個分支上來。除非你的計算能力爆棚,超過了全網計算能力的 50%,否則這已經是一件幾乎不可能完成的任務了。
那如果你想篡改的交易 X 之後,已經被計算出來若干個新區塊了呢?你必須從 X 開始逐一重新計算,試圖製作出來一條更長的區塊鏈分支來說服大家。這不僅是幾乎不可能的事情,而且會讓嘗試做這樣事情的人損失巨大的能源、計算機節點資源。有這個能力,你完全可以做個正常的礦工,賺取每個區塊產生的收益。因此,你的交易在區塊鏈里時間越久,前面產生的新區塊越多,你的交易也就越安全。
雖然由偽造導致的分叉在實際情況中不常發生,但因為不同節點收到交易的先後順序不同、選擇策略不同,而網路則又不總是可靠,比特幣偶爾也會出現分叉。
產生區塊的過程稱為工作量證明方法,這種方法使得篡改、偽造區塊鏈變得代價高昂,從而確保了在沒有中心權威的情況下,參與系統的各方出於保障自己的經濟利益的目的,去遵守和維護系統規則。這樣就使得人們對系統產生了信任,從而賦予了比特幣價值。
怎麼樣,是不是非常精巧和神奇呢?
來源:可樂編程
推薦閱讀:
※鎮宅風水法器 — 「五帝錢」解析(乾貨)
※乾貨!刑法分則重難點速記42條
※看完乾貨就來做一篇新聞閱讀吧
※乾貨!大師級的超跌反彈戰法運用!圖文講解!
※八字命理基礎知識乾貨之,白話說十神