1. 程式人生 > >乾貨|區塊鏈技術入門——比特幣執行及交易原理剖析(分享實錄)

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

image

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

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,如果監管得當的話完全能代替全球所有的證券市場和交易所,因為區塊鏈是一個全球的東西。

然後是共享經濟,比如閒置了什麼東西,都能通過網路共享出來。這個共享除了我們熟知的那些以外,還可以是網路、儲存、算力,我可以作為一個節點,通過區塊鏈技術,根據自己完成任務去證明工作量,獲得一定的報酬,另一方面也實現了資產最大化利用。

還有物流跟蹤等方面,比如產品跟蹤、產品資料安全等,就不再展開贅述。

以上就是本次分享的全部內容,希望對大家有所幫助。

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

本文編輯:Cynthia

以下是我們的社群介紹,歡迎各種合作、交流、學習:)

image

點選“閱讀原文”即可回聽本課程