比特幣以及區塊鏈原理學習


  2018年春節過后區塊鏈技術一下子火爆起來了,本人也對該技術十分感興趣,因此想研究下區塊鏈技術的原理,看看區塊鏈背后那些技術值得去研究。由於自己缺乏實際的開發經驗和使用經驗,文中難免會有些理解不到位,本文主要的目的還是想將最近的學習梳理總結一下。

一、概述

  比特幣是存儲在計算機里一枚貨幣,計算機存儲的本質就是一串數字,那么存儲比特幣的這串數字為什么就可以等同於真正的貨幣呢?而且比特幣讓人感覺很像黃金,不管這黃金從什么渠道獲取(從沙子里掏的,還是自己購買的),人類都會認同它的財富價值。

說到比特幣很多文章總結它的特點,例如:去中心化啊,記賬系統,安全性好,不過它有什么特點,大家現在幾乎都公認比特幣可以等同於貨幣,但是比特幣這種貨幣是有別於現實社會中的各國央行發行發行的法定貨幣,法定貨幣的一大重要特點就是需要一個權威的機構(一般是指代表國家的央行)來發行貨幣,法定貨幣的價值是由老百姓認同國家的權威性來體現的,不管怎么說法定貨幣是一種中心化的發行貨幣機制,法定貨幣都會受到國家這個中心所控制和約束。比特幣的設計理念不同,它想通過一種沒有任何權威中心所左右的方式發行貨幣,讓貨幣只包含經濟價值的本質屬性。

  比特幣的價值體現方式是通過交易的記賬流程來體現的,具體過程如下圖所示:

 

  支付交易從產生一直到最后支付交易被成功寫入了區塊鏈,這樣支付交易才會被真正確認,比特幣的貨幣價值在這個過程中被體現,公司貨幣的發行也在這個過程中進行。

  這張流程圖可能會讓很多人費解,為什么本人會說它體現了比特幣的貨幣價值?本人之所以這么概括,主要包含下面的理解:

  1. 該流程包含了比特幣的發行,流通,交易的全過程;
  2. 該流程是在沒有中心機構參入的情況下進行的,但是該流程和現實貨幣的價值使用一樣的權威有效。
  3. 完整理解了該流程就可以理解比特幣可以等同於實際的法定貨幣的道理了。

  下面本人將一個一個環節的解釋該流程。

二、支付交易

  比特幣里如何完成支付交易了,下圖是中本聰論文里的交易流程圖,如下所示:

 

 

  說到支付交易就牽涉比特幣原理之一的非對稱加密以及數字簽名技術。在比特幣的知識范疇里有一個錢包的概念,錢包的本質就是一對非對稱加密的公鑰和私鑰,如果我們把比特幣的使用映射到現實的使用者即人,那么公鑰就是這個人對外的唯一身份標識,私鑰則是使用者開啟錢包使用比特幣的鑰匙。公鑰是對外公開的,在比特幣的規則里公鑰即代表了網絡里錢包使用者的地址。

  按照比特幣的規則定義,公鑰的長度是512個字節,為了方便公鑰在網絡上的傳播,公鑰要被轉化為160位的數字指紋,數字指紋是二進制編碼,轉化為字符串就是2635位的字符。

  那么假如AB支付比特幣,那么A就得要知道B的地址,這樣A才能把比特幣發送給B。下面我將描述下這個支付的流程,具體如下:

  AB支付比特幣的交易即A的地址向B的地址轉移比特幣的過程,下面我們舉例說明:

  首先是AB發送數據,這些數據包含如下內容:

  • 上一筆交易的 Hash(你從哪里得到這些比特幣)
  • 本次交易雙方的地址
  • 支付方的公鑰
  • 支付方的私鑰生成的數字簽名

  B收到信息后進行相關驗證,驗證過程如下:

  第一步,找到上一筆交易,確認支付方的比特幣來源。

  第二步,算出支付方公鑰的指紋,確認與支付方的地址一致,從而保證公鑰屬實。

  第三步,使用公鑰去解開數字簽名,保證私鑰屬實。

  驗證無誤,B認為該交易是可以執行,注意:這里只是認為該交易可以執行,並沒有確認該交易有效成功。

  從支付交易的傳輸數據和驗證流程我們可以看到,比特幣的支付過程中主要是使用到了支付方即A的交易數據信息以及A的公鑰和私鑰,被支付方即B只是做驗證操作的有效性而已,被支付方B自己的公鑰、私鑰以及交易信息都沒參入支付過程,因此我們可以認為私鑰和公鑰主要是用於把比特幣用花出去的場景。

  如果想要交易最終被確認成功,接下來被支付方B就要將該筆交易廣播到全網去了,如是流程進入到了交易廣播的階段。

三、交易廣播

  本人認為從交易廣播開始,就進入了時下很火爆的區塊鏈技術范疇了,因為廣播出來的交易最終都會被網絡里的礦工(礦工即是區塊鏈分布式系統下的各個子節點)接收,作為礦工創建區域鏈區塊的輸入。這個過程比較簡單,只是數據的傳輸,但是對於技術實現而言就是技術的難點之一,因為此塊技術包含了編程領域里比較復雜的網絡通訊技術和高並發技術。不過如果把交易廣播作為區塊鏈的輸入來理解,那么這里還牽涉跟輸入相關的一個重要技術那就是時間戳服務器,時間戳服務器的作用是給同一時間下的交易加上一個時間維度的標識,有了時間戳,我們就可以確定在某個時間點該交易一定發生過。

  時間戳服務器在中本聰的論文里是這么定義:

    時間戳服務器通過對以區塊(block)形式存在的一組數據實施隨機散列而加上時間戳,並將該隨機散列進行廣播,就像在新聞或世界性新聞組網絡(Usenet)的發帖一樣。

    由此定義我們可以知道時間戳是對新產生的交易記錄按時間維度分組,這樣就保證每條實際發生的交易都能正確的被保存下來。

  時間戳服務器的作用對於比特幣的貨幣價值至關重要,這里我舉一個例子:在傳統的交易里往往是沒有時間維度的概念,沒有時間維度的交易往往會影響到交易的信用評價,例如:甲方和乙方賬戶里各有100塊錢,一天甲方向乙方賬戶打入了10塊錢,第二天乙方賬戶又向甲方賬戶打入10塊,最終甲乙雙方的賬戶任然是100塊,如果交易過程沒有被記錄,那么我們就很難追溯其中的交易行為,假如甲乙雙方進行了違法的交易,最終在檢查前讓賬戶平衡,那么危險的行為就會被藏匿。因此時間戳服務器給比特幣的交易提供了一種正向的不可逆的交易流程,這就讓比特幣的區域鏈技術達到了行為可追溯的功能,能解決溝通中信息不對稱的問題,這就是區塊鏈技術能被應用到其他領域一個重要原因。

  交易廣播后就是交易寫入區塊的過程了。

四、交易寫入區塊

  交易最終被確認就是要將交易寫入到區塊鏈里,而區塊鏈是由一個個區塊串聯起來的,區塊才是記錄交易的實體,因此要寫入區塊鏈,首先要將信息寫到區塊里。那么區塊是如何產生的呢?

區塊的產生是有網絡中一個個礦機來完成。但是礦機要產生一個新區塊並沒有那么容易。這里我們首先講下區塊的數據結構,區塊分為區塊頭和區塊體,區塊體里存儲的就是一條條的交易記錄,這些交易記錄都是被支付方例如B廣播到網絡中去的交易記錄。

在比特幣系統里一個塊的大小本指定為1mb,一筆交易大概500個字節,因此一個區塊大概可以存儲2000筆左右的交易。區塊的里最關鍵因素在區塊頭里,區塊頭里有該區塊的很多特征值,比較關鍵的有

  • 區塊生成時間
  • 區塊體的Hash
  • 上一個區塊的Hash

  以上值都是外部獲取的,除此之外區塊頭還包含一個難度系數difficultyNonce的隨機數,礦機系統里還有一個固定的常量值。這里有個公式:

      target = 固定的常量值/difficulty

  由此可見難度系數越大,target的值就會越小。礦機會對區塊頭的數據進行hash計算,hash的結果是一串二進制數字,如果最終的hash結果要小於target那么該區塊才會被認為有效區塊,這個有效區塊才能被同步到區塊鏈里,但是計算出一個有效的區塊可沒有那么容易,需要反復的計算才能得到最終結果。可是由於一個區塊特征屬性一般都是固定的,為了讓每次區塊頭的每次計算出來的hash值都不同,每次無效的hash結果計算后,礦機程序就會動態調整Nonce的值,讓最終hash的值發生變化。Nonce是一個32位的二進制數字,因此它的取值范圍就是021.47億。那么命中target就是一個窮舉的數學過程了,一個礦機可能幸運很快算出來,也有可能算滿了21.47億次都不能命中,這時候框架就得重新同步區塊鏈數據,重新計算。這就是區塊鏈技術里的工作量證明,可見一個區塊產生是相當的麻煩和困難的。

回到區塊產生的講述,由上面流程,我們發現一個區塊的產生是非常耗費資源即耗費計算機的算力和電力資源,那么為什么礦機都樂此不疲的想產生區塊呢?這是因為每產生一個區塊的經濟獎勵是非常誘人的。

  中本聰是這么來設立生成區塊的獎勵的,比特幣系統是2008年運行的,當時產生一個有效新區塊的獎勵是50個比特幣,這個數值每4年減半,也就是說到了2012年后就是25個,2016年后就是12.5個,現在是2018年就是一個新區塊的獎勵就是12.5個,而時下的比特幣價格都超過了1萬美金,這個收入是極其可觀的。從這個規則我們也可以發現比特幣的總有一天是不會在增加的,到了新區塊不給新比特幣獎勵,那么這時就沒有礦可以挖了,為了激勵框架繼續挖礦,中本聰還建立了另外一種獎勵措施那就是手續費,區塊是記錄交易,每個交易被記錄都是要付費的,而且每個區塊都會根據手續費的高低排列交易,那么沒給手續費的或者手續費很低的交易往往很難寫入到區塊,也就是最終很難寫入到區塊鏈,交易就會很難成立,這就可以讓礦機有無限動力挖礦。

  新區塊誕生會獎勵比特幣,這就是比特幣發行的流程,這也就是人們為什么會樂此不疲的做礦工的原因,有巨大的利益驅使的。

  新區塊產生了就要將新區塊加入到區塊鏈里了。

五、區塊寫入區塊鏈

  新區塊並不是簡單的加入到區塊鏈的,因為區塊鏈是一個沒有中心管理員的分布式數據庫,那么不可能有個權威機構來做加入鏈條操作的,新區塊加入到區塊鏈的過程是一個集體協商的過程,具體的過程如下:

  礦機成功產生了一個區塊,礦機就會把該區塊在全網進行廣播,有完整區域鏈數據備份的服務器就會接收到該信息,並將新的區塊加入到區塊鏈的末尾。及時新的區塊加入到了區塊鏈的末尾也還沒有說明新區塊加入區塊鏈是成功的,這里我們把成功加入區塊鏈的區塊給個名字叫做節點,只有新區塊被加入到了最長的鏈條即最正宗的鏈條才能叫做節點,這個規則產生的原因是因為在相同時間下可能會有多個新區塊加入到區塊鏈,到底那個才是有效的,需要一個判定機制,這個機制一般是那個新區塊最先獲得了連續的6個新區塊,那么該鏈條就是正宗鏈條,即可確定該區塊為區塊鏈的一個新的節點了。

  不過一個新區塊加入區塊鏈的時間間隔是被嚴格控制的,比特幣系統里是每10分鍾才有一次機會把新區塊加入到區塊鏈里,在加上后續需要6個新區塊加入氣候才能最終確認區塊鏈的新區塊加入成功,這就說明一個交易被確認成功最快也需要1個小時左右,我們還可以這么算下,一個區塊存儲最多2000比交易,10分鍾也就是600秒,平攤下來1秒鍾比特幣系統也就只能處理35比交易,這也就是比特幣交易時間長的一個重要原因。當然時間間隔之所以設立還有一個重要原因,限制區塊的產生的數量,控制新區塊的數量也就是控制比特幣的總量,也就是說比特幣的總數量其實是固定的,總有一天會發完的。

  交易被成功寫入區塊鏈后,被支付方B同步區塊鏈的數據,B如果在區塊鏈里找到了自己的交易記錄,那么交易就被認為有效。

  以上就是比特幣的完整交易流程了。

六、總結與疑問

  由以上對於比特幣原理和流程分析,我們就可以理解比特幣為什么能等同於法定貨幣了,本人認為理由如下:

  1. 比特幣的唯一性,比特幣在網絡里是唯一,而且這種唯一性很難被篡改;
  2. 比特幣的總量恆定,比特幣不會發生通貨膨脹的問題,因此比特幣有保質的作用,這個跟黃金很類似;
  3. 比特幣的安全性很高,比特幣是基於記賬原理來產生價值,比特幣的交易情況是全網透明的,每筆交易都可以追溯,而且交易記錄機制安全可靠,很難有外部的非理性原因影響到比特幣的價值。

  這里還有一些疑問需要重點說明下:

  問題一:比特幣為什么很難被篡改?

  這主要是比特幣產生的載體區塊是非常難以產生的,需要大量的工作流證明,而且區塊的有效性又是和區塊鏈里該區塊的下游區塊相關,如果要篡改一個比特幣,那么跟該比特幣交易相關的下游區塊都要更改,這就倍增篡改比特幣的難度。當然理論上如果有實體掌握了區塊鏈全網51%的算力是可以篡改比特幣的,但是在公網下這種情況基本很難實現,不過要是區塊鏈做成私有的這就很難說了,私有的區塊鏈引入了中心機構,但是這樣的區塊鏈就不是真正意義的區塊鏈了。

  問題二:為什么現在挖礦是越來越難了?

  挖礦其實就是在做hash運算,我們知道產生一個新區塊需要大量的hash運算,只有擁有強大算力的實體才能獲得先機,工作量證明的hash運算從CPU發展到GPU到現在的基於硬件的專業化的礦機,因此普通人很難有那么大的財力在算力競爭下獲勝,所以個人挖礦目前是一件幾乎無法完成的事情了。

  問題三:區塊鏈為啥現在會特別火?

  這個問題我沒法回答,其實區塊鏈目前很火還是一種炒作,畢竟區塊鏈技術除了比特幣還沒有什么重量級的應用出現,但是區塊鏈技術里面的很難更改的記賬系統機制是非常有前景的,目前國家,大型企業都涉獵其中,相信區塊鏈的前景是非常不錯的,這也是本人為什么花精力研究區塊鏈的原因所在。

七、區塊鏈的相關技術

  研究區塊鏈的原理還是想為自己做技術研究做准備,這里大概總結下自己學習中發現的區塊鏈的一些底層技術,具體如下:

  1. 非對稱加密技術,這個使用開源技術即可;
  2. Hash計算的技術,主要是SHA技術;
  3. 數字簽名或者叫做數字指紋技術,這個其實也是HASH技術,不過HASH出來的值一般是二進制,很難傳播,因此需要一些簽名技術將二進制轉化成可以閱讀的字符技術,例如把公鑰變成地址(字符串),這里應該牽涉到一些字符置換的技術例如Base58
  4. P2P相關的網絡通訊技術,分布式系統里的一個節點如何廣播信息,節點如何輪詢接收廣播出來信息的技術,還有就是同步區域鏈數據的技術;
  5. 跟區域鏈相關的各種算法了,例如工作量證明的算法,Merkle樹的算法等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM