看完你就知道什麼是比特幣了

什麼是比特幣?

比特幣 (bitcoin) 是一種數字貨幣。html

小知識:什麼是比特(bit) ?

bit 是計算機表示二進制的單位。
例如:
1bit 能夠表示 0 或者 1 兩種狀態;
2bit 能夠表示 00/01/10/11 四種狀態。

因此,習慣上人們用比特來形容數字化相關的事物,例如:比特幣
複製代碼

既然比特幣是一種數字貨幣,那麼理解比特幣以前,先要了解:什麼是貨幣算法

經濟學上認爲,貨幣本質上是通常等價物數據庫

什麼是通常等價物?編程

考慮原始時代的經濟:瀏覽器

A 圈養了一頭牛,B 紡織了一塊布,爲了知足彼此的需求,他們能夠約定:安全

一頭牛 換 一匹布
複製代碼

經過這種原始的物物交換實現了簡單的價值流動bash

可是,隨着社會生產力的提升,這種模式已經不能適應經濟發展的要求。服務器

小思考:爲何物物交換行不通?

一、A 在安陽,B 在梅州,空間上無法物物交換;
二、A 今天生產了商品甲,下個月才須要商品乙,時間上無法物物交換;
三、參與市場的各方提供了成千上萬的商品,效率上不接受物物交換。
複製代碼

這個時候,須要一種各方都承認的通常等價物來衡量、轉換和傳遞商品的價值,從而實現商品的高效自由流動。微信

價值流動:商品 -> 通常等價物 -> 商品
複製代碼

早期,人們使用貝殼來充當通常等價物,後來又使用金、銀等貴金屬,再發展出紙幣,甚至到如今的移動支付。網絡

小思考:

財、貨、貴、販、賺、帳、賃,這些字有什麼共同點?
複製代碼

以 ¥人民幣 爲例,它是以國家信用爲背書,充當價值媒介的通常等價物。具備價值尺度、流通手段、貯藏手段、支付手段等職能。

因此,貨幣本質上是通常等價物。

只要你能創造出一種東西:它知足充當通常等價物的條件,那麼你就是創造了一種貨幣!

小思考:充當通常等價物須要哪些條件?

一、全體參與方承認;
二、不可僞造;
三、方便攜帶、分隔、能夠長期保存;
四、數量可控;
......
複製代碼

比特幣就是這樣一種東西。

比特幣

這是一個革命性的創舉,它打破了古今中外的慣例:貨幣都由政府的中央銀行負責發行,並且只能在特定國家或地區流通。

要知道,每每只有改朝換代的時候有機會發行全新的貨幣,可謂百年難遇。如今比特幣作到了,並且是全球性地發行和流通,前無古人!

當前的貨幣體系

政府經過國家信用和強制手段保證央行發行的貨幣被普遍承認和接受。

例如,經過頒佈法律和規章制度:《中華人民共和國中國人民銀行法》、《中華人民共和國人民幣管理條例》等。

中國人民銀行

對於防止僞造,一方面經過技術手段提升紙幣的僞造難度;另外一方面經過法律手段打擊製造、流通假幣。

截至目前,經過央行發行貨幣是全世界通用的作法,運行良好,但缺點明顯。

顯而易見的問題,包括但不限於:

  1. 因爲發行權掌握在中心化的央行手中,理論上存在貨幣超發的可能,從而致使通貨膨脹,例如:委內瑞拉、津巴布韋等國家因爲通貨膨脹,貨幣體系近乎崩潰;

  2. 即便高壓打擊,依然沒法避免假幣出現,最薄弱的環節不在於印製技術,而在於流通中須要人去辨別,而人每每是不可靠的。

通貨膨脹

比特幣系統是如何運轉的?

2008 年,一個網名爲中本聰 (Satoshi Nakamoto) 的人,發表了《比特幣:一種點對點式的電子現金系統》的論文,由此掀開了比特幣風靡全球的大幕。

小連接:

論文 PDF 版原文:https://bitcoin.org/bitcoin.pdf
複製代碼

因爲思惟定勢,剛接觸比特幣概念的人,每每有一些認知的誤區或盲區:

一、比特幣是否是和硬幣或紙幣同樣有實體形式?

二、比特幣是數字貨幣,是否是和銀行帳戶同樣,在某個服務器的數據庫裏記錄着個人帳戶下有多少餘額?

三、兩我的之間怎麼轉帳?是否是和傳統的銀行同樣:A 的帳戶 -100,B 的帳戶 +100?

四、比特幣的數量有多少?最小分割單位是多少?

五、沒有中央銀行,那麼比特幣是誰發行的?

六、軟件、音樂、文檔等數字資產能夠隨便複製,爲何比特幣不能拷貝?

......

一大堆問題!是什麼?!爲何?!

當你開始思考這些問題的時候,那麼恭喜你,你已經在思考如何設計一種貨幣系統了。

真是激動人心,歷來沒有想過有一天本身也能夠設計一套貨幣系統,並且能夠在真實世界運行起來。

更使人興奮的是,你有機會參與價值的從新分配,就像淘金。

接下來,開始揭祕比特幣是如何運行的。

從記帳開始

比特幣系統不須要一個具體的地方記錄某個帳戶下有多少餘額,只要知道全部帳戶之間的轉帳記錄,就能夠推算出某個帳戶下有多少餘額。

假設系統總共有 3 個帳戶 A/B/C,它們初始值和轉帳記錄以下:

A B C 帳戶初始值分別爲 50元、0元、0元
複製代碼

轉帳記錄:

A -> B : 10元
B -> C : 5元
C -> A : 2元
B -> A : 3元
複製代碼

那麼,能夠計算出 A/B/C 目前的餘額分別是:

A: 50 - 10 + 2 + 3 = 45元
B: 0 + 10 - 5 - 3 = 2元
C: 0 + 5 - 2 = 3元
複製代碼

因此:只要知道轉帳記錄,就能夠知道帳戶餘額

前提是,你要知道全部帳戶的初始值。

額... 結果仍是有某個地方記錄着 A/B/C 的初始值爲 50/0/0,說好的比特幣不用記錄每一個帳戶的餘額呢?!

怎麼解決?

只要規定每一個帳戶初始餘額都是 0 ,不就能夠不用記錄了麼!

都是 0 ?那後來 A 的 50元 哪裏來的?沒有這 50 ,哪來後續的轉帳?總不能無中生有吧??

答案確實是:無中生有。

如今,A/B/C 帳戶的餘額都是 0,因此不用記錄了,可是多了一筆「無中生有」的轉帳記錄:

-> A : 50元(無中生有)
A -> B : 10元
B -> C : 5元
C -> A : 2元
B -> A : 3元
複製代碼

那麼,能夠計算出 A/B/C 目前的餘額分別是:

A: 0 + 50 - 10 + 2 + 3 = 45元
B: 0 + 10 - 5 - 3 = 2元
C: 0 + 5 - 2 = 3元
複製代碼

結論依然是:只要知道轉帳記錄,就能夠知道帳戶餘額。

憑什麼?!

憑什麼無中生有的時候,到了 A 的帳戶下,而不是個人,或者至少是全部人平均?!

想一想吧,A 發現了一座疑似金礦,他 費時費力千辛萬苦冒着萬一不是金礦或者發生礦難的風險 開採完,最終總共獲得了 50 克黃金。

這個時候,你還會說憑什麼麼?不會的。

當 A 拿 10 克 黃金向 B 買一份醃面的時候,轉帳發生了:

-> A : 50
A -> B : 10
...
複製代碼

因此,無中生有的成本是:A 要成爲一名礦工,去挖礦。

而 A 的所得是系統對他的獎勵,畢竟沒人挖礦的話,市場上就沒有支持價值流動的媒介:通常等價物。

這也是比特幣惟一的發行方式:礦工每完成一次有效「挖礦」,就獎勵必定數量的比特幣。

同時,「挖礦」會設置必定的難度,保證每次「挖礦」時間在 10 分鐘左右。

最開始的時候,每次獎勵 50 個比特幣,每過 4 年時間獎勵減半:

2009 - 2012 年,每次獎勵 50 btc
2013 - 2016 年,每次獎勵 25 btc
2017 - 2020 年,每次獎勵 12.5 btc
...
複製代碼

按照這樣的規則,時間線到 2140 年左右,獎勵會變爲 0,那時候問世的比特幣總量約 2100 萬個。

因此,你如今就參加挖礦的話,每次能夠獎勵到 12.5 個比特幣,根據比特幣交易所 coinbase.com 的最新數據:1btc = $14907,那麼 12.5 個比特幣約合人民幣 ¥1210802,心動不?

比特幣價格變化曲線:

挖礦吧!少年

事實上,「挖礦」只是一個形象的比喻。比特幣做爲一種數字貨幣,並不像黃金同樣要開着挖掘機一勺一勺的挖。

上文說到,「無中生有」是對「礦工」辛苦「挖礦」付出成本的一種獎勵,隨着獎勵的不斷進行,這些「礦工」的帳戶上也就不斷地有比特幣增長,而後「礦工」們向其餘人支付或者轉帳,那麼貨幣系統就開始運行起來了。

既然不用真的去挖,那麼哪來的成本?

你說對了,目前看起來確實沒有成本。

那怎麼辦?

解決方案是:人爲的制形成本!

比特幣系統給每一個「礦工」佈置一道做業題,誰先解答出來,就算誰「挖礦」成功,而後獎勵就花落他家。

究竟是什麼樣的做業題,要計算機花大約 10 分鐘才能解答出來?

答案相似於「抽獎」。

給你 1-10 個號碼,隨機從中抽一個,放回後能夠重複任意次,誰先抽到 「小於等於 N」的號碼,就算解答成功。

那麼:

對於題目「抽到號碼小於等於 10」,那麼平均抽 10/10=1 次,就能出現;
對於題目「抽到號碼小於等於 5」,那麼平均抽 10/5=2 次,就能出現;
對於題目「抽到號碼小於等於 2」,那麼平均抽 10/2=5 次,就能出現;
...
可見 N 的值越小,須要抽的次數就越多
複製代碼

是否是很簡單?以計算機的速度,別說抽 10 次,就算抽 100 萬次也是分分鐘搞定的事情。感受我也能「挖礦」,立刻就要一晚上暴富了,哈哈哈。

你高興的太早了。

若是改成從 1 到 2的256次方 之間抽一個呢?

2^256 = 115792089237316195423570985008687907853269984665640564039457584007913129639936

2的256次方 是一個很大的數字!

用 16 進制來表示就是:

從 0x0000000000000000000000000000000000000000000000000000000000000000
到 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

若是如今要求抽到一個小於等於:

0x00000000ffff0000000000000000000000000000000000000000000000000000

的數。

那麼平均須要 4295032833(約 43 億)次。
複製代碼

因此,事情沒有你想象的那麼簡單。

目前,「挖礦」已是一個競爭激烈殘酷到不忍直視的工做。

比特幣系統爲了保證每次挖礦時間大約爲 10 分鐘,會根據過去 2016 次挖礦的平均時間,動態調整 N 的大小。

小思考:爲何是 2016 次?

若是 10 分鐘能夠挖一次,那麼每小時 6 次 x 一天 24 小時 x 14 天(2 周) = 2016 次
複製代碼

N 越小,須要計算的次數就越多,那麼時間也就越長。

若是「礦工」投入了計算速度超快的設備,也就是傳說中的「礦機」,甚至使用成千上萬的「礦機」的聯合體,也就是更可怕的「礦場」。

直至終極形態:由無數的個體戶和「礦場」等聯合,造成「礦池」!那麼,計算能力不斷加強,爲了保證計算時間穩定在 10 分鐘左右,N 的值就得不斷減少。

可怕的礦場

小知識:「挖礦」設備變遷史

我的電腦 CPU ->  GPU -> FPGA -> ASIC(礦機)-> 礦場 -> 礦池

注:專用集成電路(英語:Application-specific integrated circuit,縮寫:ASIC)
複製代碼

根據 btc.com 的統計,目前參與比特幣系統「挖礦」的計算能力已經達到:15.23 EH/s!

15.23 EH/s = 15.23 x 10^18 次哈希計算/每秒
複製代碼

難度係數也達到了:

1.93T = 1.93 x 10^12

難度係數是個相對值:

以難度係數 1 須要計算 4295032833(約 43 億)次爲基準

那麼,難度係數 1.93T 須要計算:
4295032833 x 1.93 x 10^12 = 8289413367690000000000 次
複製代碼

因此,很遺憾,做爲「個體戶」,你已經沒有參與「挖礦」的機會了,或者說你那點計算能力參與競爭的話,機會有點渺茫,很渺茫的那種渺茫。so sad ;(

根據 blockchain.info 的統計,目前全球各大礦池算力份額佔好比下圖所示:

其中,有超過 70% 的算力分佈在中國,真是「勤勞勇敢的中國人」。

小思考:

每臺「礦機」背後都要消耗大量的電源,因此爲了下降成本,不少「礦場」都選擇建在靠近電站的地方。

比特幣這種人爲設置「挖礦」成本的機制,一直被批評人士詬病:形成大量能源的浪費。

你以爲有什麼好的解決方案呢?
複製代碼

[新聞連接] 騰訊財經:《央行閉門會議討論對比特幣礦場限電 並不是關停》

如今,你已經對比特幣「挖礦」的概念有了感性的認識:付出「辛苦勞動」的成本,得到系統的獎勵,這樣你的帳戶上就會「無中生有」多出比特幣,而後你用這些「被挖出」的比特幣購買商品或服務,給他人支付或轉帳,那麼比特幣就開始充當通常等價物的角色,變身爲貨幣。

如今就去開戶

上文說到,無論你是參與「挖礦」,仍是接受比特幣支付或者轉帳,都須要一個屬於你的帳戶。因此,參與到比特幣系統的前提是,你要有一個比特幣帳戶。

小知識:

截至 2018 年 1 月,比特幣網絡上活躍的帳戶已經超過 2200 萬個。
複製代碼

你之前去銀行開戶的時候,須要本人帶着身份證,填寫一大堆信息和簽名,甚至須要現場錄指紋和拍照,至關繁瑣。

那麼,比特幣開戶須要攜帶什麼材料,到哪一個機構去開戶呢?

答案是:不用帶任何材料,不用到任何機構,你能夠隨時隨地零成本地開設任意數量的帳戶!

這只是比特幣貨幣系統一個小特性而已。從如今開始,你腦海中的思惟定勢須要被慢慢推翻,直到你徹底掌握比特幣運行的原理。

事實上,你只須要一對密鑰,分別稱爲私鑰和公鑰。

這對密鑰有這樣的特性:私鑰加密後的信息只有公鑰能解密;公鑰加密後的信息只有私鑰能解密。也就是所謂的「非對稱加密」。

小知識:

這也是比特幣被稱爲數字加密貨幣的緣由,整個系統都依賴密碼學基礎。
複製代碼

如今,你徹底不用關心怎麼生成這樣一對密鑰。由於有專門的軟件幫你生成和保管,這種軟件被形象地稱爲「比特幣錢包」。

你能夠到 bitcoin.org/coinbase.com/btc.com 等網站下載它們提供的比特幣錢包,甚至能夠本身編程開發一個。

比特幣錢包

有了比特幣錢包以後,你須要作的就是動動手指,點一下就開好帳戶了,再點一下又開好了一個帳戶。

一個帳戶由一對密鑰(私鑰,公鑰)組成,公鑰能夠經過私鑰生成。再使用公鑰通過一系列不可逆的哈希計算獲得比特幣帳號地址。

小知識:什麼是哈希計算?

哈希(hash)計算具備以下特色:
一、將任意長度的數據映射爲固定長度的大整數;
二、數據有任意變化後,計算出來的結果徹底不一樣;
三、沒法經過哈希結果逆推出原始數據內容。

哈希算法有不少種實現,好比常見的 SHA-256 算法:

sha256('123') = a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
sha256('234') = 114bd151f8fb0c58642d2170da4ae7d7c57977260ac2cc8905306cab6b2acabc
...

可見這裏:
哈希值是用 16 進製表示的整數;
原始內容輕微變化,但哈希結果差之千里,那麼每次改動原始內容,獲得的哈希值至關於從 1 到 2的256次方 中隨機抽一個數。
複製代碼

所謂「不可逆」就是:別人沒法經過帳號地址推算出公鑰。因此,你能夠放心的把地址告訴別人,接受對方的轉帳。下圖展現了經過公鑰計算出比特幣地址的過程:

你很興奮,由於有了第一個屬於本身的比特幣帳戶,可是也很沮喪,由於裏面空空如也。

那麼怎樣讓本身的錢包鼓起來?畢竟一個比特幣價值 $17082!

小知識:比特幣冷笑話

爲何前文提到比特幣價值 1btc = $14907,這裏又變成了 $17082?

由於比特幣交易價格劇烈波動,在做者寫到這裏的時候,已通過了 10 分鐘。^_^
複製代碼

已知的獲取比特幣的方式和存在的障礙:

一、比特幣「挖礦」;(競爭很激烈,機會很渺茫)

二、接受比特幣支付,好比你的工資/咖啡店;(你的老闆/顧客也沒有比特幣)

三、讓你的好朋友給你轉一點;(你可能沒有好到這種程度的朋友 ^_^)

四、花錢到比特幣交易所購買。(國內已經禁止比特幣交易,另外價格也已經突破 $10000 美圓)

那普通人不是沒有機會參與了麼?

你說對了,目前參與門檻已經很是高了。這是比特幣發展必然要經歷的一個過程,也許等到「礦工」們願意花費他們手中的比特幣,也有足夠的機構和我的願意接受比特幣支付了,比特幣纔會經過價值流動慢慢到達普通人手中。

根據 btc.com 統計的全球前十大比特幣帳戶下的餘額:

第一名的價值已經超過 26億 美金!

這就是技術變革給先行者最好的獎勵!「擁抱變化」不是一句空談。

固然,這裏可能有一些是比特幣交易所的公共帳戶。

小思考:

批評人士也認爲,目前的比特幣不能給大衆帶來普惠。
狂熱的炒做只是一個龐氏騙局,泡沫終將破滅。

你怎麼看?
複製代碼

[新聞連接] 人民日報:《比特幣價格存在泡沫,已經是一個無需討論的問題》

轉帳是如何實現的

假設 Mr.Chen 在國外,經過 coinbase.com 比特幣交易所,用美圓向他人購買了 0.1 個比特幣。

小知識:比特幣最小單位

就像 1元 = 10角 = 100分 同樣,1btc 也能夠細分:

1btc = 100000000聰(沒錯,是1億,也是中本聰那個聰)
也即:1聰 = 0.00000001btc

因此,當你之後聽到:「2兩蔥多少錢?」 「2聰」 這樣對話的時候,不要驚訝。
複製代碼

如今 Mr.Chen 想給 Miss.Liu 轉 0.05個比特幣,怎麼實現呢?

想一下,你之前用銀行卡的時候怎麼轉帳:

  1. 帳戶餘額大於等於轉帳金額;
  2. 知道對方的帳號;
  3. 輸入密碼,確認是本人操做。

剩下的事情,銀行會幫你搞定:扣掉你帳戶的金額,加到對方帳戶下,給你出帳單等等,還可能會收你手續費。

比特幣轉帳步驟相似,可是沒有銀行這個角色,就像你開比特幣帳戶的時候不用帶着材料跑去銀行同樣。

那麼誰來扣錢、誰來記錄帳單呢?

答案是:分佈式節點。

小知識:什麼叫分佈式?

與分佈式對應的是「中心化」,就像全部人的交易都由銀行這個中心記錄管理。
若是銀行服務器崩潰了,那麼全部人的交易都沒法再進行。

相反,分佈式就是全部交易由比特幣網絡中的節點共同記錄。
每一個節點獨立維護一份完整的交易帳本,這個帳本也叫作「分佈式帳本」。
任何一個節點退出比特幣網絡,不影響系統運行。

如今,比特幣系統由分佈在全球各地的節點組成。
每一個節點都與附近的節點鏈接,組成一張覆蓋全球的 P2P 網絡。

這也是比特幣能夠全球流通的物質基礎。
複製代碼

因此,你只需將交易信息告訴比特幣網絡中任意節點就行。

它不只會幫你記錄到它的帳本中,還會幫你轉發給與之鏈接的近鄰節點,經過這樣病毒式擴散後,數分鐘內交易信息將抵達全球每個比特幣節點。蔚爲壯觀!

那麼節點在哪?看不見摸不着,我去哪裏找它?

幸運的是,不用你費心去找節點,你的「比特幣錢包」會幫你作這件事。

事實上,比特幣錢包要把交易信息告訴節點,那麼它就至少得鏈接比特幣網絡中的一個節點,當與節點鏈接後,比特幣錢包自己也就成爲了網絡中的一個節點,只不過叫作「輕量級節點」,由於它既沒有記錄完整的帳本,也沒有去「挖礦」。

小知識:比特幣錢包都有哪些功能?

一、管理比特幣帳戶(密鑰);
二、發送交易信息;
三、查詢餘額。
複製代碼

好奇的你仍是想多問一句:比特幣錢包是怎麼發現節點的?

很簡單,在比特幣網絡發展的過程當中,會有一些長期穩定的節點,稱爲「種子節點」。

開發比特幣錢包軟件的時候,會把這些「種子節點」的域名寫進代碼,經過 DNS 動態查詢的方式,向「種子節點」要一份活躍節點地址列表,以這些節點爲媒介比特幣錢包就能夠加入網絡了。

好極了!如今 Mr.Chen 經過比特幣錢包給 Miss.Liu 完成轉帳了,這筆轉帳經過「分佈式帳本」被全球的比特幣網絡節點記錄在案。

轉帳記錄:

Mr. Chen -> Miss. Liu : 0.05btc

固然,不會真的這樣記錄名字,而是兩人的比特幣帳號,相似於:
1AC4fMwgY8j9onSbXEWeH6Zan8QGMSdmtA -> 1JWq3G8pqCo6jZGhLHpctYap5yVScqGxkv : 0.05btc
複製代碼
小思考:

交易記錄中沒有任何隱私信息,即比特幣交易的「匿名性」。

那麼,匿名交易的利與弊都有哪些?
複製代碼

節點爲了什麼而工做

那麼誰來充當比特幣網絡中記帳的「全節點」?爲何它們會那麼好心,幫我記錄交易信息呢?畢竟隨着交易數量的增加,這個帳本可不小。

自 2009 年比特幣網絡開始記帳以來,帳本已經接近 150G 大小:

節點們並無好心到「免費」幫你記帳。

事實上,每個節點均可能是「壞節點」,即便收到你發來的交易信息了,也不幫你記帳!so bad ;(

那怎麼辦呢?

解決方案:每筆交易支付一筆「轉帳費」,誰願意記帳就能夠得到這筆費用。

這樣節點就有動力收集全網的交易信息,真是「有錢能使鬼推磨」。

帶轉帳費的交易:

Mr. Chen -> Miss. Liu : 0.05btc
Mr. Chen -> 某 「礦工」 : 0.001btc
複製代碼

咱們說過,交易會被全球比特幣網絡節點記錄在案,那麼「轉帳費」是它們均分麼?節點那麼多,平均下來也太少了,起碼我不幹。

固然不會均分,而是誰先完成「挖礦」,這筆費用就歸誰,也就是跟系統獎勵一塊兒給他,贏者通吃!

這也是節點被稱爲「礦工」的緣由,勤勤勉勉的記帳,辛辛苦苦的付出計算成本,最後獲得轉帳費+系統獎勵。

那其餘節點不樂意了,沒有收到小費憑什麼要我記錄?

解決方案:「挖礦」是每 10 分鐘一次,雖然此次你沒挖着,沒了獎勵也沒了轉帳費,可是能夠開始下一輪競賽了啊,不過參加下一輪競賽的前提是,你得把帳本更新到最新,也就是你不記帳就失去了繼續競賽的資格。

「好吧,咱們願意接着幹」,節點們心有不甘地說道。

個人錢歸我

你已經知道,只需向比特幣網絡廣播一次交易信息,就會被全網的節點記錄在案。

假若有個壞人 HR ,他知道你的帳號是 A,那麼他廣播一條交易信息:

A -> HR : 10btc
複製代碼

那你的錢不就被他轉走了嗎?

並不會。

比特幣節點接收到一條交易信息後,會獨立進行真實性校驗,若是有誤就不會入帳:

  1. 帳戶餘額是否足夠;
  2. 是否本人發起交易。

對於餘額查詢,咱們前文說過,比特幣系統的分佈式帳本並不直接記錄某個帳戶下有多少餘額,而是隻記錄轉帳記錄。「挖礦」獎勵所得也至關於一次系統給「礦工」的轉帳。

假設你帳戶 A 以下,有「挖礦」所得及 X/Y/Z 三人給你轉帳,共 50btc:

記錄1:  -> A : 12.5btc
記錄2:X -> A : 12.5btc
記錄3:Y -> A : 20btc
記錄4:Z -> A : 5btc
複製代碼

顯然,你還沒花出去。

在比特幣系統中,這 4 筆轉帳記錄的輸出部分也叫作「未花費交易輸出」 (Unspent Transaction Output 縮寫爲:UTXO)。

UTXO 不可分割,只能以總體做爲一筆新交易的輸入。

就像你不能把1元硬幣割成兩塊,分別做爲5毛錢同樣。若是你要給商戶支付5毛,只能給他1元,而後找回你5毛。

如今,你想給 B 轉帳 22btc,你只能從這 4 個 UTXO 中挑幾個,若是恰好能夠湊齊 22btc 最好,不然只能選大於 22btc 的組合。

就像你錢包有 10元/5元/2元/1元 各一張,買地鐵票須要 3元,那麼你能夠給 ¥2+¥1 的組合,也能夠給 ¥5 找回 ¥2,甚至能夠給 ¥10 找回 ¥7,隨你意。

通過反覆斟酌,你挑選了這 2 個 UTXO:

記錄3:Y -> A : 20btc
記錄4:Z -> A : 5btc
複製代碼

這就是你準備發起的新交易的輸入部分,總共 25btc。等到交易被確認以後,它們會被從 UTXO 記錄中移除 ,也就不能再做爲另外一筆交易的輸入了。

輸出分爲兩部分,一個是給 B 轉帳 22btc,另外一個是給本身轉帳 2.5btc:

記錄5:A -> B : 22btc
記錄6:A -> A : 2.5btc
複製代碼

給本身轉帳也叫做「找零」。

但是:

25btc - 22btc = 3btc
複製代碼

怎麼只「找零」了 2.5btc?

爲何 0.5btc 神祕消失了?是由於人性的扭曲仍是道德的淪喪?

是由於隱性的「轉帳費」。

當記錄交易的節點發現一筆交易的輸入大於輸出的時候,他就知道:

轉帳費 = 輸入 - 輸出
複製代碼

那轉帳費給多少合適呢?

答案是:隨意,並且交易費和交易額無關,只和交易數據大小有關。費用越高,你的交易就越快地被記錄。

幸運的是,挑選 UTXO 組合和計算轉帳費的工做都有「比特幣錢包」幫你搞定,對你來講只需關注:給誰轉了多少、找零多少、費用多少。

小思考:不給轉帳費會怎樣?

當傳統的銀行都開始取消轉帳費的時候,比特幣還在收費,有點過度。
這也是批評人士詬病比特幣的缺陷之一。

事實上,轉帳費是爲了鼓勵節點參與到系統的維護。
傳統銀行系統也有鉅額的維護成本,只不過他們轉移了收費方式,畢竟「羊毛出在羊身上」。

即便你不交轉帳費,交易也可能被順利記錄,由於網絡中有一些「熱情的」節點。
只不過不能那麼及時能夠確認轉帳成功。
複製代碼

如今,你已經知道,一筆交易由輸入和輸出組成。輸入由多個 UTXO 組成,輸出由轉出額以及可選的找零、交易費組成。

因此,當你挑選的 UTXO 組合小於轉出額的時候,被斷定爲:餘額不足,交易無效。

節點會給你的比特幣錢包返回錯誤提示,也不會再把這個交易信息轉發給近鄰節點。

這樣就杜絕了舞弊者:給人開空頭支票。

另外一個問題:如何確認是帳戶全部者本人操做?

上文說到,你的帳戶 A 在給 B 轉帳 22btc 以前,有 4 筆 UTXO:

記錄1:  -> A : 12.5btc
記錄2:X -> A : 12.5btc
記錄3:Y -> A : 20btc
記錄4:Z -> A : 5btc
複製代碼

事實上,每筆 UTXO 都帶有轉帳方爲 A 量身打造的的「鎖定腳本」(scriptPubKey),A 想要花費這筆 UTXO 的話必須提供「解鎖腳本」(scriptSigs)。

「解鎖腳本」和「鎖定腳本」拼接在一塊兒,能夠組成一段可執行代碼。若是執行成功,那麼解鎖成功,解鎖者能夠花費這筆 UTXO,不然記帳節點在驗證交易的時候認爲他沒有權限操做。

至關於轉帳者用你提供的一把鎖,鎖住了 UTXO,只要你能提供鑰匙解鎖,就能夠花費。

那麼「腳本」長啥樣?

鎖定腳本:
DUP HASH160 PUSHDATA(<public-key-hash>) EQUALVERIFY CHECKSIG

解鎖腳本:
PUSHDATA(<signature>) PUSHDATA(<public-key>)

拼接 <解鎖腳本> <鎖定腳本> 獲得:
PUSHDATA(<signature>) PUSHDATA(<public-key>) DUP HASH160 PUSHDATA(<public-key-hash>) EQUALVERIFY CHECKSIG
複製代碼

看起來很複雜,其實就是一條條指令:

步驟一 PUSHDATA(signature):

把解鎖者提供的簽名 signature 壓入棧頂;

步驟二 PUSHDATA(public-key):

把解鎖者提供的公鑰 public-key 壓入棧頂;

此時,棧內有兩個數據:

public-key
signature

步驟三 DUP:

將棧頂數據複製一份;

public-key
public-key
signature

步驟四 HASH160:

將棧頂數據使用 HASH160 哈希算法加密;

public-key-hash
public-key
signature

步驟五 PUSHDATA(public-key-hash) :

將鎖定者提供的 public-key-hash 加入棧頂;

public-key-hash
public-key-hash
public-key
signature

步驟六 EQUALVERIFY:

判斷棧頂2個元素是否相等,相等的話就移除;

public-key
signature

步驟七 CHECKSIG:

使用棧頂的公鑰 public-key 解密簽名 signature,可以解密的話,執行成功;

成功

這些步驟只有一個目的:證實 A 是這筆 UTXO 的全部者。

「鎖定腳本」中包含的 public-key-hash 就是 A 的公鑰哈希(注意:不是公鑰),能夠經過 A 的比特幣地址解碼出來。

因此,咱們說知道對方的比特幣地址就能夠給對方轉帳,實質上是知道對方的 public-key-hash 從而能夠製造「鎖定腳本」,也就是所謂的 P2PKH(Pay-To-Public-Key-Hash)。

A 想要花費一筆 UTXO 的時候,須要提供「解鎖腳本」,包含他的公鑰(public-key)和對新建交易的簽名(signature)。

簽名是經過 A 的私鑰對交易信息加密生成的:

簽名(signature) = 私鑰::加密(交易信息)
複製代碼

前文說到,私鑰加密的信息只有對應的公鑰能解密。言下之意,若是一段密文能夠用公鑰解密出來,那麼這段密文確定是對應的私鑰全部者親手加密的,由於私鑰只存在全部者手中。

用私鑰對一份數據加密,生成密文的過程,被形象地稱爲「簽名」。就像你在一份合同上簽名後就不可抵賴,由於沒人能夠寫出你那樣的筆跡。

用私鑰對交易信息簽名完成後,就至關於宣告:

  1. 這是你本人行爲;
  2. 任何人沒法篡改交易信息,由於簽名是對原始信息的加密,若是信息有變更,那麼用你的公鑰解密出原始內容後,就能夠比對發現差別。

綜上所述,將一筆 UTXO 做爲交易的輸入部分而花費的時候,你須要提供一段「解鎖腳本」,包含有你的私鑰加密後的簽名。

當你把交易信息廣播給節點的時候,節點會進行真實性校驗:

  1. 確認存在這樣一筆 UTXO;
  2. 將你提供的「解鎖腳本」和 UTXO 攜帶的「鎖定腳本」組合成一段代碼並執行;
  3. 代碼執行過程的本質就是確認你是這筆 UTXO 的全部者,是你本人準備花費它,並且交易信息在網絡傳輸過程當中沒有被篡改過。

至此,「轉帳是本人操做」的問題已經解決。

小知識:

智能合約(smart contract)的概念也就是從上述「腳本」代碼執行過程衍生出來的。
所謂「智能」指的是:當條件知足時,代碼能夠順利執行。

比特幣系統對「腳本」的設計是開放的。
上述 P2PKH 的執行過程,只要你能提供私鑰就能夠花費 UTXO。
事實上,你能夠設計爲:3 人中有 2 我的提供私鑰,代碼就能夠順利執行。
這就至關於,你把比特幣帳戶交給 3 人共同保管,有 2 人達成協議就能夠花費。
複製代碼

達成共識

遍及全球的比特幣網絡節點各自獨立工做,隨時有節點退出或者加入,怎麼保證最終你們記錄的帳本一致,或者說達成共識呢?

先看看帳本長啥樣。

假設某節點 Node 在 10 分鐘內接收到 3 筆通過合法校驗的交易:

交易1:A -> B
交易2:C -> D
交易3:E -> F
複製代碼

節點會計算每筆交易的輸入減去輸出的差額,也就是前文所說的「隱性的轉帳費」。

假設每筆交易包含的轉帳費都是 0.1btc,那麼總共就有 0.3btc。

再加上當前時段的系統獎勵 12.5btc,那麼節點將會獲得:

12.5btc + 0.3btc = 12.8btc
複製代碼

節點會構造一筆系統給本身的轉帳,加入到交易列表:

交易0:  -> Node (12.8btc)
交易1:A -> B
交易2:C -> D
交易3:E -> F
複製代碼

這筆交易也叫做 coinbase transaction,是對節點辛苦記帳的獎勵。

接下來,節點以這些交易列表爲基礎,構造出一個區塊頭,共同組成一個完整的區塊。

其中,區塊頭主要包含如下信息:

區塊頭結構 簡介
版本號 不一樣版本的區塊適用不一樣版本的校驗規則
上一個區塊頭的哈希值 連接上一個區塊,從而在區塊之間造成「鏈條」
交易列表的 Merkle Root 由交易列表數據經過必定規則生成
時間戳 構造區塊頭的時間點
難度目標值 區塊頭的哈希值要小於難度目標值
隨機數 不斷調整以改變區塊頭內容,使得區塊頭的哈希值知足特定要求

能夠使用區塊鏈瀏覽器查詢每一個區塊的數據內容,如下是經過 btc.com 查詢到的高度爲 503688(也就是第 503688 個區塊)的區塊信息:

能夠直觀的看到,區塊分爲區塊頭和交易列表兩部分。

爲了方便瀏覽,有一些並不在區塊頭中實際存儲的信息,也被展現出來了。
好比:區塊自身的哈希值、後一個區塊哈希值等。
複製代碼

那麼區塊頭的各個字段都是如何肯定內容的呢?

版本號

比特幣協議會不斷髮展以適應新的需求,不一樣的版本有不一樣的規則,能夠經過版本字段標示這個區塊適用哪些規則。

上一個區塊頭的哈希

根據上一個區塊頭內容計算出來的哈希值。

這裏有個遞歸的問題:構造區塊頭須要上一個區塊的信息,那麼同理,上一個區塊在被構造出來的時候須要上上一個區塊的信息....

解決方案:創世區塊,也就是第 0 個區塊,不須要上一個區塊的信息。

下圖展現了創世區塊(Genesis Block)的數據結構,能夠看到它沒有上一個區塊頭的哈希值,同時也沒有交易記錄,只有一筆系統獎勵的 50btc:

有了創世區塊問題就解決了,下一個區塊能夠指向創世區塊,今後子子孫孫無窮盡也。

Merkle Root

Merkle Root 美國計算機科學家 Ralph Merkle 最先提出,並由他冠名的一種數據處理過程。

例如,對於排好序的 4 份數據 L1/L2/L3/L4,分別計算它們的哈希值,而後將哈希值兩兩合併再計算哈希值,直至最後剩下一個根節點:

上圖看起來就像一棵不斷分叉的樹,最底層的稱爲葉子(leaf)節點,最頂部的稱爲 Merkle Root。

這種數據結構具備特色:任意葉子節點的數據變化,都會沿着箭頭向上傳遞,最終致使 Merkle Root 也發生變化。

將這種處理方法應用到區塊的交易列表數據上,把每筆交易做爲葉子節點,就能夠計算出區塊頭所須要的 Merkle Root。

時間戳

區塊頭被構造出來的時間點。

例如,創世區塊是在 2009-01-04 02:15:05 被構造出來的。

難度目標值

上文說到,比特幣網絡設置了「挖礦」難度,保證無論全網算力增長仍是減小,都讓「挖礦」時間保持在 10 分鐘左右。

每通過 2016 個區塊,難度就會調整一次。若是平均時間大於 10 分鐘,那麼下降難度;若是平均時間小於 10 分鐘,那麼增大難度。

下圖是對數化處理後的難度變化曲線,能夠看到從 2010 年 2 月開始難度劇烈增長(對數化處理後才能在圖表內展現完整,因此看起來平緩):

比特幣協議要求構造出來的區塊頭的哈希值小於難度目標值,不然區塊無效:

hash(block-header) < difficulty-target
複製代碼

這個構造過程也稱爲「工做量證實」(Proof of Work),由於不花費必定時間投入算力的話,就不能構造出符合條件的區塊頭。那麼構形成功的話也就證實了投入的工做量。

在區塊頭中,有 4 個字節的長度存儲編碼後的難度目標值,以第 503829 個區塊的難度目標值爲例:

0x180091c1
複製代碼

這串 16 進製表示的數據分爲 0091c1 和 18 兩部分,通過固定公式計算後,能夠獲得難度目標值:

0x0091c1 * 2^(8*(0x18 - 3)) = 0x00000000000000000091c1000000000000000000000000000000000000000000
複製代碼

能夠看到難度目標值是一個 16 進製表示的整數。

計算區塊頭哈希值的算法把區塊頭內容也映射爲一個 16 進製表示的整數,例如第 503829 個區塊頭的哈希值:

hash(block.503829) = 0x000000000000000000304f4c17301acc6bb0990c3791db64d642ae5868158038
複製代碼

經過對比能夠發現,區塊頭哈希值小於難度目標值:

區塊哈希值:0x000000000000000000304f4c17301acc6bb0990c3791db64d642ae5868158038
難度目標值:0x00000000000000000091c1000000000000000000000000000000000000000000
複製代碼

因此這個區塊是合法的。

咱們知道哈希計算是單向的,也就是沒有辦法經過哈希值推算出原始內容。

只能經過不斷地變化原始內容,而後計算出哈希值,看看是否符合小於難度目標值的要求。

這是一個費時的工做,大約須要 10 分鐘。雖然「挖礦」設備計算速度超快,可是須要嘗試的次數實在是太多了!

例如,到底要嘗試多少次,才能得到小於下列難度目標值的哈希呢?

0x00000000000000000091c1000000000000000000000000000000000000000000
複製代碼

至關於前文說到的在 1 到 2的256次方 之間隨機抽一個數,使其小於等於這個難度目標值。

那麼平均要計算:

8.29 x 10^21 次 = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/0x00000000000000000091c1000000000000000000000000000000000000000000

若是你的計算機每秒能夠計算 10 億次的話,那麼須要:
8.29*10^21/1000000000/3600/24/365 = 26萬年

得等到天荒地老!
複製代碼

確實有難度。

因此前文說到;我的計算設備參與「挖礦」機會很渺茫。

如今你已經知道:難度目標值的存在,使得構造一個有效的區塊至關費時費力。

這也是前文所說的:人爲製造「挖礦」成本。

那麼如何確認構造當前區塊須要的難度目標值呢?

答案是:每構造完 2016 個區塊,有一次調整的機會,根據過去的 2016 塊消耗的平均時間,用固定的規則計算出新的難度目標值。

仍是有遞歸的問題,因此創世區塊的難度目標值只能人爲設定。事實上,初始難度目標值由中本聰寫在初版比特幣代碼中:

0x00000000ffff0000000000000000000000000000000000000000000000000000
複製代碼

平均須要計算:

4295032833 = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/0x00000000ffff0000000000000000000000000000000000000000000000000000

約 43 億次,至關輕鬆
複製代碼

以這個爲難度係數 1 的話,截至目前,難度係數已經達到:

1.93x10^12 (1.93T) = 0x00000000ffff0000000000000000000000000000000000000000000000000000 / 0x00000000000000000091c1000000000000000000000000000000000000000000
複製代碼

難度係數(difficulty)是相對值,表徵當前相對於第一次,構造一個有效區塊有多難。

難度目標值(target)是實現這個難度的具體閾值,要求構造的區塊頭的哈希小於這個數。

下圖展現了最近幾回的難度變化:

可見,難度有漲有跌,漲多跌少,這也代表加入「挖礦」大軍的算力整體上在不斷增長。

根據過去 2016 個區塊的平均生成時間和難度目標值,就能夠計算出接下來 2016 個區塊的難度目標值:

新難度目標值 = 過去難度目標值 * (過去平均分鐘時間 / 10)

例如:

當前難度目標值爲 0x180091c1,解碼後:
0x00000000000000000091c1000000000000000000000000000000000000000000

過去 2016 塊平均出塊時間爲 8.7 分鐘

那麼新的難度目標值:

0x00000000000000000091c1000000000000000000000000000000000000000000 * (8.7 / 10)
= 0x0000000000000000007e578c0000000000000000000000000000000000000000

轉碼後記爲:0x177e578c
複製代碼

隨機數

前文說到,爲了讓區塊頭的哈希值知足條件,必須不斷地變化區塊頭內容,可是區塊頭的其餘部分都是固定的,因此只能調整區塊頭的隨機數字段。

事實上,這個字段有 4 字節長度,能夠表示:

0 到 4,294,967,295
複製代碼

因此,隨機數字段(Nonce:Number use Once) 從 0 開始遍歷,能夠產生約 43 億個不一樣的值,也就能夠生成 43 億個不一樣的哈希,只要有一個哈希知足條件了,區塊頭構造工做就實現了。

不過,隨着全網算力的不斷攀升,43 億次計算根本不夠難度要求。

前文說到,普通交易須要在輸入部分提供「解鎖腳本」,用於花費 UTXO ,可是「礦工」本身構造的系統獎勵+轉帳費的那筆交易(coinbase transaction)並不須要指定 UTXO ,因此不用寫入「解鎖腳本」。這裏空出來的地方能夠寫入多達 100 字節的任何數據。

交易列表的每次變更會致使區塊頭中的 Merkle Root 也發生變化,從而保證足夠屢次的哈希嘗試。

以創世區塊爲例,雖然當時隨機數字段足夠知足哈希嘗試次數,可是中本聰依然在 coinbase transaction 寫入了這句話:

The Times 03/Jan/2009 Chancellor on brink of second bailout for banks

(泰晤士報 2009年1月3號 財政大臣準備再次對銀行施以援手)

這句話既證實了創世區塊誕生於 2009 年 1 月 3 號 以後,又表達了對銀行(傳統貨幣體系)的諷刺和創造比特幣系統的初衷,還示範了 coinibase transaction 字段的擴展性用法。

如今你已經知道構造區塊頭須要的全部數據,以及如何獲取到這些數據,回顧一下:

一、節點收集 10 分鐘內全網有效的交易信息;
二、插入一筆包含交易費和系統獎勵的交易信息;
三、將交易列表排好順序,計算出 Merkle Root 寫入區塊頭;
四、找到上一個區塊,並計算出它的區塊頭哈希值寫入區塊頭;
五、獲取當前難度目標值;
六、不斷調整隨機數和 coinbase transaction 擴展字段,使得區塊頭的哈希值知足要求。
複製代碼

這就是一次「挖礦」的所有過程。

因此,「挖礦」的本質就是記錄交易並構造出一個知足條件的區塊。

從創世區塊開始,每 10 分鐘左右全網發生的交易被打包進一個區塊,每一個區塊都包含上一個區塊頭的哈希值,從而在塊與塊之間造成「鏈條」,這就是所謂的「區塊鏈」:

區塊鏈即是上文所說的「分佈式帳本」的真實面貌。

如今的問題是:如何讓全部節點記錄的區塊鏈保持一致?

每一個節點是獨立開展工做的,只打包本身接收到的交易信息,同時會插入給本身的獎勵交易,那最後豈不是每人一條本身的區塊鏈?

畢竟本身構造的區塊才包含給本身的獎勵,誰也不肯意放棄。

爲了讓這羣「自私」的節點保持一致,比特幣協議規定:

系統中只有最長的那條區塊鏈是有效的

這會致使兩個結果:

一、節點成功構造出區塊後,除了加到本身的鏈尾,還會第一時間廣播給全網節點;
二、其餘節點收到一個有效區塊後,會第一時間加入到本身的區塊鏈上,同時也就宣佈本身放棄這一輪的「挖礦」了。
複製代碼

第 1 個結果是顯而易見的,把好不容易構造出來的區塊藏着掖着,對本身沒有任何好處。

倒不如發給更多人,反正它們沒法篡改,讓它們加到鏈尾,那麼你的區塊所在的鏈條長度又 +1 了,這樣就鞏固了「系統中最長的區塊鏈」的地位,你才能夠認爲系統獎勵安心落袋了。

小思考:爲何其餘節點沒法篡改你的區塊?

篡改的主要目標是交易記錄,好比把系統獎勵改到本身名下。
這就會致使 Merkle Root 發生變化,那麼區塊頭的哈希值也跟着變化。
那就再也不是一個有效的區塊了,畢竟區塊頭的哈希值必須小於難度目標值。
複製代碼

第 2 個結果充分運用了博弈的原理,假設你收到一個別人發過來的有效區塊,你最佳的選擇就是立刻把它加到本身的區塊鏈上,由於你不知道其餘節點會不會加到它們的鏈尾,若是它們加了而你沒加,那你的鏈條就比人短,致使你記錄的整個鏈條做廢!

那麼擺在你面前的只有兩個選項:放棄這一輪「挖礦」,開始下一個區塊的構造;或者等着本身的鏈條做廢。「利慾薰心」的你應該不難作出選擇,畢竟沒人跟錢過不去。

至此,「自私」的節點在有效規則之下作到了大規模協同,讓系統利益最大化:只保持同一條最長的區塊鏈。這也叫作「達成共識」。

但世界上沒有完美的規則。

假設 A/B 兩個節點在同一時刻成功構造區塊並廣播出去,全網節點中有一半先收到 A 的區塊後收到 B 的區塊,另外一半先收到 B 的區塊後收到 A 的區塊。

節點會把前後收到的兩個區塊都接入鏈尾,以先收到爲主鏈,後收到的爲候選鏈,並開始以主鏈爲基礎繼續下一輪「挖礦」。

節點們都按照規則辦事,但此時出現了兩條「最長的區塊鏈」:

這就是傳說中的「區塊鏈分叉」問題。

怎麼辦?徹底蒙了...

不要擔憂,若是「挖礦」期間又收到下一個有效區塊,其指向的是候選鏈,那麼此時候選鏈更長,節點會把它切換爲主鏈。

因此,這種「分叉」危機每每只存在一個「挖礦」週期,最後全網又只有一條最長的區塊鏈。

你也多是壞人

前文介紹了比特幣系統如何確保一筆交易是本人簽發的,主要爲了防止壞人盜取你的資金。

但若是你就是壞人呢?

考慮到只有參與「挖礦」並第一個完成「工做量證實」,才能得到系統發行的比特幣。只有存在別人給你轉帳而你未花費的 UTXO,你才能發起一筆有效交易。這就確保比特幣系統基本上沒有做弊的空間了。

可是百密一疏。

假設你的比特幣地址是 A,給某商戶 B 支付了 100btc:

A -> B : 100btc
複製代碼

這筆交易被廣播到比特幣網絡,大約 10 分鐘後被打包進一個區塊,加入到區塊鏈。

這時 B 認爲你支付成功了。

可是,此時你使用同一份 UTXO 又生成一筆轉給 C 的交易:

A -> C : 100btc
複製代碼

並把這筆交易只發給本身控制的具備強大算力的「礦池」,假設你的「礦池」的算力已經佔到全網的 51%,那麼你能夠很快的生成包含轉給 C 的交易的區塊,並廣播給其餘節點。

其餘節點會接受這個區塊。由於後收到,因此把它做爲候選鏈。

因爲你的「礦池」算力如此之大,以致於下一個區塊又是首先被你構形成功。因而乎全網節點都把候選鏈切換爲主鏈。

就這樣,包含給 B 支付的那筆交易的區塊就被排除在「最長區塊鏈」以外了,至關於你沒給 B 付錢。

這就是所謂「雙重支付」。

幸運的是,目前全網算力如此之高,以致於你得付出巨大的成本才能掌握超過 51% 的算力。權衡利弊,你發現得不償失就放棄了這個想法。

但這確實是比特幣系統存在的缺陷之一。

對於 B 來講,能夠作的就是等待。不要看到交易被打包進區塊加入區塊鏈後,就認爲支付已經成功了。

等到更多後續的區塊被加入區塊鏈後,想要篡改以前的某筆交易,就必須從新生成後續的全部區塊,可是每一個區塊都要耗時大約 10 分鐘,攻擊者在算力有限的狀況下不管如何也追不上主鏈的區塊構造速度。

如今你就能夠理解區塊鏈的設計初衷了:

一、塊與塊之間造成鏈式結構,若是某個區塊被改動,那麼後續的區塊就再也不指向它,要想成爲「最長的區塊鏈」只能從新構造後續的區塊;

二、爲構造區塊設置難度,使得這是一件費時費力的工做,讓攻擊者有心無力。

因此,前文說到人爲地給比特幣「挖礦」制形成本,並非設計者沒事找事,而是爲了讓比特幣系統無懈可擊。

事實上,比特幣「挖礦」難度徹底能夠改成 5 分鐘、20分鐘或任意分鐘,可是綜合考慮到:既不能讓人等過久才能夠確認交易,又不能讓攻擊者有隙可乘,便折中肯定爲 10 分鐘。

真是煞費苦心。

偉大的試驗

如今你已經徹底理解了比特幣系統運行的原理,全部這些複雜的設計,都只有一個目的:知足成爲通常等價物的條件。

目前看來,比特幣基本上作到了:

一、總量有限,減量供給;
二、沒法僞造;
三、交易方便安全;
複製代碼

這些特色給人以信心,令人相信比特幣能夠做爲通常等價物,因而慢慢地:

四、被普遍承認和接受
複製代碼

另外,比特幣還具備鮮明的特色:

五、去中心化;
六、全球發行和流通;
複製代碼

這既包括了發行的去中心化,也包括分佈式帳本。

比特幣的優勢很明顯,就和它的缺點同樣:

一、比特幣的「挖礦」機制,耗費了全球大量的能源;
二、盲目的炒做令比特幣價格劇烈波動,而貨幣的首要目標就是幣值穩定;
三、交易的匿名性存在缺陷,好比此前勒索病毒要求使用比特幣做爲贖金;
四、比特幣總量有限,因此是一種通縮型貨幣,價值只增不減,可能致使人人囤積,從而市場上缺乏流動性,最終經濟萎縮;
五、轉帳耗時,還須要手續費;
六、交易併發容量有限。
複製代碼

貨幣問題本質上是經濟問題,但也是政治問題。

政府發行貨幣,自己就是對其合法性的一種宣示。對貨幣發行的控制權本質上是對社會財富分配的控制權。

因此,對比特幣盲目的樂觀或消極的詆譭都是錯誤的。

比特幣是一場偉大的社會試驗!

從 2009 年正式問世以來,比特幣在無數人的共同努力下不斷髮展,啓發了人們關於貨幣體系的思考,這自己就是巨大的成就。

但更偉大的是比特幣帶來了區塊鏈技術。區塊鏈從比特幣發展而來,但卻遠遠超出了比特幣的範疇。

區塊鏈讓人們看到了如何在沒有「中心」的前提下構建彼此之間的信任。

「中心」的造成是由於信任的須要,由於只有創建了信任才能提升活動效率。但一旦成爲「中心」,便帶來壟斷和不透明,這自己又侵蝕了效率。

能不能創建不須要「中心」的信任網絡?

敬請期待下一篇文章:《區塊鏈:通往將來世界的橋樑》

這只是開始

本文主要介紹了比特幣的運行原理,相信讀者已經對比特幣相關的概念有了基本的認知。

你腦海中還有一大堆疑問,想了解更多關於比特幣/區塊鏈的信息,能夠聯繫做者微信/微博 @Ceelog,或者使用微信掃一掃加入知識星球交流羣。

上文說到,比特幣是一場偉大的試驗。這場試驗只是剛剛開始。

事實上,受到比特幣啓發,人們又發行了上千種數字貨幣:

這些數字貨幣甚至比比特幣更完善,價格也在不斷攀升,受到愈來愈多人的承認,雖然有很大一部分人是無知而無畏的投機。

隨着區塊鏈底層技術的發展完善,已經到了人人均可以發行數字貨幣的時代。

偉大而瘋狂的時代。

你其實已經參與到這場試驗中了,從閱讀本文,理解了比特幣運行原理開始。

接下來,祝你好運!

(完)

做者 @Ceelog 版權聲明:

歡迎轉發原文連接,但未經受權禁止複製或改動後發佈到其餘平臺。
複製代碼
相關文章
相關標籤/搜索