溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

區(qū)塊鏈的兩種挖礦方式是什么

發(fā)布時(shí)間:2022-01-19 09:53:27 來(lái)源:億速云 閱讀:234 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“區(qū)塊鏈的兩種挖礦方式是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“區(qū)塊鏈的兩種挖礦方式是什么”吧!

挖礦的演進(jìn)是硬件的演進(jìn)過(guò)程,同時(shí)也是軟件的演進(jìn)過(guò)程,尤其是軟硬件對(duì)接協(xié)議的改進(jìn)過(guò)程,本文重點(diǎn)通過(guò)與挖礦有關(guān)的幾個(gè)核心協(xié)議解析其中的邏輯設(shè)計(jì)和技術(shù)實(shí)現(xiàn)。

1、Setgenerate協(xié)議

Setgenerate協(xié)議接口代表了CPU挖礦時(shí)代。

中本聰在論文里描述了“1 CPU 1 Vote”的理想數(shù)字民主理念,在最初版本客戶端就附帶了挖礦功能,客戶端挖礦非常簡(jiǎn)單,當(dāng)然,需要同步數(shù)據(jù)結(jié)束才可以挖礦?,F(xiàn)在有很多算力很低的山寨幣還是直接使用客戶端挖礦,有兩種方式可以啟動(dòng)挖礦:

  • 在配置文件設(shè)置gen=1,然后啟動(dòng)客戶端,節(jié)點(diǎn)將自行啟動(dòng)挖礦。

  • 客戶端啟動(dòng)后,利用RPC接口setgenerate控制挖礦。

如果使用經(jīng)典QT客戶端,點(diǎn)擊“幫助”菜單,打開(kāi)“調(diào)試窗口”,在“控制臺(tái)”輸入如下命令:setgenerate true 2,然后回車(chē),客戶端就開(kāi)始挖礦,后面的數(shù)字代表挖礦線程數(shù),如果想關(guān)閉挖礦,在控制臺(tái)使用如下命令:setgenerate false,可以使用getmininginfo命令查看挖礦情況。

節(jié)點(diǎn)挖礦過(guò)程也非常簡(jiǎn)單:

構(gòu)造區(qū)塊,初始化區(qū)塊頭各個(gè)字段,計(jì)算Hash并驗(yàn)證區(qū)塊,不合格則nNonce自增,再計(jì)算并驗(yàn)證,如此往復(fù)。在CPU挖礦時(shí)代,nNonce提供的4字節(jié)搜索空間完全夠用(4字節(jié)即4G種可能,單核CPU運(yùn)算SHA256D算力一般是2M左右),其實(shí)nNonce只遍歷完兩個(gè)字節(jié)就返回去重構(gòu)塊。

2、getwork協(xié)議

getwork協(xié)議代表了GPU挖礦時(shí)代,需求主要源于挖礦程序與節(jié)點(diǎn)客戶端分離,區(qū)塊鏈數(shù)據(jù)與挖礦部件分離。

使用客戶端節(jié)點(diǎn)直接挖礦,需要同步完整區(qū)塊鏈,數(shù)據(jù)和程序緊密結(jié)合,也就是說(shuō),如果有多臺(tái)電腦進(jìn)行挖礦,需要每臺(tái)電腦都單獨(dú)同步一份區(qū)塊鏈數(shù)據(jù)。這其實(shí)沒(méi)有必要,對(duì)于礦工來(lái)說(shuō),最少只需要一個(gè)完整節(jié)點(diǎn)就可以。而以此同時(shí),GPU挖礦時(shí)代的到來(lái),也需要一個(gè)協(xié)議與客戶端節(jié)點(diǎn)交互。

區(qū)塊鏈的兩種挖礦方式是什么

getwork核心設(shè)計(jì)思路是:

由節(jié)點(diǎn)客戶端構(gòu)造區(qū)塊,然后將區(qū)塊頭數(shù)據(jù)交給外部挖礦程序,挖礦程序遍歷nNonce進(jìn)行挖礦,驗(yàn)證合格后交付回給節(jié)點(diǎn)客戶端,節(jié)點(diǎn)客戶端驗(yàn)證合格后廣播到全網(wǎng)。

如前所述,區(qū)塊頭共80個(gè)字節(jié),由于沒(méi)有區(qū)塊鏈數(shù)據(jù)和待確認(rèn)交易池,nVersion,hashPrevBlock,nBits和hashMerkleRoot這4個(gè)字段共72個(gè)字節(jié)必須由節(jié)點(diǎn)客戶端提供。挖礦程序主要是遞增遍歷nNonce,必要時(shí)候可以微調(diào)nTime字段。

對(duì)于顯卡GPU來(lái)說(shuō),其實(shí)不用擔(dān)心nNonce的4字節(jié)搜索空間不足,而且挖礦程序從節(jié)點(diǎn)客戶端那里拿到一份數(shù)據(jù)后,不應(yīng)該埋頭工作太久,不然很有可能這個(gè)塊已經(jīng)被其他人挖到,繼續(xù)挖只能做無(wú)用功,對(duì)于比特幣來(lái)說(shuō),雖然設(shè)計(jì)為每10分鐘一個(gè)區(qū)塊,良好的策略也應(yīng)該在秒級(jí)內(nèi)重新向節(jié)點(diǎn)申請(qǐng)新的挖礦數(shù)據(jù)。對(duì)于顯卡來(lái)說(shuō),運(yùn)行SHA256D算力一般介于200M~1G,nNonce提供4G搜索空間,也就是說(shuō)再好的顯卡也能支撐4秒左右,調(diào)整一次nTime,又可以再挖4秒,這個(gè)時(shí)間綽綽有余。

節(jié)點(diǎn)提供RPC接口getwork,該接口有一個(gè)可選參數(shù),如果不帶參數(shù),就是申請(qǐng)挖礦數(shù)據(jù),如果帶一個(gè)參數(shù),就是提交挖到的塊數(shù)據(jù)。

不帶參數(shù)調(diào)用getwork,返回?cái)?shù)據(jù)如下:

區(qū)塊鏈的兩種挖礦方式是什么

Data字段

共128字節(jié)(80區(qū)塊頭字節(jié) + 48補(bǔ)全字節(jié)),因?yàn)镾HA256將輸入數(shù)據(jù)切分成固定長(zhǎng)度的分片處理,每個(gè)切片64字節(jié),輸入總長(zhǎng)度必須是64字節(jié)的整數(shù)倍,輸入長(zhǎng)度一般不符合要求,則根據(jù)一定規(guī)則在元數(shù)據(jù)末端補(bǔ)全數(shù)據(jù)。其實(shí)對(duì)于挖礦來(lái)說(shuō),補(bǔ)全數(shù)據(jù)是固定不變的,這里沒(méi)必要提供,外部挖礦軟件可以自行補(bǔ)齊。甚至連nNonce字段都不需要提供,data最少只需要提供前面的76字節(jié)就夠了。nTime字段也是必不可少的,外部挖礦程序需要參照節(jié)點(diǎn)提供的區(qū)塊時(shí)間來(lái)調(diào)節(jié)nTime。

Target字段

即當(dāng)前區(qū)塊難度目標(biāo)值,采用小頭字節(jié)序,需要翻轉(zhuǎn)才能使用。

其實(shí)對(duì)于外部挖礦程序來(lái)說(shuō),有data 和 target這兩個(gè)字段就可以正常挖礦了,不過(guò)getwork協(xié)議充分考慮各種情況,盡量幫助外部挖礦程序做力所能及的事,提供了兩個(gè)額外字段,data字段返回完整補(bǔ)全數(shù)據(jù)也是出于此理念。

Midstate字段

如上所述,SHA256對(duì)輸入數(shù)據(jù)分片處理,礦工拿到data數(shù)據(jù)后,第一個(gè)分片(頭64字節(jié))是固定不變的,midstate就是第一個(gè)分片的計(jì)算結(jié)果,節(jié)點(diǎn)幫忙計(jì)算出來(lái)了。

因此,在midstate字段輔助下,外部挖礦程序甚至只需要44字節(jié)數(shù)據(jù)就可以正常挖礦:32字節(jié)midstate + 第一個(gè)切片余下的12(76-64)字節(jié)數(shù)據(jù)。

Hash2字段

比特幣挖礦每次都需要連續(xù)執(zhí)行兩次SHA256,第一次執(zhí)行結(jié)果32字節(jié),需要再補(bǔ)充32字節(jié)數(shù)據(jù)湊足64字節(jié)作為第二次執(zhí)行SHA256的輸入。hash2就是補(bǔ)全數(shù)據(jù),同理,hash2也是固定不變的。

外部挖礦程序挖到合格區(qū)塊后再次調(diào)用getwork接口將修改過(guò)的data字段提交給節(jié)點(diǎn)客戶端。節(jié)點(diǎn)客戶端要求返回的數(shù)據(jù)也必須是128字節(jié)。

每次有外部無(wú)參調(diào)用一次getwork時(shí),節(jié)點(diǎn)客戶端構(gòu)造一個(gè)新區(qū)塊,在返回?cái)?shù)據(jù)前,都要把新區(qū)塊完整保存在內(nèi)存,并用hashMerkleRoot作為唯一標(biāo)識(shí)符,節(jié)點(diǎn)使用一個(gè)Map來(lái)存放所有構(gòu)造的區(qū)塊,當(dāng)下一個(gè)塊已經(jīng)被其他人挖到時(shí),立即清空Map。

getwork收到一個(gè)參數(shù)后,首先從參數(shù)提取hashMerkleRoot,在Map中找出之前保存的區(qū)塊,接著從參數(shù)中提取nNonce和nTime填充到區(qū)塊的對(duì)應(yīng)字段,就可以驗(yàn)證區(qū)塊了,如果難度符合要求,說(shuō)明挖到了一個(gè)塊,節(jié)點(diǎn)將其廣播到全網(wǎng)。

getwork協(xié)議是最早版本挖礦協(xié)議,實(shí)現(xiàn)了節(jié)點(diǎn)和挖礦分離,經(jīng)典的GPU挖礦驅(qū)動(dòng)cgminer和sgminer,以及cpuminer都是使用getwork協(xié)議進(jìn)行挖礦。getwork + cgminer一直是非常經(jīng)典的配合,曾經(jīng)很多新算法推出時(shí),都快速被移植到cgminer。即便現(xiàn)在,除了BTC和LTC,其他眾多競(jìng)爭(zhēng)幣都還在使用getwork協(xié)議進(jìn)行挖礦。礦機(jī)出現(xiàn)之后,挖礦速度得到極大提高,當(dāng)前比特幣礦機(jī)算力已經(jīng)達(dá)到10T/秒級(jí)別。而getwork只給外部挖礦程序提供32字節(jié)共4G的搜索空間,如果繼續(xù)使用getwork協(xié)議,礦機(jī)需要頻繁調(diào)用RPC接口,這顯然不可行。如今BTC和LTC節(jié)點(diǎn)都已經(jīng)禁用getwork協(xié)議,轉(zhuǎn)向更新更高效的getblocktemplate協(xié)議。

3、getblocktemplate協(xié)議

getblocktemplate協(xié)議誕生于2012年中葉,此時(shí)礦池已經(jīng)出現(xiàn)。礦池采用getblocktemplate協(xié)議與節(jié)點(diǎn)客戶端交互,采用stratum協(xié)議與礦工交互,這是最典型的礦池搭建模式。

與getwork相比,**getblocktemplate協(xié)議最大的不同點(diǎn)是:getblocktemplate協(xié)議讓礦工自行構(gòu)造區(qū)塊。**如此一來(lái),節(jié)點(diǎn)和挖礦完全分離。對(duì)于getwork來(lái)說(shuō),區(qū)塊鏈?zhǔn)呛诎档?,getwork對(duì)區(qū)塊鏈一無(wú)所知,他只知道修改data字段的4個(gè)字節(jié)。對(duì)于getblocktemplate來(lái)說(shuō),整個(gè)區(qū)塊鏈?zhǔn)峭该鞯?,getblocktemplate掌握區(qū)塊鏈上與挖礦有關(guān)的所有信息,包括待確認(rèn)交易池,getblocktemplate可以自己選擇包含進(jìn)區(qū)塊的交易。

getblocktemplate 在被開(kāi)發(fā)出來(lái)后并非一成不變,在隨后發(fā)行的各個(gè)版本客戶端都有所升級(jí)改動(dòng),主要是增添一些字段,不過(guò)核心理念和核心字段不變。目前比特幣客戶端返回?cái)?shù)據(jù)如下,考慮到篇幅限制,交易字段(transactions)只保留了一筆交易數(shù)據(jù),其實(shí)根據(jù)當(dāng)前實(shí)際情況,待確認(rèn)交易池實(shí)時(shí)有上萬(wàn)筆交易,目前區(qū)塊基本都是塞滿的(1M容量限制),加上額外信息,因此每次調(diào)用getblocktemplate基本都有1.5M左右返回?cái)?shù)據(jù),相對(duì)于getwork的幾百個(gè)字節(jié)而言,不可同日而語(yǔ)。

區(qū)塊鏈的兩種挖礦方式是什么

來(lái)簡(jiǎn)單分析一下其中幾個(gè)核心字段, Version,Previousblockhash,Bits這三個(gè)字段分別指區(qū)塊版本號(hào),前一個(gè)區(qū)塊Hash,難度,礦工可以直接將數(shù)值填充區(qū)塊頭對(duì)應(yīng)字段。

Transactions,交易集合,不但給了每一筆交易的16進(jìn)制數(shù)據(jù),同時(shí)給了hash,交易費(fèi)等信息。 Coinbaseaux,如果有想要寫(xiě)入?yún)^(qū)塊鏈的信息,放在這個(gè)字段,類似中本聰?shù)膭?chuàng)世塊宣言。

Coinbasevalue,挖下一個(gè)塊的最大收益值,包括發(fā)行新幣和交易手續(xù)費(fèi),如果礦工包含Transactions字段的所有交易,可以直接使用該值作為coinbase輸出。

** Target**,區(qū)塊難度目標(biāo)值。

Mintime,指下一個(gè)區(qū)塊時(shí)間戳最小值,Curtime指當(dāng)前時(shí)間,這兩個(gè)時(shí)間作為礦工調(diào)節(jié)nTime字段參考。 

Height,下一個(gè)區(qū)塊難度,目前協(xié)議規(guī)定要將這個(gè)值寫(xiě)入coinbase的指定位置。

礦工拿到這些數(shù)據(jù)之后,挖礦步驟如下:

  • 構(gòu)建coinbase交易,涉及到字段包括Coinbaseaux,Coinbasevalue,Transactions,Height等,當(dāng)然最重要的是要指定一個(gè)收益地址。

  • 構(gòu)建hashMerkleRoot,將coinbase放在transactions字段包含的交易列表之前,然后對(duì)相鄰交易兩兩進(jìn)行SHA256D運(yùn)算,最終可以構(gòu)造交易的Merkle樹(shù)。由于coinbase有很多字節(jié)可供礦工隨意發(fā)揮,此外交易列表也可隨意調(diào)換順序或者增刪,因而hashMerkleRoot值空間幾乎可以認(rèn)為是無(wú)限的。其實(shí)getblocktemplate協(xié)議設(shè)計(jì)的主要目標(biāo)就是讓礦工獲得這個(gè)巨大的搜索空間。

  • 構(gòu)建區(qū)塊頭,利用Version,Previousblockhash,Bits以及Curtime分別填充區(qū)塊頭對(duì)應(yīng)字段,nNonce字段可默認(rèn)置0。

  • 挖礦,礦工可在由nNonce,nTime,hashMerkleRoot提供的搜索空間里設(shè)計(jì)自己的挖礦策略。

  • 上交數(shù)據(jù),當(dāng)?shù)V工挖到一個(gè)塊后當(dāng)立即使用submitblock接口將區(qū)塊完整數(shù)據(jù)提交給節(jié)點(diǎn)客戶端,由節(jié)點(diǎn)客戶端驗(yàn)證并廣播。

**需要注意的是:**與上文提到的GPU采用getwork挖礦一樣,雖然getblocktemplate給礦工提供了巨大搜索空間,但礦工不應(yīng)對(duì)一份請(qǐng)求數(shù)據(jù)挖礦太久,而應(yīng)循環(huán)適時(shí)向節(jié)點(diǎn)索要最新區(qū)塊和最新交易信息,以提高挖礦收益。

4、POOL

**挖礦有兩種方式,一種叫SOLO挖礦,另一種是去礦池挖礦。**前文所述的在節(jié)點(diǎn)客戶端直接啟動(dòng)CPU挖礦,以及依靠getwork+cgminer驅(qū)動(dòng)顯卡直接連接節(jié)點(diǎn)客戶端挖礦,都是SOLO挖礦,SOLO好比自己獨(dú)資買(mǎi)彩票,不輕易中獎(jiǎng),中獎(jiǎng)則收益全部歸自己所有。去礦池挖礦好比合買(mǎi)彩票,大家一起出錢(qián),能買(mǎi)一堆彩票,中獎(jiǎng)后按出資比率分配收益。

理論上,礦機(jī)可以借助getblocktemplate協(xié)議鏈接節(jié)點(diǎn)客戶端SOLO挖礦,但其實(shí)早已沒(méi)有礦工會(huì)那么做,在寫(xiě)這篇文章時(shí),比特幣全網(wǎng)算力1600P+,而當(dāng)前最先進(jìn)的礦機(jī)算力10T左右,如此算來(lái),單臺(tái)礦機(jī)SOLO挖到一個(gè)塊的概率不到16萬(wàn)分之一,礦工(人)投入真金白銀購(gòu)買(mǎi)礦機(jī)、交付電費(fèi),不會(huì)做風(fēng)險(xiǎn)那么高的投資,顯然投入礦池抱團(tuán)挖礦以降低風(fēng)險(xiǎn),獲得穩(wěn)定收益更加適合。因此礦池的出現(xiàn)是必然,也不可消除,無(wú)論是否破壞系統(tǒng)的去中心化原則。

礦池的核心工作是給礦工分配任務(wù),統(tǒng)計(jì)工作量并分發(fā)收益。礦池將區(qū)塊難度分成很多難度更小的任務(wù)下發(fā)給礦工計(jì)算,礦工完成一個(gè)任務(wù)后將工作量提交給礦池,叫提交一個(gè)share。假如全網(wǎng)區(qū)塊難度要求Hash運(yùn)算結(jié)果的前70個(gè)比特位都是0,那么礦池給礦工分配的任務(wù)可能只要求前30位是0(根據(jù)礦工算力調(diào)節(jié)),礦工完成指定難度任務(wù)后上交share,礦池再檢測(cè)在滿足前30位為0的基礎(chǔ)上,看看是否碰巧前70位都是0。

礦池會(huì)根據(jù)每個(gè)礦工的算力情況分配不同難度的任務(wù),礦池是如何判斷礦工算力大小以分配合適的任務(wù)難度呢?調(diào)節(jié)思路和比特幣區(qū)塊難度一樣,礦池需要借助礦工的share率,礦池希望給每個(gè)礦工分配的任務(wù)都足夠讓礦工運(yùn)算一定時(shí)間,比如說(shuō)1秒,如果礦工在一秒之內(nèi)完成了幾次任務(wù),說(shuō)明礦池當(dāng)前給到的難度低了,需要調(diào)高,反之。如此下來(lái),經(jīng)過(guò)一段時(shí)間調(diào)節(jié),礦池能給礦工分配合理難度,并計(jì)算出礦工的算力。

區(qū)塊鏈的兩種挖礦方式是什么

礦池一直都是一個(gè)矛盾的存在,毫無(wú)疑問(wèn),礦池是中心化的,如上圖所示,全網(wǎng)算力集中在幾個(gè)礦池手里,網(wǎng)絡(luò)雖然幾千個(gè)節(jié)點(diǎn)同時(shí)在線,但只有礦池鏈接的幾個(gè)點(diǎn)擊擁有投票權(quán),其他節(jié)點(diǎn)都只能行使監(jiān)督權(quán)。礦池再一次將礦工至于“黑暗”之中,礦工對(duì)于區(qū)塊鏈再次變得一無(wú)所知,他們只知道完成礦池分配的任務(wù)。

關(guān)于礦池,還有一個(gè)小插曲,在礦池剛出現(xiàn)時(shí),反對(duì)聲特別強(qiáng)烈,很多人悲觀的認(rèn)為礦池最終會(huì)導(dǎo)致算力集中,危及系統(tǒng)安全,甚至置比特幣于死地。于是有人設(shè)計(jì)并實(shí)現(xiàn)了P2P礦池,力圖將“抱團(tuán)挖礦”去中心化,代碼也都是開(kāi)源的,但由于效率遠(yuǎn)不如中心化的礦池沒(méi)能吸引太多算力,所謂理想很豐滿,現(xiàn)實(shí)很骨感。

推薦幾個(gè)比較成熟的開(kāi)源礦池項(xiàng)目,有興趣的讀者可自行研究:

  • PHP-MPOS,早期非常經(jīng)典的礦池,很穩(wěn)定,被使用最多,尤其山寨幣礦池,后端使用Stratum Ming協(xié)議,源碼地址

  • node-open-mining-portal,支持多幣種挖礦,源碼地址

  • Powerpool,支持混合挖礦,源碼地址

運(yùn)行一個(gè)礦池需要考慮的問(wèn)題很多,比如為了得到最及時(shí)的全網(wǎng)信息,礦池一般對(duì)接幾個(gè)網(wǎng)絡(luò)節(jié)點(diǎn),而且最好分布在地球的幾大洲。另外提高出塊率,降低孤塊率,降低空塊率等都是礦池的核心技術(shù)問(wèn)題,本文不能一一展開(kāi)討論,接下來(lái)只詳細(xì)討論一個(gè)問(wèn)題,即礦池與礦工的具體配合工作方式——stratum協(xié)議。

5、Stratum協(xié)議

礦池通過(guò)getblocktemplate協(xié)議與網(wǎng)絡(luò)節(jié)點(diǎn)交互,以獲得區(qū)塊鏈的最新信息,通過(guò)stratum協(xié)議與礦工交互。此外,為了讓之前用getwork協(xié)議挖礦的軟件也可以連接到礦池挖礦,礦池一般也支持getwork協(xié)議,通過(guò)階層挖礦代理機(jī)制實(shí)現(xiàn)(Stratum mining proxy)。須知在礦池剛出現(xiàn)時(shí),顯卡挖礦還是主力,getwork用起來(lái)非常方便,另外早期的FPGA礦機(jī)有些是用getwork實(shí)現(xiàn)的,stratum與礦池采用TCP方式通信,數(shù)據(jù)使用JSON封裝格式。

區(qū)塊鏈的兩種挖礦方式是什么

先來(lái)說(shuō)一下getblocktemplate遺留下來(lái)的幾個(gè)問(wèn)題:

  • **礦工驅(qū)動(dòng):**在getblocktemplate協(xié)議里,依然是由礦工主動(dòng)通過(guò)HTTP方式調(diào)用RPC接口向節(jié)點(diǎn)申請(qǐng)挖礦數(shù)據(jù),這就意味著,網(wǎng)絡(luò)最新區(qū)塊的變動(dòng)無(wú)法及時(shí)告知礦工,造成算力損失。

  • 數(shù)據(jù)負(fù)載:如上所述,如今正常的一次getblocktemplate調(diào)用節(jié)點(diǎn)都會(huì)反饋回1.5M左右的數(shù)據(jù),其中主要數(shù)據(jù)是交易列表,礦工與礦池需頻繁交互數(shù)據(jù),顯然不能每次分配工作都要給礦工附帶那么多信息。再者巨大的內(nèi)存需求將大大影響礦機(jī)性能,增加成本。

Stratum協(xié)議徹底解決了以上問(wèn)題。

Stratum協(xié)議采用主動(dòng)分配任務(wù)的方式,也就是說(shuō),礦池任何時(shí)候都可以給礦工指派新任務(wù),對(duì)于礦工來(lái)說(shuō),如果收到礦池指派的新任務(wù),應(yīng)立即無(wú)條件轉(zhuǎn)向新任務(wù);礦工也可以主動(dòng)跟礦池申請(qǐng)新任務(wù)。

現(xiàn)在最核心的問(wèn)題是如何讓礦工獲得更大的搜索空間,如果參照getwork協(xié)議,僅僅給礦工可以改變nNonce和nTime字段,則交互的數(shù)據(jù)量很少,但這點(diǎn)搜索空間肯定是不夠的。想增加搜索空間,只能在hashMerkleroot下功夫,如果讓礦工自己構(gòu)造coinbase,那么搜索空間的問(wèn)題將迎刃而解,但代價(jià)是必要要把區(qū)塊包含的所有交易都交給礦工,礦工才能構(gòu)造交易列表的Merkleroot,這對(duì)于礦工來(lái)說(shuō)壓力更大,對(duì)于礦池帶寬要求也更高。

Stratum協(xié)議巧妙解決了這個(gè)問(wèn)題,成功實(shí)現(xiàn)既可以給礦工增加足夠的搜索空間,又只需要交互很少的數(shù)據(jù)量,這也是Stratum協(xié)議最具創(chuàng)新的地方。

區(qū)塊鏈的兩種挖礦方式是什么

再來(lái)回顧一下區(qū)塊頭的6個(gè)字段80字節(jié),這個(gè)很關(guān)鍵,nVersion,nBits,hashPrevBlock這3個(gè)字段是固定的,nNonce,nTime這兩個(gè)字段是礦工現(xiàn)在就可以改變的。增加搜索空間只能從hashMerkleroot下手,這個(gè)繞不過(guò)去。Stratum協(xié)議讓礦工自己構(gòu)造coinbase交易,coinbase的scriptSig字段有很多字節(jié)可以讓礦工自由填充,而coinbase的改動(dòng)意味著hashMerkleroot的改變。從coinbase構(gòu)造hashMerkleroot無(wú)需全部交易,如上圖所示,假如區(qū)塊將包含13筆交易,礦池先對(duì)這13筆交易進(jìn)行處理,最后只要把圖中的4個(gè)黑點(diǎn)(Hash值)交付給礦工,同時(shí)將構(gòu)造coinbase需要的信息交付給礦工,礦工就可以自己構(gòu)造hashMerkleroot(圖中的綠點(diǎn)都是礦工自行計(jì)算獲得,兩兩合并Hash時(shí),規(guī)定下一個(gè)黑點(diǎn)代表的hash值總是放在右邊)。按照這種方式,假如區(qū)塊包含N筆交易,礦池可以濃縮成log2(N)個(gè)hash值交付給礦工,這大大降低了礦池和礦工交互的數(shù)據(jù)量。

Stratum協(xié)議嚴(yán)格規(guī)定了礦工和礦池交互的接口數(shù)據(jù)結(jié)構(gòu)和交互邏輯,具體如下:

1. 礦工訂閱任務(wù)

啟動(dòng)挖礦機(jī)器,使用mining.subscribe方法鏈接礦池

區(qū)塊鏈的兩種挖礦方式是什么

返回?cái)?shù)據(jù)很重要,礦工需本地記錄,在整個(gè)挖礦過(guò)程中都用到,其中: b4b6693b72a50c7116db18d6497cac52:給礦工指定初始難度, ae6812eb4cd7735a302a8a9dd95cf71f:訂閱號(hào)ID 08000002:學(xué)名Extranonce1 ,用于構(gòu)造coinbase交易 4:學(xué)名Extranonce2_size ,即Extranonce2的長(zhǎng)度,這里指定4個(gè)字節(jié)Extranonce1,和 Extranonce2對(duì)于挖礦很重要,增加的搜索空間就在這里,現(xiàn)在,我們至少有了8個(gè)字節(jié)的搜索空間,即nNonce的4個(gè)字節(jié),以及 Extranonce2的4個(gè)字節(jié)。

2. 礦池授權(quán)

區(qū)塊鏈的兩種挖礦方式是什么

在礦池注冊(cè)一個(gè)賬號(hào) ,添加礦工,礦池允許每個(gè)賬號(hào)任意添加礦工數(shù),并取不同名字以區(qū)分。礦工使用mining.authorize 方法申請(qǐng)授權(quán),只有被礦池授權(quán)的礦工才能收到礦池指派任務(wù)。

3. 礦池分配任務(wù)

區(qū)塊鏈的兩種挖礦方式是什么

以上每個(gè)字段信息都是必不可少,其中: bf:任務(wù)號(hào)ID,每一次任務(wù)都有唯一標(biāo)識(shí)符

前一個(gè)區(qū)塊hash值,hashPrevBlock:

4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000:

學(xué)名coinb1 ,構(gòu)造coinbase的第一部分序列數(shù)據(jù):

01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff20020862062f503253482f04b8864e5008

學(xué)名coinb2 ,構(gòu)造coinbase的第二部分序列數(shù)據(jù):

072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000

學(xué)名merkle_branch,交易列表的壓縮表示方式,即上圖的黑點(diǎn):

["76cffd68bba7ea661512b68ec6414438191b08aaeaec23608de26ac87820cbd02016","e5a796c0b88fe695949a3e7b0b7b1948a327b2f28c5dbe8f36f0a18f96b2ffef2016"]

00000002:區(qū)塊版本號(hào),nVersion 1c2ac4af:區(qū)塊難度nBits 504e86b9:當(dāng)前時(shí)間戳,nTime 有了以上信息,再加上之前拿到的Extranonce1 和Extranonce2_size,就可以挖礦了。

4. 挖礦

構(gòu)造coinbase交易

用到的信息包括Coinb1, Extranonce1, Extranonce2_size 以及Coinb2,構(gòu)造很簡(jiǎn)單:

Coinbase=Coinb1 + Extranonce1 + Extranonce2 + Coinb2

為啥可以這樣,因?yàn)榈V池幫礦工做了很多工作,礦池已經(jīng)構(gòu)建了coinbase交易,系列化后在指定位置分割成coinb1和coinb2,coinb1和coinb2包含指定信息,比如coinb1包含區(qū)塊高度,coinb2包含了礦工的收益地址和收益額等信息,但是這些信息對(duì)于礦工來(lái)說(shuō)無(wú)關(guān)緊要,礦工挖礦的地方只是Extranonce2 的4個(gè)字節(jié)。另外Extranonce1是礦池寫(xiě)入?yún)^(qū)塊的指定信息,一般來(lái)說(shuō),每個(gè)礦池會(huì)寫(xiě)入自己礦池的信息,比如礦池名字或者域名,我們就是根據(jù)這個(gè)信息統(tǒng)計(jì)每個(gè)礦池在全網(wǎng)的算力比重。

構(gòu)建Merkleroot

利用coinbase和merkle_branch,按照上圖方式構(gòu)造hashMerkleroot字段。

構(gòu)建區(qū)塊頭

填充余下的5個(gè)字段,現(xiàn)在,礦池可以在nNonce和Extranonce2 里搜索進(jìn)行挖礦,如果嫌搜索空間還不夠,只要增加Extranonce2_size為多幾個(gè)字節(jié)就可輕而易舉解決。

5. 礦工提交工作量 當(dāng)?shù)V工找到一個(gè)符合難度的shares時(shí),提交給礦池,提交的信息量很少,都是必不可少的字段:

slush.miner1:礦工名字,礦池用以識(shí)別誰(shuí)提交的工作量 bf:任務(wù)號(hào)ID,礦池在分配任務(wù)之前,構(gòu)造了Coinbase等信息,用這個(gè)任務(wù)號(hào)唯一標(biāo)識(shí) 00000001:

Extranonce2 504e86ed:nTime字段 b2957c02:nNonce字段

礦池拿到以上5個(gè)字段后,首先根據(jù)任務(wù)號(hào)ID找出之前分配任務(wù)前存儲(chǔ)的信息(主要是構(gòu)建的coinbase交易以及包含的交易列表等),然后重構(gòu)區(qū)塊,再驗(yàn)證shares難度,對(duì)于符合難度要求的shares,再檢測(cè)是否符合全網(wǎng)難度。

6. 礦池給礦工調(diào)節(jié)難度

礦池記錄每個(gè)礦工的難度,并根據(jù)shares率不斷調(diào)節(jié)以指定合適難度。礦池可以隨時(shí)通過(guò)mining.set_difficulty方法給礦工發(fā)消息另其改變難度。

區(qū)塊鏈的兩種挖礦方式是什么

如上,Stratum協(xié)議核心理念基本解析清楚,在getblocktemplate協(xié)議和Stratum協(xié)議的配合下,礦池終于可以大聲的對(duì)礦工說(shuō),讓算力來(lái)的更猛烈些吧。

6、Auxpow

在挖礦的發(fā)展歷史上,還出現(xiàn)了一個(gè)天馬行空的事情,即混合挖礦(Merge Mining)。域名幣(Namecoin)最先使用混合挖礦模式,掛靠在比特幣鏈條上,礦工挖比特幣時(shí),可以同時(shí)挖域名幣,后來(lái)狗狗幣(Dogecoin)也支持混合挖礦,掛靠在萊特幣(Litecoin)鏈條上?;旌贤诘V使用Auxiliary Proof-of-Work (AuxPOW)協(xié)議實(shí)現(xiàn),雖然混合挖礦不怎么流行,但是協(xié)議設(shè)計(jì)的很精巧,最初看到協(xié)議時(shí)我不禁感嘆社區(qū)的力量之偉大,這種都能想出來(lái)。

以域名幣的混合挖礦舉例,比特幣作為父鏈(Parent Blockchain),域名幣作為輔鏈(Auxiliary Blockchain),AuxPOW協(xié)議的實(shí)現(xiàn)無(wú)需改動(dòng)父鏈(比特幣當(dāng)然不會(huì)為了域名幣做任何改動(dòng)),但輔鏈需要做針對(duì)性設(shè)計(jì),比如狗狗幣改為支持混合挖礦時(shí)就進(jìn)行了硬分叉。

區(qū)塊鏈的兩種挖礦方式是什么

AuxPOW的實(shí)現(xiàn)得益于比特幣Coinbase的輸入字段,中本聰當(dāng)初不知有意無(wú)意,在此處只規(guī)定了長(zhǎng)度限制,留了一片未定義區(qū)域。這片區(qū)域后來(lái)對(duì)比特幣的發(fā)展產(chǎn)生深遠(yuǎn)影響,很多升級(jí)和優(yōu)化都盯上這片區(qū)域,比如上文講的Stratum協(xié)議。中本聰類似的有意無(wú)意情況還有很多,比如交易的nSequence字段,也是因?yàn)闆](méi)有明確定義,被黑客盯上引發(fā)的“延展性”問(wèn)題成了“門(mén)頭溝”倒閉的替罪羊。再比如說(shuō)nNonce,如果一開(kāi)始定義的字節(jié)大一些,你比方說(shuō)32字節(jié),挖礦的演進(jìn)就不需要以上討論的那么多協(xié)議。

AuxPOW協(xié)議核心理念不同的地方在于:

對(duì)于經(jīng)典的POW區(qū)塊,規(guī)定只有難度符合要求才算一個(gè)合格的區(qū)塊,AuxPOW協(xié)議對(duì)區(qū)塊難度沒(méi)有要求,但附加兩個(gè)條件:

  • 輔鏈區(qū)塊的hash值必須內(nèi)置于父鏈區(qū)塊的Coinbase里。

  • 該父鏈區(qū)塊的難度必須符合輔鏈的難度要求。

將輔鏈區(qū)塊的hash值內(nèi)置于父鏈的Coinbase,其實(shí)是利用父鏈作存在證明。這樣就可以實(shí)現(xiàn)間接依靠父鏈的算力來(lái)維護(hù)輔鏈安全。一般來(lái)說(shuō),父鏈的算力比輔鏈大,因而滿足父鏈難度要求的區(qū)塊一定同時(shí)滿足輔鏈難度要求,反之則不成立。這樣一來(lái),很多本來(lái)在父鏈達(dá)不到難度要求的區(qū)塊,卻達(dá)到輔鏈難度要求,礦工g=廣播到輔鏈網(wǎng)絡(luò),在輔鏈獲得收益,何樂(lè)而不為。

AuxPOW協(xié)議對(duì)兩條鏈都有一些數(shù)據(jù)結(jié)構(gòu)方面的規(guī)定,對(duì)于父鏈,要求必須在區(qū)塊的coinbase的scriptSig字段中插入如下格式的44字節(jié)數(shù)據(jù):

區(qū)塊鏈的兩種挖礦方式是什么

對(duì)于輔鏈,對(duì)原區(qū)塊結(jié)構(gòu)改動(dòng)比較大,在nNonce字段和txn_count之間插入了5個(gè)字段,這種區(qū)塊取名AuxPOW區(qū)塊。

區(qū)塊鏈的兩種挖礦方式是什么

**混合挖礦要求父鏈和輔鏈的算法一致,是否支持混合挖礦是礦池的決定,礦工不知道是否在混合挖礦。**礦池如果支持混合挖礦,需要對(duì)接所有輔鏈的節(jié)點(diǎn)。

將輔鏈區(qū)塊hash值內(nèi)置在父鏈的Coinbase,意味著礦工在構(gòu)造父鏈Coinbase之前,必先構(gòu)造輔鏈的AuxPOW 區(qū)塊并計(jì)算hash值。如果只挖一條輔鏈,情況較為簡(jiǎn)單,如果同時(shí)挖多條輔鏈,則先對(duì)所有輔鏈在挖區(qū)塊構(gòu)造Merkleroot。礦池可以將特定的44字節(jié)信息內(nèi)置于上文Stratum協(xié)議中提到的Coinb1中,交給礦工挖礦。對(duì)礦工返回的shares重構(gòu)父鏈區(qū)塊和所有輔鏈區(qū)塊,并檢測(cè)難度,如果符合輔鏈難度要求,則將整個(gè)AuxPOW區(qū)塊廣播到輔鏈。

輔鏈節(jié)點(diǎn)驗(yàn)證AuxPOW區(qū)塊邏輯過(guò)程如下:

  • 依靠父鏈區(qū)塊頭(parent_block)和區(qū)塊Hash值(block_hash,本字段其實(shí)沒(méi)必要,因?yàn)楣?jié)點(diǎn)可以自行計(jì)算),驗(yàn)證父鏈區(qū)塊頭是否符合輔鏈難度要求。

  • 依靠Coinbase交易(coinbase_txn)、其所在的分支(coinbase_branch)以及父鏈區(qū)塊頭(parent_block),驗(yàn)證Coinbase交易是否真的被包含在父鏈區(qū)塊中。

  • 依靠輔鏈分支(blockchain_branch),以及Coinbase中放Hash值的地方(aux_block_hash),驗(yàn)證輔鏈區(qū)塊Hash是否內(nèi)置于父鏈區(qū)塊的Coinbase交易中。

通過(guò)以上3點(diǎn)驗(yàn)證,則視為合格的輔鏈區(qū)塊。

7、Conclusion

中本聰最初設(shè)計(jì)比特幣時(shí)希望所有節(jié)點(diǎn)都采用CPU挖礦,一般認(rèn)為只有這樣才能充分保證區(qū)塊鏈的去中心化特征,比特幣在CPU時(shí)代安全度過(guò)了萌芽階段。getwork和cgminer將挖礦帶入GPU時(shí)代,國(guó)內(nèi)顯卡曾經(jīng)一度脫銷(xiāo),全網(wǎng)算力迅速提升了一個(gè)檔次,CPU挖礦慘遭淘汰。隨著越來(lái)越多人參與挖礦,全網(wǎng)算力不斷上升,催生了抱團(tuán)挖礦(礦池)。然而GPU時(shí)代的繁榮歷史也沒(méi)能持續(xù)多久就被getblocktemplate,stratum以及礦機(jī)帶入了ASIC時(shí)代。

getwork實(shí)現(xiàn)了數(shù)據(jù)與挖礦分離,getblocktemplate給外部挖礦程序提供了最大自由度,徹底解決了外部挖礦程序與節(jié)點(diǎn)交互的可擴(kuò)展性問(wèn)題(scalability problems),主要用于礦池與網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)接。stratum不但解決了搜索空間不足的問(wèn)題,同時(shí)也解決了礦池與礦機(jī)交互數(shù)據(jù)量大的問(wèn)題。getblocktemplate和stratum這兩個(gè)協(xié)議使大型礦池,大規(guī)模礦場(chǎng),大算力礦機(jī)成為可能,從此挖礦產(chǎn)業(yè)進(jìn)入一個(gè)全新階段,此后挖礦的演進(jìn)主要集中于幾個(gè)方向:礦池的設(shè)計(jì)優(yōu)化與穩(wěn)定運(yùn)行,礦場(chǎng)的科學(xué)部署,以及礦機(jī)工藝升級(jí),提升算力,降低功耗等。

感謝各位的閱讀,以上就是“區(qū)塊鏈的兩種挖礦方式是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)區(qū)塊鏈的兩種挖礦方式是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI