乾貨|區塊鏈技術入門——比特幣運行及交易原理剖析(分享實錄)

image

我一直從事服務端的開發工做,對各類計算機技術都有比較濃厚的興趣,從去年五六月份開始接觸區塊鏈技術,感受和互聯網以及傳統軟件開發相比,區塊鏈有一些新的東西,甚至是一些顛覆性的創新,雖然技術方面仍是基於現有的技術,但其應用和設計思想簡直是腦洞大開。node

1

特  性

區塊鏈技術從比特幣開始到如今已經存在了九年多將近十年,爲何這兩年開始特別火,幾乎全部人都知道了,由於春節的時候被一些大V和VC着重炒了一把,怎麼創新、怎麼投資等等,將區塊鏈推向了風口,你們開始瘋狂地關注。算法

區塊鏈到底有什麼顛覆性的特色呢?編程

image

去中心化安全

它理論上是徹底去中心化的,意思是說不像傳統行業那樣有一個本身的服務器和數據中心,數據、權限、帳戶、餘額也都集中在一箇中心手裏。比特幣是徹底去中心化的。服務器

無需信任微信

你不須要對上面的任何節點,好比誰支付給你了,你支付給誰了,你不須要對他們有任何的信任,不須要徹底信任他們,也不須要認識他們,也沒有人給你作擔保,全部的交易過程都是經過密碼學的技術去擔保的,只須要信任這個技術。網絡

匿名框架

好比去銀行開戶,確定須要身份證、實名制等,一查就能知道你的信用記錄和資產狀況。可是比特幣帳號是你本身申請的,只有你有,別人根本查不到你,除非你去交易所進行交易和銀行帳戶關聯了,那就另說了。區塊鏈

2

比特幣發展簡史

在前幾年提及區塊鏈就約等因而比特幣,如今由於應用多了,推的也比較多了,各類各樣的智能合約和新的鏈出來,咱們要想鏈接,就要了解區塊鏈這個技術自己是怎麼運行的,怎麼去保障裏面每一個塊之間的內容是可信的。由於比特幣是第一個成功的,也是運行時間最長、影響力最大的區塊鏈應用,因此咱們經過研究比特幣來理解區塊鏈。編碼

大概簡單介紹一下比特幣的發展簡史。

image

  • 2008年12月,一個叫中本聰的人發表了一篇論文《比特幣——一種點對點的現金系統》。

  • 2009年1月,中本聰挖出了第一個區塊,就是創世區塊,這個區塊產生了50個比特幣。

  • 2010年5月22日,產生了第一筆交易,一個技術狂熱者花了一萬比特幣去買了一個披薩,真正地將比特幣和實物關聯起來,比特幣在這一天真正地有了價值。

  • 後來比特幣經歷了不少次分叉、升級和bug修復。

3

區塊鏈·比特幣

image

區塊鏈是一個全球化的網絡,全球任何一個節點均可以加入進來,並且是無中心的,這正是P2P網絡的一個特性。P2P網絡雖然可能沒有作過相關的開發,但你們應該都用過其中的技術,好比迅雷下載,這就是P2P網絡,好比我發一個種子,廣播出去以後你們可以根據一個相似哈希值搜到我廣播的東西,而後你們就能傳播出去,而後就有五我的從我這兒下載,再發出去以後又有其餘人從咱們六我的這兒下載,就是這樣一點點傳播出去的。

區塊鏈就是創建在這樣一種P2P網絡的基礎上,經過一些共識機制來保證無中心的區塊鏈能產生一些共同的你們都認定的標準,好比誰去寫這個塊、誰去作交易、交易怎麼進行等等,而後有人作完一件事以後,你們用相同的標準去驗收,若是是合格的,就繼續進行,若是是不合格的或者是錯的,就把它扔掉。

P2P網絡+共識機制,基本上就已經構成區塊鏈的框架了,可光有框子仍是沒有任何價值的,它須要承載一些東西。比特幣其實就是在裏面存了一個數,而後數轉來轉去,至關於就是一種貨幣,再加上帳號餘額系統和交易策略,才組成比特幣系統。

4

比特幣區塊

image

如圖所示是比特幣的一個區塊,後一個區塊在前一個區塊的基礎上,把固定的幾個值經過哈希算出來,存在如今這個區塊裏,做爲區塊頭的一部分,後面的區塊也會這樣作。

哈希你們應該都有了解,一個完美的哈希算法應該有三個特性:

  • 無論是在任何各個地方、任何計算機只要用同一個算法,相同的內容,確定獲得一樣的結果。

  • 不相同的內容,儘可能別獲得一樣的結果,也就是哈希碰撞越低越好。

  • 不能經過獲得的結果反推出原來的值。

上圖中只列出了四個東西,實際上是比這四個東西多一些,咱們只須要關注這四部分就能夠:哈希值、時間戳、隨機數和默克爾樹。

前一個塊的這四個值的哈希值加一個時間戳(就是當前你挖這個塊的時間,固然它容許必定的晃動範圍),還有一個隨機的數,由於其餘幾個值,好比前一塊的哈希值、時間戳變化的範圍比較小,我若是作一些工做量的任務,須要去向別人證實個人工做量的話,要經過不停地改這個隨機數去算這個哈希。

比特幣每一個塊裏都有交易,它會把每一個塊裏的全部交易組成一個默克爾樹。默克爾樹是怎樣的呢?它如今也是用的哈希值,就是把交易按照必定順序排列出來,第一個節點和第二個節點算一個哈希,而後往上,這兩個節點往上的算一個父節點,如上圖右邊,就是兩個交易的哈希再哈希。這樣一層層一直往上算,就是一個平衡二叉樹。

全部的區塊,第一個區塊確定是創世塊,創世塊在全部礦機節點或錢包節點裏是原生自帶的,不會在網絡上傳播,後面的全部塊都是經過創世塊的哈希值一塊塊連起來的。每一個塊裏除了這四個值以外,還有塊的高度,以及工做量證實的難度等。

5

共識機制

image

什麼是共識機制?之前咱們作的任何系統歷來沒有說過有什麼共識機制,由於都是中心化的系統,什麼時間誰來寫入已經提早定好了,不會說爲了公平去選什麼節點之類的。共識機制其實就是整個網絡約定好了,咱們按什麼樣的東西去證實,誰有能力去出下一個塊,以及如何驗收這個塊是正確的,不是誰有權限就能夠隨便更改塊的大小,還有包括獎勵等等,還有難度係數等你們普遍承認的標準的。

在區塊鏈裏,共識機制首先就是得選出誰有權利去記這個帳。比特幣裏用的是比較粗暴的方式,就是塊頭裏有一個難度,你經過不斷修改隨機數去算這幾個數字的哈希值,求得的值比要求的難度數要小,就證實你能夠有權利記帳。

並且就算你拿到了記帳的權利,也不能隨意改變塊的大小,每一個塊的大小和獎勵都是有標準的。這個塊的大小在如今的共識機制裏是1M,在最初的時候中本聰沒有限制塊的大小,後來有不少人頻繁地在網絡中作一些額度特別小的交易,至關於把塊搞得很大,網絡都撐不住了,後來中本聰就調整了一下塊的大小爲1M。到如今爲止,整個比特幣若是把全部節點都down下來的話,有100多G,在當時估計整個網絡能承受的數據也基本就是這個量級了。

算哈希值的過程就是一個暴力的破解數學難題的過程,至關於扔色子,隨機扔,假若有一個一萬面的色子,每一個機器十分鐘能扔一次,只要誰扔到那個點小於等於10,就有權利記帳。那是否是扔的人越多,出來這個塊就越容易呢?若是不限制難度,永遠是10的話,真的有10萬個機器,就一分鐘出一個塊,網絡就可能會產生不少衝突,甚至會癱瘓。這種狀況就須要調整個難度,讓色子的值小於等於一便可。

因此爲了整個網絡的穩定,好比如今規定是十分鐘出一個塊,每兩週,也就是每2016個塊以後會調整難度。其實就是拿前2016塊的時間平均起來和10分鐘相比,若是這個平均時間大於10分鐘的話就調小難度,若是時間小於10分鐘就調高難度。這個難度也會做爲別人驗證所挖出區塊是否合法的一個條件,也就是說若是一個塊廣播到網絡中,可是別人認爲難度沒有達到共識機制中的那個難度,就會直接把這個塊扔掉,不會在這個塊的後面進行記帳工做。

爲了鼓勵你們積極挖礦,也爲了創造比特幣,挖出塊以後會有必定的獎勵,初始獎勵是50個比特幣,就是每挖一個塊產生50個比特幣,它用程序和算法來限制,每21萬個塊,獎勵會在原來的比特幣基礎上減半,這是一個求極限的問題,很容易算出來極限就是2100萬個比特幣,大概在2040年左右剩下最小單位不能除以2了,這時就不會再去獎勵了。

6

挖  礦

image

比特幣裏把挖塊的行爲叫挖礦,挖礦的機器就礦機,挖礦的節點叫礦工。爲何那麼多人喜歡挖礦?前面提到了,其實就是爲了獲得CoinBase,就是出塊獎勵,以及打包塊的交易產生的手續費。

挖礦是怎麼開始的呢?礦機會收集網上的交易,驗證交易是否合法,而後把交易放到內存裏,有一個未成交交易集,這時候你收到一個新的塊,其實你此時正在上一個塊的基礎上挖,收到新塊說明你在此輪的競猜中已經輸了,最優的策略是馬上在這個新塊的基礎上挖下一個塊,因而就從內存交易集裏選擇手續費最高的一部分按照大小要求打包成一個1M的塊,而後進行計算,經過不斷修改隨機數,力求算出一個小於當前給出的難度數的值,暴力破解這個數學難題,若是成功了,就能夠拿到打包交易的權利,成功挖出一個塊,而後經過P2P網絡廣播出去,讓其它節點驗收。

挖礦以前用的是CPU,可是由於這些CPU一直在佔用率近乎100%地運算sha256,須要耗費不少電費,成本愈來愈高,因而你們開始使用GPU,後來發現GPU速度不夠,就換成FGPA,就是一種可編程的通用芯片,到最後使用ASIC,其實就是一種專用芯片,只會算sha256算法,這種狀況就至關於把sha256算法的代碼用各類語言寫成算法,作成硬件,這是最省電的,並且爲了利益最大化,礦機會集中部署在電費成本比較低的地區,由管理公司統一管理,造成所謂的礦池。

礦機其實就是一個主機,有一個操做系統,裏面是一個完整的節點,每臺礦機經過USB或者其餘接口連着不少礦機,這樣最省電,前段時間各類媒體說幾乎百分之七八十的算力都在中國,形成了大量的能源浪費等,其實這其中各有利弊。好比中國對外售出礦機,能帶動中國經濟的發展,但這種算力浪費會致使能源浪費和環境破壞是其弊端。

就其對於比特幣自己而言,這種挖礦硬件是有好處的,比特幣一開始發明的時候想用通用的硬件讓你們去挖,後來你們發現用專用的硬件去挖對比特幣的穩定性更有好處。若是通用硬件的話,忽然有一天來了一個經濟收益更好的幣你們可能就都去挖那個了,而專用硬件是隻能挖比特幣的。

7

分  叉

image

比特幣是在一個全球化的P2P網絡上,節點之間確定會有延遲,這麼多節點可能就會出現兩個節點同時挖一個塊的現象,就會產生衝突,比特幣的共識機制裏並無寫清楚衝突要怎麼解決,一旦發生這樣的狀況只能是你們以爲那個是好的就去跟隨他,在他後面繼續挖礦,正常的礦機都會選擇在最長的鏈後面繼續,這是一個博弈的過程。好比我支付給誰一個比特幣,可能被一個礦機馬上就打包到區塊裏了,但我不能馬上把這個東西給他,由於若是出現一個增加更快的分叉鏈,可能會把這個鏈幹掉,這個交易就會被廢棄而失敗。廣泛認爲是在六個區塊以後,這個交易就算基本穩定了,正常狀況下六七個區塊打包完成後被推翻的機率就很小了。

分叉分爲軟分叉和硬分叉。

硬分叉就是我把共識機制改了,重新的節點開始我認你以前的那些節點,可是以前的那些礦機並不認我這個新的共識機制,由於你們都互不相認,這種狀況就至關於在某個節點以後,全部節點基於新的共識機制和舊的共識機制,分道揚鑣,產生了一個分叉。

軟分叉是共識機制沒有變,通常用途是在硬分叉以前,改一個微小的東西不影響共識的操做,讓礦機投票,要不要去硬分叉,用哪一種方式去分叉等,礦機以爲哪一個好,挖礦時就把操做符改爲對應的那個值就好了,而後到某個塊的高度以後,再根據你們投票的結果,看到底要不要硬分叉,這是經過軟分叉的操做位來實現的。

惡意分叉最多的可能就是雙花攻擊。新幣種就是剛纔說的那種,用一個新的共識機制,在比特幣上拉一個新的幣種。這些對比特幣都是有損害的。

8

錢  包

下面開始講比特幣交易,交易的話就要有錢包和帳號了,一個帳號怎麼來的,比特幣裏其實並無帳號的概念,錢包多是一個徹底節點,也多是一個輕量級錢包。

image

首先用錢包生成一個私鑰,這個私鑰其實就是一個很大的隨機數,比特幣也不會去驗證你的私鑰別人用沒用,它的理論是認爲這個碰撞是沒有的,這也是比特幣安全的一個基礎。

這個私鑰經過非對稱加密算法,算出公鑰,在公鑰的基礎上通過兩次不同的哈希算法,算出一個公鑰哈希值,再經過一個Base58Check編碼,就是一個你們好比容易讀的字符串,這纔是一個比特幣地址

因爲私鑰不存在於區塊鏈上,並且花錢時須要用它簽名,若是你把它丟了,相對應地址裏的錢就永遠花不掉了。

9

UTXO

比特幣是怎麼在這個區塊裏產生的?由於這是交易的基礎。它的產生只有一個途徑,就是挖礦對礦工的獎勵。

image

塊的交易裏有一個特殊的交易叫CoinBase交易,就是隻有輸出沒有輸入,輸出的地址就是礦機的地址。可是並無一個帳號去存比特幣的餘額,帳號的餘額存在什麼地方呢?就存在以前全部的把這個地址做爲輸出的那些交易裏,其中沒有花費的交易的金額合計就是這個地址的餘額。

可能有人會問這個值算起來容易嗎?其實從0開始算的話確定是難的,可是由於全部的礦機都是從第一個區塊開始一點點算出來的,因此每一個塊會把每一個塊的交易,還有用戶的交易,以及花費的未花費的交易都放在節點內存或硬盤裏,一直累計到如今這個塊的時候,就能知道這個帳號有哪些交易未花費,並很快就能查出來餘額是多少。比特幣這種餘額系統有個專有名詞叫「未花費交易輸出」,英文簡稱:UTXO

在比特幣交易中,一個交易能夠有多個輸入,也能夠有多個輸出。全部交易的輸入都指向以前把這個地址做爲輸出的交易,並且它限制了每一個交易只能被花費一次。好比我以前有一個未花費的交易輸出,額度比較大,此次要把它作一個小額的支付怎麼辦?在這種狀況下要作一個找零。就是說若是前一個未花費的交易有五個比特幣,此次要花一個比特幣的話,其實把其餘四個比特幣放在你的地址上,做爲一個輸出就能夠了。

其實比特幣並無限制找零的話必定要找給本身,也沒有限制必須找零。好比說我能夠有兩個錢包地址A和B,能夠在A地址找零給B地址,除了找零以外,交易輸出必須比那個輸入還得小一點,由於這個差值是給礦工的,不然就不會在網絡中傳播出去。在網絡擁堵的時候,最好把這個找零設大一點,礦工纔會優先把你的交易打包,若是很是小的話,可能永遠都打包不了,交易就沒辦法完成。

典型交易

下面看一個完整的交易流程

image

Rob要付0.3比特幣給他的朋友,他先掃一下他朋友錢包的二維碼,其實就是那個Base58Check編碼的地址,而後把要支付的錢和費用輸入進去,點擊發送,這個環節要花費以前未花費的那些交易,他錢包的那個節點會自動用私鑰簽名,而後變成一個交易,就是一段包含以前UTXO解鎖腳本和輸出鎖定腳本的信息,把這些交易信息傳播到比特幣網絡上,被臨近的節點驗收並傳播,礦工收到後把交易打包好放到區塊中,即表示挖礦成功,他把挖到的塊廣播到網絡上,其餘的節點來驗收這個結果,而且再次傳播這個交易,通過六個塊之後,交易就被認爲是可信而穩定的,對方就能夠認爲收到了這筆交易。

10

交易簽名

image

所謂的未花費交易就是別人給你的錢,他會在交易裏有一個支付的解鎖腳本,這個解鎖腳本必須得用你的簽名和你的公鑰才能解鎖,這裏用的其實就是非對稱加密ECDSA就是用橢圓曲線來解一個數學難題。ECDSA非對稱加密比常見的RSA安全性和效率都更高。

非對稱加密其實很簡單,就是用私鑰作簽名,用公鑰來驗證這我的確實是我。還有一個用處是你用個人公鑰加密一個東西,而後經過網絡傳給我,只有用個人私鑰才能解開。比特幣裏其實只用了第一個用途,就是數字簽名

11

花費UTXO

image

比特幣交易內置一個非圖靈完備的腳本語言其實就是作一些交易相關的加解密,以及一些算法,好比這個交易是怎麼驗證的,標記這個交易是支付給哪一個地址的等等。要去花費這個交易的時候,**未花費交易中包含鎖定腳本,簽名和公鑰是解鎖腳本,兩部分拼起來,構成一份完整的腳本到執行環境裏去執行,**若是符合要求的話,說明你是這筆未花費交易的主人,能夠花費這筆交易,能夠轉給支付對象的地址。若是有未花費交易支出的話,它的簽名是放在花它的那個交易中的。至關於作了一個證據鏈,能夠一直往上進行驗證。

比特幣咱們只說了一個最簡單的交易,就是地址的交易,叫P2PKH。還有些信用條件的交易,以及根據一個腳本地址作的交易,這裏不展開介紹。

這個腳本語言支持多重簽名,好比五我的裏有四我的簽名了,這筆錢就能夠轉了,這個能夠用來作一些衆籌或資金託管方面的事情。

12

默克爾樹

image

**就是當前這個塊裏收到的全部交易,按照一個順序去排列,而後相鄰的節點往上一個個去算哈希,一層層最後算出一個根節點來。**若是正好不能被2整除怎麼辦?它會在後面補一個相同,至關於把一個值複製一份湊成一個偶數。

默克爾樹一是驗證了這個默克爾樹的根放在我這個塊裏,至關於全部的交易都已經固定了,若是某個節點修改交易,一驗證就能驗證出來,最終沒法獲得正確的根哈希。至關於這個塊全部的交易的一個指紋,不能在裏面作任何修改。

爲何不是把全部的交易直接算一個哈希就完了呢?這裏有一個巧妙的用處,它是爲了支持Spv交易驗證,就是輕量的客戶端的支付驗證標準,或者協議。好比輕量級錢包,只有當前節點,也就是當前區塊裏的四個值,沒有全部的交易,這樣的區塊頭只佔整個區塊的千分之幾,至關於這個錢包比一個徹底節點的錢包會輕不少。

這個輕量級錢包裏面沒有完整的交易信息,交易是否成功怎麼去驗證?好比說別人給我支付幣了,交易是多少,怎麼驗證這個交易已經被放在塊裏了,我能夠去網上廣播問,問相鄰的完整節點,他們會告訴我這個交易已經被打包在某個塊裏了,可是由於比特幣網絡是無需信任的,我誰都不能相信,你說打包進去了,怎麼證實呢?好比你給我一個區塊的高度,我只知道這個區塊的默克爾樹的根,這個完整節點怎麼讓你相信他呢?

好比左圖他會把HL和這個HMNOP、HLJ、HABCDEFGH這個幾個節點的哈希給你,而且把它們對應的路徑告訴你,這時你就能根據sha256往上去算,算出幾個虛的節點的哈希值,以及最後的根哈希,而後發現根哈希和你拿到的那個區塊的高度相同,就能驗證交易真的被打包進了這個塊,也就是說那個完整節點告訴你的是真的。

13

智能合約

區塊鏈,若是往裏放的是一個數字,並且還有交易協議和系統的話就是一個加密貨幣。若是放一個別的東西,就成爲另外一個別的平臺了,好比放一個智能合約。

image

智能合約是不可篡改的,並且是自動達成的,若是新增某個條件,好比時間、人數或錢數,達到這個條件後,會把代幣等有價值的東西自動轉移。

智能合約在區塊鏈以前就已經存在了,這是個概念性的東西,區塊鏈技術出來後,發現這是一個作智能合約的完美的載體,因此將二者結合起來。

14

分  類

image

區塊鏈根據應用範圍和公開程度可分爲三種。

  • 公開鏈。比特幣和以太坊都是公開鏈,任何人均可以做爲節點加入到網絡中來,均可以去挖礦。

  • 聯盟鏈。加入聯盟鏈是須要認證的,銀行之間可能造成好比結算系統之類的聯盟鏈。還有清帳系統、物流系統、或者溯源等,各個系統之間互相不太信任,就能夠用聯盟鏈來作,沒有任何一箇中心節點,而且經過加密技術保障你們是平等互信的。

  • 私有鏈,一個公司本身搭建一個鏈,各個部門加入其中,這個比聯盟鏈更小,不過基於企業內部的私有鏈其存在並無太大意義。

15

區塊鏈技術的應用

image

區塊鏈技術應用的話,在數字版權方面是很完美的,好比電子書,我只是把書的內容加密後放在鏈上,支付了纔有權限解密打開。而且經過一些硬件或其餘的技術限制你拿不到這個東西,至關於原版仍是在我手中,別人只能看不能拿走。還有音樂版權和數據交易,如今有不少數據交易所,至關因而你把數據賣給交易所了,它再賣一次仍是十次你是不知道的,這就是有中心的,並不可信。

顛覆性的應用應該是在金融方面,好比電子貨幣,跨國轉帳比原來方便不少,還有衆籌,智能合約很適合用來衆籌,固然還有一個I-C-O,若是監管得當的話徹底能代替全球全部的證券市場和交易所,由於區塊鏈是一個全球的東西。

而後是共享經濟,好比閒置了什麼東西,都能經過網絡共享出來。這個共享除了咱們熟知的那些之外,還能夠是網絡、存儲、算力,我能夠做爲一個節點,經過區塊鏈技術,根據本身完成任務去證實工做量,得到必定的報酬,另外一方面也實現了資產最大化利用。

還有物流跟蹤等方面,好比產品跟蹤、產品數據安全等,就再也不展開贅述。

以上就是本次分享的所有內容,但願對你們有所幫助。

image

HiBlock區塊鏈社區邀請您一塊兒搞事情~

一、一塊兒讀代碼 社區網址:http://hiblock.net/topics/node21 一塊兒讀代碼,好比從以太坊源代碼開始

二、一塊兒寫筆記 社區網址:http://hiblock.net/topics/node22 不積跬步無以致千里,每日寫500字左右關於我對區塊鏈的理解,或者針對某一個問題發表本身的觀點,由HiBlock公衆號統一篩選整理對外發布

三、一塊兒譯文檔 社區網址:http://hiblock.net/topics/node23 英文文檔、資訊有太多太多頗有價值的,咱們一塊兒來作知識的搬運工吧

當前一塊兒譯團隊的工做:Solidity官方文檔,參考Github倉庫,智能合約-Solidity官方文檔(1)

四、一塊兒磨課程 社區網址:http://hiblock.net/topics/node24 將專業技術知識分享給更多的人。能夠是一堂課的分享,也能夠是打磨一個系列課程。

若是您要報名以上哪一個活動,請添加微信小助手(baobaotalk_com),而後直接回複姓名+數字【可多選,如Bob 1/2/3】

image

內容來源:HiBlock區塊鏈課堂002期 崔超老師的線上分享《區塊鏈技術入門——比特幣運行及交易原理剖析

本文編輯:Cynthia

點擊「閱讀原文」便可回聽本課程

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息