search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

區塊鏈和比特幣基礎技術原理

比特幣的發展歷程

自從2009年一個自稱中本聰(對,是日本人...)的人在一個隱秘的密碼學討論組上發布了一篇叫做《比特幣:一種點對點的電子現金系統》的報告,比特幣就出現了,並且得到了越來越多人的關注。比特幣從最初的幾分錢到現在上萬元的價格一路上漲,價格有過猛漲,有過大跌,但是價格的總體趨勢是不斷增加的。挖礦由一開始的個人電腦到後來的礦機,再到後來的礦池也經過了幾代的發展。政策上得到了一些國家的支持,也有一些國家反對,還有一些國家對比特幣的態度很曖昧。最有意思的是,2010年5月21日,在第一次比特幣交易中,佛羅里達程序員Laszlo Hanyecz用1萬BTC購買了價值25美元的披薩優惠券,這些比特幣在最近價值已經上億了。這些都見證了比特幣神奇的發展歷史。

雖然比特幣沒有完全得到各國政府的認可,也並不是一個標準的金融組織,但是比特幣十幾年如如一日的挖礦活動從來沒有停止過,比特幣交易隨時隨地都在進行,無疑是一個成功的金融產品,從技術上,比特幣的每一項技術點,例如:非對稱密碼學、P2P網路、共識機制、智能腳本等,都不是創新,但是這些技術組合形成的比特幣就是一個大大的創新。

由於比特幣的成功,比特幣的核心技術區塊鏈越來越多的得到大家的關注,以至於區塊鏈被認為是互聯網金融行業的下一個風口,各行各業都在研究區塊鏈,並為區塊鏈尋找使用場景,有個不恰當的例子,但是很生動,區塊鏈技術就想是一個鎚子,滿世界的找釘子,好不容易找到的幾個釘子,一看還是螺絲釘,還得換成螺絲刀才行,不過非得要用鎚子砸進去,也不是不可以,就是有點費力氣。

上面這個例子生動的說明了區塊鏈技術的現狀,比如,有的企業裡面使用區塊鏈做存儲、有的企業裡面使用區塊鏈做客戶的賬務、也有的公司裡面使用區塊鏈保存電子資產,這些都是在為區塊鏈找場景,雖然區塊鏈還沒有得到全面的應用,但是無疑區塊鏈在金融領域已經初露頭角。

另外一個現象是很多公司為了炒作新概念,聲稱產品使用了區塊鏈,例如某某電子資產公司使用了區塊鏈,仔細了解,人家使用的私有鏈,這讓人覺得匪夷所思,私有的區塊鏈是為了提高性能,肯定不是,區塊鏈最難說清楚的就是性能,那是安全,私有的安全在於私有產品的建設,不在於是否使用區塊鏈,那麼私有鏈的使用是為了什麼呢?這裡讀者可自行YY。

實際上,區塊鏈分為共有鏈、私有鏈和聯盟鏈,共有鏈對參與的節點沒有限制,整個系統運行在公網上,沒有中央機構的控制,自由發展,自發組織,典型的案例就是比特幣;私有鏈,顧名思義就是一個組織內部運行的區塊鏈系統,這種系統運行在組織內,很難保證去中心化,在一個組織內本身就是個中心化的產物,因此,我一直認為凡事私有鏈都不要說具有去中心化的特點;聯盟連,這是筆者最看好的一種形式,

比特幣系統是當下最流行的電子貨幣之一,也有很多山寨幣,但是思想甚至源碼都是來自於比特幣,朋友圈裡有很多介紹性的文章,也有人試圖通過漫畫來生動的解釋比特幣的特性,但是始終不得要領,總是有些問題想不清楚,為了弄清楚這些問題,最近深入的研讀了幾本比特幣的書籍以及中本聰本人發表的比特幣論文,感覺茅塞頓開,迫不及待的與大家分享我的理解,希望與大家共同探討、共同進步。

比特幣是一種利用點對點技術實現的電子現金系統,它允許一個組織直接與另外一個組織進行在線支付,而不需要中間的權威的清算機構。

在比特幣的世界里,如果你想擁有比特幣,你需要申請一個比特幣地址,就像你到銀行存款,需要開立一個賬戶,然後,你就擁有這個賬號,有了自己的賬號,你可以向你的賬號存款,別人也可以給你的賬號轉賬,當你需要提款的時候或者給別人轉賬的時候,你需要出示一個能夠打開這個地址的鑰匙,也就是你的私鑰,就像你在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擁有比特幣的交易的鎖定腳本。

鎖定腳本的邏輯格式為:

比特幣數量來源鎖定地址
解鎖地址解鎖
地址A地址A的公鑰、地址A用私鑰對前一區塊頭哈希散列值的簽名

具體的解鎖過程如下:

  • 使用地址A的公匙推導出地址,與地址A對比,如果一致則證明公匙提供正確,進入下一步。

  • 使用地址A的公匙解密簽名,如果獲得的值與前一區塊的哈希散列值一致,則證明解鎖成功,可以花費地址上的10個比特幣。

其實,鎖定和解鎖腳本是通過逆波蘭表示法的基於堆棧的腳本實現的,由於本文篇幅有限,這裡不展開介紹,會在後續的文章中詳細介紹鎖定和解鎖腳本的原理和流程。

挖礦

上一節介紹了比特幣使用分散式存儲的區塊鏈作為記賬系統,也解決了大家關於如何聲明比特幣的擁有權,以及把比特幣支付給其他人的過程。現在我們遇到了新的問題,既然區塊鏈是分散式的記賬系統,每個參與的節點都有一份拷貝,那麼誰來負責把一筆交易記到區塊鏈呢?

這不得不引入一個新的概念,就是共識機制,比特幣是通過工作量證明的共識機制來決定記賬權的,通俗來講,誰證明了自己的工作量最大,誰就負責記賬。

工作量證明示意圖如下:

工作量大小是通過計算符合某一個標準的比特幣區塊頭的哈希散列值來體現的。試圖爭奪記賬權的節點稱為挖礦節點,挖礦節點會把網路節點上發來的交易進行驗證(網路傳播機制會在下一節中介紹),驗證後會存入緩衝區,形成一定的交易存儲結構(交易使用Merkle樹存儲,後續問斬各種介紹),放在區塊體中,然後根據區塊的基本信息構造區塊頭,區塊頭通常包含前一個區塊的哈希散列值、Merkle根(後續文章會詳細介紹)、時間戳、難度目標、以及一個填充的隨機值。這裡面的隨機值是隨機產生並且填充的,挖礦過程就是求出一個能夠填充本區塊頭的隨機值,讓區塊頭的哈希散列值符合某一個標準,例如:哈希散列值的前某些位為0,難度目標就是用來表達哈希散列值標準的難度係數,可以通過概率演算法計算出難度值與挖礦成功的可能性。

網路上的每一個礦機接收並驗證了一批交易,然後就開始進行挖礦,視圖計算滿足某一難度值的區塊頭的哈希散列值,如果計算成功,則挖礦成功,向全網廣播挖礦所得,全網節點驗證后,把這個區塊連接到區塊的最上端,並且在全網達成一致。礦機需要反覆的試驗隨機填充值來進行求解,一般採用產生隨機數,嘗試把產生的隨機數填充到區塊頭,然後計算哈希,後續文章會介紹礦機聯盟,礦機聯盟會把隨機數分成多個小區間,分配給聯盟中的成員,共同求解。

除了上面介紹的工作量證明機制,還有權益證明、股份制的權益證明共識機制等,後續我會在共識機制的專題文章中與大家分享。

P2P網路

前面兩節介紹了比特幣的賬戶體系和記賬機制,這節我們討論比特幣的分散式區塊鏈賬本是如何在網路上傳輸,交易又是如何在網路上傳輸並得到驗證的。

比特幣網路中的節點都是對等的,沒有中心化的伺服器,節點有不同的類型,不同的類型有不同的職責,我們會在將來的文章中詳細介紹,這裡我們只介紹全節點,也就是比特幣核心客戶端的工作機制。

比特幣中的全節點除了存儲完整區塊鏈,還具有礦工、錢包、路由節點等的角色,他們的職責如下:

  • 礦工:就像挖礦的工人一樣,做的是體力活,不斷的嘗試在構造的區塊頭的隨機欄位上填充數字,來找到滿足一定標準的哈希散列值,如果找到,把此區塊連接到區塊鏈的最上端,並且把合法的區塊鏈發送給鄰接節點。

  • 錢包:區塊鏈記載了創幣交易和轉賬交易,這有別於通常意義的賬戶系統,通常意義的賬戶系統記錄賬戶餘額,而區塊鏈裡面只記錄了交易,沒有餘額,錢包就是用來從區塊鏈中算出某個地址擁有區塊的餘額,如果你學過關係型資料庫,你可以把區塊鏈理解為資料庫的索引,也可以認為是一本書的目錄。

  • 路由節點:負責在去中心化的網路環境中傳遞交易和區塊,一個節點創建一筆交易,併發送給相鄰的節點,相鄰的節點驗證后,再發送給相鄰的節點,很快會傳遍網路。如果一個節點通過挖礦,找到一個符合標準的區塊,這個節點也會用相同的方式傳遞給相鄰節點,然後相鄰節點再繼續傳播下去,讓網路的所有節點都達成一致。

P2P網路傳播的示意圖如下:

我們會在後續的文章中詳細介紹比特幣P2P網路的工作機制,包括節點分類、節點發現、節點連接和廣播等。

由於篇幅有限,前文介紹了比特幣的三大基礎概念,包括區塊鏈、挖礦與P2P網路,然而比特幣是個龐大的系統,初學者可能對方方面面都有疑問,這涉及到如何防止雙重支付、智能合約、區塊鏈分叉、通縮特性、鎖定和解鎖腳本、交易的Merkle樹存儲、交易的存儲格式、區塊鏈被攻擊的概率、挖礦難度與挖礦成功時間、更多的共識機制、創幣交易和轉賬交易、比特幣的性能、不同類型的挖礦節點、以及比特幣的應用場景等。

筆者曾經鼓動小夥伴們加入我的比特幣和區塊鏈技術研究微信群,

那時候比特別才5000塊,是人民幣呀 :) 這是一個自由的分享群,每人都參與發言,任何人可以拋出問題,接下來問題是這個樣子的,一共有50多個問題,oh..my gosh,多嗎?不少?想了解答案嗎?想!那就立即跳過問題看後面我分享的材料,看完秒懂這些問題,讓你理解比特幣和區塊鏈不留死角,是在吹牛嗎?嗯,也許不是,看吧,看完真的秒懂 。

  • 比特幣在哪裡?

  • 比特幣多少錢?

  • 如何購買比特幣?

  • 現在有哪些區塊鏈交易平台?

  • 比特幣安全嗎?

  • 比特幣如何保存?

  • 比特幣是世界貨幣嗎?

  • 比特幣和區塊鏈的關係?

  • 比特幣是誰發明的?

  • 中本聰是誰?

  • 比特幣一共有多少個?

  • 現在已經挖了多少比特幣了?

  • 產生比特幣有多少途徑?

  • 哪個國家承認比特幣?承認比特幣嗎?

  • 挖礦是什麼?如何挖礦?

  • 都誰可以挖礦?

  • 怎麼驗證一個礦機挖到礦了?

  • 密碼學的基本原理?演算法加密、對稱加密、非對稱加密。

  • 比特幣的私鑰、公匙、公鑰哈希、錢包地址都啥關係?

  • 什麼是智能合約?

  • 為什麼要沒10分鐘挖礦成功一次?如何保持每10分鐘一次,而不是20分鐘一次?

  • 區塊是怎麼連接一起的?又怎麼防止篡改的?

  • 挖礦的難度值是怎麼確定的?怎麼調整的?

  • 比特幣為什麼是通縮的?比特幣挖完了咋辦?

  • 共識機制包含哪些?pow、pos、dpos

  • 比特幣交易是怎麼達成的?包括生產交易和轉賬交易

  • 區塊頭的結構?區塊頭是如何互相串聯成鏈的?

  • 交易是如何存儲的,又如何加入一個塊的?

  • 賬本在哪裡?如何獲得和存儲賬本?賬本有多大?

  • 什麼是Merkle樹?如何驗證交易?

  • 比特幣真的是去中心化嗎?

  • 比特幣如何使用P2P網路?

  • 比特幣的性能如何?每秒只能做7筆交易,交易確認速度真的是10分鐘嗎?

  • 什麼是軟分叉和硬分叉?

  • 什麼是50%攻擊?

  • 公共的賬本為什麼說沒人能更改得了呢?

  • 比特幣錢包都有哪些rest api可用?

  • 一個人如何證明自己就是某個地址的擁有者?

  • 比特幣與虛擬貨幣的關係?比特幣與法幣的關係?

  • 什麼是共有鏈、私有鏈、聯盟鏈?

  • 什麼是側鏈、染色鏈?

  • 什麼是萊特幣、狗狗幣?

  • 區塊鏈除了應用在比特幣還有哪些應用場景?

  • 區塊鏈是一項創新嗎?

  • 比特幣p2p網路節點都有哪些類型?

  • 比特幣交易是如何收費的?根據交易數量、金額還是?

  • 那麼大的賬本每個節點都要下載嗎?

  • 比特幣錢包真的有錢包嗎?什麼是紙錢包?

  • 比特幣如何保證交易的匿名性?交易所又是如何進行實名認證合規的?

  • 中本聰是如何用數學上的泊松定理證明交易的被攻擊的概率的?

  • 比特幣還有bug嗎?

  • 比特幣一筆交易有多大的限制?

  • 什麼叫支付到腳本?什麼叫支付到公鑰哈希?

  • 大家站在擴容派還是保守派的一端?

本文從比特幣和區塊鏈技術的背景說起,介紹了比特幣和區塊鏈技術的來龍去脈,然後,為讀者講解了區塊鏈技術的核心原理,這包括密碼學原理、智能合約、P2P網路、解鎖腳本等,最後提供了筆者在區塊鏈研究群里收集的初學者常見的問題,並嚮導讀者帶著這些問題去閱讀筆者提供的資料。閱讀完這本書,並讀完筆者提供的資料,無論你是技術人員還是業務人員,無論你是初學者還是有一定的基礎,都會對比特幣和區塊鏈的技術原理有更深入的認識和理解。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦