區(qū)塊鏈原理與實(shí)踐- 課件 第9章比特幣_第1頁
區(qū)塊鏈原理與實(shí)踐- 課件 第9章比特幣_第2頁
區(qū)塊鏈原理與實(shí)踐- 課件 第9章比特幣_第3頁
區(qū)塊鏈原理與實(shí)踐- 課件 第9章比特幣_第4頁
區(qū)塊鏈原理與實(shí)踐- 課件 第9章比特幣_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章比特幣系統(tǒng)01.比特幣簡介03.共識機(jī)制02.比特幣原理04.區(qū)塊及交易存儲結(jié)構(gòu)05.比特幣運(yùn)行06.比特幣錢包07.比特幣源碼解讀08.使用比特幣系統(tǒng)1比特幣簡介比特幣的起源

比特幣(Bitcoin)是區(qū)塊鏈技術(shù)中最典型、最廣泛使用的應(yīng)用,區(qū)塊技術(shù)的概念基本上就是基于比特幣系統(tǒng)廣泛使用而被人熟知的,以至于很多人認(rèn)為比特幣技術(shù)就是區(qū)塊鏈技術(shù),實(shí)際上,比特幣只是區(qū)塊鏈技術(shù)的最典型應(yīng)用之一。

比特幣的概念最初由中本聰(SatoshiNakamoto)首先提出的,至今為止,中本聰仍是一個網(wǎng)絡(luò)虛擬的人物,其真實(shí)身份還不為人知。2008年11月1日,中本聰在“”網(wǎng)站的密碼學(xué)郵件列表中發(fā)表了一篇論文,題為《比特幣:一種點(diǎn)對點(diǎn)式的電子現(xiàn)金系統(tǒng)》。該論文中,中本聰首次基于區(qū)塊鏈技術(shù)描述了一個去中心化的電子交易體系,并提出了一種P2P形式的虛擬的加密數(shù)字貨幣—比特幣的概念。2009年1月3日,中本聰開發(fā)出首個實(shí)現(xiàn)了比特幣算法的客戶端程序,并將其運(yùn)行于網(wǎng)絡(luò),首次“采礦”(Mining)獲得了第一區(qū)塊中第一個交易的50個比特幣,第一個區(qū)塊也被稱為創(chuàng)世區(qū)塊。標(biāo)志著比特幣金融體系的正式誕生。比特幣的產(chǎn)生

不同于傳統(tǒng)的貨幣,比特幣是完全虛擬的,甚至在比特幣系統(tǒng)中,也沒有每個用戶擁有比特幣的數(shù)值。實(shí)際上,區(qū)塊鏈系統(tǒng)中存儲的是所有用戶之間的每一筆交易,每個用戶擁有的比特幣數(shù)量是根據(jù)用戶之間的一筆筆交易計(jì)算出來的。比特幣的產(chǎn)生是由作為創(chuàng)建區(qū)塊的用戶在創(chuàng)建區(qū)塊時,作為每個區(qū)塊的第一筆交易,獎勵給創(chuàng)建者的。依據(jù)共識機(jī)制,通過大量的計(jì)算產(chǎn)生來競爭創(chuàng)建區(qū)塊的權(quán)利,從而獲得比特幣,整個P2P網(wǎng)絡(luò)中眾多節(jié)點(diǎn)構(gòu)成的分布式數(shù)據(jù)庫來確認(rèn)并記錄所有的交易行為,并使用密碼學(xué)的設(shè)計(jì)來確保貨幣流通各個環(huán)節(jié)安全性。P2P的去中心化特性與算法本身確保存儲于系統(tǒng)的數(shù)據(jù)是不可修改的,從而保證上面記錄的每一筆交易是可信的,最終保證通過計(jì)算交易,獲得每個用戶擁有的比特幣數(shù)量是可信的?;诿艽a學(xué)的設(shè)計(jì),可以使比特幣只能被擁有者轉(zhuǎn)移或支付。這同樣確保了貨幣所有權(quán)與流通交易的匿名性以及可信性。比特幣的激勵

比特幣的產(chǎn)生速度是有限制的,最開始是創(chuàng)建一個區(qū)塊獎勵50比特幣,規(guī)定每產(chǎn)生21萬個區(qū)塊,獎勵就會減半。比特幣自誕生以來,到2020年5月,已經(jīng)經(jīng)歷了三次減半。2012年11月28日,比特幣在區(qū)塊高度210000完成歷史首次減半,獎勵由50枚比特幣降至25枚。2016年7月9日,比特幣在區(qū)塊高度420000完成第二次減半,獎勵降至12.5枚。2020年5月12日,在達(dá)到區(qū)塊高度630000后,比特幣的第三次減半,獎勵進(jìn)一步降至6.25枚。在2040年后,比特幣總數(shù)達(dá)到接近2100萬個比特幣,之后新的區(qū)塊不再包含比特幣獎勵,礦工的收益全部來自交易費(fèi)。比特幣的單位

在比特幣基本的系統(tǒng)中有兩個基本的交易單位分別是:比特幣(Bitcoins,BTC)、聰(Satoshi),他們之間的關(guān)系是1BTC=108Satoshi,其中,Satoshi是比特幣系統(tǒng)中不可分割的最小交易單位。在實(shí)際的交易使用過程中,由于BTC和Satoshi之間間隔過大,為使用方便,人們又增加如下幾個交易單位:比特分(Bitcent,cBTC:1cBTC=0.01BTC毫比特(Milli-Bitcoins,mBTC):1mBTC=0.001BTC微比特(Micro-Bitcoins,μBTC或uBTC):1μBTC=0.000001BTC但是在系統(tǒng)中,這些存儲要轉(zhuǎn)換成BTC和Satoshi。2比特幣原理

比特幣體系結(jié)構(gòu)

比特幣體系結(jié)構(gòu)比特幣網(wǎng)絡(luò)層比特幣系統(tǒng)通過對等(P2P,peer-to-peer)網(wǎng)絡(luò),將網(wǎng)絡(luò)數(shù)據(jù)廣播到各節(jié)點(diǎn)。在比特幣系統(tǒng)是不存在真正服務(wù)器節(jié)點(diǎn),所有節(jié)點(diǎn)之間都是對等的。在全球運(yùn)行的整個比特幣系統(tǒng)中,可以認(rèn)為都是所謂的客戶端系統(tǒng),只是存在不同類型的客戶端系統(tǒng)。但是為保證比特幣系統(tǒng)在全球能夠穩(wěn)定運(yùn)行,在比特幣系統(tǒng)存在全球固定的種子節(jié)點(diǎn),這幾個節(jié)點(diǎn)在比特幣的核心源碼中已經(jīng)固定。seed.bitcoin.sipa.be

dnsseed.bluematt.meseed.bitcoin.jonasschnelli.chseed.bitcoin.sprovoost.nldnsseed.emzy.de比特幣體系結(jié)構(gòu)比特幣數(shù)據(jù)層比特幣的全部數(shù)據(jù)以交易的方式存儲在區(qū)塊鏈中,每個交易由表明交易來源的交易輸入和表明交易去向的交易輸出組成,交易輸入和交易輸出都可以有多項(xiàng),表示一次交易可以將先前多個賬戶中的比特幣合并后轉(zhuǎn)給另外多個賬戶。所有交易通過輸入與輸出鏈接在一起,使得每一筆交易都可追溯;未經(jīng)使用交易的輸出稱之為UTXO(UnspentTransactionOutputs)可以被新的交易引用作為其合法的輸入。被使用過交易的輸出稱之為STXO(SpentTransactionOutputs),則無法被引用作為合法輸入。比特幣使用了Merkle樹確保數(shù)據(jù)的完整性。比特幣采用了改進(jìn)的非對稱橢圓曲線加密算法(EllipticCurveCryptography,ECC),用戶自己保留私鑰,對自己發(fā)出的交易進(jìn)行簽名確認(rèn),并公開公鑰,比特幣采用公鑰\私鑰作為交易的賬號,使用該加密算法對交易進(jìn)行數(shù)字簽名,簽名后的交易確保發(fā)生后不會被任何人修改。比特幣體系結(jié)構(gòu)比特幣共識層比特幣系統(tǒng)的共識算法采用基于工作量證明算法(ProofofWork,PoW)的機(jī)制來實(shí)現(xiàn)共識,該機(jī)制最早于1998年在Bmoney設(shè)計(jì)中提出。POW通過計(jì)算來猜測一個數(shù)值(nonce),和本區(qū)塊上特定數(shù)據(jù)合并后,經(jīng)過Hash(報(bào)文摘要)運(yùn)算后,如果Hash值滿足一定的條件,從而獲得創(chuàng)建區(qū)塊需求權(quán)限的共識,并獲得比特幣獎勵,這就是所謂挖礦。比特幣體系結(jié)構(gòu)比特幣接口應(yīng)用層在比特幣的應(yīng)用層,有不同的節(jié)點(diǎn)類型提供的各種接口,獲得比特幣的相關(guān)信息。各節(jié)點(diǎn)類型如下:(1)全節(jié)點(diǎn)是指維持包含全部交易信息的完整區(qū)塊鏈節(jié)點(diǎn),為完整區(qū)塊鏈節(jié)點(diǎn)。完整區(qū)塊鏈節(jié)點(diǎn)保存有全部的交易數(shù)據(jù),因此其所擁有的數(shù)據(jù)是完整的、所有的區(qū)塊信息,全節(jié)點(diǎn)包含了從第一區(qū)塊(創(chuàng)世區(qū)塊)一直到網(wǎng)絡(luò)中最新建立的區(qū)塊,是全球比特幣交易信息的一個復(fù)制信息。完整區(qū)塊節(jié)點(diǎn)通過比特幣網(wǎng)絡(luò)廣播獲取包含交易信息的新區(qū)塊,在驗(yàn)證無誤后將此更新合并至本地的區(qū)塊鏈數(shù)據(jù)庫。(2)錢包節(jié)點(diǎn)是一個應(yīng)用程序,為用戶提供交互界面,不同平臺有不同的錢包。用戶通過錢包進(jìn)行交易和查詢自己的比特幣數(shù)量,錢包是用戶操作比特幣的接口。比特幣網(wǎng)絡(luò)比特幣采用了的P2P(peer-to-peer)網(wǎng)絡(luò)架構(gòu)。P2P是指位于同一網(wǎng)絡(luò)中的每臺計(jì)算機(jī)都彼此對等的,各個節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點(diǎn)。所謂對等是網(wǎng)絡(luò)中每個節(jié)點(diǎn)既是數(shù)據(jù)的提供者也是數(shù)據(jù)的使用者,節(jié)點(diǎn)間通過網(wǎng)絡(luò)實(shí)現(xiàn)計(jì)算機(jī)資源與信息的共享,因此每個節(jié)點(diǎn)地位均等。比特幣所采用的P2P網(wǎng)絡(luò)架構(gòu)是一種完全去中心化的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),是比特幣去中心化的基石,因此,比特幣是一種點(diǎn)對點(diǎn)的數(shù)字現(xiàn)金系統(tǒng)。比特幣網(wǎng)絡(luò)實(shí)現(xiàn)時,建立與網(wǎng)絡(luò)層之上,不考慮邏輯節(jié)點(diǎn)之間的路由和拓?fù)潢P(guān)系,比特幣P2P網(wǎng)絡(luò)完全基于TCP構(gòu)建,主網(wǎng)默認(rèn)通信端口是8333,比特幣傳輸層采用TCP協(xié)議,實(shí)現(xiàn)時必然也是采用C/S架構(gòu)方式。實(shí)際上,比特幣點(diǎn)對點(diǎn)之間是一種互為C/S架構(gòu),也即每個節(jié)點(diǎn)即是服務(wù)器端,可以等待其他節(jié)點(diǎn)的建立連接通信,也是可以作為客戶端,主動連接其他節(jié)點(diǎn)通信。比特幣網(wǎng)絡(luò)比特幣網(wǎng)絡(luò)的架構(gòu)比特幣網(wǎng)絡(luò)網(wǎng)絡(luò)節(jié)點(diǎn)的類型:

(1)全節(jié)點(diǎn),具有路由數(shù)據(jù)功能。一個節(jié)點(diǎn)只要是下載了完整且最新的區(qū)塊鏈數(shù)據(jù),就可以作為一個全節(jié)點(diǎn)。只有全節(jié)點(diǎn)才能真正自己去驗(yàn)證交易。因?yàn)榭梢元?dú)立完成交易確認(rèn)和廣播,它是支撐著比特幣轉(zhuǎn)賬交易的核心力量。從整個比特幣網(wǎng)絡(luò)的角度來看,運(yùn)行全節(jié)點(diǎn)是對比特幣網(wǎng)絡(luò)很好的支持,全節(jié)點(diǎn)越多,比特幣網(wǎng)絡(luò)就越安全。

(2)礦機(jī)網(wǎng)絡(luò),在比特幣網(wǎng)絡(luò)中,任何一臺電腦都可以算力計(jì)算,獲得創(chuàng)建區(qū)塊的權(quán)利,成為挖礦機(jī)。但是單臺計(jì)算機(jī)的計(jì)算能力有限,參與全球算力競爭是,可能永遠(yuǎn)都無法競爭獲勝,獲得創(chuàng)建區(qū)塊的比特幣。為此,參與計(jì)算競爭的計(jì)算機(jī)聯(lián)合起,共同參與競爭,當(dāng)競爭勝利后,根據(jù)協(xié)議分配獲得比特幣,這就是所謂的礦池網(wǎng)絡(luò)。

(3)錢包節(jié)點(diǎn),只關(guān)心和自己錢包中的地址相關(guān)部分交易,不會下載完整的區(qū)塊鏈,所以也被稱為輕節(jié)點(diǎn)。發(fā)起簡單支付驗(yàn)證(SPV),然后向全節(jié)點(diǎn)請求數(shù)據(jù)來驗(yàn)證交易。輕節(jié)點(diǎn)不能看到所有的交易歷史。比特幣網(wǎng)絡(luò)比特幣網(wǎng)絡(luò)運(yùn)行過程如下:

1)新的交易向全網(wǎng)進(jìn)行廣播;2)每一個節(jié)點(diǎn)都將收到的交易信息納入一個區(qū)塊中;3)每個節(jié)點(diǎn)都嘗試在自己的區(qū)塊中找到一個具有足夠難度的工作量證明;4)當(dāng)一個節(jié)點(diǎn)找到了一個工作量證明,它就向全網(wǎng)進(jìn)行廣播;5)當(dāng)且僅當(dāng)包含在該區(qū)塊中的所有交易都是有效的且之前未存在過的,其他節(jié)點(diǎn)才認(rèn)同該區(qū)塊的有效性;6)其他節(jié)點(diǎn)表示他們接受該區(qū)塊,置于區(qū)塊鏈的末尾。比特幣系統(tǒng)更新過程

比特幣系統(tǒng)通過比特幣更新提案(BitcoinImprovementProposal,BIP)改進(jìn)其運(yùn)行機(jī)制,BIP是用于引入特征信息的比特幣設(shè)計(jì)文檔。通過BIP向比特幣社區(qū)提供信息的設(shè)計(jì)文檔,或描述比特幣或其流程或環(huán)境的新功能。BIP9支持多個特性同時升級,并新增投票時間區(qū)間以及新增鎖定期。BIP9將一個提案更新過程分為五個狀態(tài),MTP是最近11個塊的時間戳中位數(shù)。區(qū)塊鏈上的塊時間并不是按照高度遞增而嚴(yán)格遞增的,但MTP時間是嚴(yán)格遞增的(早期可能不能嚴(yán)格遵守)。BIP能夠進(jìn)入鎖定期(即得到全網(wǎng)同意)的條件是在2016個塊中,支持的塊數(shù)量達(dá)到95%,在測試網(wǎng)絡(luò)上是75%。之后才能正式激活特性。根據(jù)BIP9,版本號4字節(jié)做以下定義:32位中前三位固定為001,剩余29個比特可以用于特性設(shè)置,用于激發(fā)某個特性,如果處理激發(fā)狀態(tài)則對應(yīng)的位設(shè)置為1。比特幣系統(tǒng)更新過程有限狀態(tài)機(jī)DEFINED穩(wěn)定狀態(tài),還沒有開始升級,創(chuàng)世區(qū)塊被預(yù)定義為這個狀態(tài);STARTED提案進(jìn)入投票開始狀態(tài);LOCKED_IN鎖定狀態(tài);ACTIVE激活狀態(tài);提案正式開始生效,網(wǎng)中所有區(qū)塊都已通過鎖定期;FAILED鎖定期內(nèi)沒有達(dá)成投票成功的條件,不進(jìn)行升級。3共識機(jī)制

比特幣共識算法

比特幣區(qū)塊鏈采用了ProofofWork(PoW)的機(jī)制來實(shí)現(xiàn)共識,比特幣系統(tǒng)所采用的工作量證明算法是,通過計(jì)算來猜測一個數(shù)值(Nonce),使得拼湊上交易數(shù)據(jù)后,進(jìn)行哈希運(yùn)算(Hash函數(shù)),其Hash值滿足規(guī)定的上限。Version:4字節(jié),區(qū)塊的版本號。hashPrevBlock:256位,前一個區(qū)塊的哈希值。hashMerkleRoot:256位,Merkle根哈希值。由區(qū)塊中包含的所有交易的哈希值運(yùn)算得出的。nTime:4字節(jié),時間,礦工開始運(yùn)算header哈希的那個時間點(diǎn)。nBits:4字節(jié),難度系數(shù)。Nonce:4字節(jié),滿足條件的隨機(jī)數(shù),礦工通過算力尋找的參數(shù)。比特幣共識算法

將區(qū)塊頭相關(guān)參數(shù)轉(zhuǎn)換成字節(jié)流,通過SHA265運(yùn)算獲得HASH值,HASH值必須nBits設(shè)定的難度系數(shù)條件。礦工通過調(diào)整Nonce的值,來尋找滿足條件的Nonce,礦工只能通過暴力破解的方法,也即在Nonce范圍內(nèi)遍歷的方法尋找滿足條件的Nonce。誰的運(yùn)算速度快,也就是誰的算力大,找到符合條件的Nonce的可能性就越大。

比特幣系統(tǒng)設(shè)定一個難度目標(biāo)值,如果運(yùn)算哈希值小于目標(biāo)值,則表示找到滿足條件的Nonce,挖礦成功。即需要滿足公式:sha256(blockheader)<=target

比特幣系統(tǒng)中第一區(qū)塊稱之為創(chuàng)世區(qū)塊,初始難度目標(biāo)值為:0x00000000FFFF0000000000000000000000000000000000000000000000000000

在比特幣系統(tǒng)中,難度目標(biāo)值越小,挖礦難度就越大,因?yàn)楣V的繕?biāo)值的范圍會越??;反之難度值越大,挖礦難度就越小。比特幣共識算法

為表示目標(biāo)哈希值有效字節(jié)數(shù),比特幣系統(tǒng)采用壓縮表示法,由一個4字節(jié)的整數(shù)表示壓縮存儲目標(biāo)值。表示方法為:

第1個字節(jié)存儲目標(biāo)值有效的字節(jié)數(shù),記為Ex;后3個字節(jié)為目標(biāo)值的最高3個字節(jié),記為C1。

如果目標(biāo)值的最高位為1(大于0x80),需要在前面補(bǔ)上0x00。這里有效字節(jié)數(shù)Ex包含后3個字節(jié)C1。如上述創(chuàng)世區(qū)塊初始難度目標(biāo)值去掉前面的0,其目標(biāo)值FFFF0000000000000000000000000000000000000000000000000000,共28個字節(jié),由于最高位為1,因此前面補(bǔ)上00,因此有效字節(jié)數(shù)為:29個,16進(jìn)制表示為1D,目標(biāo)值最高3個字節(jié)為:00FFFF,這時壓縮表示為:0x1D00FFFF比特幣共識算法

另外一個參數(shù)是難度,是挖礦困難程度的度量,表示的是創(chuàng)世區(qū)塊的難度目標(biāo)值的比值,即指:相對創(chuàng)世區(qū)塊的難度。定義如下:Difficulty=Difficulty_1_target/Cur_target

difficulty_1_target的長度為256bit,前32位為0,后面全部為1,以16進(jìn)制表示為:0x00000000FFFF0000000000000000000000000000000000000000000000000000表示比特幣網(wǎng)絡(luò)創(chuàng)世區(qū)塊的難度目標(biāo)值,以難度目標(biāo)表示法為,0x1d00ffff。因此,創(chuàng)世區(qū)塊的難度為1.

Cur_target當(dāng)前難度目標(biāo)值。如上述難度目標(biāo)值的難度為:0x00000000FFFF0000000000000000000000000000000000000000000000000000/0x00000000000404CB000000000000000000000000000000000000000000000000=16307.420938523983bdiff這里bdiff表示本單位是比特幣挖礦難度。比特幣共識算法

比特幣網(wǎng)絡(luò)有一個全局的區(qū)塊難度,礦池也會有一個自定義的共享難度用來設(shè)定產(chǎn)生股份的最低難度限制。

比特幣網(wǎng)絡(luò)中算力是持續(xù)波動的,比特幣系統(tǒng)通過難度目標(biāo)的調(diào)整,使得平均出塊時間維持在10分鐘左右。當(dāng)區(qū)塊高度為2016的整數(shù)倍時,比特幣系統(tǒng)就會在該區(qū)塊上自動調(diào)整難度目標(biāo),也就是比特幣系統(tǒng)每大約14天調(diào)整一次挖礦難度。如果上一個難度目標(biāo)調(diào)整周期內(nèi),平均出塊時間超過10分鐘,那么降低挖礦難度,增大難度目標(biāo);反之則提高挖礦難度,減小難度目標(biāo)。

難度目標(biāo)值每過2016塊改變一次,計(jì)算公式:TarNew=TarCur*ActTime2016/TheoryTime2016

TarNew:新難度目標(biāo)值;

TarCur:當(dāng)前難度目標(biāo)值

ActTime2016:實(shí)際2016個區(qū)塊的出塊時間

TheoryTime2016:理論2016個區(qū)塊出塊時間也就是2周比特幣共識算法

比特幣系統(tǒng)更新難度目標(biāo)值的算法如下:1)當(dāng)前區(qū)塊高度是否2016的整數(shù)倍,如果不是則繼續(xù)使用原來難度目標(biāo)值,否則下一步;

2)計(jì)算最近2016個區(qū)塊出塊用時;

3)如果用時低于半周,則按半周計(jì)算。防止難度增加4倍以上。如果用時高于8周,則按8周計(jì)算。防止難度降低到4倍以下。

4)按照公式8-3計(jì)算新的目標(biāo)難度,如果新目標(biāo)值,超過最大難度限制,則按最大難度處理,

5)調(diào)整為新的難度目標(biāo)。挖礦是尋找滿足條件的Nonce,由于其他數(shù)據(jù)值是固定的,因此,相當(dāng)于建立一個自變量為Nonce函數(shù)映射,自變量Nonce的范圍只有4個字節(jié),而目標(biāo)Hash值是一個長度32字節(jié)即256位,自變量的變化范圍遠(yuǎn)小于應(yīng)變量的范圍。必然存在可能無法找到符合提交件Nonce,未解決這個問題,比特幣系統(tǒng)采用擴(kuò)展Nonce的方法,在Nonce之外,再存儲一些擴(kuò)展字段,見這些擴(kuò)展字段數(shù)據(jù)和Nonce以及其他頭數(shù)據(jù)一起Hash后滿足目標(biāo)條件。這些擴(kuò)展字段數(shù)據(jù)稱之為ExtraNonce。由于區(qū)塊中存儲的第一個交易為獎勵挖礦者的區(qū)塊交易,稱之為Coinbase交易,ExtraNonce存儲在Coinbase交易的數(shù)據(jù)區(qū)中。比特幣挖礦

找到符合條件的Nonce就可以獲得創(chuàng)建區(qū)塊的權(quán)利,創(chuàng)建區(qū)塊者將獲得一定的獎勵,包括兩部分:創(chuàng)建區(qū)塊獎勵和交易的費(fèi)用獎勵,前者產(chǎn)生新的比特幣。創(chuàng)建區(qū)塊獎勵最初為50個比特幣,且每開采210000個區(qū)塊其獎勵減半,由于比特幣系統(tǒng)大約每十分鐘產(chǎn)生一個新區(qū)塊,其減半周期為4年。在2040年后,之后新的區(qū)塊不再包含比特幣獎勵,礦工的收益全部來自交易費(fèi)。

挖礦計(jì)算的是基于SHA256的HASH算法,基于SHA256運(yùn)算速度越快,就能獲得競爭優(yōu)勢,為此針對的SHA256算法特點(diǎn),人們硬件上專門開發(fā)了有SHA256算法運(yùn)算優(yōu)勢的計(jì)算機(jī),這就是所謂礦機(jī)。評價礦機(jī)的指標(biāo)主要是算力,算力單位指標(biāo)定義如下:

H/s:算力最小的單位,每秒做一次SHA256運(yùn)算,叫做Hash/s單位簡寫成H/s。

KH/s:1KH/s=1000H/s每秒1,000次哈希

MH/s:1MH/s=1000KH/s每106次哈希

GH/s:1GH/s=1000MH/s每秒109次哈希

TH/s:1TH/s=1000GH/s每秒1012次哈希

PH/s:1PH/s=1000TH/s每秒1015次哈希

EH/s:1EH/s=1000PH/s每秒1018次哈希比特幣挖礦

2020年7月,比特幣的全網(wǎng)算力為121.12EH/s

目前,比特幣挖礦經(jīng)歷了三個階段,CPU、GPU、ASIC。如下:

CPU(中央處理器,CentralProcessingUnit):相當(dāng)于利用普通的電腦進(jìn)行挖礦。CPU是只能進(jìn)行順序串行處理,一個CPU只能處理一個任務(wù),但是有很強(qiáng)的通用性,能處理各種不同的數(shù)據(jù)類型及任務(wù);

GPU(圖像處理單元,GraphicsProcessingUnit):就是利用顯卡進(jìn)行挖礦,這是因?yàn)?/p>

顯卡中的GPU對SHA256運(yùn)算比CPU有優(yōu)勢。GPU是針對圖像像素處理的,特點(diǎn)是數(shù)據(jù)類型、運(yùn)算類型簡單,重復(fù)性高、可并行計(jì)算等,因此GPU的設(shè)計(jì)特點(diǎn)是則擁有一個由數(shù)以千計(jì)的、更小的、更高效的計(jì)算核心組成的大規(guī)模并行計(jì)算架構(gòu),適合并行大量的簡單運(yùn)算,因此GPU在高效并發(fā)處理方面有極大的優(yōu)勢。

ASIC(特定應(yīng)用集成電路,ApplicationSpecificIntegratedCircuit):ASIC是一種專門為比特幣挖礦設(shè)計(jì)的集成電路,以2012年阿瓦隆生產(chǎn)出世界上第一臺ASIC礦機(jī)為代表。ASIC礦機(jī)則是指使用ASIC芯片作為核心運(yùn)算零件的礦機(jī),ASIC比特幣礦機(jī)是一臺專門從事比特幣采礦程序的計(jì)算機(jī),是針對SHA256算法而進(jìn)行優(yōu)化的專用挖礦硬件。比特幣挖礦

單個礦工從概率上講都可能挖礦成功,但是實(shí)際上,由于概率太低,可能十年都無法成功一次,找到一個區(qū)塊以抵消電力和硬件成本的可能性非常小。因此,礦工們合作組成礦池,匯集數(shù)以千計(jì)參與者們的算力并分享獎勵。通過參加礦池,礦工們得到整體回報(bào)的一小部分,因而減少了不確定性。

在礦池機(jī)制中,不論個人礦工所能使用的運(yùn)算力多寡,只要是透過加入礦池來參與挖礦活動,無論是否有成功挖掘出有效資料塊,都可以通過由對礦池的貢獻(xiàn)度來獲得少量比特幣獎勵。下圖是2020年8月4日顯示的全球礦池算力圖。比特幣挖礦

礦機(jī)、礦池形成了另一個網(wǎng)絡(luò),稱之為礦工網(wǎng)絡(luò)。礦工網(wǎng)絡(luò)分成礦機(jī)、礦池、錢包等幾個主要部分。礦工網(wǎng)絡(luò)采用的網(wǎng)絡(luò)協(xié)議稱之為挖礦協(xié)議,當(dāng)前主要采用Stratum協(xié)議。Stratum協(xié)議通信格式采用JSON數(shù)據(jù)格式,傳輸層采用TCP協(xié)議,其中礦池為服務(wù)器端。Stratum協(xié)議采用主動分配任務(wù)的方式:礦池方面,隨時可以給礦工指派新任務(wù);礦工方面,收到礦池指派的新任務(wù)時,應(yīng)立即無條件轉(zhuǎn)向新任務(wù),同時礦工可以主動向礦池申請新任務(wù)。礦工與礦池之間的通信過程如下:比特幣挖礦

1.任務(wù)訂閱

礦機(jī)啟動,和礦池建立連接后,提交subscribe方法,消息內(nèi)容如下:{"id":1,"method":"mining.subscribe","params":[]}

礦池收到礦機(jī)的訂閱消息后,響應(yīng)消息內(nèi)容如下:

id與礦機(jī)訂閱消息中id相同。result包含三部分:

第一部分可選,對應(yīng)不同方法的id;

第二部分是extraNonce1用于構(gòu)建coinbase交易;

第三部分是extraNonce2的長度,礦機(jī)ExtraNonce2計(jì)數(shù)器的字節(jié)數(shù),一般為4字節(jié)。比特幣挖礦

2.請求授權(quán)

礦機(jī)以mining.authorize方法,帳號和密碼登錄到礦池,密碼可空,礦池返回true登錄成功。該方法必須是在初始化連接之后馬上進(jìn)行,否則礦機(jī)得不到礦池任務(wù)。如:{"id":2,"method":"mining.authorize","params":["slu.miner1","password"]}

礦池收到礦機(jī)的授權(quán)消息后,先對礦工名進(jìn)行驗(yàn)證,礦工名的第一部分(“.”左邊的部分)為用戶名或子賬號名,若該用戶名不存在,則授權(quán)失敗,返回error,消息內(nèi)容如下:{"id":2,"result":null,"error":[29,"Invalidusername",null]}

若成功,則返回如下消息:{"id":2,"result":true,"error":null}

只有被礦池授權(quán)的礦工才能收到礦池指派任務(wù)。比特幣挖礦

3.任務(wù)分配該命令由礦池定期發(fā)給礦機(jī),礦池以mining.notify返回該任務(wù)。如下:比特幣挖礦

4.挖礦①構(gòu)建coinbase用到的信息包括Coinb1,Extranonce1,Extranonce2_size以及Coinb2,方法如下:Coinbase=Coinb1+Extranonce1+Extranonce2+Coinb2②構(gòu)建Merkleroot利用coinbase和merkle_branch,按照構(gòu)造hashMerkleroot③構(gòu)建區(qū)塊頭開始挖礦填充余下的5個字段,礦池可以在nNonce和Extranonce2里搜索進(jìn)行挖礦,如果搜索空間還不夠,增加Extranonce2_size大小。比特幣挖礦

5.結(jié)果提交如果礦機(jī)挖礦成功發(fā)現(xiàn)一個nonce,則提交給礦池,消息格式如下:礦池返回結(jié)果,返回true表示礦池認(rèn)可礦機(jī)的工作比特幣挖礦

6.難度調(diào)整當(dāng)比特幣系統(tǒng)難度調(diào)整時,礦池通知礦機(jī)調(diào)整難度,消息格式如下:Server:{"id":null,"method":"mining.set_difficulty","params":[123]}其中,"params":[123]便是新難度值。123表示新難度是創(chuàng)世區(qū)塊難度的123倍。4區(qū)塊及交易存儲結(jié)構(gòu)

區(qū)塊結(jié)構(gòu)

區(qū)塊鏈?zhǔn)且詨K式存儲,每個區(qū)塊都通過一個數(shù)值(前一區(qū)塊哈希值)指向前一個區(qū)塊,每個區(qū)塊都是鏈?zhǔn)浇Y(jié)構(gòu)中的一節(jié),區(qū)塊與區(qū)塊連成一個鏈條,從而構(gòu)成了鏈?zhǔn)酱鎯Α?/p>

比特幣的區(qū)塊數(shù)據(jù)里包含了比特幣鏈上的所有核心信息,在網(wǎng)站/explore可以查詢到所有的區(qū)塊信息,下表顯示了較新區(qū)塊第642274的區(qū)塊信息。區(qū)塊結(jié)構(gòu)

在每個區(qū)塊中分區(qū)塊頭和區(qū)塊體。區(qū)塊頭主要用來存儲本區(qū)塊的一些相關(guān)屬性,區(qū)塊體則用來存儲交易數(shù)據(jù)記錄。區(qū)塊頭由80個字節(jié)構(gòu)成,如圖所示。

其中:

所有數(shù)據(jù)采用小端格式編碼,即低有效位放在前面;

時間戳表示的是自1970年1月1日0時0分0秒以來的秒數(shù),小端格式編碼;

版本號為4字節(jié)無符號整數(shù),創(chuàng)世區(qū)塊的版本號。區(qū)塊結(jié)構(gòu)

整個區(qū)塊體中實(shí)際上由一個個交易構(gòu)成,每一筆交易的輸入引用的是上一筆交易的輸出。如圖9-11為比特幣系統(tǒng)中交易輸入輸出的過程:圖中可以看出,對于每個普通的交易都包含了若干個輸入和若干個輸出,且輸入和輸出的個數(shù)至少為1。一個交易的輸出可以成為另一個交易的輸入。如交易TX2由一個輸入為50K和兩個輸出分別為20K組成,假設(shè)該交易的付款方為A,而交易的收款方為B,則TX2交易表示:A消費(fèi)了50K交易給B,這50K來自于交易TX0的輸出,接下來B消費(fèi)了其中的40K分別在交易TX4、TX5中消費(fèi),單從交易TX2來看,如果沒有交易費(fèi)用給礦工,B還有10K沒有消費(fèi)。B錢包的所有余額就是計(jì)算B參與的所有交易中,沒有花費(fèi)的輸出。這就是UTXO(UnspentTransactionOutputs,未使用過的交易輸出),交易過程中的錢包余額是一個錢包地址的UTXO集合。B將來再參與交易消費(fèi)時,只能使用這些UTXO參與。區(qū)塊及交易信息查看

通過網(wǎng)站/btc可以在線查詢比特幣系統(tǒng)的所有區(qū)塊以及區(qū)塊中的所有交易情況。如輸入/btc/blocks?page=1,獲得當(dāng)前最新挖出的區(qū)塊。圖9-12顯示2020年8月6日最新挖出的區(qū)塊。5比特幣運(yùn)行

五比特幣運(yùn)行

比特幣的運(yùn)行機(jī)制就是,不斷產(chǎn)生新的交易以及新的區(qū)塊的過程,同時,依據(jù)比特幣機(jī)制,需要將這些交易及產(chǎn)生的區(qū)塊廣播于網(wǎng)絡(luò),被其他節(jié)點(diǎn)驗(yàn)證。比特幣的運(yùn)行分為兩個步: 1.交易構(gòu)建及驗(yàn)證 2.區(qū)塊構(gòu)建及傳播五比特幣運(yùn)行

1.交易構(gòu)建及驗(yàn)證假如,A通過自己的錢包向B轉(zhuǎn)賬,交易構(gòu)建過程如下:1.1構(gòu)建交易。(1)交易輸入vin:從UTXO集中找到UTXO,并且獲得這些UTXO對應(yīng)的交易Hash值以及在前交易中的索引,尋找最接近交易目標(biāo)的前交易輸出,作為新交易的輸入。A用自己的私鑰創(chuàng)建簽名,然后對前交易的鎖定腳本進(jìn)行解鎖,做為新交易的輸入,對新的交易進(jìn)行簽名,生成解鎖腳本。(2)計(jì)算手續(xù)費(fèi),設(shè)定找零地址并計(jì)算找零。(3)構(gòu)建交易輸出vout生成交易Hash,利用ECDSA簽名算法對交易進(jìn)行簽名,生成鎖定腳本。五比特幣運(yùn)行

1.2廣播驗(yàn)證交易

構(gòu)建交易后,該節(jié)點(diǎn)通過比特幣網(wǎng)絡(luò)向已連接的臨近完全節(jié)點(diǎn)廣播該交易,完全節(jié)點(diǎn)收到交易后,首先根據(jù)比特幣系統(tǒng)的要求驗(yàn)證交易的正確性,包括以下信息:

①交易語法與數(shù)據(jù)是否正確;

②輸入與輸出列表都不能空;

③交易大小小于(1M);

④0<輸出值與總量<2100萬,0<輸入值與總量<2100萬,輸入值的總和小于輸出值的總和;

⑤哈希值不能為零、序列號N不能為-1

⑥驗(yàn)證解鎖腳本、鎖定腳本(scriptPubkey)是

⑦交易費(fèi)用要高于一定值根據(jù)本節(jié)點(diǎn)所存儲的區(qū)塊鏈中該交易的相關(guān)信息,驗(yàn)證該交易。驗(yàn)證以下信息:

①輸入交易是否是對應(yīng)前交易的輸出

②如果是輸入交易coinbase交易,是否已經(jīng)過100個確認(rèn)

③每一個輸入的解鎖腳本必須依據(jù)前交易中輸出交易的鎖定腳本來驗(yàn)證。五比特幣運(yùn)行

1.3.打包交易

每個驗(yàn)證的完全節(jié)點(diǎn)驗(yàn)證交易后,會把收到的交易放到一個叫臨時交易池。

每個交易收款方,也要驗(yàn)證交易的付款方使用的未花費(fèi)的交易輸出UTXO是否合法;每個交易廣播于網(wǎng)絡(luò)后,要被比特幣網(wǎng)絡(luò)中的其他節(jié)點(diǎn)驗(yàn)證其正確性;驗(yàn)證交易付款方的UTXO是否合法,以及是否存在雙花等問題。交易的接受者要驗(yàn)證交易的付款方的UTXO的合法性的問題。

作為參與交易方不可能要都擁有所有區(qū)塊鏈信息,為此,采用“簡單支付驗(yàn)證”(SimplifiedPaymentVerification)機(jī)制。

簡化支付驗(yàn)證(SPV)方法用于允許在不存儲完整區(qū)塊鏈的情況下運(yùn)行。這些類型的客戶端稱為SPV客戶端或輕客戶端。隨著比特幣采用率的增加,SPV節(jié)點(diǎn)正成為比特幣節(jié)點(diǎn)的最常見形式,尤其是對于比特幣錢包而言。

SPV節(jié)點(diǎn)只保存區(qū)塊頭。而需要不保存每一筆交易,因此,相比完全節(jié)點(diǎn)下載所有區(qū)塊信息,SPV下載的數(shù)據(jù)量大為減少。五比特幣運(yùn)行

SPV節(jié)點(diǎn)可以做如下工作:

SPV節(jié)點(diǎn)可以獨(dú)立地驗(yàn)證任何一筆鏈上交易的是否存在。驗(yàn)證原理是,查詢每個交易的輸入交易Hash值所在的區(qū)塊,利用Merkle機(jī)制對輸入交易進(jìn)行驗(yàn)證。

其次,SPV節(jié)點(diǎn)可以獨(dú)立地驗(yàn)證新的區(qū)塊是否符合工作量證明。SPV節(jié)點(diǎn)可以隨時從比特幣網(wǎng)絡(luò)的完全節(jié)點(diǎn)同步最新的區(qū)塊頭,獨(dú)立地計(jì)算新的區(qū)塊頭的哈希值,驗(yàn)證其是否符合工作量證明。

最后,SPV節(jié)點(diǎn)封裝成錢包后可以保存自己關(guān)心的數(shù)據(jù)。普通用戶使用SPV錢包進(jìn)行日常支付。SPV錢包里包含了對使用者重要的交易數(shù)據(jù)。如自己左右參與交易的信息,從而可以獲得自己的UTXO。

使用SPV簡單支付驗(yàn)證,可以節(jié)省一大筆存儲空間,無論未來交易量有多大,區(qū)塊頭保存的數(shù)據(jù)(哈希值)都是固定80個字節(jié),按照每小時6個的出塊速度,每年產(chǎn)出52560個區(qū)塊。當(dāng)只保存區(qū)塊頭時,每年新增的存儲需求約為4兆字節(jié)五比特幣運(yùn)行

2.區(qū)塊構(gòu)建及傳播對于挖礦節(jié)點(diǎn),需要的比特幣的共識期間進(jìn)行挖礦,如果挖礦成功,所在的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論