天天看點

比特币原理交易挖礦原理全解析交易挖礦整體流程

網上很多人分析了一堆,但是具體的交易流程,具體怎麼工作的,很少有人分析清楚,現在我力求把這個過程說清楚,這個更适合技術人員檢視,沒有廢話

交易挖礦整體流程

比特币原理交易挖礦原理全解析交易挖礦整體流程
  1. 交易者用錢包用戶端生成交易
  2. 然後選擇一個自有節點或者公共節點peerA将自己的交易發送過去
  3. peerA擷取到交易資訊之後,進行一長串的驗證,驗證通過之後,加入本地的未确認交易池,而且廣播到與之連接配接的所有節點peerB,peerC
  4. peerB和peerC接收到交易之後,進行驗證,通過之後,加入到交易池中,同時判斷交易池中交易數量是否超過1000,超過就按照交易池中的交易hash,批量擷取所有的完整交易資料。同時,驗證通過的交易會繼續廣播到與之相連的所有的節點,轉瞬之間,交易就會傳播到所有節點
  5. 拿到所有交易資料之後,從交易池中選取一部分交易組成一個新的區塊。在區塊頭中添加一個32bit的随機數Nonce,範圍0~2^32,不斷的更改随機數,同時需要改變創币交易中的附帶消息,讓merkle root也發生變化,以便最終的區塊hash低于難度目标值(例如0xb4796ec3),一旦完成挖礦,将本區塊連結到本地鍊的最後,然後将這個區塊發給與之相連的所有節點
  6. peerB接收到這個新區塊,立即停止自身的挖礦工作,然後驗證這個新區塊是否合法,如果合法,并且本地鍊沒有此區塊,添加到自己的鍊中,并且将此區塊轉發給自己相連的所有節點,例如peerA

生成交易

  • UTXO
  • 交易輸出
  • 交易輸入
  • 交易費
  • 簽名加密

UTXO

UTXO易于了解的說就像是賬戶的餘額。它是比特币交易的基本機關,是未經使用的一個交易輸出,Unspent Transaction Output,簡稱UTXO,“未花費的交易輸出”。UTXO不能再分割,1 個UTXO可以是 1“聰” 的任意倍,就像美元可以被分割成“美分”一樣,“分”就不可以再分割了。UTXO被記錄于區塊鍊中,比特币網絡監測着以百萬為機關的所有可用的UTXO。

假設此時glowd擁有 2 比特币,當glowd接收到 0.3 比特币時,這個金額被當作UTXO記錄到區塊鍊裡,現在glowd一共擁有的 2.3 比特币,同樣都被當作UTXO分散到數百個交易和數百個區塊中。實際上,并不存在一個儲存比特币的位址或賬戶餘額的地方,隻有被glowd(所有者)鎖住的、分散的UTXO。

是以,“glowd的比特币餘額”這個概念,是通過掃描區塊鍊并聚合所有屬于該使用者的UTXO來計算該使用者的餘額。

交易輸出

一筆比特币交易是一個含有輸入值和輸出值的資料結構,其中包含了将一筆資金從初始位址(輸入)轉移至目标位址(輸出)的代碼資訊:版本規則、輸入&其數量、輸出&其數量、時間戳。

每一筆比特币交易創造輸出,輸出都會被比特币賬簿記錄下來。所有的輸出都能創造一定數量的可用于支付的比特币(也就是UTXO)。這些UTXO會被整個網絡所識别記錄,其所有者可在未來的交易中使用它們。發送比特币實際上是創造新的UTXO,并且能被用于新的支付。

交易輸入

交易輸入是指向UTXO的指針,當使用者付款時,他的錢包通過選擇可用的UTXO來構造一筆交易。

例如:想要支付0.015比特币,錢包應用會選擇一個 0.01 UTXO和一個 0.005 UTXO,使用它們加在一起來得到想要的付款金額作為交易輸入

交易費

大多數交易包含交易費,這是給比特币礦工一種激勵。大多數錢包自動計算并計入交易費,交易費被挖出這個區塊的礦工得到,并且記錄在這個交易的區塊鍊中。交易的資料結構沒有交易費的字段,意味着你無法從交易資訊中直接看到交易費的金額。

例如:glowd想要支付0.25比特币,為了自己的交易被礦工優先處理,他願意支付0.01比特币作為交易費,那麼錢包至少需要從區塊鍊記錄中整合至少0.26比特币的UTXO。假設他的錢包有一個1比特币的UTXO可用,那麼這筆新的交易就會産生一個1比特币的輸入,和兩個輸出:一個是0.25比特币的消費金額被支付給目标位址,另一個0.74比特币的輸出作為找零支付給glowd的錢包位址,其中有0.01比特币未配置設定,就是“隐藏的”交易費用。

值得說明的是:一定要定義清楚0.74比特币是一個指向自己錢包的輸出,這樣找零才會有效“退回”給glowd的錢包,否則0.74比特币也都将成為交易費,被礦工挖到這份驚喜的“紅包”。

簽名加密

一筆比特币交易一旦被建立,它就會被資金所有者(可能存在多位所有者)簽名。如果它是合法建立并簽名的,則該筆交易現在就是有效的。它包含資金轉移時所需要的所有資訊。使用者的私鑰用于生成支付比特币所必需的簽名,來證明資金的所有權,這樣的簽名加密是為了確定交易内容不被篡改。

網絡中節點收到交易資訊後,會對交易的合法性進行檢查,資金所有者的簽名加密是重要的驗證依據,檢查都通過後,則将交易标記為合法的未确認交易,才會在網絡中進行廣播。

私鑰

一個比特币錢包中包含一系列的密鑰對,每個密鑰對包括一個私鑰和一個公鑰。私鑰是一個數字,通常是随機産生的。一個比特币位址中的所有資金的控制取決于相應私鑰的所有權和控制權。私鑰必須保密,因為一旦被洩露,相當于該私鑰保護下比特币也就丢失了。

通過在一個密碼學安全的随機源中取出一串随機位元組,對其使用SHA256雜湊演算法進行運算,生成了一個256位的數字,這樣的一個數字就可以作為私鑰。以十六進制格式表示一個随機生成的私鑰,即:

DEA94FBC4ED27612315A2616A2B0E9E52CED330AC530EDCB32C8FFC6A526AEDD

公鑰

比特币原理交易挖礦原理全解析交易挖礦整體流程

通過橢圓曲線算法可以從私鑰計算得到公鑰,這是不可逆轉的過程。由公鑰經過單向的加密雜湊演算法生成的比特币位址以數字“1”開頭,在交易中比特币位址就是收款人的位址。比特币位址時使用的算法是Secure Hash Algorithm (SHA)和the RACE Integ rity Primitives Evaluation Message Digest (RIPEMD),具體一點說就是SHA256和RIPEMD160。

以公鑰K為輸入,計算其SHA256哈希,然後再計算RIPEMD160哈希,所得到的160位(20位元組)的數字就是比特币位址。

peerA進行驗證交易

  • 交易的文法和資料結構必須正确。
  • 輸入與輸出清單都不能為空。
  • 交易的位元組大小是小于MAX_BLOCK_SIZE的。
  • 每一個輸出值,以及總量,必須在規定值的範圍内 (小于2,100萬個币,大于0)。
  • 沒有哈希等于0,N等于-1的輸入
  • 交易的位元組大小是大于或等于100的
  • 交易中的簽名數量應小于簽名操作數量上限。
  • 池中或位于主分支區塊中的一個比對交易必須是存在的。
  • 對于每一個輸入,如果引用的輸出存在于池中任何的交易,該交易将被拒絕(避免雙花)
  • 對于每一個輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個輸入,該交易将成為一個孤立的交易。如果與其比對的交易還沒有出現在池中,那麼将被加入到孤立交易池中。
  • 對于每一個輸入,如果引用的輸出交易是一個coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個确認。
  • 對于每一個輸入,引用的輸出是必須存在的,并且沒有被花費。
  • 使用引用的輸出交易獲得輸入值,并檢查每一個輸入值和總值是否在規定值的範圍内 (小于2100萬個币,大于0)。
  • 如果輸入值的總和小于輸出值的總和,交易将被中止。
  • 如果交易費用太低以至于無法進入一個空的區塊,交易将被拒絕。
  • 每一個輸入的解鎖腳本必須依據相應輸出的鎖定腳本來驗證。

peerA廣播交易Hash

  • peerA會廣播交易Hash到所有與之相連的peer節點上
  • peerA的這個交易并不保證廣播到比特币網絡的所有節點。隻要到達足夠多的節點,那麼沒多久這些交易就會被打包進一個區塊。區塊廣播也容許一些消息被丢棄。如果一個節點并未接收到某個區塊,那麼這個節點會在它接收到下一個區塊的時候意識到自己錯失了之前的區塊,是以會發出補充那個遺失區塊的請求。

peerC選擇交易組成新區塊 參閱

比特币原理交易挖礦原理全解析交易挖礦整體流程

節點需要為交易池中的每筆交易配置設定一個優先級,并選擇較高優先級的交易記錄來建構候選區塊。交易的優先級是由交易輸入所花費的UTXO的“塊齡”(币在塊中存在的時間,轉賬頻繁在塊中的時間就會越短)決定,交易輸入值高、“塊齡”大的交易比那些新的、輸入值小的交易擁有更高的優先級。如果區塊中有足夠的空間,高優先級的交易行為将不需要礦工費。數額越大、币齡越高優先級越高。數額較小或剛開采出來不久,轉賬就不免費。

交易的優先級是通過輸入值和輸入的“塊齡”乘積之和除以交易的總長度得到的:

Priority = Sum (Value of input * Input Age) / Transaction Size
           

Priority<0.576就要付費,btc提現時候都要加一個0.0001.

在這個等式中,交易輸入的值是由比特币機關“聰”(1億分之1個比特币)來表示的。UTXO的“塊齡”是自該UTXO被記錄到區塊鍊為止所經曆過的區塊數,即這個UTXO在區塊鍊中的深度。交易記錄的大小由位元組來表示。

一個交易想要成為“較高優先級”,需滿足的條件:優先值大于57,600,000,相當于一個比特币(即1億聰),年齡為一天(144個區塊),交易的大小為250個位元組:

區塊中用來存儲交易的前50K位元組(1/20 * 1M)是保留給較高優先級交易的。節點在填充這50K位元組的時候,會優先考慮這些最高優先級的交易,不管它們是否包含了礦工費。這種機制使得高優先級交易即便是零礦工費,也可以優先被處理。

然後,挖礦節點會選出那些包含最小礦工費的交易,并按照“每千位元組礦工費”進行排序,優先選擇礦工費高的交易來填充剩下的區塊,區塊大小上限為MAX_BLOCK_SIZE=1M。

如區塊中仍有剩餘空間,挖礦節點可以選擇那些不含礦工費的交易。有些礦工會竭盡全力将那些不含礦工費的交易整合到區塊中,而其他礦工也許會選擇忽略這些交易。

在區塊被填滿後,記憶體池中的剩餘交易會成為下一個區塊的候選交易。因為這些交易還留在記憶體池中,是以随着新的區塊被加到鍊上,這些交易輸入時所引用UTXO的深度(即交易“塊齡”)也會随着變大。由于交易的優先值取決于它交易輸入的“塊齡”,是以這個交易的優先值也就随之增長了。最後,一個零礦工費交易的優先值就有可能會滿足高優先級的門檻,被免費地打包進區塊。

比特币交易中沒有過期、逾時的概念,一筆交易現在有效,那麼它就永遠有效。然而,如果一筆交易隻在全網廣播了一次,那麼它隻會儲存在一個挖礦節點的記憶體中。因為記憶體池是以未持久化的方式儲存在挖礦節點存儲器中的,是以一旦這個節點重新啟動,記憶體池中的資料就會被完全擦除。而且,即便一筆有效交易被傳播到了全網,如果它長時間未處理,它将從挖礦節點的記憶體池中消失。如果交易本應該在一段時間内被處理而實際沒有,那麼錢包軟體應該重新發送交易或重新支付更高的礦工費。

區塊

比特币原理交易挖礦原理全解析交易挖礦整體流程

1個區塊最大1M空間,區塊頭80位元組

  • version 版本号,4個位元組,跟随比特币用戶端而定的,一段時間内不會改變。即使要改變,也會有比特币的核心開發人員來協調更新政策,這個可以了解為一個靜态常數。
  • previous_block_hash 前一區塊的摘要,32個位元組
  • merkle_root 默克爾樹的根,32個位元組
  • time 區塊生成時間,4個位元組,一般是打包時的時間查閱
  • bits 難度目标,是一個數字,4個位元組,參考上兩周産生的區塊的平均生成時間而定的,軟體會計算最新的2016個區塊生成的時間,然後做對比,随之調整難度
  • nonce 随機數,4個位元組,這個數字可以變化,而且要從0試到最大值。直到最後出現的hash結果,其數字必須低于難度目标值。不過以現在的計算機算力,這個數字用不了一秒就把全部的變化可能計算完了,是以還需要改變區塊内部的創币交易中的附帶消息,這樣就讓merkle root也發生了變化,進而有更多的可能去找到符合要求的nonce

回收磁盤空間Merkle 樹

如果一枚硬币最近發生的交易發生在足夠多的區塊之前,那麼,這筆交易之前該硬币的花銷交易記錄可以被丢棄 —— 目的是為了節省磁盤空間。為了在不破壞該區塊的哈希的前提下實作此功能,交易記錄的哈希将被納入一個 Merkle 樹[7、2、5]之中,而隻有樹根被納入該區塊的哈希之中。通過砍掉樹枝方法,老區塊即可被壓縮。内部的哈希并不需要被儲存。

一個沒有任何交易記錄的區塊頭大約是 80 個位元組。假設每十分鐘産生一個區塊,80 位元組乘以 6 乘以 24 乘以 365,等于每年 4.2M。截止 2008 年,大多數在售的計算機配有 2GB 記憶體,而按照摩爾定律的預測,每年會增加 1.2 GB,即便是區塊頭必須存儲在記憶體之中也不會是什麼問題。

區塊生成

通過創造出新區塊,比特币以一個确定的但不斷減慢的速率被發行。大約每十分鐘産生一個新區塊,每一個新區塊都伴随着一定數量從無到有的全新比特币。每開采210,000個塊,大約耗時4年,貨币發行速率降低50%。

在2016年的某個時刻,在第420,000個區塊被“挖掘”出來之後降低到12.5比特币/區塊。在第13,230,000個區塊(大概在2137年被挖出)之前,新币的發行速度會以指數形式進行64次“二等分”。到那時每區塊發行比特币數量變為比特币的最小貨币機關——1聰。最終,在經過1,344萬個區塊之後,所有的共20,999,999.9769億聰比特币将全部發行完畢。換句話說,到2140年左右,會存在接近2,100萬比特币。在那之後,新的區塊不再包含比特币獎勵,礦工的收益全部來自交易費。

創世區塊

區塊中的第一筆交易是筆特殊交易,稱為創币交易或者Coinbase交易

創币交易的輸入:創币交易于其他交易的不同點在于其交易輸入沒有UTXO,也沒有“輸入腳本”。這個字段被Coinbase資料替代,除開始的幾個位元組外,礦工可以任意使用Coinbase的其他部分,随意填充任何資料。是以,中本聰在創世區塊的Coinbase中填入了這樣的資料 “The Times 03/Jan/ 2009 Chancellor on brink of secondbailout for banks”。

區塊鍊裡的第一個區塊建立于2009年,被稱為創世區塊。它是區塊鍊裡面所有區塊的共同祖先,這意味着你從任一區塊,循鍊向後回溯,最終都将到達創世區塊。

創世區塊的哈希值為:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

礦工

礦工是指設定為挖礦狀态的節點(查閱比特币節點),處于挖礦狀态的節點需要貢獻算力,可能擷取到寫入區塊的權利,進而擷取比特币。

比特币的鍊要想正常生長,理論上隻要有一個節點處于挖礦狀态即可。實際上維護比特币網絡長期正常運作需要多個挖礦節點,保持鍊正常生長。多個節點處于挖礦狀态時,則多個節點競争寫區塊的權利,每個區塊的生成具有随機性,但是貢獻工作量/算力大小決定了你擷取權利的機率。

難度調整

比特币的區塊平均每10分鐘生成一個。這就是比特币貨币發行速率和交易達成速度的基礎,必須始終保持恒定。随着技術發展,計算機性能将飛速提升。此外,參與挖礦的人和計算機也會不斷變化。為了能讓新區塊的保持10分鐘一個的産生速率,挖礦的難度必須根據這些變化進行調整。

2009年12月30日,比特币挖礦難度首次增長。尋找一個比特币區塊需要整個網絡花費大約10分鐘來處理,每發現2,016個區塊時會根據前2,016個區塊完成的時間對難度進行調整。

區塊鍊的分叉

分叉發生在兩名礦工在較短的時間内,各自都算得了工作量證明解的時候。兩個礦工在各自的候選區塊一發現解,便立即傳播自己的“獲勝”區塊到網絡中,先是傳播給鄰近的節點而後傳播到整個網絡。

由于每個礦工的區塊資料都不一樣,是以他們解題得出的結果也是不一樣的,都是正确答案,隻是區塊不同。區塊鍊在這個時刻,出現了兩個都滿足要求的不同區塊。不同的礦工看到這兩個區塊是有先後順序的,通常情況下,礦工們會把自己先看到的區塊複制過來,然後接着在這個區塊開始新的挖礦工作。這時分叉就産生了。

從分叉的區塊起,由于分叉的鍊上礦工的數量不同,是以算力也有差别,兩條鍊的增長速度也是不一樣的,總有一條鍊的長度要超過另一條。當礦工發現全網有一條更長的鍊時,他就會抛棄他目前分叉的鍊,而繼續在更長的主鍊上進行挖礦工作。