什麼是比特幣?
比特幣 (bitcoin) 是一種數字貨幣。
小知識:什麼是位元(bit) ?
bit 是計算機表示二進位制的單位。
例如:
1bit 可以表示 0 或者 1 兩種狀態;
2bit 可以表示 00/01/10/11 四種狀態。
所以,習慣上人們用位元來形容數字化相關的事物,例如:比特幣
複製程式碼
既然比特幣是一種數字貨幣,那麼理解比特幣之前,先要了解:什麼是貨幣
?
經濟學上認為,貨幣本質上是一般等價物
。
什麼是一般等價物?
考慮原始時代的經濟:
A 圈養了一頭牛,B 紡織了一塊布,為了滿足彼此的需求,他們可以約定:
一頭牛 換 一匹布
複製程式碼
通過這種原始的物物交換
實現了簡單的價值流動
。
但是,隨著社會生產力的提高,這種模式已經不能適應經濟發展的要求。
小思考:為什麼物物交換行不通?
1、A 在安陽,B 在梅州,空間上沒法物物交換;
2、A 今天生產了商品甲,下個月才需要商品乙,時間上沒法物物交換;
3、參與市場的各方提供了成千上萬的商品,效率上不接受物物交換。
複製程式碼
這個時候,需要一種各方都認可的一般等價物
來衡量、轉換和傳遞商品的價值,從而實現商品的高效自由流動。
價值流動:商品 -> 一般等價物 -> 商品
複製程式碼
早期,人們使用貝殼來充當一般等價物
,後來又使用金、銀等貴金屬,再發展出紙幣,甚至到現在的移動支付。
小思考:
財、貨、貴、販、賺、賬、賃,這些字有什麼共同點?
複製程式碼
以 ¥人民幣 為例,它是以國家信用為背書,充當價值媒介的一般等價物。具有價值尺度、流通手段、貯藏手段、支付手段等職能。
所以,貨幣本質上是一般等價物。
只要你能創造出一種東西:它滿足充當一般等價物的條件,那麼你就是創造了一種貨幣!
小思考:充當一般等價物需要哪些條件?
1、全體參與方認可;
2、不可偽造;
3、方便攜帶、分隔、可以長期儲存;
4、數量可控;
......
複製程式碼
比特幣就是這樣一種東西。
這是一個革命性的創舉,它打破了古今中外的慣例:貨幣都由政府的中央銀行負責發行,而且只能在特定國家或地區流通。
要知道,往往只有改朝換代的時候有機會發行全新的貨幣,可謂百年難遇。現在比特幣做到了,而且是全球性地發行和流通,前無古人!
當前的貨幣體系
政府通過國家信用和強制手段保證央行發行的貨幣被廣泛認可和接受。
例如,通過頒佈法律和規章制度:《中華人民共和國中國人民銀行法》、《中華人民共和國人民幣管理條例》等。
對於防止偽造,一方面通過技術手段提高紙幣的偽造難度;另一方面通過法律手段打擊製造、流通假幣。
截至目前,通過央行發行貨幣是全世界通用的做法,執行良好,但缺點明顯。
顯而易見的問題,包括但不限於:
-
由於發行權掌握在中心化的央行手中,理論上存在貨幣超發的可能,從而導致通貨膨脹,例如:委內瑞拉、辛巴威等國家由於通貨膨脹,貨幣體系近乎崩潰;
-
即使高壓打擊,依然無法避免假幣出現,最薄弱的環節不在於印製技術,而在於流通中需要人去辨別,而人往往是不可靠的。
比特幣系統是如何運轉的?
2008 年,一個網名為中本聰 (Satoshi Nakamoto) 的人,發表了《比特幣:一種點對點式的電子現金系統》的論文,由此掀開了比特幣風靡全球的大幕。
小連結:
論文 PDF 版原文:https://bitcoin.org/bitcoin.pdf
複製程式碼
由於思維定勢,剛接觸比特幣概念的人,往往有一些認知的誤區或盲區:
1、比特幣是不是和硬幣或紙幣一樣有實體形式?
2、比特幣是數字貨幣,是不是和銀行賬戶一樣,在某個伺服器的資料庫裡記錄著我的賬戶下有多少餘額?
3、兩個人之間怎麼轉賬?是不是和傳統的銀行一樣:A 的賬戶 -100,B 的賬戶 +100?
4、比特幣的數量有多少?最小分割單位是多少?
5、沒有中央銀行,那麼比特幣是誰發行的?
6、軟體、音樂、文件等數字資產可以隨便複製,為什麼比特幣不能拷貝?
......
一大堆問題!是什麼?!為什麼?!
當你開始思考這些問題的時候,那麼恭喜你,你已經在思考如何設計一種貨幣系統了。
真是激動人心,從來沒有想過有一天自己也可以設計一套貨幣系統,而且可以在真實世界執行起來。
更令人興奮的是,你有機會參與價值的重新分配,就像淘金。
接下來,開始揭祕比特幣是如何執行的。
從記賬開始
比特幣系統不需要一個具體的地方記錄某個賬戶下有多少餘額,只要知道所有賬戶之間的轉賬記錄,就可以推算出某個賬戶下有多少餘額。
假設系統總共有 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)計算具有如下特點:
1、將任意長度的資料對映為固定長度的大整數;
2、資料有任意變化後,計算出來的結果完全不同;
3、無法通過雜湊結果逆推出原始資料內容。
雜湊演算法有很多種實現,比如常見的 SHA-256 演算法:
sha256('123') = a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
sha256('234') = 114bd151f8fb0c58642d2170da4ae7d7c57977260ac2cc8905306cab6b2acabc
...
可見這裡:
雜湊值是用 16 進製表示的整數;
原始內容輕微變化,但雜湊結果差之千里,那麼每次改動原始內容,得到的雜湊值相當於從 1 到 2的256次方 中隨機抽一個數。
複製程式碼
所謂“不可逆”就是:別人無法通過賬號地址推算出公鑰。所以,你可以放心的把地址告訴別人,接受對方的轉賬。下圖展示了通過公鑰計算出比特幣地址的過程:
你很興奮,因為有了第一個屬於自己的比特幣賬戶,但是也很沮喪,因為裡面空空如也。
那麼怎樣讓自己的錢包鼓起來?畢竟一個比特幣價值 $17082!
小知識:比特幣冷笑話
為什麼前文提到比特幣價值 1btc = $14907,這裡又變成了 $17082?
因為比特幣交易價格劇烈波動,在作者寫到這裡的時候,已經過了 10 分鐘。^_^
複製程式碼
已知的獲取比特幣的方式和存在的障礙:
1、比特幣“挖礦”;(競爭很激烈,機會很渺茫)
2、接受比特幣支付,比如你的工資/咖啡店;(你的老闆/顧客也沒有比特幣)
3、讓你的好朋友給你轉一點;(你可能沒有好到這種程度的朋友 ^_^)
4、花錢到比特幣交易所購買。(國內已經禁止比特幣交易,另外價格也已經突破 $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個比特幣,怎麼實現呢?
想一下,你以前用銀行卡的時候怎麼轉賬:
- 賬戶餘額大於等於轉賬金額;
- 知道對方的賬號;
- 輸入密碼,確認是本人操作。
剩下的事情,銀行會幫你搞定:扣掉你賬戶的金額,加到對方賬戶下,給你出賬單等等,還可能會收你手續費。
比特幣轉賬步驟類似,但是沒有銀行這個角色,就像你開比特幣賬戶的時候不用帶著材料跑去銀行一樣。
那麼誰來扣錢、誰來記錄賬單呢?
答案是:分散式節點。
小知識:什麼叫分散式?
與分散式對應的是“中心化”,就像所有人的交易都由銀行這個中心記錄管理。
如果銀行伺服器崩潰了,那麼所有人的交易都無法再進行。
相反,分散式就是所有交易由比特幣網路中的節點共同記錄。
每個節點獨立維護一份完整的交易賬本,這個賬本也叫做“分散式賬本”。
任何一個節點退出比特幣網路,不影響系統執行。
現在,比特幣系統由分佈在全球各地的節點組成。
每個節點都與附近的節點連線,組成一張覆蓋全球的 P2P 網路。
這也是比特幣可以全球流通的物質基礎。
複製程式碼
所以,你只需將交易資訊告訴比特幣網路中任意節點就行。
它不僅會幫你記錄到它的賬本中,還會幫你轉發給與之連線的近鄰節點,通過這樣病毒式擴散後,數分鐘內交易資訊將抵達全球每一個比特幣節點。蔚為壯觀!
那麼節點在哪?看不見摸不著,我去哪裡找它?
幸運的是,不用你費心去找節點,你的“比特幣錢包”會幫你做這件事。
事實上,比特幣錢包要把交易資訊告訴節點,那麼它就至少得連線比特幣網路中的一個節點,當與節點連線後,比特幣錢包本身也就成為了網路中的一個節點,只不過叫做“輕量級節點”,因為它既沒有記錄完整的賬本,也沒有去“挖礦”。
小知識:比特幣錢包都有哪些功能?
1、管理比特幣賬戶(金鑰);
2、傳送交易資訊;
3、查詢餘額。
複製程式碼
好奇的你還是想多問一句:比特幣錢包是怎麼發現節點的?
很簡單,在比特幣網路發展的過程中,會有一些長期穩定的節點,稱為“種子節點”。
開發比特幣錢包軟體的時候,會把這些“種子節點”的域名寫進程式碼,通過 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
複製程式碼
那你的錢不就被他轉走了嗎?
並不會。
比特幣節點接收到一條交易資訊後,會獨立進行真實性校驗,如果有誤就不會入賬:
- 賬戶餘額是否足夠;
- 是否本人發起交易。
對於餘額查詢,我們前文說過,比特幣系統的分散式賬本並不直接記錄某個賬戶下有多少餘額,而是隻記錄轉賬記錄。“挖礦”獎勵所得也相當於一次系統給“礦工”的轉賬。
假設你賬戶 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) = 私鑰::加密(交易資訊)
複製程式碼
前文說到,私鑰加密的資訊只有對應的公鑰能解密。言下之意,如果一段密文可以用公鑰解密出來,那麼這段密文肯定是對應的私鑰所有者親手加密的,因為私鑰只存在所有者手中。
用私鑰對一份資料加密,生成密文的過程,被形象地稱為“簽名”。就像你在一份合同上簽名後就不可抵賴,因為沒人可以寫出你那樣的筆跡。
用私鑰對交易資訊簽名完成後,就相當於宣告:
- 這是你本人行為;
- 任何人無法篡改交易資訊,因為簽名是對原始資訊的加密,如果資訊有變動,那麼用你的公鑰解密出原始內容後,就可以比對發現差異。
綜上所述,將一筆 UTXO 作為交易的輸入部分而花費的時候,你需要提供一段“解鎖指令碼”,包含有你的私鑰加密後的簽名。
當你把交易資訊廣播給節點的時候,節點會進行真實性校驗:
- 確認存在這樣一筆 UTXO;
- 將你提供的“解鎖指令碼”和 UTXO 攜帶的“鎖定指令碼”組合成一段程式碼並執行;
- 程式碼執行過程的本質就是確認你是這筆 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 欄位的擴充套件性用法。
現在你已經知道構造區塊頭需要的所有資料,以及如何獲取到這些資料,回顧一下:
1、節點收集 10 分鐘內全網有效的交易資訊;
2、插入一筆包含交易費和系統獎勵的交易資訊;
3、將交易列表排好順序,計算出 Merkle Root 寫入區塊頭;
4、找到上一個區塊,並計算出它的區塊頭雜湊值寫入區塊頭;
5、獲取當前難度目標值;
6、不斷調整隨機數和 coinbase transaction 擴充套件欄位,使得區塊頭的雜湊值滿足要求。
複製程式碼
這就是一次“挖礦”的全部過程。
所以,“挖礦”的本質就是記錄交易並構造出一個滿足條件的區塊。
從創世區塊開始,每 10 分鐘左右全網發生的交易被打包進一個區塊,每個區塊都包含上一個區塊頭的雜湊值,從而在塊與塊之間形成“鏈條”,這就是所謂的“區塊鏈”:
區塊鏈便是上文所說的“分散式賬本”的真實面貌。
現在的問題是:如何讓所有節點記錄的區塊鏈保持一致?
每個節點是獨立開展工作的,只打包自己接收到的交易資訊,同時會插入給自己的獎勵交易,那最後豈不是每人一條自己的區塊鏈?
畢竟自己構造的區塊才包含給自己的獎勵,誰也不願意放棄。
為了讓這群“自私”的節點保持一致,比特幣協議規定:
系統中只有最長的那條區塊鏈是有效的
這會導致兩個結果:
1、節點成功構造出區塊後,除了加到自己的鏈尾,還會第一時間廣播給全網節點;
2、其他節點收到一個有效區塊後,會第一時間加入到自己的區塊鏈上,同時也就宣佈自己放棄這一輪的“挖礦”了。
複製程式碼
第 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 分鐘,攻擊者在算力有限的情況下無論如何也追不上主鏈的區塊構造速度。
現在你就可以理解區塊鏈的設計初衷了:
1、塊與塊之間形成鏈式結構,如果某個區塊被改動,那麼後續的區塊就不再指向它,要想成為“最長的區塊鏈”只能重新構造後續的區塊;
2、為構造區塊設定難度,使得這是一件費時費力的工作,讓攻擊者有心無力。
所以,前文說到人為地給比特幣“挖礦”製造成本,並不是設計者沒事找事,而是為了讓比特幣系統無懈可擊。
事實上,比特幣“挖礦”難度完全可以改為 5 分鐘、20分鐘或任意分鐘,但是綜合考慮到:既不能讓人等太久才可以確認交易,又不能讓攻擊者有機可乘,便折中確定為 10 分鐘。
真是煞費苦心。
偉大的試驗
現在你已經完全理解了比特幣系統執行的原理,所有這些複雜的設計,都只有一個目的:滿足成為一般等價物的條件。
目前看來,比特幣基本上做到了:
1、總量有限,減量供給;
2、無法偽造;
3、交易方便安全;
複製程式碼
這些特點給人以信心,使人相信比特幣可以作為一般等價物,於是慢慢地:
4、被廣泛認可和接受
複製程式碼
另外,比特幣還具有鮮明的特點:
5、去中心化;
6、全球發行和流通;
複製程式碼
這既包括了發行的去中心化,也包括分散式賬本。
比特幣的優點很明顯,就和它的缺點一樣:
1、比特幣的“挖礦”機制,耗費了全球大量的能源;
2、盲目的炒作令比特幣價格劇烈波動,而貨幣的首要目標就是幣值穩定;
3、交易的匿名性存在缺陷,比如此前勒索病毒要求使用比特幣作為贖金;
4、比特幣總量有限,所以是一種通縮型貨幣,價值只增不減,可能導致人人囤積,從而市場上缺少流動性,最終經濟萎縮;
5、轉賬耗時,還需要手續費;
6、交易併發容量有限。
複製程式碼
貨幣問題本質上是經濟問題,但也是政治問題。
政府發行貨幣,本身就是對其合法性的一種宣示。對貨幣發行的控制權本質上是對社會財富分配的控制權。
所以,對比特幣盲目的樂觀或消極的詆譭都是錯誤的。
比特幣是一場偉大的社會試驗!
從 2009 年正式問世以來,比特幣在無數人的共同努力下不斷髮展,啟發了人們關於貨幣體系的思考,這本身就是巨大的成就。
但更偉大的是比特幣帶來了區塊鏈技術。區塊鏈從比特幣發展而來,但卻遠遠超出了比特幣的範疇。
區塊鏈讓人們看到了如何在沒有“中心”的前提下構建彼此之間的信任。
“中心”的形成是因為信任的需要,因為只有建立了信任才能提高活動效率。但一旦成為“中心”,便帶來壟斷和不透明,這本身又侵蝕了效率。
能不能建立不需要“中心”的信任網路?
敬請期待下一篇文章:《區塊鏈:通往未來世界的橋樑》
這只是開始
本文主要介紹了比特幣的執行原理,相信讀者已經對比特幣相關的概念有了基本的認知。
你腦海中還有一大堆疑問,想了解更多關於比特幣/區塊鏈的資訊,可以聯絡作者微信/微博 @Ceelog,或者使用微信掃一掃加入知識星球交流群。
上文說到,比特幣是一場偉大的試驗。這場試驗只是剛剛開始。
事實上,受到比特幣啟發,人們又發行了上千種數字貨幣:
這些數字貨幣甚至比比特幣更完善,價格也在不斷攀升,受到越來越多人的認可,雖然有很大一部分人是無知而無畏的投機。
隨著區塊鏈底層技術的發展完善,已經到了人人都可以發行數字貨幣的時代。
偉大而瘋狂的時代。
你其實已經參與到這場試驗中了,從閱讀本文,理解了比特幣執行原理開始。
接下來,祝你好運!
(完)
作者 @Ceelog 版權宣告:
歡迎轉發原文連結,但未經授權禁止複製或改動後釋出到其他平臺。
複製程式碼