區塊鏈原理

莫名私下裡發表於2019-12-26

轉載 連結:https://www.cnblogs.com/sharpxiajun/p/8530...
一、概述
  比特幣是儲存在計算機裡一枚貨幣,計算機儲存的本質就是一串數字,那麼儲存比特幣的這串數字為什麼就可以等同於真正的貨幣呢?而且比特幣讓人感覺很像黃金,不管這黃金從什麼渠道獲取(從沙子裡掏的,還是自己購買的),人類都會認同它的財富價值。

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

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

     >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     |                                                   |
     | 支付交易 --> 交易廣播 --> 交易寫入區塊 --> 區塊加入區塊  |
     |                                                   |  
     >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

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

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

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

Linux

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

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

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

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

  首先是A向B傳送資料,這些資料包含如下內容:

上一筆交易的 Hash(你從哪裡得到這些比特幣)
本次交易雙方的地址
支付方的公鑰
支付方的私鑰生成的數字簽名
  B收到資訊後進行相關驗證,驗證過程如下:

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

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

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

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

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

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

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

  時間戳伺服器在中本聰的論文裡是這麼定義:

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

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

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

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

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

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

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

區塊生成時間
區塊體的Hash值
上一個區塊的Hash值
  以上值都是外部獲取的,除此之外區塊頭還包含一個難度係數difficulty和Nonce的隨機數,礦機系統裡還有一個固定的常量值。這裡有個公式:

      target = 固定的常量值/difficulty

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

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

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

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

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

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

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

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

  交易被成功寫入區塊鏈後,被支付方B同步區塊鏈的資料,B如果在區塊鏈裡找到了自己的交易記錄,那麼交易就被認為有效。

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

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

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

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

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

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

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

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

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

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

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

相關文章