區塊鏈學習筆記01--區塊鏈常識

Frank·Ming發表於2018-12-23

目錄

1.人類交易發展史

2.比特幣(bitcoin)

2.1 比特幣誕生背景

2.2 神祕組織CypherPunk

2.3 中本聰Satoshi Nakamoto

2.4 比特幣(bitcoin)

3.區塊鏈(blockchain)

3.1 區塊鏈和比特幣

3.2 中心化與去中心化

3.3 區塊鏈(blockchain)

4.比特幣專業名詞

4.1 記賬

4.2 錢包

4.3 節點

4.4 採礦(mining)

4.4.1 採礦本質

4.4.2 難度值

4.4.3 礦

4.4.4 採礦過程

4.5 算力

4.6 比特幣引數

4.6.1 出塊時間

4.6.2 出塊獎勵

4.7 p2p網路

4.8 工作量證明POW

4.9 比特幣地址(bitcoin address)

4.10 比特幣結構

4.10.1 區塊結構

4.10.2 區塊頭結構

1.人類交易發展史

以物換物->實物貨幣->傳統貨幣->人工貨幣,其中人工貨幣可以細分為

  1. 金屬貨幣(稱量貨幣)
  2. 紙幣
  3. 電子貨幣
  4. 數字貨幣

貨幣發展總是從大到小,使用越來越便捷,而且下級貨幣總是因為解決了上級貨幣的一些缺陷而產生的。

2.比特幣(bitcoin)

2.1 比特幣誕生背景

在比特幣之前已經存在數個電子支付系統,例如:

  • Ecash(1990年) 注重密碼學網路支付系統,但是仍然依賴中心化結構
  • B-money(1998年)是比特幣的精神先導,但是未解決發行貨幣問題
  • 位元現金(2005年)提出競爭數學難題,構建認證系統。但是提出者並不會程式設計,無法實現。

在07-09年的環球金融危機爆發的時候,貨幣系統出現嚴重問題是導致數字貨幣誕生的直接原因。從另一方面來說,密碼學與計算機裝置技術的成熟也是催生數字貨幣出現的另一直接原因。前文中我們提到下級貨幣的提出總是因為解決了上級貨幣的某些缺陷,數字貨幣的提出顯然就是解決了紙質貨幣的【生產發行成本太低,受國家影響太大】的缺陷。

2.2 神祕組織CypherPunk

cypherpunk,中文直譯為密碼朋克,是一個提倡信仰使用強加密演算法將能夠使個體保持安全的私人性的組織。組織中的人大多為電腦黑客、密碼學專家和追求隱私的狂熱者,例如Assange阿桑奇(維基解密創辦人)等人就是其中的一份子。他們反對任何政府規則的密碼系統,或許他們崇尚的是個人資訊的絕對私密性。

2.3 中本聰Satoshi Nakamoto

中本聰,自稱日裔美國人(注意是自稱,因為其真實身份仍不為外界所知)。曾於2008年在“metzdowd.com”網站的密碼學郵件列表發表了一篇名為《比特幣:一種點對點式的電子現金系統》(Bitcoin: A Peer-to-Peer Electronic Cash System)的論文,描述了一種被他稱為“比特幣”的電子貨幣及其演算法。其中詳細描述瞭如何建立一套去中心化的電子交易體系,且這種體系不需要建立在交易雙方相互信任的基礎之上。在2009年1月3日,他開發出首個實現了比特幣演算法的客戶端程式並進行了首次“採礦”(mining),獲得了第一批的50個比特幣,這也標誌著比特幣金融體系的正式誕生。而在2010年的12月12日,他在比特幣論壇中發表了最後一篇文章,提及了最新版本軟體中的一些小問題,隨後不再露面,電子郵件通訊也逐漸終止。

2.4 比特幣(bitcoin)

必須清楚的一點就是比特幣並不是什麼我們通常意義上的固有貨幣,例如人民幣或者美元等。比特幣本質是一個軟體,是一個電子支付系統。在這個電子支付系統中流通的用於相互交易的資料,才是我們通常認為的比特幣。所以比特幣軟體和比特幣兩者並不是同一個概念,但由於人們認知和理解上的誤區而導致經常會將其混淆。既然比特幣本質只是一組資料,那麼對於資料就有了很大的可能。

(1)首先資料作為貨幣就解決了貨幣發行的問題。資料是基於計算機演算法產生的,而不是由某個人或某個國家機構產生,所以規避了紙幣的隨意超發就有效的避免了通貨膨脹

(2)其次資料作為貨幣還解決了貨幣歸屬安全問題。資料在計算機演算法中是可以允許進行加密的,而不是客觀物理世界中的持有。只有確切知道加密演算法和加密金鑰(可以簡單認為就是密碼)的人才能夠確定資料的歸屬,這也規避了紙幣的非主觀變更貨幣歸屬權問題(簡單說就是搶劫)

3.區塊鏈(blockchain)

3.1 區塊鏈和比特幣

區塊鏈和比特幣並不是同一個東西。在上一節中我們分析過了比特幣雖然被稱為xx幣,但本質其實就是一個電子支付系統,而區塊鏈最初只是這個電子支付系統中的一個重要底層技術,它的本質是一個去中心化的資料庫。可以理解為因為有了區塊鏈技術才導致比特幣軟體的產生,而比特幣軟體的產生才是區塊鏈技術真正被人們知道的重要原因。

3.2 中心化與去中心化

由於理論問題過於繁雜,而且專業名詞一個接著一個也不利於說明,所以選擇使用最直白的語言來說明。如果用宿舍取食堂打飯例子來說明,那麼:

  • 中心化:“某個具有權威的人”指定今天誰去打飯,誰來分打回來的飯,這個權威的人可以永遠也不去親自打飯。
  • 去中心化:不存在所謂具有權威的人,大家輪流去打飯,輪流分發打回來的飯,每一個人都有可能親自去打飯。

其實上面的例子就非常直觀的解釋了什麼叫中心化和去中心化。中心就是權威,顧名思義必然存在一個說了算的人或機構,而少數權威機構就必然會產生寡頭與壟斷。例如上面的例子中張三和具有權威的人的關係最好,那麼很有可能每一次都會獲得最多的飯菜和很少去食堂打飯的辛苦,這就是權威對於行為產生壟斷帶來的負面影響。

而去中心化的本質就是為了解決寡頭和壟斷問題,如果每一個人都有可能親自去打飯也有可能來分發打回來的飯菜。那麼為了避免別人分發飯菜的時候對自己少分發,那麼必然在自己打飯或者分發飯菜的時候對每一個人都做到平均平等。這就解決了寡頭和壟斷帶來的少數人獲利這種負面影響。(當然這只是一個例子,真實情況還是要具體情況具體分析的。)

3.3 區塊鏈(blockchain)

前文中已經說明,區塊鏈本質只是一個去中心化的資料庫,是一種資料的儲存方式而已。至於如何使用區塊鏈並不是說只有比特幣這一種實現使用方式,因此將區塊鏈和比特幣之間畫一個等號的行為是很無趣的。就像前人說的一樣:能力並無善惡之分,善惡之分擁有能力的人。如何使用區塊鏈也將是我們未來需要考慮的一大問題。

  • 從狹義來說區塊鏈是一種按照時間順序將資料區塊以順序相連的方式組合成的一種鏈式資料結構, 並以密碼學方式保證的不可篡改和不可偽造的分散式賬本。
  • 而從廣義來講,區塊鏈技術是利用塊鏈式資料結構來驗證與儲存資料、利用分散式節點共識演算法來生成和更新資料、利用密碼學的方式保證資料傳輸和訪問的安全、利用由自動化指令碼程式碼組成的智慧合約來程式設計和運算元據的一種全新的分散式基礎架構與計算方式

4.比特幣專業名詞

既然區塊鏈技術是最初從比特幣發展而為人們所知,因此通過學習比特幣原理可以更好更清楚的對區塊鏈技術有深刻的理解。那麼需要先了解一些比特幣技術行業內的一些專業名詞。

4.1 記賬

將系統中產生的交易資料儲存到資料庫中的過程稱為記賬。比特幣記賬方式與傳統的記賬方式有很大的不同:

傳統記賬方式 比特幣記賬方式
由某個人(會計)進行記賬 所有參與交易的人共同記賬
只有會計自己知道每一筆交易的細節 所有人都知道每一筆交易的細節
有一筆交易記錄一次 間隔一定時間記錄一次

顯然傳統記賬方式中記賬人(會計)就可以認為是我們前文中提到的資訊壟斷者,因為記賬人唯一持有對每一筆交易的資訊,因此如果記賬人對交易資訊進行刪改那麼其他人無從知曉。而比特幣記賬則將每一個參與交易的人都當做了記賬人,單一記賬人對某一筆交易作出的修改無法影響其餘所有人的記錄,因此保證了交易資訊的公平。

同時傳統記賬方式有一筆交易記錄一次,如果某一筆交易沒有記錄也不會有人知曉。因為交易與交易之間是不存在任何關聯的。但是比特幣的記賬方式則杜絕了這種問題,因為記賬是按照時間來進行。在一定時間內例如10分鐘,不管有沒有發生交易所有人都會進行一次記錄,那麼在這10分鐘之內的所有可能發生的交易就被所有參與交易的人記錄在了自己的賬本上。那麼如果有人想要故意少記錄一筆交易,所有參與交易的人在下一次完成交易的時候就會發現這個人賬本上少了一筆交易,那麼這個人的這次交易就不會生效。大白話說就是不帶這個人玩了。

4.2 錢包

一個私鑰,能夠產生一個公鑰,一個公鑰能夠計算出一個hash賬戶地址。

  • 私鑰相當於銀行卡密碼
  • 公鑰相當於銀行卡賬戶
  • hash賬戶地址相當於把銀行卡賬戶加密之後公開給別人的資訊

可以暫時認為私鑰就是比特幣本身,那麼存放管理私鑰內容的wallet.dat檔案就稱為錢包,這個檔案記憶體放了各種私鑰相關的資訊。但是由於wallet.dat檔案無法單獨操作,因此一般將管理這個wallet.dat檔案的比特幣客戶端稱為錢包。

ps:多說一句,某人使用比特幣客戶端進行每一次交易的時候,“銀行卡賬戶地址”都是不同的。但這並不意味著這個人就會擁有無限多個比特幣賬戶,這時計算機加密演算法提供的一種資料保護。能夠防止賬戶被有心人追蹤交易記錄從而對賬戶資訊進行竊取。

4.3 節點

每一個執行比特幣客戶端的節點稱為節點。對節點而言

  • 輕節點:不下載所有賬本,只下載區塊頭和自己有關的交易(一般指手機)
  • 全節點:儲存所有賬單交易記錄的節點,稱為全節點(一般pc)

對於客戶端而言

  • 黃顏色-真實網路(錢包一節中截圖的顏色就是黃顏色,真正可以用於發起交易的網路)
  • 綠顏色-測試網路(擁有一部分真實網路資料,但是隻能用於開發測試)
  • 藍顏色-本地網路(自己玩玩,不能將資料上傳到真實網路)

4.4 採礦(mining)

所有交易的資訊集合都會使用levelDB資料庫儲存,比特幣網路中每一個節點都會同步相同的一個賬本。節點之間競爭向賬本中記賬權利的過程就叫做採礦。競爭成功者獲得記賬的權利,並向賬本中進行一次記賬操作,即為採到礦。

4.4.1 採礦本質

基於現在的區塊資料新增一個隨機數,並對這個資料做sha256加密運算,尋找其運算結果小於難度值的數字。

4.4.2 難度值

難度值由系統統計前2016個區塊產生區塊的平均時間調節,可能變高可能變低。難度值不可能由某一個人來設定。

4.4.3 礦

礦實際上就是計算出的數字。

4.4.4 採礦過程

假設:
    (1)位元網路中有5個礦工,分別為A、B、C、D、E
    (2)難度值是:0x0000123456780012
    (3)位元網路前2016個區塊的資料內容是:

過程:
    (1)所有人同時開始計算:sha256(12345678abcd1234abcd5678+一個整數數字)的hash值結果
       目的是找到使得【hash值結果 < 難度值】表示式成立的這個整數數字
    (2)假設礦工C在某一時刻計算出了整數數字當是100的時候能夠使得表示式成立,那麼礦工C會立即將這個整數數字公佈到位元網路中
    (3)同一時刻其餘所有礦工立即停止計算,並開始驗證這個數字是否真的能讓表示式成立
    (4)所有礦工驗證通過後,證明礦工C這次計算是有效的,那麼就允許礦工C將這個計算結果新增到本地的區塊鏈中
    (5)同時所有礦工也將這個計算結果新增到自己本地的賬本中
    (6)位元網路更新難度值,所有礦工重新開始計算,下一輪採礦週期開始

4.5 算力

通過上面的採礦過程概述能夠發現,誰計算的速度越快誰就更有可能採到礦。那麼很多人會有疑問這個計算是不是很容易?事實上對於一次sha256的計算很容易,但是我們都知道sha256是一種不可逆的單向加密機制,其雪崩效應決定了任何一個微小的變更都會導致最後的計算hash結果變得完全不同,因此想要通過某幾次計算得到目標數字幾乎是一個不可能的行為,因此必須從1開始逐步累加計算比對(相信我這是一個無聊枯燥的過程),直到突然發現某個數字符合要求為止。那麼運算速度就決定了誰能更快速的發現這個數字,而算力就是度量hash運算速度的一個標準。在比特幣中算力指的是每秒鐘進行的hash運算次數。

 

  • 1 KH / s = 10^3(每秒1,000次雜湊運算)
  • 1 MH / s = 10^6(每秒1,000,000次雜湊運算)
  • 1 GH / s = 10^9(每秒1,000,000,000次雜湊運算)
  • 1 TH / s = 10^12(每秒1,000,000,000,000次雜湊運算)
  • 1 PH / s = 10^15(每秒1,000,000,000,000,000次雜湊運算)
  • 1 EH / s = 10^18(每秒1,000,000,000,000,000,000次雜湊運算)

目前比特幣網路的全網算力已經進入到了P時代,所以可想而知我們之前奢望的幾次hash運算就能得到結果是多麼一種玩笑的想法。目前市面上普通的家用電腦的CPU運算素的也不過就是10^12次浮點數運算/s,這個運算速度換算成hash值計算還要打很多個折扣,所以計算hash值來查詢目標數字是一個很苦難的事情。

ps:補充一句,由於家用電腦的運算速度不夠快才出現了GPU、FPGA還有ASIC之類的東西。ASIC就是俗稱的礦機(螞蟻礦機),是一種專門用來執行hash256計算的工具,然鵝單一的礦機其實並沒什麼用(依然算不過其他人)。

pss:一個ASIC就是礦機,多個礦機放在一起就是礦場,多個礦場放在一起就是礦池。

4.6 比特幣引數

4.6.1 出塊時間

出塊時間指的是,一個區塊(礦工C算出一個數字,寫到賬本上的內容)產生的時間是10分鐘左右(全網所有人10分鐘左右才能算出一個數字,可以自己算算要進行多少次計算,很恐怖的)。位元網路會根據前2016個區塊的出塊時間動態調整難度值,大約是2周左右。出塊時間包括同步時間,校驗時間,計算時間等。

4.6.2 出塊獎勵

出塊獎勵才是比特幣網路中最根本的內容和比特幣最真實的來源,也是為什麼這麼多人想要進行採礦的原因。位元網路是一個特殊的網路,最初是不存在比特幣的。每當有一個人採到一個礦,那麼這個人會進行一次記賬,位元網路就會獎勵這個人一些比特幣。而這就是比特幣的來源。

位元網路規定每產生21萬個區塊獎勵就會減半,最初每採到一個礦位元網路會獎勵這個人50個比特幣。由於位元網路固定10分鐘會出現一個區塊,因此簡單計算210000*10/60/24/365可以得出大約4年左右會進行一次獎勵衰減。截止到目前為止一次採礦位元網路所獎勵的比特幣數量已經經歷了兩次衰減,即12.5個。

所以經由簡單的數學邏輯可以知道,最終採礦位元網路一定會出現不再獎勵任何比特幣的現象產生。那就意味著比特幣發行完畢,不會再進行發放了。而這個計算過程相信你有等差數列數學基礎就都能夠很快算出,只有2100萬個。這就對應了2.4小節中說的比特幣能夠有效遏制通貨膨脹的原因,因為貨幣的發行是計算機演算法決定的,而不是“某個具有權威”的人或政府機構決定。

4.7 p2p網路

p2p,peer to peer,即點對點技術。是指無中心伺服器,依靠使用者群交換技術的網際網路技術。其特點是:耐攻擊、高容器、地位平等

4.8 工作量證明POW

pow,proof of work,即工作量證明。是指出示結果表示你做過的一件事情。如何獲取結果的過程通常很艱辛,但驗證卻很簡單。比如赫拉克勒斯的十二試煉一樣過程簡直要人命,但是赫拉檢驗他的結果卻是一句話的事情。比特幣採礦的雜湊sha256運算過程就非常漫長而又痛苦,但是全網在檢驗某個礦工的計算結果的時候卻只需要進行一次計算。

4.9 比特幣地址(bitcoin address)

實際上就是4.2中提到的hash賬戶地址,這個地址的計算非常複雜,具體流程可以大致參考如下:

(1)本地隨機數列獲取私鑰,然後由私鑰生成公鑰
(2)使用公鑰進行一次sha256運算,然後再使用RIPMD160演算法對剛才的結果進行加密得到一個160bit,即20byte位元組的資料.
   ps:[RIPMD160演算法並不是go內建的hash函式,需要下載]
(3)然後將當前網路版本1byte位元組的資料作為資料頭新增到20byte資料前面,得到21byte位元組資料
(4)然後copy這21byte位元組資料,然後對他做兩次sha256加密運算後,取前4byte位元組資料
(5)將剛才的21byte位元組資料+這個4byte子節的資料,獲得25byte位元組的資料
(6)然後進行base58編碼,得到bitcoin地址

4.10 比特幣結構

4.10.1 區塊結構

位元組長度 欄位 說明
4   區塊大小 用位元組表示的該欄位之後的區塊大小
80  區塊頭 組成區塊頭的幾個欄位
1-9 交易計數器 該區塊包含的交易數量,包含coinbase交易
不定 交易列表 記錄在區塊裡的交易資訊

4.10.2 區塊頭結構

位元組長度     欄位     說明
4      區塊版本號 區塊版本號
32   父區塊頭雜湊值 前一個區塊頭的雜湊值
32   Merkle根雜湊  交易列表生成的默克爾樹根雜湊
4 時間戳 該區塊產生的近似時間,精確到秒的UNIX時間戳
4 難度目標 難度目標,挖礦難度值
4 Nonce 挖礦過程中使用的隨機值

ps:數字簽名在交易中的應用驗證可以通過在bitcoin軟體的console中輸入【gettransaction 交易hash】指令,從而獲取交易具體資訊。然後再通過輸入【decoderawtransaction 獲得的交易資訊中的交易hex】指令就能夠看到每一次的交易當中都必須存在【scriptSig欄位】,這個欄位就是簽名欄位,其中包括【asm】欄位和【hex】欄位。

相關文章