【區塊鏈學習筆記】基礎知識篇

2020-09-29 11:01:17

一、數位貨幣

區塊鏈確實脫胎於數位貨幣,它生來就是為數位貨幣服務的。另一方面,區塊鏈的分散式記賬機制,又依賴於數位貨幣的激勵。可以說區塊鏈和數位貨幣是一對孿生兄弟,在某中程度上互相依存。
為什麼要研究貨幣數位化?
便捷;
去除對中心節點的依賴;
在這裡插入圖片描述

數位貨幣化需解決的問題(解決這些問題的鑰匙是區塊鏈)
賬戶數位化;
簽名數位化;
記賬去中心化;
(中心化的意思是中心決定節點,節點必須依賴中心,節點離開了中心就無法生存。)

本質問題(解決這些問題的強有力工具是密碼學)
在這裡插入圖片描述

二、接觸區塊鏈的小故事

有個封閉的山村叫玉石村,村民的主要工作就是挖玉石,村裡的財富也是用玉石來計算,大家挖了的玉石堆放到一起,村長來清點記賬。張三、李四、王五各自的財富都記錄在村長的賬本上,他們可以依此來換取其他的生活用品,可是村長這個人有點不厚道,記賬時看到貌美的農婦多記兩筆,遇到刺頭就少記一筆,然後賬本保管也經常出問題,有的地方受潮模糊,還有的地方被老鼠啃掉,更過分地是村長的兒子趙六還常常偷偷塗改賬本,於是村民決定將不幹活包吃飯還老出錯的村長廢除掉,那麼誰來記賬呢?村民們想了一個辦法,每個人都帶著一本賬本,誰挖到玉石時自己記錄的同時用村口的大喇叭通知所有人,大家都在各自的本子幾下同樣的內容,每個村民都保管各自的賬本,以後村民直接的物品換取、交換玉石也通過這個方式記賬,這樣既節省了一個記賬的勞力,還避免了賬本受潮等問題。即使小寡婦塗改了張三的賬本,但大家拿李四、王五、孫六的賬本出來對比就能馬上發現問題並更正。只要村民的數量足夠多,即使小寡婦效能再強大也無法篡改過半人的賬本。這就是去中心化的分散式記賬

李四提出了一個新的問題「我把已經記錄的玉石拿來再記一次,財富豈不是很快翻倍再翻倍了」。村民為了解決李四的弄虛作假想了一個辦法,給每塊玉石都做標記,記錄挖掘到的時間、地點、人物以及上一塊被挖到的玉石的資訊。因此每個村民的賬本都記錄了每塊玉石的完整資訊,每塊玉都與上一塊玉資訊關聯,形成一個鏈條。李四既無法憑空捏造,也無法更改之前的記錄,這就是區塊鏈—P2P分散式記賬

區塊鏈去中心化思想
經過改革以後,玉石村的每一個村民手裡都擁有一個賬本,每個賬本里頭都記錄著村民挖出玉石的資訊,摒棄了以往只有村長手裡唯一賬本的「中心化」的記賬方式,採取了人手一個賬本的「去中心化」的分散式記賬方式。
區塊鏈防篡改思想
在每個村民的賬本里頭給每塊玉石都做標記,記錄了玉石挖掘到的時間、地點和人物,以及上一塊被挖到的玉石的資訊。每塊玉都與上一塊玉有資訊關聯,形成一個鏈條,這樣誰都無法憑空捏造,也無法更改之前的記錄,做到了防篡改。
交易資訊公開透明的思想
在村民挖到玉石之後,在自己的賬本記錄的同時,用村口的大喇叭通知所有人,大家都在各自的本子上寫下同樣的內容。所有村民都擁有一份完整的玉石資訊,他們可以隨時翻閱自己的賬本,對記錄的玉石資訊進行查詢。
共識的思想
當某個村民發現有一筆玉石資訊記錄錯誤了,需要更正。這個時候需要至少51%的村民同意,才可以修改這筆記錄。換句話來說,只有至少51%的村民認同這筆玉石資訊,才可以把它記錄在每個人的記100%賬本中。這就體現出一個很簡單的共識的思想。

三、區塊鏈的起源

  1. 密碼朋克的成立
    1992年,英特爾高階科學家蒂姆·梅在自己的家中和朋友聚會。聚會上他和朋友討論著網際網路應該如何更好的保護人們的隱私。怎樣保護全世界民眾的隱私在網際網路上不被別有用心的人利用呢?他們成立了一個小組:密碼朋克。埃裡克·休斯就寫了個程式,可以接收加密郵件,擦除所有身份標記,並將它們傳送回使用者列表,當你簽名後,你會得到休斯的回信。1993年,埃裡克·休斯等人升級迭代了加密電子郵件系統,直接把系統改名叫「密碼朋克」。
  2. Ecash
    大衛·喬姆發明了密碼學匿名現金支付系統,Ecash。喬姆認為分散式的、真正的數位現金系統應該為人們的隱私加密。因此他的系統裡的加密使用了數學編碼。還有一個小特點就是支付時付款方是匿名的,但是收款方是非匿名的。
  3. 雜湊現金
    1997年,亞當貝克發明了雜湊現金,用到了工作量證明系統(proof of work)。其實亞當貝克最初發明這個系統是想解決垃圾郵件的問題,也就是為了避免其他人傳送包含有相同資訊的郵件。它的工作量證明系統,解決了數位貨幣的一大難題:如何保證數位貨幣不被交易過很多次?這就要求計算機在獲得資訊之前,做一定的工作量計算來避免重複交易。
  4. 時間戳概念
    時間戳保證了數位貨幣安全問題,可以保證檔案的先後順序。要求在檔案建立後,不能改動。當一個虛擬貨幣被交易時,被蓋上時間戳,它就無法篡改,在區塊鏈系統中,每一個新區快生成時,都會被打上時間戳,最終依照區塊生成時間的先後順序相連成區塊鏈。
    在這裡插入圖片描述
  5. 位元幣誕生
    中本聰對Ecash進行了優化,綜合了時間戳、工作量證明機制、非對稱加密技術、UTXO的結構,最終發明了位元幣。人們就把位元幣的底層技術稱為區塊鏈。

區塊鏈技術從誕生到現在經歷了三個階段
區塊鏈1.0-----數位貨幣,以位元幣為代表的去中心化的數位支付。
區塊鏈2.0-----智慧合約,以以太坊為代表的支援使用者自己編寫智慧合約,構建去中心化的應用DAPP。
區塊鏈3.0-----延伸到各個領域,也就是將區塊鏈運用到各行業具體的場景中去。

四、位元幣

1. 位元幣與區塊鏈的關係

「對於位元幣而言,區塊鏈對於它的意義,就如同網際網路對郵件的意義一樣。」
在這裡插入圖片描述
在這裡插入圖片描述

2. 位元幣的作用機制

(1). 位元幣的不依靠指定的貨幣發行機構,而依據特定演演算法,通過大量的計算產生,也就是「挖礦」。
(2). 總數量有限,具有極強的稀缺性,位元幣的總數量在最初設定時,就被系統永久限制在2100萬個。

五、信任的建立和區塊鏈的形象解釋

1. 區塊鏈建立信任的方式

區塊鏈本質就是一個去中心化的分散式賬本,原來需要通過銀行或第三方支付才能完成的交易,現在可以通過分散式節點組成的網路來完成。
在這裡插入圖片描述
交易的規則制定、系統治理,由各常委共同執行,同時每一個常委都擁有一個賬本。每個交易資訊在各個常委驗證通過之後,由各個常委記入自己的賬本之中,因此每個賬本記錄的資訊都是一樣的。

2. 區塊鏈的定義

(1). 狹義來講,區塊鏈是一種按照時間順序,將資料區塊以順序相連的方式組合成的一種鏈式資料結構,並以密碼學方式保證的不可篡改和不可偽造的分散式賬本。
(2). 廣義來講,區塊鏈是利用塊鏈式資料結構來驗證與儲存資料、利用共識演演算法來生成和更新資料、利用密碼學的方式保證資料安全、利用智慧合約來程式設計和運算元據的一種全新的分散式基礎架構與計算正規化。

區塊鏈本質上是一個去中心化的分散式賬本,如果說區塊鏈就是賬本,那麼構成區塊鏈的每一個區塊就是賬本的每一頁,每增加一個區塊,帳本後面就會增加一頁,區塊鏈有多長,帳本就有多厚。這個帳本存在網路中各自節點的手裡,而不是統一儲存在一箇中心節點,並且是任何人都可以看得到的公開賬本。

3. 區塊鏈的分類

根據節點的加入或退出是否需要批准,將區塊鏈分為公有鏈、私有鏈、聯盟鏈。(節點就是網路的骨幹,用來驗證和記錄交易。通常指區塊鏈網路中的計算機,手機、礦機、桌上型電腦和伺服器等。)
(1). 公開鏈就是公開的區塊鏈,所有人都可以作為網路中的一個節點自由加入或退出,節點之間基於共識機制開展工作。是真正意義上完全的去中心化。
(2). 私有鏈一般用在企業內部,系統的運作規則、節點的讀取和修改許可權根據企業的要求進行設定。
(3). 聯盟鏈是一種多中心化或者部分去中心化的區塊鏈,共識機制受某些指定節點控制,一般是由若干機構聯合發起,比如行業內部,它介於公有鏈和有鏈之間,兼具部分去中心化的特性。

六、雜湊演演算法

雜湊加密演演算法,SHA256,是由美國國家安全域性研發,由美國國家標準與技術研究院在2001年釋出。將任何一串資料輸入到SHA256將得到一個256位的Hash值。其特點是相同的資料輸入將得到相同的結果。輸入資料只要稍有變化(比如資料中一個1變成了0)則將得到一個千差萬別的結果,且結果無法事先預知。具體來說就是雜湊演演算法將資料打亂、混合、壓縮成一個摘要,使得資料量變小,重新建立—個叫做雜湊值的指紋。

1. 雜湊演演算法的特徵

一是單向性,雜湊演演算法必須具備單向性;

  • 只能由輸入的資料或者訊息計算出一個定長的雜湊值,而不能通過這個雜湊值反向推算出輸入的資料或者訊息。

二是可以根據任意長度的訊息計算出固定長度的雜湊;

  • 雜湊演演算法生成的雜湊值的長度必須是固定的,而且是針對任意長度的輸入資料。
  • 這一性質保證了雜湊演演算法的易用性。
  • 因為雜湊演演算法的一個使用目的就是用最後的雜湊值來代表輸入資料,那麼最後的雜湊值很長、不固定或跟原始資料一樣長,那麼通過雜湊值的對比來確定原始資料就跟直接校驗原始資料一樣費力沒有區別了。
  • 最後的長度要控制在一個固定的、合適的值,才能體現出雜湊值作為原資料指紋或者說摘要的特徵。

三是不同的輸入就有不同的輸出;

  • 雜湊演演算法被髮明的目的之一就是根據此需求來的,也成為了雜湊演演算法的一大特性。
  • 可以實現對資料完整性和一致性的判定,只有一模一樣的資料經過同一個雜湊運算得到的雜湊值才是一樣的。
  • 無論輸入資料的長度大小,都會產生定長的雜湊值,這樣比對結果就比較快速方便。
  • 對於資料的防篡改、防缺失都是很好的校驗方式。

四是演演算法效率高,計算雜湊值的時間短。

  • 保證不管資料有多長,都能在可接受的範圍內得到雜湊結果。

2. 典型的雜湊演演算法

著名的是MD系列和SHA系列。SHA代表安全雜湊演演算法。是根據MD4和MD5開發的演演算法,由美國國家安全域性發布,作為美國政府標準。
雜湊演演算法運用的雜湊函數是一類比較成熟的雜湊函數。
雜湊演演算法的特徵:

  • 可以用於「任意」長度的訊息。
  • 產生的Hash值是固定長度的。
  • 對於任意給定的訊息,容易計算訊息對應的雜湊值。
  • 不能通過給定的雜湊值反向推算出輸入的資料或者訊息。

3. 雜湊演演算法在區塊鏈中發揮著怎樣的作用

(1)必須知道區塊鏈中雜湊指標的概念
普通的指標只是儲存結構體在記憶體中的位置。而雜湊指標是不僅要儲存結構體在記憶體中的位置,還要儲存結構體的雜湊值。
好處是不僅能夠找到結構體的位置,還能夠知道結構體是否被篡改。

區塊鏈和普通連結串列的區別
/*位元幣背後的技術主要是區塊鏈,而區塊鏈是由一個個區塊連線而成,區塊鏈和普通連結串列的主要區別就在於用雜湊指標代替
了普通的指標。普通連結串列如果內容發生了改變,指標不會發生改變,而區塊鏈一旦內容發生了變化,後面區塊的雜湊指標都會
發生變化,類似於多米諾骨牌效應。*/

雜湊運算能夠幫助識別區塊資料是否被篡改,區塊鏈的雜湊值能夠唯一而精準地標識一個區塊,區塊鏈中任意節點通過簡單的雜湊計算都可以獲得這個區塊的雜湊值,計算出的雜湊值沒有變化也就意味著區塊鏈中的資訊沒有被篡改。另外,雜湊運算還能夠幫助把各個區塊串連成區塊鏈。每個區塊都包含上一個區塊的雜湊值和下一個區塊的值,就相當於通過上一個區塊的雜湊值掛鉤到這一個區塊,通過這一個區塊的雜湊值掛鉤到下一個區塊,就自然而然形成一個鏈式結構的區塊鏈。

4. Merkle樹在區塊鏈中發揮著怎樣的作用

雜湊運算還能夠加密交易地址。

什麼是Merkle樹呢?
/*它使用的是單向雜湊。雜湊樹的頂部為頂部雜湊,亦稱根雜湊或主雜湊。它是通過並聯兩個子雜湊來往樹上爬直到找到。*/

Merkle樹的作用

  • 第一,可以快速定位每筆交易,由於交易在儲存上是線性儲存,定位到某筆交易會需要遍歷,效率低時間慢,通過這樣的二元樹可以快速定位到想要找的交易。
  • 第二,在不需要儲存整個資料的情況下,就可以簡明地核實交易是否被篡改,從交易到每個二元樹的雜湊值,有任何一個數位的變化都會導致根雜湊的變化。同時,如果有錯誤,可以快速定位到錯誤的地方。

Merkle樹的特點
在這裡插入圖片描述

  • merkle tree是一種樹狀結構,它具有樹結構的所有特點;
  • merkle tree的葉子節點的值是資料集合的單後設資料或者是單後設資料的雜湊值;
  • 非葉子節點的值是根據它下面所有葉子節點的值,按照hash演演算法計算而得出的。

七、 共識演演算法

什麼叫「共識」?
所謂共識,從語文的角度進行理解,可以簡單解釋為,許多不同的人對同一件事情達成一樣的或者至少說方向一致的看法。這個解釋同樣適用於位元幣網路當中。

1. 共識機制

  • 達成共識的主體
    它是當前這個區塊鏈中的一些節點,到底哪些節點需要達成一致,也是一個需要考慮的問題。
  • 這些節點需要對什麼東西達成一致?
    共識機制涉及了區塊該如何生成以及生成之後如何選擇的問題。

在位元幣網路中每個礦工都有權力生成新的區塊,那麼我們到底該選擇誰的區塊作為整個網路的新區塊呢?這個新區塊生成之後,在這條鏈上進行的交易能不能通過呢?

在日常生活中,我們可以有一個老大或者一個領導來拍板決定這些問題。但是在區塊鏈當中,每個節點都是平等的,沒有一箇中心機構的存在,這時候就需要通過共識機制來達成節點間的一致。

2. 共識演演算法

共識演演算法是為了達成共識所依據的一種規則,是篩選出具有代表性的節點的方法。為此,區塊鏈設計了一定的底層演演算法,通過這個特定的演演算法來選出那個可以生成新區塊的節點,同時對於每一筆在這條區塊鏈上進行的交易是否准許完成進行了約束和規定,也就是共識演演算法。

共識演演算法規定了下一個新區塊由哪個礦工生成。同時在這條區塊鏈上一筆交易要達成,需要被共識演演算法選出的部分節點達成一致的觀點:「哦,我們覺得這筆交易可以進行!」 對一筆交易,如果利益不相干的若干個節點能夠達成共識,就可以認為全網對此也能夠達成共識。

共識演演算法有很多種,主要有工作量證明、權益證明、委託工作量證明、委託權益證明、實用拜占庭容錯演演算法等,他們最終的目的是一致的,但在具體的實現過程中各具特色。

3. 位元幣的共識機制——工作量證明機制

工作量證明,英文全稱叫proof of work,通常我們叫它POW。
工作量證明就是一份證明,用來確認你做過一定量的工作。怎麼證明呢?通過工作結果——當使用者做一定難度的工作得出一個結果時,通過展現出這個結果證明你完成了一定的工作量——也就是說POW作為一種共識機制,它是結果導向而非過程導向的。

  • 原因
    實際應用中,如果我們通過監測工作的整個過程來證明工作量,這是極為低效的,為了保證一定的效率,就設計了通過驗證結果的方式證明工作量的方法。
  • 關鍵特徵:不對稱性
    進行實際工作的使用者需要付出很多的工作量才能得到一個符合已定條件的結果,但是作為驗證方卻可以根據使用者提供的材料很容易重算這個結果,同時驗證這個結果是否滿足提前規定好的條件。

在工作量證明中,你工作的時間越長,工作時採用的裝置越先進,你的工作量就越高,你收穫的也會越多。

工作量證明機制POW
首先,生成要加入到區塊鏈中的一筆新的交易資訊,也就是新區塊時必須滿足的要求。然後在基於工作量證明機制構建的區塊鏈網路中,所有節點開始不斷嘗試和計算,直到第一個節點找到了那個隨機雜湊雜湊的數值解,於是它就得到了生成新區塊的權力。(挖礦)

工作量證明機制具有完全去中心化的優點。
工作量證明機制的缺點:造成了大量的資源浪費,達成共識所需要的週期較長。

八、挖礦

位元幣與支付寶、微信支付類似,位元幣屬於網際網路支付。但微信和支付寶處理的是人民幣,是政府發行的法定貨幣,代表民眾對權力機構的信任。而位元幣是去中心化的虛擬「貨幣」,背後完全沒有機構或法律背書,完全是參與者的集體管理。

由於搭載在區塊鏈平臺上,運用分散式記賬機制,系統中所有節點都參與記賬過程,那麼一筆交易產生後由哪個節點記賬?如果有惡意節點想隨意篡改資料獲取利益該如何發現?這就引入了「工作量證明」。

1. 工作量證明

工作量證明(Proof-of-Work,PoW)是一種對應服務與資源濫用、或是阻斷服務攻擊的經濟對策。一般是要求使用者進行一些耗時適當的複雜運算,並且答案能被服務方快速驗算,以此耗用的時間、裝置與能源做為擔保成本,以確保服務與資源是被真正的需求所使用。

簡單理解就是一份證明,用來確認你做過一定量的工作。監測工作的整個過程通常是極為低效的,而通過對工作的結果進行認證來證明完成了相應的工作量,則是一種非常高效的方式。比如現實生活中的畢業證、駕駛證等,就是通過檢驗結果的方式所取得的證明。

區塊鏈任何一個節點,如果想生成一個新的區塊並寫入區塊鏈,必須解出位元幣網路出的工作量證明的迷題,這個過程我們稱之為「挖礦」。這道題關鍵的三個要素是工作量證明函數、區塊、難度值。工作量證明函數是這道題的計算方法,區塊決定了這道題的輸入資料,難度值決定了這道題的所需要的計算量。

(1)工作量證明函數
和我們上節例子中用到的雜湊函數一樣,位元幣系統中使用的工作量證明函數正是SHA256。

(2)區塊
區塊頭的大小為80位元組,由版本號、上一個區塊的雜湊值、Merkle Root Hash、區塊生成時間、難度值、亂陣列成,區塊包含的交易列表則附加在區塊頭後面。

區塊頭就是用於位元幣工作量證明的輸入字串。為了使區塊頭能體現區塊所包含的所有交易,在區塊的構造過程中,需要將該區塊要包含的交易列表,通過Merkle Tree演演算法生成Merkle Root Hash,並以此作為交易列表的摘要存到區塊頭中。見下圖:
在這裡插入圖片描述

挖礦∶區塊頭中有個引數叫亂數Nonce,尋找這個亂數的過程就叫做「挖礦;
網路上任何一臺機器只要找到合適的數位填到自己的Nonce位置,使得區塊頭這6個欄位(80個位元組)的資料的雜湊值符合目標雜湊值。

(3)難度值
難度值(difficulty)是礦工們在挖礦時候的重要參考指標,它決定了礦工大約需要經過多少次雜湊運算才能產生一個合法的區塊。位元幣的區塊大約每10分鐘生成一個,如果要在不同的全網算力條件下,新區塊的產生保持都基本這個速率,難度值必須根據全網算力的變化進行調整。

位元幣工作量證明的達成就是礦工計算出來的區塊雜湊值必須小於目標值。

我們也可以簡單理解成,位元幣工作量證明的過程,就是通過不停的變換區塊頭(即嘗試不同的nouce值)作為輸入進行SHA256雜湊運算,找出一個特定格式雜湊值的過程(即要求有一定數量的前導0)。而要求的前導0的個數越多,代表難度越大。

2. 工作量證明的過程

我們可以把位元幣礦工解這道工作量證明迷題的步驟大致歸納如下:

  • 生成Coinbase交易(這是一筆為了讓礦工獲得獎勵及手續費的特殊交易),並與其他所有準備打包進區塊的交易組成交易列表,通過Merkle Tree演演算法生成Merkle Root Hash。
  • 把Merkle Root Hash及其他相關欄位組裝成區塊頭,將區塊頭的80位元組資料(Block Header)作為工作量證明的輸入。
  • 不停的變更區塊頭中的亂數即nonce的數值,並對每次變更後的的區塊頭做雙重SHA256運算(即SHA256(SHA256(Block_Header))),將結果值與當前網路的目標值做對比,如果小於目標值,則解題成功,工作量證明完成。

可以發現儘管挖礦裝置是用來幫區塊鏈記賬的,但是它們實際所做的大部分工作是尋找正確的亂數,而與記賬無關。

到現在,大家可能理解了區塊鏈是如何做到去中心化的。沒有中心機構的權威背書,區塊鏈系統一方面提供報酬鼓勵記賬人蔘與記賬,另一方面通過記賬人之間的資源消耗競賽來提高作假成本、確保賬本真實性。記賬人之間為獲得位元幣報酬而爭奪「記賬權」。

九、 錢包、私鑰、簽名與交易

位元幣的所有權是通過私鑰地址來確立的。地址類似於一個銀行賬戶的賬號,要想給一個人轉位元幣,只要知道他的位元幣地址就可以了。私鑰的作用主要是給交易來簽名,用來證明這筆交易是由你發起的,別人收到這筆交易,通過驗證簽名就可以確認交易中涉及的資金是合法的。

在位元幣中,公鑰用於接收位元幣,私鑰用於生成其對應地址上支付位元幣所必需的簽名,以唯一確定這些位元幣的所有權。具體到位元幣地址的生成,其實是先產生私鑰,私鑰通過橢圓曲線演演算法這種不可逆的函數來產生公鑰,公鑰經過一系列不可逆的運算再來產生地址。

私鑰持有者才是位元幣的擁有者,那麼私鑰放在哪呢?
錢包是私鑰的容器,是金鑰的管理工具,它只包含金鑰而不是確切的某一個代幣。一個位元幣錢包中包含一系列的金鑰對,每個金鑰對包括一個私鑰和一個公鑰。(錢包的地址類似於銀行賬戶,私鑰類似於銀行卡密碼)

1. 錢包

  • 位元幣錢包有很多種,有PC端的、手機端的,也有專門的硬體錢包,甚至還有用紙寫上私鑰的紙錢包。我們一般使用的都是軟體錢包,私鑰存在一個叫wallet.dat的檔案中。
  • wallet.dat檔案其實是用我們自己設定的密碼加密過的,登入錢包軟體時,需要使用者輸入密碼來對檔案進行解密得到真正的私鑰,這時私鑰存在錢包程式的記憶體中,當我們需要發起一筆交易時,錢包軟體去記憶體中獲取這一私鑰來對交易進行簽名操作。

2. 位元幣交易

從一個位元幣錢包向另一箇中轉賬,每筆交易都有數位簽章來保證安全。一個交易一旦發生那麼就是對所有人都公開的,每個交易的歷史可以最終追溯到相應的位元幣最初被挖出來的那個點。使用者用錢包中的私鑰來簽名交易,從而證明他們擁有交易的輸出,也就是其中的位元幣。

位元幣是以交易輸出的形式儲存在區塊鏈中的。
位元幣並不存在於任何地方,即使是硬碟上。持有位元幣其實是擁有特定位元幣的地址,但是其實所謂的幣並不是直接就存在於這個地址中的,地址就相當於你的銀行賬戶。世界上沒有一個可以摸得著的實物,或者是一個資料檔案,可以被叫做「位元幣」的。
有的只是各個地址之間的轉賬記錄,餘額時增時減。所有的交易都存放在一個非常大的賬本檔案中,這個檔案叫做「區塊鏈」。如果想知道一個位元幣地址中的餘額,那麼這個不是直接存放在位元幣地址中的,我們需要到區塊鏈中去計算出來。
在這裡插入圖片描述
第一筆礦工挖礦的收入交易通常被稱為Coinbase,它沒有輸入,所以交易輸入的雜湊總是被標記為00000000…0000;其他的交易,任何一個交易輸入都會唯一追溯到區塊鏈上在本區塊之前的某個交易雜湊,以及索引。

通過交易雜湊和索引,即可唯一確定一個未花費的交易輸出——UTXO。這樣,每一個交易輸入都和之前的某個交易輸出關聯了起來。
地址是公鑰的雜湊。
當使用一個UTXO時,使用者要提供這個UTXO中描述的地址對應的公鑰、同時用這個公鑰對應的私鑰對這個交易進行簽名,這樣位元幣的接收者才能去驗證這筆交易是否有效。

十、 雙花攻擊和UTXO

什麼叫雙花問題?—筆錢被花費了兩次甚至更多次。

1. 數位貨幣中的雙花問題

在數位貨幣系統中,數位資產本質上是以網際網路為基礎的虛擬數位,簡單來說所謂的數位資產其實就是一串字元,因此它很容易被複制或者多次傳送使用,在這種情況下,如果沒有中心機構的存在,人們並不能確定一筆資產是否已經被花掉,這就導致系統可能存在同一筆數位資產因不當操作被重複使用的情況。

為了解決雙花問題,我們日常的數位資產使用依賴於第三方信任機構進行。這類機構對資料進行中心化管理,由它保管交易總帳,並通過實時修改賬戶餘額的方法來防止雙重支付的出現。第三方機構的最大弊端是驗證費用極高。

在位元幣系統中是如何避免雙花問題的呢?
礦工在生成區塊的時候,會從網路上收集交易資訊,交易資訊中包含了付款人的私鑰簽名。礦工首先會驗證簽名是不是正確的,只有正確的簽名才會被認為是付款人認可的支付。然後礦工會從以前的區塊鏈中追溯,看看付款人這次消費的位元幣是不是以前沒有被消費過。然後記錄下付款人可用的位元幣餘額。這個過程也被稱為UTXO機制

2. UTXO

UTXO是Unspent Transaction Outputs的縮寫,全稱叫做「尚未使用的交易輸出」。

  • U代表Unspent,表示未支付的或尚未使用的,「尚未支付」指的是這個交易輸出還沒有出現在其它交易的輸入端。
  • TX是transaction的縮寫,交易是從一個位元幣錢包向另一個錢包轉賬,是唯一可以改變位元幣所有權的方式,包含了輸入、數目和輸出這些基本內容。
  • O是Output,是輸出的意思,TXO連起來就是指交易輸出。

位元幣是以交易輸出,也就是TXO的形式存在的。我們說自己有多少位元幣實際上是指的我們擁有所有權的那些UTXO中所指明的位元幣的數量。所以可以說並沒有位元幣,只有UTXO。Alice有10個位元幣,本質上是當前區塊鏈賬本中,有若干筆交易的UTXO項收款人寫的是Alice的地址,而這些UTXO項的數額總和是10。

位元幣的分散式區塊鏈賬本
位元幣的分散式區塊鏈賬本,由一筆一筆的交易形成的,每一筆交易都要花費一筆輸入,產生一筆輸出,而其所產生的輸出,就是「未花費過的交易輸出」,也就是UTXO。這些交易構成了一組鏈式結構,所有合法的位元幣交易都可以追溯到前一個或多個交易的輸出,鏈條的源頭就是挖礦獎勵,末尾則是當前未花費的交易輸出。

位元幣交易規則

  • 除了coinbase交易之外,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO。
  • 任何一筆交易的交易輸入總量必須等於交易輸出總量,等式兩邊必須配平。
    在這裡插入圖片描述

當然,UTXO技術也並非100%保證基於區塊鏈的交易中杜絕雙花問題。51%攻擊,又被稱為Majority attack,這種攻擊是通過控制網路算力實現雙花。

十一、 區塊高度,51%攻擊,礦池與算力

1.區塊高度

區塊
區塊是一種被包含在公開賬簿裡的聚合了交易資訊的容器資料結構,這個公開賬簿就是區塊鏈。它是構成區塊鏈的基本單元,由包含後設資料的區塊頭和包含交易資料的區塊主體構成。

那麼這個區塊生成之後要怎麼跟原先的區塊連結起來呢?
區塊頭主要由三組資料組成,第一組是父區塊的雜湊值,父雜湊值用來將該區塊與它的前一區塊相連線;第二組資料和礦工競爭挖礦有關,即難度、時間戳和Nonce(亂數);第三組是由剛才我們講到的區塊體中計算出來的根雜湊值,即默克爾樹根。
在這裡插入圖片描述

這時區塊頭髮揮作用,區塊頭中包含了三組後設資料,其中第一組就是上一個區塊的雜湊值。也就是說,第二個區塊的父雜湊為第一個區塊的雜湊,第三個區塊的父雜湊為第二個區塊的雜湊,通過這種方式,就把一個個區塊連結起來了,形成了一個前向的連結串列。

區塊高度是用來標識一個區塊在區塊鏈中位置的一個概念。

2. 礦池與算力

算力也叫雜湊率,是用來衡量進行雜湊運算的能力的指標,或者說進行一次雜湊計算所需要使用的時間。如果說網路達到了10T雜湊每秒的雜湊率時,就意味著它可以每秒進行10萬億次雜湊運算。

區塊鏈網路中每個礦工都有資格生成區塊,因此為了決定下一個區塊由誰生成,需要通過—定的方法來決定。

PoW機制中,所有節點通過隨機的嘗試和計算,直到有一個節點找到那個隨機雜湊雜湊的數值解,成為有資格生成新區塊的主體。

雜湊碰撞:解出隨機雜湊值不斷嘗試的過程。
一個挖礦機每秒鐘能做這種碰撞的次數,代表其算力。礦工進行挖礦所使用的機器越先進,算力就會越高。

區塊鏈轉賬的基本原理
整個區塊鏈網路之所以能執行,靠的就是整個網路的「礦工」,因為他們通過算力解答加密難題,從而挖出新的區塊。挖出區塊後,他們就有權力將轉賬資訊放入到區塊中,然後完成這筆轉賬,這就是區塊鏈轉賬的基本原理。

中本聰一開始就定義了位元幣總量為2100萬個,並且加密數學題的難度也越來越大。正所謂眾人拾柴火焰高,越來越多的人把自己的礦機拿出來,組成了「挖礦小分隊」,這類組織就被稱為「礦池」。

3. 51%攻擊

51%攻擊出現的根本原因:在整個網路中,有人的算力超過了全網的50%,那麼在他的控制算力的這段時間,可以將區塊逆轉,進行反向交易,實現雙花。

儘管51%的攻擊不會產生新幣或直接導致區塊鏈崩潰,但對參與者對加密貨幣的信心會產生嚴重影響。

什麼時候會出現51%攻擊的問題呢?由於某個礦池的算力過大。
例子:Alice一個礦工掌握了全網50%以上算力的可能性微乎其微,但由於現在生產新區塊越來越困難,出現了礦工間合作組成礦池,匯聚數以千計參與者們的算力,一起參與挖礦並分享獎勵的行為。在這種情況下,一旦某個礦池彙集了過多的礦工,其算力超過了全網的50%,這時就出現了51%攻擊的風險,也對礦工的道德提出了要求。

一個典型51%攻擊案例

Alice 和 Bob之間使用位元幣完成了一杯咖啡的交易,因為是小額交易,Bob在收到Alice的轉賬通知(不是交易確認的通知,只是表面發起了交易)就給Alice提供了咖啡。

正常情況下,這筆交易會馬上被放入交易池等待挖礦節點把自己加入一個新的區塊並開始努力」挖礦」。

假設Alice就是那個大boss,擁有網路51%的算力,他真的不願意為這筆咖啡付錢(有錢人也可能很小氣),於是他開始攻擊了。

網路上很多節點都收到了這筆交易並加入區塊準備運算了,Alice也同樣開始貢獻算力,但是在開始之前他把區塊裡的這筆交易改了,本來這是一筆Alice付款給Bob的交易,被改成Alice轉給自己的一筆交易了(更改很容易,只要把接收地址和簽名改掉即可)。

Alice開始嘗試用這個偽區塊進行計算(計算正確後這個區塊會被加入主鏈中),因為擁有51%的算力,Alice比別的節點更容易優先計算成功,導致一個偽造的區塊加入了主鏈。現在網路中有兩個區塊鏈:
在這裡插入圖片描述
其中一個是原來的主鏈,另一個是比主鏈高出一個區塊的偽造鏈。

按照最長區塊鏈原則,更高的這個鏈就代替了原有的鏈成為後面的主鏈。這筆偽造的交易就被所有節點認可成為了」真實的交易」。

這是Bob就會一直收不到錢,但是咖啡已經給出去了。

攻擊結果: 由於復原了所有對外付款交易,等於收回來已花掉的位元幣。

51%攻擊悖論

雖然看起來51%攻擊非常恐怖,不過這通常僅存在於理論情況下。因為如果你想做到,首先需要足夠的錢去掌控全網51%的算力,這將是非常大的一筆投資。其次在攻擊後,幣種價格會受到影響,你要賣出非常多的幣才能達到收支平衡。這就是51%攻擊悖論。

十二、 總結(基本概念)

礦工
礦工就是指參與位元幣挖礦的個體,也就是說,每一個致力於生產新區塊的位元幣節點的主人,就是一個礦工,是一切行為的操作者,也就是位元幣網路參與的主體。

礦池
礦池的概念是在礦工的基礎上延伸出來的。隨著參與挖礦的礦工越來越多,一個個體礦工要想挖到礦,得到生成新區塊的權力的可能性越來越低,所以一些礦工集合起來,集合各自的算力,提高挖到礦的可能性。這種礦工的集合體就是礦池。

公鑰、私鑰
公鑰和私鑰是一組配合使用的概念,他們之間有著緊密的聯絡。簡單來說,私鑰是系統隨機生成的,公鑰是由私鑰計算得出的;公鑰負責加密,私鑰負責解密;私鑰負責簽名,公鑰負責驗證。在兩者的配合使用之下,礦工才能完成位元幣的交易。

錢包
位元幣錢包,就是用來裝金鑰的容器,它只包含金鑰而不包括具體的多少個位元幣。具體來說,錢包裡面存放了一系列的金鑰,每一金鑰對應著一個私鑰和由這個私鑰生成的公鑰,用於完成這個錢包主人可能要進行的位元幣交易。錢包還有一個地址,這個地址就相當於你支付寶的賬號一樣,你要提供自己的賬號,才能向外轉賬或者給自己充值。

交易
這裡提到的交易,就是利用礦工掌握的私鑰,把位元幣從—個地址轉到另一個地址的行為。我們所說的位元幣,其實就是一系列交易輸出的集合,我們說自己有多少位元幣實際上是指的我們擁有所有權的那些UTXO中所指明的位元幣的數量。

區塊
區塊是構成區塊鏈的基本單元,在區塊鏈中,每隔一段時間就會形成一個新的區塊,礦工們就是在通過挖礦爭奪生成新區塊的權力。每一個區塊由區塊頭和區塊主體構成。在區塊頭中包含了前一個區塊的雜湊資訊,可以幫助新區塊和之前的區塊聯絡起來;而區塊主體則包含了這一段時間內所有的交易資訊。
在這裡插入圖片描述
算力
算力,是用來衡量進行雜湊運算的能力的指標,它可以用每秒完成雜湊碰撞次數來衡量。算力越強,挖到下一個新區塊的可能性也相應的越大。

技術概念

  1. 雜湊演演算法
  2. 共識演演算法
  3. UTXO

參考連結:
https://www.icourse163.org/learn/NJU-1449346161?tid=1461482449
https://www.jianshu.com/p/c616155eae91
http://www.chidaolian.com/article-1574-4
https://www.jianshu.com/p/9ce0dc83efb4