自從2009年一個自稱中本聰(對,是日本人...)的人在一個隱祕的密碼學討論組上發佈了一篇叫作《比特幣:一種點對點的電子現金系統》的報告,比特幣就出現了,而且獲得了愈來愈多人的關注。比特幣從最初的幾分錢到如今上萬元的價格一路上漲,價格有過猛漲,有過大跌,可是價格的整體趨勢是不斷增長的。挖礦由一開始的我的電腦到後來的礦機,再到後來的礦池也通過了幾代的發展。政策上獲得了一些國家的支持,也有一些國家反對,還有一些國家對比特幣的態度很曖昧。最有意思的是,2010年5月21日,在第一次比特幣交易中,佛羅里達程序員Laszlo Hanyecz用1萬BTC購買了價值25美圓的披薩優惠券,這些比特幣在最近價值已經上億了。這些都見證了比特幣神奇的發展歷史。html
雖然比特幣沒有徹底獲得各國政府的承認,也並非一個標準的金融組織,可是比特幣十幾年如如一日的挖礦活動歷來沒有中止過,比特幣交易隨時隨地都在進行,無疑是一個成功的金融產品,從技術上,比特幣的每一項技術點,例如:非對稱密碼學、P2P網絡、共識機制、智能腳本等,都不是創新,可是這些技術組合造成的比特幣就是一個大大的創新。java
因爲比特幣的成功,比特幣的核心技術區塊鏈愈來愈多的獲得你們的關注,以致於區塊鏈被認爲是互聯網金融行業的下一個風口,各行各業都在研究區塊鏈,併爲區塊鏈尋找使用場景,有個不恰當的例子,可是很生動,區塊鏈技術就想是一個錘子,滿世界的找釘子,好不容易找到的幾個釘子,一看仍是螺絲釘,還得換成螺絲刀才行,不過非得要用錘子砸進去,也不是不能夠,就是有點費力氣。程序員
上面這個例子生動的說明了區塊鏈技術的現狀,好比,有的企業裏面使用區塊鏈作存儲、有的企業裏面使用區塊鏈作客戶的帳務、也有的公司裏面使用區塊鏈保存電子資產,這些都是在爲區塊鏈找場景,雖然區塊鏈尚未獲得全面的應用,可是無疑區塊鏈在金融領域已經初露頭角。算法
另一個現象是不少公司爲了炒做新概念,聲稱產品使用了區塊鏈,例如某某電子資產公司使用了區塊鏈,仔細瞭解,人家使用的私有鏈,這讓人以爲匪夷所思,私有的區塊鏈是爲了提升性能,確定不是,區塊鏈最難說清楚的就是性能,那是安全,私有的安全在於私有產品的建設,不在因而否使用區塊鏈,那麼私有鏈的使用是爲了什麼呢?這裏讀者可自行YY。數據庫
實際上,區塊鏈分爲共有鏈、私有鏈和聯盟鏈,共有鏈對參與的節點沒有限制,整個系統運行在公網上,沒有中央機構的控制,自由發展,自發組織,典型的案例就是比特幣;私有鏈,顧名思義就是一個組織內部運行的區塊鏈系統,這種系統運行在組織內,很難保證去中心化,在一個組織內自己就是個中心化的產物,所以,我一直認爲凡事私有鏈都不要說具備去中心化的特色;聯盟連,這是筆者最看好的一種形式,api
比特幣系統是當下最流行的電子貨幣之一,也有不少山寨幣,可是思想甚至源碼都是來自於比特幣,朋友圈裏有不少介紹性的文章,也有人試圖經過漫畫來生動的解釋比特幣的特性,可是始終不得要領,老是有些問題想不清楚,爲了弄清楚這些問題,最近深刻的研讀了幾本比特幣的書籍以及中本聰本人發表的比特幣論文,感受茅塞頓開,火燒眉毛的與你們分享個人理解,但願與你們共同探討、共同進步。安全
比特幣是一種利用點對點技術實現的電子現金系統,它容許一個組織直接與另一個組織進行在線支付,而不須要中間的權威的清算機構。服務器
在比特幣的世界裏,若是你想擁有比特幣,你須要申請一個比特幣地址,就像你到銀行存款,須要開立一個帳戶,而後,你就擁有這個帳號,有了本身的帳號,你能夠向你的帳號存款,別人也能夠給你的帳號轉帳,當你須要提款的時候或者給別人轉帳的時候,你須要出示一個可以打開這個地址的鑰匙,也就是你的私鑰,就像你在ATM上取款的時候須要提供密碼同樣。微信
與銀行發行的法訂貨幣不一樣,法訂貨幣的發行是由各國央行來統一管理的,你們都相信央行是靠譜的,不會記錯帳,也不會被人攻擊。然而,比特幣的發行並不須要央行這樣的權威機構,它容許一筆交易從一個組織直接結算給另一個組織,省去了權威機構結算的環節,提升了交易和結算的效率,節省了交易的成本,尤爲是跨境交易的成本。網絡
一個點對點的在線交易系統如何保證交易的匿名性、正確性、不可篡改性?又是如何防止雙重支付和防止做弊和攻擊的呢?
下面的章節將爲你們經過最通俗的語言解開比特幣的神祕面紗,讓你從邏輯上理解比特幣是如何工做的,讓學習比特幣不留死角,讓比特幣的方方面面清晰的呈如今你的腦海裏。
本節介紹區塊鏈技術中最核心的幾個要點,這包括:區塊鏈存儲、密匙和地址、解鎖腳本、挖礦過程、共識機制、P2P網絡等。
對於一個現金帳戶系統,首先要解決的是如何記帳,把帳記在哪裏,帳戶如何存儲等。例如,你在中國銀行存款,中國銀行爲你開立帳戶,你的帳戶就存儲在中國銀行的服務器上,而你在建設銀行存款,建設銀行爲你開立帳戶,你的帳戶就存儲在建設銀行的服務器上。若是你須要轉帳給同一個銀行的其餘人的帳戶,你須要經過這個銀行爲你轉帳和結算,若是你須要轉帳給其餘銀行的其餘人的帳戶,你須要經過銀聯爲你轉帳和結算,儘管一個普通用戶感知不到如此多的過程,不過這些步驟確實是存在的,從這個過程當中咱們看到記帳的帳戶系統是專用的,是中心化的,歸某一個組織全部並維護,一般這個組織是權威的、可信賴的。
而比特幣並無中心化的記帳系統,而是經過分佈式的區塊鏈來記載比特幣的擁有權和交易信息。每一個比特幣的參與者都擁有一份相同的區塊鏈副本,區塊鏈包含着多個隨着時間排序的塊,後一個塊經過哈希指針指向前一個塊,造成一個鏈,從鏈的頂端經過這個指針,能夠一直找到底端第一個塊,第一個塊成爲創世紀塊。每一個區塊記錄着前一個區塊的哈希散列值,其實是前一個節點頭的哈希散列值,若是想改變一個區塊包含的交易,必須改變這個區塊以後全部的交易,因爲每一個區塊的產生是須要條件和時間的,而且條件至關苛刻(後續會在共識機制相關的文章中詳細說明),所以,一個區塊一旦產生,而且被區塊鏈的節點所接受,而且在這個節點以後又產生了必定數量的區塊,那麼這個區塊基本是不可篡改的。
區塊鏈示意圖以下:
從上圖可見,區塊鏈是由多個區塊組成,每一個區塊是由區塊頭和區塊體組成的,每個區塊頭包含着區塊的元信息,同時也包含一個指向前一個區塊頭哈希值的指針,這個指針是防止區塊鏈被篡改的關鍵信息。區塊體包含比特幣的交易信息,第一個交易是特殊交易,是獎勵給挖礦節點的酬勞,這也是惟一一種能夠產生比特幣的方式,也就是發行比特幣的方式,其他的交易都是轉帳交易,比特幣從一個地址支付給另一個地址,這也是實現比特幣價值轉移的惟一方式。總結來看,比特幣只有發行和轉帳兩種交易,比特幣產生之後只能從一我的轉帳給另一我的,而不能憑空消失,比特幣發行的總量是有限的,一共2100萬,所以是一種通縮性貨幣,後續咱們會在相關的文章中詳細介紹比特並的通縮特性。
上一節介紹了區塊鏈的存儲,區塊鏈其實是比特幣的帳本,記錄着誰擁有多少比特幣,只不過這個帳本是保存在互聯網上的、分佈式的,並非由一箇中心機構或者服務器來存儲。有了帳本,剩下的問題就是比特幣的擁有者如何證實本身擁有比特幣?就像你在銀行開立了一個帳戶,等你想給其餘人轉帳的時候,你須要在ATM上插入卡,而後輸入密碼。卡就至關於比特幣的地址,密碼就至關於比特幣的祕鑰,有了正確的地址和祕鑰,就能夠對外宣稱本身對比特幣的擁有權,就能夠把比特幣轉帳給其餘人來作一筆轉帳交易。
在ATM上提取一筆現金,輸入密碼解鎖帳戶,咱們相信ATM機不會泄露密碼。那麼在比特幣的世界裏,咱們如何經過私鑰來校驗一個地址上的比特幣的歸屬權呢?
比特幣的歸屬權是經過加密領域技術來實現的,咱們先來了解下加密領域的原理,加密領域大致上通過了3個階段,第一個階段拼算法,把加密邏輯寫在一個很是高深的代碼裏,後來發現不管把多麼複雜的邏輯寫在代碼裏,總有高手能夠破解。因而產生了對稱祕鑰加密,對稱祕鑰加密經過一個對稱的祕鑰進行加密數據,而後傳輸或者保存,須要的時候再經過同一個祕鑰進行解密還原原來數據,缺點是祕鑰是共享的,沒法安全的保存祕鑰,尤爲是跨組織的場景。後來,聰明的安全科學家們發明了非對稱加密算法,例如:RSA,非對稱算法擁有一對祕鑰,一個公鑰和一個私鑰,私鑰能夠推導出公鑰,可是公鑰不能推導出私鑰,公鑰加密的數據私鑰能夠解密,私鑰加密的數據公鑰能夠解密,若是組織A向組織B傳遞數據,那麼組織A使用公鑰進行加密,組織B使用私鑰進行解密,所以,組織B須要當心的保存好私鑰,而公鑰是公開的,這是典型的非對稱加密場景,可以有效的防止數據被偷窺、被篡改。非對稱加密還有另一個場景,就是簽名,簽名是加密場景的逆向場景,商戶B經過本身的私鑰加密數據,而後把加密的數據傳遞給商戶A,商戶A經過公鑰進行解密,若是解密的數據正確,則說明數據是由A發送的,有效的保證了數據的防篡改,從這兩個場景咱們看到,公鑰是公開的,可發給任何人,私鑰是私密的,用來解密或者簽名的。
比特幣證實歸屬權的示意圖以下:
從上圖可見,現實生活中咱們用鑰匙打開鎖頭,咱們用密碼在ATM上提取現金,那麼在比特幣系統裏,咱們經過祕鑰來實現比特幣的轉帳,實現價值的轉移。
更具體來說,一筆比特幣交易會把必定數量的腳本鎖定在一個地址,聲明擁有這個地址的用戶會經過密匙的簽名來證實本身擁有這個地址,而後,花費這筆比特幣,這筆比特幣被花費後並不會消失,會被鎖定在其餘人的地址上,其餘人可使用一樣的方法來花費這筆比特幣。
從上面的過程,咱們總結了兩個動做,鎖定與解鎖,這和咱們平時鎖鎖頭和開鎖頭是對應的,在比特幣系統裏是經過鎖定腳本和解鎖腳原本實現的。
下面咱們舉一個例子詳細說明:
用戶Alice在比特幣裏地址A上擁有10個比特幣,Alice與Bob想作一筆交易,Bob把本身家的汽車賣給了Alice,Alice須要向Bob支付10個比特幣,Bob的比特幣地址是B。
在以前的交易中,Alice擁有的10個比特幣被鎖定在Alice的比特幣地址A上,其來源多是挖礦所得或者別人轉帳而來,咱們會在後續詳細描述如何得到比特幣,這裏咱們只關注證實Alice擁有比特幣的交易的鎖定腳本。
鎖定腳本的邏輯格式爲:
比特幣數量 | 來源 | 鎖定地址 |
---|---|---|
10 | 挖礦所得 | 地址A |
若是想花費這個鎖定腳本,須要的解鎖腳本以下:
解鎖地址 | 解鎖 |
---|---|
地址A | 地址A的公鑰、地址A用私鑰對前一區塊頭哈希散列值的簽名 |
具體的解鎖過程以下:
其實,鎖定和解鎖腳本是經過逆波蘭表示法的基於堆棧的腳本實現的,因爲本文篇幅有限,這裏不展開介紹,會在後續的文章中詳細介紹鎖定和解鎖腳本的原理和流程。
上一節介紹了比特幣使用分佈式存儲的區塊鏈做爲記帳系統,也解決了你們關於如何聲明比特幣的擁有權,以及把比特幣支付給其餘人的過程。如今咱們遇到了新的問題,既然區塊鏈是分佈式的記帳系統,每一個參與的節點都有一份拷貝,那麼誰來負責把一筆交易記到區塊鏈呢?
這不得不引入一個新的概念,就是共識機制,比特幣是經過工做量證實的共識機制來決定記帳權的,通俗來說,誰證實了本身的工做量最大,誰就負責記帳。
工做量證實示意圖以下:
工做量大小是經過計算符合某一個標準的比特幣區塊頭的哈希散列值來體現的。試圖爭奪記帳權的節點稱爲挖礦節點,挖礦節點會把網絡節點上發來的交易進行驗證(網絡傳播機制會在下一節中介紹),驗證後會存入緩衝區,造成必定的交易存儲結構(交易使用Merkle樹存儲,後續問斬各類介紹),放在區塊體中,而後根據區塊的基本信息構造區塊頭,區塊頭一般包含前一個區塊的哈希散列值、Merkle根(後續文章會詳細介紹)、時間戳、難度目標、以及一個填充的隨機值。這裏面的隨機值是隨機產生而且填充的,挖礦過程就是求出一個可以填充本區塊頭的隨機值,讓區塊頭的哈希散列值符合某一個標準,例如:哈希散列值的前某些位爲0,難度目標就是用來表達哈希散列值標準的難度係數,能夠經過幾率算法計算出難度值與挖礦成功的可能性。
網絡上的每個礦機接收並驗證了一批交易,而後就開始進行挖礦,視圖計算知足某一難度值的區塊頭的哈希散列值,若是計算成功,則挖礦成功,向全網廣播挖礦所得,全網節點驗證後,把這個區塊鏈接到區塊的最上端,而且在全網達成一致。礦機須要反覆的試驗隨機填充值來進行求解,通常採用產生隨機數,嘗試把產生的隨機數填充到區塊頭,而後計算哈希,後續文章會介紹礦機聯盟,礦機聯盟會把隨機數分紅多個小區間,分配給聯盟中的成員,共同求解。
除了上面介紹的工做量證實機制,還有權益證實、股份制的權益證實共識機制等,後續我會在共識機制的專題文章中與你們分享。
前面兩節介紹了比特幣的帳戶體系和記帳機制,這節咱們討論比特幣的分佈式區塊鏈帳本是如何在網絡上傳輸,交易又是如何在網絡上傳輸並獲得驗證的。
比特幣網絡中的節點都是對等的,沒有中心化的服務器,節點有不一樣的類型,不一樣的類型有不一樣的職責,咱們會在未來的文章中詳細介紹,這裏咱們只介紹全節點,也就是比特幣核心客戶端的工做機制。
比特幣中的全節點除了存儲完整區塊鏈,還具備礦工、錢包、路由節點等的角色,他們的職責以下:
P2P網絡傳播的示意圖以下:
咱們會在後續的文章中詳細介紹比特幣P2P網絡的工做機制,包括節點分類、節點發現、節點鏈接和廣播等。
因爲篇幅有限,前文介紹了比特幣的三大基礎概念,包括區塊鏈、挖礦與P2P網絡,然而比特幣是個龐大的系統,初學者可能對方方面面都有疑問,這涉及到如何防止雙重支付、智能合約、區塊鏈分叉、通縮特性、鎖定和解鎖腳本、交易的Merkle樹存儲、交易的存儲格式、區塊鏈被攻擊的機率、挖礦難度與挖礦成功時間、更多的共識機制、創幣交易和轉帳交易、比特幣的性能、不一樣類型的挖礦節點、以及比特幣的應用場景等。
筆者曾經鼓動小夥伴們加入個人比特幣和區塊鏈技術研究微信羣,
那時候比特別才5000塊,是人民幣呀 :) 這是一個自由的分享羣,每人都參與發言,任何人能夠拋出問題,接下來問題是這個樣子的,一共有50多個問題,oh..my gosh,多嗎?很多?想了解答案嗎?想!那就當即跳過問題看後面我分享的材料,看完秒懂這些問題,讓你理解比特幣和區塊鏈不留死角,是在吹牛嗎?嗯,也許不是,看吧,看完真的秒懂 :)
- 比特幣在哪裏?
如行業內一個前輩所說,最正宗和最正經的學習比特幣和區塊鏈的資料莫過於中本聰發佈的比特幣論文,我對新技術的學習一直都是先看論文,再看具體的實現或者產品,聽到前輩這句話讓我感受像找到了知己同樣,一直堅持認爲上來就某某框架、某某高大上開源項目、某某微服務實現大規模高併發平臺的套路總以爲有點構造空中花園的野路子,因而,立刻馬上就把我學習的比特幣和區塊鏈資料分享出來,但願可以讓更多的人從比特別最原始的概念開始學習,打下良好的基礎,再擴展學習會有水到渠成的感受。
讀者能夠從下面的鏈接下載原始論文:
中本聰比特幣論文[英文版] 密碼:x0f8
中本聰比特幣論文[中文版] 密碼: 29fx
學習上面的論文更多的可以幫助你對理論的理解,這篇論文的內容包括了比特幣和區塊鏈最核心的思想,那麼若是你想從技術上更深刻的學習比特別,或者想了解比特別和區塊鏈的實現層次的細節,那麼我推薦《精通比特幣》這本書,幸虧這本書也有中文版。
讀者能夠從下面的鏈接下載這本書:
精通比特幣 密碼: bbdb
這本書詳細的介紹了P2P網絡、交易的過程、錢包的構造、智能合約、共識機制、密碼學原理、腳本支付、網絡分裂的解決辦法等,書中內容能夠解決文章開始的全部的問題。
前文說了,雖然論文是一項新技術的靈魂和核心,路邊的野花真的就不要了嗎?能夠時而的換個口味,讀讀別的文章,看看別人的PPT,學學別人學習途徑,仍是頗有價值的,這裏介紹幾個對學習比特幣有幫助的資料。
這是一篇使用比喻講解比特幣的文章,喜歡聽故事的看這個就好。
中國區塊鏈技術和產業發展論壇標準(密碼:xa8y)
這是國內一個組織制定的區塊鏈標準,想不通這個標準的做用在哪裏? :)
區塊鏈與數字貨幣技術(密碼:cu7y)
這是普遍傳播的一個比特幣和區塊鏈PPT,內容面很廣,能夠用做導讀。
布比區塊鏈產品白皮書(密碼:uico)
這是國內一家使用區塊鏈作保存電子資產服務的公司的白皮書,指的閱讀。
只能合約PPT(密碼:v362)
這是一個直接上代碼講解只能合約的PPT,比較難理解,得邊看邊查資料。
區塊鏈技術指南(密碼:2qvg)
技術指南比較全面的講解區塊鏈技術的方方面面。
本文從比特幣和區塊鏈技術的背景提及,介紹了比特幣和區塊鏈技術的前因後果,而後,爲讀者講解了區塊鏈技術的核心原理,這包括密碼學原理、智能合約、P2P網絡、解鎖腳本等,最後提供了筆者在區塊鏈研究羣裏收集的初學者常見的問題,並嚮導讀者帶着這些問題去閱讀筆者提供的資料。閱讀完這本書,並讀完筆者提供的資料,不管你是技術人員仍是業務人員,不管你是初學者仍是有必定的基礎,都會對比特幣和區塊鏈的技術原理有更深刻的認識和理解。