小白科普:比特幣基本運行原理
「
古斯幣行
最貼心的玩幣資訊
」
本公眾號
本公眾號微信群已建
近期入群會有福利哦
請加古斯個人微信號拉你入群
請掃描上方二維碼
備註:入群
提示
文本純科普,旨在向小白解釋清楚比特幣系統運行「基本原理」,尋找幣圈快速致富秘籍的朋友可以止步了。
(配圖較多,請在WIFI下閱讀,土豪隨意)
前言
1
自2009年比特幣橫空出世就飽受爭議,有人認為比特幣所代表的區塊鏈技術可以顛覆現有互聯網世界,對其報以的宏達期望。也有人認為比特幣就是傳銷,是泡沫,是擊鼓傳花的龐氏騙局。
知我者,其惟春秋乎,罪我者,其惟春秋乎,比特幣在爭議聲中突破過1.9萬美元的高位,截止現在價格也高達1.2萬美元。無論比特幣功過是非,對我等普羅大眾而言,其中無疑蘊含著驚天動地的財富效應,許多人渴望著在這幣水三千中取得屬於自己的那一瓢。
但因為比特幣誕生於極客世界,充斥著一個又一個演算法術語,讓許多人如墜迷宮毫無頭緒,只能盲目的跟隨各「山頭大佬」指揮左衝右突,才發現自己已經淪為被收割得光禿禿的韭菜。
幣行君在研讀了大量比特幣的資料後,試圖寫出一篇能夠博採眾長,難易適中的比特幣科普教程,以便小白們理解和認知比特幣系統的「基本原理」。
鑒於比特幣系統本身非常精密複雜,為了便於小白級讀者能夠理解,有些概念難免反覆提及和解釋,所以本文篇幅較長,感興趣的朋友可以收藏後慢慢閱讀。
導讀
2
社會專業化大分工是現代經濟基本特徵,經濟越發達,分工越精細,作為普羅大眾的我們也處在各個細分的專業當中,在我們所熟悉的行業里也充斥著各種專業術語,這些術語同樣也不是三言兩語便可為外人道的。
當一個新事物剛出現還未普及之前,因為不屬於我們的專業分工領域,我們會天然的覺得難以理解和接受。
當新事物普及和融入我們生活後,我們又會因為習以為常而不足為奇,對新事物背後的原理毫不在意,因為那根本不重要。
對於任何新事物,即使不明白其背後原理,完全不妨礙我的使用以及享受新事物帶來的好處和便利。
以上的啰嗦,是為了告訴大家一個「科技黑箱」的理論,「科技黑箱」中的結構和原理我們不需要了解,我們只需知道把「物體A」放入「科技黑箱」中,我們能夠從黑箱中得「物體B」,這就足夠了。
所以,當我們在了解比特幣及其背後的數字貨幣世界時,不要被專業辭彙迷惑而試圖完全了解其背後的原理,那樣不符合社會專業化分工的原則。我們只需要了解到每個專業辭彙充當的「科技黑箱」的作用即可。
我們只需知其然,不需要知其所以然!
為何創造比特幣
3
大家都知道比特幣系統是一套數字貨幣系統,其運行原理我們先放一邊。我們首先要弄清楚的是,為什麼有人要在現有的成熟貨幣系統之外,另起爐灶創造一套比特幣貨幣系統(數字貨幣系統)?
這個問題包含兩層含義:
1、現有貨幣系統有什麼缺陷;
2、比特幣系統(數字貨幣系統)有什麼優勢。
當然QQ幣、遊戲幣之類不在本文討論範圍內。
現有貨幣系統的缺陷
為什麼要創造比特幣系統(數字貨幣系統),肯定是因為我們現有的貨幣系統不完善,還有很多問題。
其他問題本文不展開討論,最主要的問題就一點:現有貨幣系統是一個中心化的網路系統。
什麼是中心化網路系統?
無論現實生活還是網路世界中,我們接觸到基本都是中心化的網路系統。
一個國家以有一個中央政府為中心而存在,如果出現兩個中央政府就會發生內戰;
一家公司以一個總經理為中心而經營,如果出現兩個總經理,就會指令混亂,員工無所適從,經營管理不善最後破產。
在中心化網路中,所有節點都圍繞一個中心節點在運作。中心化網路結構如下圖:
回到貨幣系統來說,拋開只會把「錢」壓床底的爺爺輩們不談,我們絕大多數人的「錢」(貨幣)都是存儲在銀行的。
誠然,銀行不止一家,但每一家銀行都是一個獨立的中心化網路系統,所以才會出現「銀聯」這樣的機構來協調處理各銀行間(中心化網路系之間)的工作。
當我們選擇某一家銀行存入一筆錢時,我們就加入了一個以這家銀行為中心一個貨幣支付網路。
在中心化的銀行系統中,小明向小紅轉賬5塊錢的流程大概是這樣:
由上可知,中心化的網路系統有兩個特徵:
特徵一:中心化網路系統中所有的數據都存儲在中心,資金餘額,轉賬記錄等這些數據無論紙質還是電子數據都由銀行銀行這個中心在保管。
特徵二:中心化網路系統中所有人的信息交流,都必須依靠網路的中心來完成。小明向小紅轉賬,必須依靠銀行完成交易,拋開銀行交易就無法進行。
中心化網路的問題
到這裡有人就會問了,這樣的中心化系統有什麼問題嗎?當然有問題,最主要的問題有兩個:1、中心安全問題;2、中心作惡問題。
(1)中心安全問題
大家一定都聽過一個軍事術語叫「斬首行動」,他是指通過精準打擊,首先消滅敵方的首腦和首腦機關,以此徹底摧毀敵方整個指揮系統從而取得勝利的軍事行動。
關於斬首行動,有一個非常有名的變種案例就是曹操的「挾天子以令諸侯」,當時 「東漢王朝」這套系統毋庸置疑的中心就是「天子(皇帝)」,曹操將這個中心控制在自己手中,這為他爭霸天下帶來了巨大的政治和資源優勢。
具體到銀行這個中心化網路中,一旦某家銀行的資料庫遭到破壞(操作失誤,偽造交易,黑客攻擊,自然災害,戰爭破壞等),那麼這家銀行所有儲戶的財富就會受到了幾乎無法挽回的損失。
為了避免上述情況的發生,銀行系統都會投入大量人力、物力,財力來建設自己的安全防護系統,並且對數據進行多重安全備份。雖然發生概率很低,毀滅級的中心網路被破壞的案例也未見報道,但類似的個案一直在不斷上演。
上圖兩則新聞從側面可以說明,在中心化網路的,當中心存儲的數據出現問題時候,會給網路的其他用戶帶來無法預估的損失。
再給大家分享一個近期的案例,2017年10月08日鹿晗和關曉彤分別發了一條微博公開戀情。
本以為這只是一個迷妹和迷弟哭暈在廁所的故事,沒想到同時哭暈的還有新浪微博的程序員,因為相關微博轉發量太大,直接導致了新浪伺服器癱瘓。
心疼程序員3秒鐘
從上可知,中心化網路系統在理論上存在巨大的安全隱患,當中心的安全受到威脅後,整個網路就無法運行。
(2)中心作惡問題
在一個中心化的網路系統當中,整個系統的運行規則由中心制定,中心擁有絕對的權威和控制力。當中心為了自己的利益而損害網路中其他用戶利益時,其他用戶要麼放棄現有系統中的一切利益徹底離開,要麼只能被迫接受。
QQ和360大戰時,騰訊利用自己網路的中心地位,脅迫QQ用戶卸載360的軟體;蘋果公司利用自己的中心地位,強行對蘋果設備上進行的打賞(微信打賞,直播平台打賞等各種打賞)收取30%的抽成。
這兩件事都是一個中心化網路中,中心為了自己的利益修改遊戲規則,強迫所有其他用戶接受的真實案例。
那麼在一個中心化的貨幣系統中,中心作惡問題的表現是什麼?
「通貨膨脹」這個詞相信大家都不陌生,現代各國法幣(紙幣)的發行權都掌握在一個中心化的政府手中,什麼時候發行法幣,發行多少法幣,都是政府在控制,當政府因為這樣那樣的原因(財政困難)超發貨幣時,很容易引發惡性的通貨膨脹,從而洗劫普通老百姓的財富。請看下面兩則故事。
國民政府的「金圓券」
1946年國民黨發動全面內戰,隨著軍事上連連失敗,損失慘重,統治區日益縮小,財政收入不及支出的十分之一,國內、國外負債纍纍,信用全失,舉債無門,只有靠發行貨幣來彌補差額,從而造成惡性通貨膨脹,工商業瀕於破產,農村凋敝不堪,社會民怨沸騰。
到1948國民黨當局遂作出發行金圓券的決定。金圓券與法幣的比率為1:300萬,同時禁止人民持有金、銀、銀元、外幣,並限期強行收兌。
金圓券於1948年8月正式進入流通時候,與銀元兌換比例為2:1,隨後金圓券一路狂貶,到1949年1月金圓券與銀元兌換比例已經變成1000:1,到4月23日解放軍攻進南京時,1000萬金圓券兌不到1塊銀元,到1949年6月,銀元價格更是達到了5億金圓券兌1塊銀元。
據不完全統計,在金圓券發行的幾個月時間裡,各階層人民金、銀、銀幣、外幣損失約二億美元,間接的經濟損失就無法計算了。
魏瑪德國的「馬克」
一戰結束後,德國作為戰敗國需支付天額的戰爭賠款,到 1922年底,德國魏瑪政府發現沒有根本能力支付《凡爾賽條約》的戰爭賠款,法國和比利時旋即佔領了德國工業區,導致德國工業巨頭命令工人罷工,德國經濟瀕於崩潰。
德國魏瑪政府於是開動印刷機,印出沒有任何商品和準備金作保證的紙幣來支付戰爭債務和工人福利。紙幣很快就變得沒有任何價值。1922年,紙馬克最大面值為50,000,一年以後變成了100萬億。到1923年11月底,德國的年通貨膨脹率為325,000,000%,意味著物價每兩天就翻倍。最後德國政府發行「地租馬克」取代了「紙馬克」。
除了上面兩則故事,還有1945-1946年間的匈牙利平格,1971-1981年間的智力比索,1975-1992年間的阿根廷比索,1988-1991年間的秘魯索爾,以及近些年的面值達到100萬億的辛巴威幣,這你些都因為政府財政困難,肆無忌憚印發紙幣而引發惡性通貨膨脹,最終洗劫了居民財富的歷史事件。
在中心化網路的貨幣系統中,掌握法幣發行權的中心化的政府是永遠無法遏制通過「印錢」(超發紙幣)來解決財政困難的衝動的,當印鈔機開動時,整個網路中的普通人沒有任何力量與之抗衡,我們有理由相信,在未來的歷史中年,同樣的故事還會不斷的重演。
比特幣系統的優勢
六大優勢
這裡幣行君直接引用媒體對比特幣系統做的優勢總結,大家先不著急需理解每項優勢的內涵,隨意瀏覽看看就行。
(1)優勢一:去中心化
比特幣是第一種分散式的虛擬貨幣,整個網路由用戶構成,沒有中央銀行。去中心化是比特幣安全與自由的保證 。
(2)優勢二:全世界流通
比特幣可以在任意一台接入互聯網的電腦上管理。不管身處何方,任何人都可以挖掘、購買、出售或收取比特幣。
(3)優勢三:專屬所有權
操控比特幣需要私鑰,它可以被隔離保存在任何存儲介質。除了用戶自己之外無人可以獲取。
(4)優勢四:低交易費用
可以免費匯出比特幣,但最終對每筆交易將收取約0.0001比特幣的交易費以確保交易更快執行。
(5)優勢五:無隱藏成本
作為由A到B的支付手段,比特幣沒有繁瑣的額度與手續限制。知道對方比特幣地址就可以進行支付。
(6)優勢六:跨平台挖掘
用戶可以在眾多平台上發掘不同硬體的計算能力。
以上的總結雖然很全面和精鍊,但都不免概念化,術語化,只有當我們了解到比特幣一些基本原理後,才能對上述優勢的內涵有比較深刻的理解。
所以幣行君在這裡只闡釋比特幣系統最核心的一個優勢:去中心化。
什麼是去中心化網路?
去中心化網路也叫P2P網路,英文全稱是Peer-to-Peer Network,意思就是從節點到節點的網路系統,P2P網路結構大概如下圖:
去中心化網的特徵大概如下:
特徵一:整個網路的運行不依靠某幾台伺服器(中心),而是利用整個網路所有節點(網路中所有電腦和手機)的計算能力和帶寬在運行,即使網路中的部分節點遭到破壞,整個網路依然能夠運行。
特徵二:去中心化網路中任意兩個節點可以直接發生信息交流或交易,不需要依靠中間媒介(中心)。這就好比過去你和你女朋友之間交流全靠她媽傳話,現在你可以直接跟你女朋友眉來眼去了,是不是爽翻天了?
特徵三:整個網路的數據存儲不只是存儲在某幾台伺服器(中心),網路中任意節點產生了新數據,其他「所有的節點」都會存儲相應的數據,某幾個節點數據遭到了破壞和篡改,整個網路的數據依然是安全,完整和正確的。
貨幣的本質
前面我們了解了「中心化網路」的缺陷和「去中心化網路」的優勢,那麼新問題來了,我是不是一定能利用去中心化網路的優勢,創造一套全新的數字貨幣呢?這裡幣行君認為我們有必要了解一貨幣的本質是什麼?
馬克思的《資本論》中認為,貨幣本身沒有任何價值,貨幣的本質就是一般等價物,如果一個經濟系統內(一個市場內)所有的交易參者能夠達成共識,共同接受某種「等價物」作為交易的媒介,那麼這個「等價物」就是貨幣,他可以是金子、可以是銀子,可以是紙,可以是石頭,也可以是貝殼。
我們漢字里有許多財富和交易有關的字都是以「貝」作為偏旁的,例如:財、賺、賜、貴、購、貨、賑、賒、賠、販等。
這很可能是因為在造字時代,我們的祖先就是以貝殼作為「貨幣」(一般等價物)來進行交易的。
再給大家分享電影《肖申克的救贖》的兩段劇情
劇情一:男主安迪(Andy)剛到關押的他監獄時,以瑞德(Red)為首監獄老油條門在一起打賭這批新來的犯人中,誰最先會失控哭泣,他們下注的賭資就是香煙。
劇情二:瑞德(Red)雖然在監獄裡,但他有特殊渠道幫獄中的人買到任何東東西。當男主安迪(Andy)向瑞德(Red)購買小榔頭後,瑞迪(Red)往監獄裡販運東西過程如下:
從以上情節可知,在監獄這個封閉環境內部,傳統的紙幣錢失去作用了,所有在押犯人達成了共識,在監獄內部用香煙就充當著一般等價物,也就是我們所謂的貨幣。
既然貨幣的本質是只是「一般等價物」,這個「一般等價物」可以是任何東西,那麼貨幣為什麼不能是網路世界裡的一串數字呢?
綜上所述,我們現有貨幣體系存在著「中心安全」以及「中心作惡」(惡性通貨膨脹)的問題,而貨幣本質是一般等價物,只要在交易市場參與交易的人認可某一個東西作為貨幣(一般等價物)就可以。
於是早在比特幣誕生之前,就有人開始探討,是否可以結合密碼學在計算機世界中創造一種去中心化的、不會受單方面控制的、不會隨意超發的數字貨幣。
只要這種數字貨幣具有安全保密、不易被盜取、易於交易流通的屬性,並且能被大家共同認可和接受,並用普遍用於市場交易當中,那麼這種數字貨幣就具有革命性的意義。
誰發明了比特幣
4
比特幣/Bitcoin/BTC
現在我們知道,比特幣(數字貨幣)不是憑空誕生的。比特幣的誕生,既有現實的客觀因素,也有理論上的可行性,在「某種程度」上可以說具有歷史的必然性。那麼又是誰第一次將理論變為現實,誰發明了比特幣呢?
2008年一個叫「中本聰(Satoshi Nakamoto)」的人在互聯網上一個討論信息加密的郵件組(興趣夥伴可以自行搜索這個郵件組,裡面全是大牛人)中發表了一篇名為《比特幣:一個點對點的電子現金系統》(《Bitcoin: A Peer-to-Peer Electronic Cash System》)的論文。
在論文中,中本聰勾畫了比特幣系統的基本框架。2009年他為該系統建立了一個開放源代碼項目 (Open Source Project),正式宣告了比特幣系統的誕生。
至於比特幣之父「中本聰」本人,在比特幣誕生之初對系統進行幾次維護和修改後,就徹底在互聯網上消身匿跡。
曾經有媒體找到一個名為多利安·普倫蒂斯·中本聰(Dorian Prentice Satoshi Nakamoto)的日裔美國人,認為他就是中本聰本人,但遭到多利安·中本聰的堅決否認,並且中本聰的網路賬號在沉寂5年後也再次被激活並澄清到:我不是多利安·中本聰。
所以,至今無人知曉中本聰的真實身份。
誰在運營比特幣
5
在中心化系統中,比如銀行的網銀系統,系統的代碼由銀行開發和部署到自己的伺服器上的,雖然銀行的用戶會在自己電腦或手機上下載安全控制項或者應用,但起本質還是通過網路訪問到銀行的伺服器上的,從而使用網銀系統的各項功能完成交易。
比特幣系統是沒有中心,也就沒有任何中心的伺服器運行比特幣系統的代碼,更沒有所謂的官方團隊在統一運營維護整個比特幣系統。
那比特幣這套系統是如何部署在網路上的?系統又在哪兒運行?又是誰在進行運營和維護?要解釋上面的問題,我們還需要了解比特幣系統源代碼的本質是什麼。
比特幣系統的源代碼本質是一種網路協議,我們可以將其理解為一種遊戲規則。就像紙牌遊戲中,都是那54張紙牌,但因為不同的規則,就了有炸金花,鬥地主,德州撲克等不同的玩法。
中本聰發明了比特幣,其本質是用代碼的方式,發布了一款取名為比特幣的遊戲規則(協議)。大家覺得這款遊戲特別有意思,都紛紛自發參與到這款遊戲當中了。
比特幣的源代碼(遊戲規則)是完全公開透明,目前託管在GitHub平台,是一個免費的開源項目,任何對比特幣有興趣的人都可以下載比特幣源代碼並對其進行修改、升級、迭代。
比特幣底層核心的協議規則是不變的,就像我們的宇宙中,萬物皆有引力,如果去掉這條物理規則,那我們所處的宇宙就不存在了,而是另外一個未知的宇宙。
會編程的朋友可以下載比特幣系統的源代碼研究
(下載地址:https://github.com/bitcoin/bitcoin)
圍繞著比特幣的協議,出現了許多開發團隊(有盈利性的,也有非營利性的),不同的開發團隊以比特幣底層協議核心,開發了一系列比特幣客戶端,支持不同平台和系統(電腦、手機、網頁、Windows、Mac、Linux)。
關於比特客戶端,幣行君以後會單開一文,詳細介紹。
(下載地址:https://bitcoin.org/zh_CN/choose-your-wallet)
這些開發團隊我們可以理解為現實世界中的撲克牌生產商。不同廠商生產的撲克牌,質地、手感、圖案、品質肯定都會有區別,但都是54張牌,唯一不同的是,這些廠商生產的撲克牌都被施以了魔法(協議),人們拿著這些撲克牌只能用來玩比特幣這款遊戲。
當然開發團隊可以在開發的客戶端中改變比特幣的底層協議(規則),只是這樣的客戶端無法參與網路做其他比特幣客戶端發生聯繫,也就無法參與到比特幣這款遊戲當中了。
改變比特幣的底層協議,相當創造了一款全新的紙牌遊戲(數字貨幣系統),這款遊戲能不能吸引其他玩家參與,就另當別論了。
在現實世界中,任何人只要買副撲克牌,就可以自發參與到 「鬥地主」的遊戲中,因為這款游足夠有趣,所以在人群中推廣和普及開了,這一過程沒有任何個人或組織在統一運營,統一調度資源,也沒有所謂「鬥地主」的官方組織,一切都是圍繞著鬥地主的遊戲規則自發的進行。
由上可知,整個比特幣系統也沒有任何官方存在,也沒有任何人在統一調度、掌握、運營和維護整個比特幣系統,比特幣系統通過用戶下載和運行比特幣客戶端部署和擴張,比特幣系統運行在網路中所有比特幣客戶端的電腦、手機等設備中。
如何加入比特幣系統
6
在現實中,我們要加入銀行網路,就需要到銀行櫃檯進行比較繁瑣的實名認證和簽署一系列文件。然後銀行再在他的網路系統中為我們設置好開設賬戶,然後我才能加入銀行的網路系統。
在比特幣世界中,任何人只需要選擇一款適用他們的比特幣客戶端,下載到手機或電腦上,與網路中的其他節點完成聯網,就加入到比特幣系統系統中,成為比特幣的用戶節點。
比特幣的客戶端分為兩類:
1、錢包,運行錢包的節點成為網路中的普通節點(Service Nodes);
2、挖礦軟體,運行挖礦軟體的節點叫做挖礦節點(Mining Nodes),也就是大名鼎鼎礦工。(比特幣挖礦的問題後文有敘述,這裡不詳細展開)
對於大多數普通人,加入比特幣系統的目的是為了實現比特幣的交易買賣,所以在前文給出的下載頁面中,選擇一款適合自己的比特幣錢包客戶端也就足夠了。
目前比特幣錢包的種類很多,特性也各不相同。
Core開發團隊開發的Bitcoin Core錢包是比特幣世界的核心錢包(全節點錢包), Core錢包首次運行後會同步比特幣系統創世以來所有的交易數據,在去年數據量就已達到130G+,同步就需要幾天幾夜的時間。
在全節點錢包外,也有很多輕量級的錢包,比如BlockChain網頁錢包,這幾乎不會在本地下載任何數據。
訪問地址:blockchain.info/zh-cn
無論我們選擇哪一款錢包,只要錢包是以比特幣協議為底層核心的,當我們在手機或電腦上運行錢包時,就加入了比特幣網路。
關於錢包,幣行君暫時就介紹這些內容,關於之後出關於錢包客戶端的專題內容,敬請期待。
玻璃房間的故事
7
接下來應該給大家講解比特幣系統的運行原理了,但幣行君準備先進行點前戲,調動一下氛圍,給大家分享一個關於比特幣的小故事。
故事中的比喻可能不是很精準,但可以幫助大家對比特幣系統運行原理有個直觀的感受,先找找感覺嘛。
以下故事翻譯自《How would you explain bitcoins to a five-year-old?(如何向五歲小孩解釋比特幣)》,內容有刪改,著作權歸原作者所有。
有一天造物主建造了一個特別的房間
· 房間用透明的玻璃建造,從外邊可以看到房間里的一切;
· 房間的大門敞開,任何人都能自由進出這個房間;
· 房間里每進一個新人,哪怕他只是想進來看個新鮮,造物主都會給他配發一套免費的、樣式統一的衣服、口罩、帽子,讓別人看不到他的真實面目,如果不穿上造物主的衣服,就進入不了房間;
· 房間的地面整整齊齊的固定著一個又一個存錢罐,存錢罐固定的位置就是它在房間里唯一坐標。房價每新進一個人,造物主就糊指定一個存錢罐供他使用,但是存錢罐沒法帶離房間,只能固定在房間里的地面上。
· 存錢帶有一個投幣孔,只能投幣進去,無法從投幣孔中取錢。
· 存錢罐也是用透明玻璃製成的,能看到裡邊有沒有錢,有多少錢,但砸不碎也摔不爛。
· 存錢罐用一把鎖鎖住了,必須用唯一的一把鑰匙打開存錢罐才能從裡邊取錢。這把所得鑰匙造物主會交給存錢罐的使用者保管,並且允許使用者將鑰匙帶出房間。
· 此外,每個存錢管你還帶有一個U盤功能,能存儲無限容量的數據信息。
· 房間屋頂有一個360度無死角高清攝像機,隨時記錄下房間里發生的一切。攝像機的拍攝的內容實時在網路上是公開直播,並且還會實時傳送給所有存錢罐U盤裡進行備份。
下面我們舉例說明,這個這個特殊的房間里,交易的支付過程是如何完成的。
小明要向小紅購買一台標價5BTC的電腦,小明需要向小紅支付5BTC。
小紅將自己存錢罐的坐標告訴小明,假設小紅存錢罐的坐標是「上三下七」。
同時「小明」也將自己存錢罐的坐標告訴小紅,假設小明存錢罐的坐標是「上五下六」。
如果小紅的存錢罐收到了來自「上五下六」這個坐標存錢罐轉來的 5 BTC,就代表小明付款完成,小紅就應該發貨給他。
然後小明穿戴上分配給他的形狀,帶著自己存錢罐的鑰匙進入了房間。
小明先根據坐標找到自己的存錢罐,用鑰匙打開,從中取出 5 BTC,然後根據坐標找到小紅的存錢罐,將 5 BTC投入進去,付款就完成了。
因為有攝像頭的存在,全世界所有人都知道,從坐標為「上五下六」的存錢罐(小明的存錢罐)里支付了 5 BTC到坐標為「上三下七」存錢罐里(小紅的存錢罐),小紅是無法對這筆收款抵賴的。
同樣,如果小明存錢罐里的餘額不足,他在房間外偽造了5 BTC 帶進房間並試圖存入小紅的存錢罐,所有人也都知道這 5 BTC不是從小明的存錢罐里取出來的,不屬於這個房間,偽造的BTC無法完成交易。
如果不能通過自行偽造比特幣在房間里使用,那麼房間里的比特幣是從哪裡來的呢?
剛開始時因為根本沒幾個人知道有這個房間,所以搶答成功的概率很高。現在,上百萬人湧入了房間,搶答成功的概率越來越低了。
那這個造物主是誰?是誰修建了玻璃房子?大家都知道是一個叫做「中本聰」的人創造了這一切,但是沒有人知道他到底是誰。
通過玻璃房間的故事,大家應該對比特幣系統的運行有個直觀的感受了,對於很多人而言,其實了解到這裡也足夠了。如果你還想繼續深入了解比特幣系統,那就請繼續往下。
在玻璃房間的故事中,造物主對房間做了一些非常特殊的設定,這些設定其實都是為了確保這個房間發生的交易能夠正常、安全、有效的進行下去。
同理,比特幣系統中使用了很多特別的理論、技術、演算法,這並不是極客們為了「炫技」而硬放進系統里的。這些理論、技術、演算法的存在都是為了解決比特幣系統實際運行中會遇見的各種現實問題。
所以幣行君要再次提醒讀者朋友們,在了解比特幣系統的過程中,不要迷失於專業術語當中,而是要撥開迷霧,了解每個專業術語充當了什麼樣的「科技黑箱」的作用。
前戲差不多到此為止,下面我們終於要進入正題了,沒錯,幣行君的前戲就是這麼長,前戲越充足,正戲才越那什麼,你懂的。
比特幣系統安全
8
比特幣系統是一套數字貨幣系統,既然是貨幣系統,就可以大概分為貨幣發行、資產安全和交易支付三個環節,因為比特幣系統的特殊性,貨幣發行我們放在最後講解,先講比特幣的資產安全問題。
中心化系統中,銀行作為中心,理論上要對整個系統的資產安全負責,所以會投入大量的資源建立安全防護體系,確保儲戶的資產安全。並且銀行會通過驗證用戶的賬號密碼、手機驗證碼、U頓K寶等各種安全工具,確保每個賬戶的操作都是出自其本人的真實授權。
比特幣系統是去中心化的網路系統,沒有一個中心可以對全系統的資產安全負責。比特幣系統中也沒有「賬戶」這個概念,更不存在驗證賬號密碼的情況(賬戶的問題,後文會有講解)。
比特幣系統保護資產安全的方案是:通過密碼學的演算法,確保屬於用戶的比特幣只有該用戶能夠支配和使用,這就足夠了。(在中心化銀行中,保護賬戶安全的目的不也是為了確保其他人不能操作我們的賬戶中的資金嗎。)
實現上述目的,比特幣系統依靠的「私鑰」和「公鑰」這一對加密工具。「私鑰」和 「公鑰」是密碼學中「非對稱加密演算法」的概念。有「非對稱加密」,當然也有「對稱加密」。
對稱加密演算法
「對稱加密」簡而言之,「加密」和「解密」都是依靠一個工具,怎麼理解,抗戰片中經常出現敵我雙方搶奪電台密碼本的橋段,這種電台密碼本一般就是對稱加密。
拿到密碼本,我可以根據密碼本中的加密規則將我要傳遞的「誤導情報」偽裝成密文發送出去,如果我截獲了一段密電,我又可以用密碼本將其解密為明文破解情報。
對稱加密的演算法不能說不好,但是確實存在非常高的泄密風險。
我們舉個例子,小明家裡是種西瓜的,有一年西瓜豐收又沙又甜,他想送一隻西瓜想送給小紅嘗嘗,但是他擔心西瓜在快遞運輸過程中被偷吃,於是他買了一個密碼保險柜來裝西瓜,小明將西瓜鎖在保險柜中設好密碼,就放心地將保險柜交給快遞了。
那麼問題來了,小紅並不知道保險柜的密碼,收到貨後,小紅同樣打不開保險柜吃不到西瓜(此處不討論暴力破解的情況)。
所以小明在送出西瓜後,還要想法通過打電話、發郵件、寫信等各種方式告訴小紅密碼是多少,無論「小明」通過任何方式將密碼告訴「小紅」,這個過程都可能被攔截泄密。即使密碼安全的傳達給了小紅,一個密碼,兩處都在保管,同樣也大大增加了泄密的風險。
有人會說,小明直接和小紅見面悄悄告訴她密碼不就行了?既然如此,那還幹嘛找人運西瓜,直接讓小紅來吃不就行。何況誰也不能保證小明和小紅的見面沒有被監控。
在網路世界裡,兩個用戶(節點)之間永遠只能通過信息交換進行交流,對稱加密的方法在網路世界的信息傳遞中非常容易泄密,因此,比特幣系統採用了更加安全的「非對稱加密」演算法,來確保用戶比特幣的財產安全。
非對稱加密
在介紹「非對稱加密」前,我不得不再提一次 「科技黑箱」概念,對於沒受過專業密碼學訓練的我們,對於「非對稱加密」 不需知其所以然只需要做到知其然就足夠了,。
「非對稱加密」包含兩部分,一部分叫「私鑰」,一部分叫做「公鑰」。
私鑰
私鑰(Private Key):比特幣系統會給每個用戶隨機生成一個「私鑰」,私鑰就是一段字元串,大概如下圖:
比特幣系統可以隨機產生私鑰數量是2的256次方個,據說這個數量比宇宙中的原子的總數還多,想要破解「私鑰」,耗盡太陽的全部能量也是不可能算出來的。從密碼學上來講,私鑰是安全。
私鑰是存儲在錢包當中的,這就是為什麼許多錢包還需要我們設置一個密碼,相當於再用一個保險柜來鎖住我們的私鑰。如果錢包不涉密,任何人登錄那你的電腦用你的錢包就可以實現轉賬了。
私鑰是比特幣系統中最重要的信息,每個用戶必須妥善保管好自己的私鑰,不能讓其他任何人知道。
公鑰
公鑰(Public Key):比特幣系統先給每個用戶的隨機生成私鑰,然後將私鑰通過橢圓曲線簽名演算法(ECDSA)生成對應的公鑰。
注意這裡的「公」並不是所有用戶共用一套「公鑰」,每個用戶的「公鑰」也是唯一的和不同的,「公鑰」的「公」字是指其可以在網路中向所有人公開,網路上公開傳播公鑰不會造成泄密風險。
私鑰與公鑰的關係
私鑰產生公鑰的「橢圓曲線演算法」,你不用知道是怎麼回事,你就把他理解為魔法吧,我們只需知道通過這個魔法能達到如下效果:
1、私鑰和公鑰是一對密鑰,兩者一一對應;
2、公鑰無法反向推算出對應的私鑰是什麼;
3、經過公鑰加密的信息,只能通過對應的私鑰解密;
4、經過私鑰加密的信息,只能通過對應的公鑰解密和驗證(驗證不同於解密,只是驗證這條加密信息是否是對應的私鑰加密的)。
對於我們普通人,對 「非對稱加密」了解到這裡就足夠了,至於「非對稱加密」如何實現上述特性的,建議不要輕易去嘗試了解,畢竟「好奇害死貓」。
西瓜的故事
現在,我們重講一遍送西瓜的故事。故事中的比喻並不完全準確,只是為了便於大家理解。
小明家裡是種西瓜的,小強和小紅都喜歡吃西瓜,他倆買好了一模一樣保險柜,設定好密碼和刻上名字後,他們就將保險柜提前寄存在了小明處。
待到西瓜豐收時,小明找出小強和小紅的保險柜給他們裝西瓜。但因為不可描述的原因,小明將一個又小又癟西瓜放入了刻有小強名字的保險柜中,將一個又大又圓的西瓜放入刻有「小紅」名字保險柜中。然後小明將兩個西保險柜的櫃門關上鎖住(保險柜在裝西瓜前沒有上鎖,櫃門是打開的)。待到小明和小紅收到保險柜後,用自己設好的密碼打開保險柜後就可以享用西瓜了。
唯一不同的是,小明和小強從此陌路友誼不再。小明和小紅卻從此幸福的生活在了一起。好吧,我編不下去了。
在上面的故事中,小明和小紅的的保險柜就是他們的公鑰,提前設好並只有他們自己知道的密碼就是私鑰。
比特幣系統就是利用私鑰和公鑰來確保資產安全的,屬於比幣行君的比特幣都是用我的公鑰鎖定的,只有我的私鑰才能解鎖。同時我的公鑰可以在網上公開,當其他人要轉賬給我時,只需用我的公鑰將對應數量的比特幣鎖定,那麼這筆比特幣就屬於我了。當我要使用這筆比特幣時,再用只有我自己才能掌握的私鑰將比特幣解鎖就行。
以上就是比特幣系統保證用戶資產安全的基本原理。
比特幣系統交易安全
9
幣行君認為,無論是現實的中心化銀行系統中,還是在比特幣系統中,交易都可以概括為三個步驟:
第一步:交易發起
(1)提供交易信息:收款人及轉賬金額;
(2)對交易進行授權:包括但不限於密碼、簽字、印章、指紋等。
第二步:交易驗證
(1)驗證交易的授權是否來自付款人本人;
(2)驗證交易金額及收款人是否被篡改;
(3)驗證交易付款賬戶餘額是否充足。
第三步:交易確認
(1)對付款人和收款人的賬目餘額修改;
(2)交易過程中的所有原始單據保存留底;
(3)更新並保存整個系統的賬單。
在現實的銀行系統中(中心化網路),因為銀行這個中心足夠的權威,擁有足夠的公信力和安全防護措施,我們天然的信任銀行這個中介,認為通過銀行完成的交易是安全的。
所以當用戶發起一筆交易後,其實只需要完成第一步即可。第二步和第三步都是由銀行這個中心替我們完成的。
比特幣系統是一個去中心網路,整個系統中沒有具有公信力的權威中心存在,整個交易流程的三個環節只有靠全網路的各個節點共同完成,但是網路間節點相互之間都是陌生的,相互之間缺乏信任,那麼比特幣系統中是如何安全可信的完成一筆交易呢?
哈希函數和哈希值
為確保交易安全,比特幣系統同樣用到了的 「私鑰」 和 「公鑰」這一對工具,但是因為這兩個工具都太高貴和驕傲,很多時候他倆並不需會親自下地幹活。同時私鑰和公鑰的數據字的符串比較多,就像皇帝每次出行排場太大,親自幹活也不方便。
於是比特幣系統為私鑰和公鑰訓練了幾個小弟代表他們在比特幣系統裡邊工作。這裡我們先補充一個 「科技黑箱」知識:哈希函數和哈希值。比特幣系統就是通過這個工具為「私鑰」和「公鑰」訓練小弟的。
哈希函數具體是就不向各位解釋了,幣行君也解釋不清楚。各位只需只需要記住一個結論:經過「哈希函數」所求得的值就是「哈希值」,也叫「Hash值」,「散列值」。
哈希函數和哈希值特性一
哈希函數可以將任意長度的一段文字或者數據,經過哈希函數計算後,轉變為一段固定長度的哈希值。
如上圖所示:「古斯」是2個字元,「古斯幣行」是4個字元,「古斯幣行最貼心的玩幣資訊」是12個字元,這三組文字的字元數量不同,但他們經過哈希函數(Sha256演算法)後,都得到了一段64個字元的哈希值,經過同一演算法求得的哈希值的長度是固定的不變的。
哈希函數和哈希值特性二
任意兩段文字或者數據,即使只有些微的差別,經過哈希函數計算後,所得的結果也完全不同。
如上圖所示,圖中兩句話唯一的區別就是句子末尾的標點符號,一個是句號,一個是嘆號,但兩者所得哈希值(Sha256演算法)卻完全不同。
《前出師表》的哈希值
如果一組文字或數據內容特別多,長度特別長,不便於查閱、使用、傳播。那我們就可以用哈希函數對以上文字求出一段長度固定的哈希值作為其摘要,以便我們使用,這個過程同樣可以起到對原文加密的功能。(其實哈希值的用途非常廣泛,只是沒法向大家詳細介紹)
我們以諸葛亮的《前出師表》為例,全篇共計747個字元(含標點,不含標題),限於篇幅本文就不引用全文了。
這747個字元經過哈希函數(Sha256演算法)計算,同樣得到一段長度為64字元的哈希值。
上面這個哈希值就是《前出師表》全篇內容的摘要,這個摘要跟標題有點類似,但並完全是一回事。你可以把原文理解為如來佛主,因為如來佛主真身太大了,所以幻化出一個替身在人間活動,哈希值就是原文的替身。
那有沒有兩段文字內容計算出來的哈希值一樣的情況呢?肯定有的,這種情況叫做哈希值「碰撞」。因為哈希值一個哈希值在數學上是對應了無數個原文的,即使知道原文A的哈希值是B,也不能認為哈希值B的原文就是A。
這裡有點繞,各位不用在意,直接記住結論:哈希值與原文完全不可逆,不能通過原文推導出原文。
哈希值的不可逆與前面的「私鑰-公鑰」加密演算法的不可逆還不是一回事,其實只要是密碼就存在破解的理論可能,只是以人類現和可預見的未來能夠掌握計算能力導致破解密碼成為不可能。哈希值不可逆是在數學理論上就不可逆。
同時大家也不用比特幣系統中我們的私鑰或者公鑰經過哈希運算後出現「碰撞」的情況,哈希值的計算方法一直在不斷的迭代,僅演算法就有MD4、MD5、SHA1、SHA224、SHA246、SHA384、SHA512等。
比特幣採用的是SHA256的哈希值演算法,再加上其他的密碼演算法和編碼方法,至少在比特幣系統中,大家還不用擔心碰撞的發生的。
比特幣系統的安全工具
了解了函數和哈希值後,我們可以正式了解比特幣系統用為私鑰-公鑰訓練的小弟們(安全工具),並了解這些小弟們在交易的各個環節分別擔任了什麼宗人,解決了哪些問題。
比特幣系統交易過程,非常類似現實中「個人支票」的支付過程, 個人支票在中國大陸並不普遍,部分朋友可能並不了解,幣行君簡單介紹一下。
上圖為幣行君香港賬戶的個人支票。
當Coin Banker(幣行君)要支付6666港幣給Guss(古斯)時,掏出支票本,填寫好收款人和金額,然後簽上大名就行了。
古斯拿著這張支票,在背面填上他的賬號,就可以要求銀行從幣行君的付款到他的賬戶。
銀行收到支票後,會做如下驗證:
以上驗證通過,則銀行會從幣行君的賬戶付款6666港幣到古斯的賬戶。
比特幣系統的交易流程與上述情況一致,唯一不同的是,比特幣系統沒有銀行這個中心來進行驗證,比特幣系統是通過一系列交易機制和安全工具來完成上述驗證。
當小明要支付5 BTC給小紅,同樣只需填寫一張交易支票就行,「比特幣支票」,分為兩部分,一部分是發起方(Input),一部分是接收方(Output),大概如下圖。
比特幣系統創造的每一個安全工具,都可以在現實支票中找到對應的原型,並且發揮著該原型在原型交易中一樣的功能。
錢包地址
錢包地址也是一串字元串,如下圖所示:
既然講到錢包地址,幣行君特為本文新建了一個錢包
大家可以試驗一下,錢包地址是否有效哦
比特幣錢包地址
1KR7ergu922S49TzaAUZJM2e4jBKvkfDvm
沒有比特幣?
那就實驗以太坊地址是否有效
以太坊錢包地址
0xd2F7955B33CAb06529754D8DCC80a0d0Bb6655fF
錢包地址對應支票中的收款人或者收款賬戶,這個大家應該都能理解,但這理解並不全面。「錢包地址」是「公鑰」的一個小弟,代表「公鑰」在比特幣系統中發揮作用的。
比特幣系統中,當我們填寫向轉賬支票時,並不填寫收款人的名字或銀行賬號,而是填寫他的「錢包地址」。
「錢包地址」是代表公鑰在發揮作用,這個行為本質上並不是往他的賬戶劃撥BTC,而是用收款人錢包地址所包含的「公鑰」鎖定這筆BTC,以此達到收款人這筆BTC專屬使用權的目的。
所以,當小明向小紅轉賬5BTC時,支票的信息如下圖:
錢包地址為什麼可以包含公鑰的信息,實現公鑰的功能呢?簡而言之,錢包地址就是公鑰的哈希值。
幣行君在里奉勸諸位,了解到這裡就足夠,如果你非要刨根問底,幣行君將錢包轉化生成錢包地址的完整流程列在下面,你自求多福吧。
公鑰生成錢包地址完整流程
第一步:取公鑰的標準數據,用SHA256演算法計算哈希值;
第二步:取上一步結果,用RIPEMD160演算法計算哈希值;
第三步:取上一步結果,在前加上地址版本號(比特幣主網版本號「0x00」);
第四步:取上一步結果,用SHA256演算法計算哈希值;
第五步:取上一步結果,再次用SHA256演算法計算哈希值;
第六步:取上一步結果,截取前4個位元組待用;
第七步:取上一步結果,加在第三步結果後面;
第八步:取上一步結果,用Base58方法進行編碼;
第九步:最後得到常見的比特幣地址;
數字簽名
數字簽名對應支票中的簽名,簽名是最常見的授權驗證手段,比特幣的數字簽名不僅具有交易授權的功能,同時還具有交易信息驗證的功能。
數字簽名是私鑰的小弟,在比特幣系統中替「私鑰」工作,數字簽名生成工作同樣用到了哈希函數這個工具,具體過程如下:
第一步:當付款人填寫一張比特幣支票後,先對支票上的交易信息(金額,收款人)求哈希值,得到一個交易摘要;
第二步:用付款人的「私鑰」對交易摘要進行加密,這個用「私鑰」加密後的「交易摘要」,就是「數字簽名」;
數字簽名與完整支票合併在一起,作為交易請求在比特幣網路上廣播,其他節點收到交易請求後,也會對這筆交易請求進行驗證。驗證過程如下:
第一步:用付款人的公鑰解密驗證數字簽名,解密成功,則證明這筆轉賬確實是付款人本人授權並發起的,如果不能解開則授權不合法;
第二步:用公鑰解密數字簽名後,會得到一個交易摘要(交易信息的哈希值),留著解密所得交易摘要待用;
第三步:公開傳播的交易信息中,除了數字簽名還有一份完整的交易信息(金額,收款人),各個網路節對完整交易信息求哈希值,同樣得到一份交易摘要;
第四步:將第二步與第三步的交易摘要進行對比,如果二者信息一直,則證明該筆交易請求的交易信息沒有被篡改。
通過數字簽名的這個功能,比特幣系統完成對每一筆對交易請求的安全的驗證:
1、確認交易授權合法;
2、確認交易金額和收款人沒有被篡改;
所以,當小明向小紅轉賬5BTC時,支票的信息如下圖:
交易編號(TXID)
現實中支付支票面臨一個很大的問題就是「空頭支票」,當我們收到別人寫給我們的支票後,在去銀行兌現之前,我們並不知道對方賬戶餘額是否足夠兌付支票上的金額給我們。當我們在銀行發現支票無法兌現時,對方可能已經消失了。
「空頭支票」的問題,在比特幣系統中同樣存在,為解決這個問題,比特幣系統設置了交易編號(TXID)這個工具。
如下圖所示,現實中現實中每一張支票都有一個唯一的編號,同理比特幣系統中每一筆交易,同樣也會生成一個唯一的編號:交易編號(TXID)。
交易編號的生成過程很簡單,就是對每一筆交易中的所有信息求哈希值,可以理解為對整張支票的求哈希值。
交易編號的具有如下的功能:
1、驗證賬戶餘額:
比特幣系統中的每一筆交易都會有一個唯一的交易編號。
我們每個人賬戶里的錢肯定不是憑空生成的,肯定是由其他人通過轉賬交易的方式進入我的賬戶的,那麼轉賬給我的這筆交易,肯定也有一個唯一的交易編號。
因此比特幣系統中發起的每一筆交易中,都必須引用對應的比特幣進入付款人賬戶的那筆交易的交易編號。
可能有點繞,我們舉例說明:
1、小花轉賬了5 BTC給小明,這筆交易已經能完成並已經生產了交易編號,我們假設交易編號為TXID:6666;
2、小明現在要將這5 BTC再轉給小紅,那麼小明填寫支票時候,就必須引用TXID:6666,以此證明他的賬戶餘額充足,確實擁有5BTC,。
比特幣系統通過交易編號驗證比特幣是否被支付過的原理很簡單,只需要檢驗正在發生的這筆交易所引用的編號,是否被其他已經完成的交易所引用。
假設小花轉賬5 BTC給小明,小明現在要將這5BTC轉給小紅,但是在轉給小紅之前,小明已經將這5BTC轉給了小麗,具體驗證過程如下:
如上所示,比特幣系統可以根據發起請求的這筆交易中所引用的交易編號是否被其他交易引用,來驗證交易發起方是否有足額的BTC來萬交易,從而杜絕了 「空頭支票」的問題。
聰明的你應該也發現了,因為有交易編號的存在,比特幣系統還可以根據交易編號,回溯每一枚比特幣的最終來源。
2、比特幣使用權的解鎖
在前文比特幣系統資產安全中我們提到過,每一枚比特幣都是被一個公鑰鎖定的,只有公鑰對應的私鑰才能解鎖。
在小花轉賬5 BTC給小明後,這 5 BTC其實是被小明公鑰鎖定著的,現在小明要將這5 BTC轉賬給小紅,那就還需要用自己的私鑰對著5BTC進行解鎖。
首先小明寫給小紅你的支票中有小明的數字簽名,我們前面講過數字簽名是私鑰的小弟,代表私鑰在工作。
然後系統帶著小明的數字簽名,根據小明支票上引用的交易編號找到小花轉賬給小明的那張支票,那張支票上有小明的錢包地址,帶有小明公鑰的信息。
最後用小明的錢包地址中的公鑰與他數字簽名中的私鑰進行驗證,驗證通過,小明就解鎖了小花轉給他的這5BTC,他可以將這筆錢轉任何人了。
區塊鏈
前面我介紹了錢包地址、數字簽名以及交易編號等工具在交易發起和交易驗證中發揮的作用,現在我們要講講比特幣系統中交易確認是如何進行的。
在現實世界中,銀行在驗證了一筆交易後,對交易雙方的賬戶餘額分別進行修改,然後更新並存儲整個銀行的賬本,以此確認並完成交易。
在比特幣系統中,當某兩個節點發生交易後,需要將交易信息傳輸給整個網路的其他節點,待所有網路的節點都存儲了最新的交易數據後,交易確認才算完成。
在這個過程中,就存在偽造交易記錄並向其他節點傳播的可能性。為此,比特幣系統採用了一種「區塊鏈」的信息存儲方式,使的偽造交易記錄在比特幣系統中幾乎是不可能完成的任務。
1、超市購物小票
我們都有超市購物經歷,超市購物結賬後,我們會獲得一張購物清單,上面一行一行的羅列著我們所採購的所有商品的詳細信息,採購的物品越多,購物清單越長。
想像一下,如果你將一家超市所有的商品全部購買,你的購物清單能有多長?幾米,幾十米,還是幾百米?對於這樣長的購物清單,應該怎麼保管?
是像衛生紙一樣圈起來嗎?這樣的話如果要檢索查看清單中間的某幾條信息,就得把整圈清單展開,查看完成後再將清單重新捲起來,非常麻煩。
有一種有效的方案就是將這張清單按照一定長度撕開,將一張很長的完整清單,撕成一張張等長的短清單。
撕裁的短清單按照從頭到尾的順序,一張張摞在一起進行保管和存放。
在上面的例子中,每一張被撕下來的短清單,就是所謂的「區塊」,而撕開清單所留下的縫隙就是所謂的「鏈」,任何紙被撕每一條縫隙絕對都是獨一無二的,所以每一張短清單都可以通過它首尾的裂痕判斷出與它相連的另外兩張短清單是哪兩張。
以上就是大名鼎鼎的區塊鏈概念
短清單是一張一張摞起來保管存放的,從完整清單頭部上撕下來的部被摞在最下面,從完整清單尾部撕下來的部分被摞在最上面。
因此在這一摞清單中,從低到高順序數就是所謂的區塊鏈高度數,也即主鏈上區塊數就是所謂的高度數。
2、比特幣系統中的區塊鏈
現在想像比特幣系統所有的交易數據,按照發生的時間順序,都記錄在一張像購物小票的清單上。從比特幣系統創世以來,不知已經發生了多少萬筆交易,這張記錄交易數據的清單不知有多長,並且新的交易不斷發生,所以這張清單還在不斷增長。
因此,比特幣系統也會將完整交易清單「撕成」一張張短清單進行存儲。當然,比特幣系統不是按照長短,而是按照數據量的大小(1M數據,約1000條交易)來撕裁清單的。
當比特幣系統中的用戶發起一筆交易並驗證通過後,這筆交易就會進入交易池中等待打包。網路中負責記賬的節點(挖礦節點)會定時從交易池中以1M數據量為單位抽取一組交易數據。請注意,這裡抽取的交易數據組的還「不是」所謂的「區塊」。
因為,現實世界中,紙張撕開的裂縫是唯一,每一個張短清單可以通過撕開裂縫與另外的短清單鏈接,但是一組交易數據並沒有可以與其他組數據鏈接的獨一無二的「裂縫」。
這裡還是要用到哈希值這個工具,具體過程如下:
第一步:我們假設比特幣網路中已經產生了一個真正意義的「區塊」,我名叫它區塊A,這個區塊怎麼產生的先不用管,然後網路中負責記賬的節點對這個「區塊A」求哈希值;
第二步:隨著系統交易的發生,第一個區塊產生後,系統又產生了1M的新交易數據,記賬節點將這1M的交易數據抽取出來;
第三步:然後比特幣系統要求每個記賬節點再設定一個隨機變數值(Nonce)(隨機變數是一個不斷變化的值,之後再詳講);
第四步:現在記賬節點手上有三個數據:
這三個數據共同構成了新的區塊:區塊B。
第五步:隨著系統運行,當網路產生新區塊時,記賬節點就對區塊B求哈希值,然後與新產生的交易數據和設定的隨機變數值組合在一起,構成區塊C。
第六步:如此,系統中每一個區塊都包含上一個區塊的哈希值,同時每個區塊又決定了下一個區塊的哈希值,這樣每一個區塊也就有了與其他區塊鏈接獨一無二的「裂紋」,比特幣在系統的區塊鏈就是如此構成的。
新的區塊產生後,記賬節點就會向全網進行廣播,其他節點接收新的區塊數據後,就會將該區塊數據存儲,以此完成交易的確認,並且使得偽造交易記錄在比特幣系統中成為不可能。
至此,關於比特幣系統交易環節的基本原理就講解完成,整個比特幣系統的交易過程其實就是填寫「支票」,驗證支票合法,然後將支票信息生成區塊,最後全網以區塊鏈的形式存儲新的支票數據。
大家應該發現了,整個過程並沒有代表比特幣的一串代碼從某一個賬戶進入到另外一個賬戶,有的只是一個又一個的賬單。
我們在比特幣錢包中看到的賬戶金額,並不代表我們的錢包中存放了對應金額的比特幣,而是系統根據的支票交易記錄中,收款和付款差額匯總後得出的結果。
所以比特幣的本質其實是一種記賬權,擁有1 枚BTC的真正含義其實是擁有了對1枚BTC的記賬權。
比特幣的發行
10
雙重支付風險
前面講解了比特幣系統交易環節一系列安全運行機制,但是有一個漏洞還有沒有提到,這個漏洞是基於去中心化網路的特點產生的。
那就是整個網路中每個節點電腦的運行速度和網路速度是不等的,有的快有的慢,同時交易數據和區塊數據向周圍節點的廣播是隨機的。
我們假設小明向小紅轉賬5BTC,在交易被打包為區塊並被全網記錄之前,他又非常迅速的發起一筆向自己轉賬5BTC的交易。
這就可能導致某些節點收到的是小明轉賬給小紅的信息,另外一些節點收到的是小明轉賬給自己的信息。
這時候比特幣就分裂為兩個陣營,一部分節認為小明轉賬5BTC給了小紅,一部節點認為小明轉賬了5BTC給自己,然後兩個陣營在各自對產生區塊並進行廣播,這就導致整個比特幣網路分出了兩條鏈條,這就是所謂的區塊鏈分叉。
分叉後的比特幣系統以哪條鏈條的數據為準呢?根據比特幣系統的的規則,以最長的哪根鏈條為準,而較短那根兩條區塊的交易信息就會被遺棄。
我們假設小明是買家,小紅是賣家,小明發起向小紅付款5BTC後,小紅向小明發貨。但是小明在付款後又非常迅速的發起一筆向自己付款5BTC的交易。如果最終小明向自己付款的交易區塊在全網的傳送速度更快,成為了更長的那根鏈條,那麼小明向小紅支付5BTC的交易就會被遺棄,小紅最紅會貨財兩失,這就是比特幣系統的「雙花風險」(雙重支付風險)。
工作量證明
比特幣系統解決雙花風險的方案就是降低區塊產生的速度,每當需要產生新的區塊時候,比特幣系統會要求所有的記賬節點來進行一場搶答競賽,只有第一個搶答成功節點才能生產區塊和廣播區塊數據。
具體過程如下:
在前面提到,每個區塊中包含三個內容:
系統會要求所有的記賬節點對將要產生的新區塊求哈希值,只有當節點所求得的哈希值小於一個目標值時候,才能算搶答成功。
節點在計算新區塊的哈希值時,上一區塊的哈希值和交易數據這兩項的值是根據已經存在的交易產生的,是固定不變的,所以記賬節點需要不斷的調整隨機值,以使得最終得出的哈希值小於系統給定的目標值。
這個過程就好比扔骰子,系統規定同時扔3個骰子,第一個扔出的點數的和為18的玩家獲勝。當然這個要求比較簡單,但如果規則是同時扔100個骰子,第一個扔出的點數和為600的玩家獲勝。這個難度就非常大了。
在真實的比特幣系統中,要計算出滿足系統要求的哈希值,每個記賬節點需要不斷地調整隨機變數的值,至少都要進行上億次的計算才能得出符合要求的哈希值。
並且系統會根據實際情況調整解題難度,以確保每10分鐘,才可能有節點計算出符合要求的哈希值。
這種通過計算出符合系統要求的哈希值以獲得生成和傳播區塊的方式,就叫做工作量證明,也叫Proof of Work(PoW)。
由上可知,因為有了工作量證明的要求,小明無法在比特幣系統中實現雙重支付。即使小明發起一筆交易後,立刻使用同一筆資金髮起另外一筆交易,他只有一台電腦,無法使第二筆交易快速生長為更長的鏈條,因為他對抗的是整個網路中所有其他節點。除非小明能控制整個網路中51%的記賬節點,這就是所謂51%攻擊。
幣行君認為如果一個人的勢力能控制51%以上的記賬節點,那麼他在現實世界中同樣可以做到對所有人予取予求,我們還需要擔心他在比特幣世界中進行雙重支付?
3、挖礦
明白了以上所有的問題,我們就可以解釋清楚比特幣的發行機制了。比特幣系統設定的比特幣總量是2100萬枚,就像是斯諾克的規則下總分只有147分。至於這2100萬枚總量的設定是否留有後台,幣行君不解釋,有疑問的朋友可以自己去查看源代碼。
當比特幣系統中的某個記賬節點解出符合系統要求的哈希值時,也就是取得了打包和傳播區塊數據的許可權時,系統就會獎勵這個節點一定數量的BTC,最開始獎勵是50BTC,獎勵的數量每4年減半,最終獎勵數量會趨近於0。
任何人都可以下載了挖礦軟體,成為比特幣系統中專門擔任記賬任務的節點就是所謂的礦工,礦工通過記賬以及生成區塊的工作量證明來獲得系統獎勵的比特幣的過程,就是所謂的挖礦。
目前挖礦都是使用專業的ASIC礦機,與各種低成本電站合作,進行大規模的挖礦作業,普通的家用電腦如果不加入某個礦池,即使挖到電腦冒煙也不可能挖出比特幣來。
後記
11
以上就是本文的全部內容。篇幅較長,也沒有涉及各個演算法的深層原理以及腳本代碼等內容,只限於向小白科普比特幣系統運行的基本原理。有不正確的地方,歡迎各位指正,感謝你的閱讀。
特別申明
投資有風險,玩幣需謹慎,本文不構成任何投資建議,僅供交流討論,所有風險均需讀者自己判斷和承擔。


※Yann LeCun卸任FAIR負責人:「我更擅長做研究」
TAG:全球大搜羅 |