本申請涉及于2013年11月19日申請的臨時申請序列號61/906,310(“臨時專利申請”),該臨時專利申請的主題及其全部內(nèi)容以引用的方式明確地并入本文,并在此根據(jù)37 CFR §1.78(a)(4)要求該臨時專利申請的申請日的權(quán)益。
背景技術(shù):
1. 技術(shù)領(lǐng)域
本發(fā)明涉及用于挖掘(mining)區(qū)塊(block),尤其是區(qū)塊鏈(block chain)中的區(qū)塊,的方法和裝置,尤其涉及用于加密貨幣(crypto currency)系統(tǒng)例如比特幣(Bitcoin)挖礦系統(tǒng)中的方法和裝置。
一般而言,在以下說明書中,我們將以斜體表示本領(lǐng)域技術(shù)人員應(yīng)該熟悉的本領(lǐng)域的每個專用術(shù)語的第一次出現(xiàn)。另外,當(dāng)我們首次介紹我們認(rèn)為是新的或在我們認(rèn)為是新的環(huán)境中將使用的術(shù)語時,我們將以粗體來表示該術(shù)語并且提供我們意圖應(yīng)用于該術(shù)語的定義。另外,在整個說明書中,當(dāng)指出信號、信號標(biāo)志、狀態(tài)位或類似設(shè)備呈現(xiàn)為其邏輯真或邏輯假狀態(tài)時,有時我們將分別使用術(shù)語斷言(assert)和否定(negate),并且使用術(shù)語切換(toggle)來表示信號從一個邏輯狀態(tài)到另一邏輯狀態(tài)的邏輯反轉(zhuǎn)。可選地,我們可以將互斥的布爾(boolean)狀態(tài)稱作邏輯0(logic_0)和邏輯1(logic_1)。當(dāng)然,眾所周知的是,通過對全部這樣的信號的邏輯含義取反能夠獲得一致的系統(tǒng)操作,使得本文中描述為邏輯真的信號變成邏輯假,反之亦然(vice versa)。此外,在這種系統(tǒng)中,選擇哪些具體電壓電平來表示每個邏輯狀態(tài)毫無關(guān)系。為了便于參考,我們將使用“設(shè)置”一詞來表示視情況需要的零、一或大于一的集合。
一般地,分布式網(wǎng)絡(luò)(decentralized network)可以存儲并引用區(qū)塊鏈中的公共信息。在一典型的區(qū)塊鏈中,每個區(qū)塊(block)包含大致出現(xiàn)于同一時間的通常被稱為交易(transactions)的信息單元。使用一預(yù)定義的協(xié)議(protocol),區(qū)塊可以通過將其散列值(hash values)插入?yún)^(qū)塊鏈的下一個順序區(qū)塊的指定字段(field)而相連(linked)。
區(qū)塊鏈的挖掘過程的設(shè)計,是為了讓系統(tǒng)達(dá)成一致性,其中計算機(jī)網(wǎng)絡(luò)的所有節(jié)點(diǎn)(nodes)都符合同一個區(qū)塊鏈。已經(jīng)提出了若干種區(qū)塊鏈系統(tǒng),且一些正被實(shí)施。其中最早的系統(tǒng)之一,且目前最廣泛認(rèn)可的,是比特幣系統(tǒng)。根據(jù)比特幣協(xié)議,第一個成功確定候選(candidate)區(qū)塊的工作量證明(proof-of-work)的礦機(jī)(miner)有權(quán)將該區(qū)塊添加到區(qū)塊鏈(有時被稱為分類賬(ledger)),并有權(quán)生成(generate)新的加密貨幣單元作為獎勵。
區(qū)塊的工作量證明包含隨機(jī)數(shù)(nonce)值,如果將其插入該區(qū)塊的指定字段,則其將使該區(qū)塊的加密散列值(cryptographic hash value)達(dá)到一定的難度目標(biāo)(difficulty target)。由于加密散列函數(shù)(cryptographic hash function)實(shí)際上表現(xiàn)為隨機(jī)指示(random oracle),除了簡單地反復(fù)試驗(yàn)(trial-and-error)來查找正確的隨機(jī)數(shù),目前尚未發(fā)現(xiàn)更好的方法。因此挖掘過程是一個隨機(jī)(stochastic)過程。在實(shí)踐中,一個特定礦機(jī)成功開發(fā)一個區(qū)塊(solving a block)的可能性,在任何特定的時間點(diǎn),正比于該礦機(jī)的散列率(hash rate),其與整個網(wǎng)絡(luò)的散列率相關(guān)。
眾所周知,美國國家安全局(“NSA”)已經(jīng)設(shè)計并公布了一組被稱為安全散列算法(“SHA”,Secure Hash Algorithms)的加密散列函數(shù)。特別地,應(yīng)用SHA-256的比特幣協(xié)議以如下偽代碼描述:
**********
注1:所有變量都是32位無符號整數(shù),并且加法按模232計算
注2:對于每個循環(huán),在消息表數(shù)組w[i]中有一個循環(huán)常數(shù)k[i]和一項記錄,0≤i≤63
注3:壓縮函數(shù)使用從a到h的8個工作變量
注4:在表達(dá)該偽碼中的常數(shù),以及從字節(jié)到字地解析消息塊數(shù)據(jù)時,使用大字節(jié)序約定,例如,在填充后,輸入消息”abc”的第一個字是0x61626380
初始化散列值:(前8位素數(shù)2…19的平方根的小數(shù)部分的前32位)
h0 := 0x6a09e667;
h1 := 0xbb67ae85;
h2 := 0x3c6ef372;
h3 := 0xa54ff53a;
h4 := 0x510e527f;
h5 := 0x9b05688c;
h6 := 0x1f83d9ab;
h7 := 0x5be0cd19;
初始化循環(huán)常數(shù)的數(shù)組:(前64位素數(shù)2…311的立方根的小數(shù)部分的前32位)
k[0..63] :=
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,
0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,
0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,
0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2;
預(yù)處理:
在消息上追加比特'1';
追加k比特個'0';
其中,k是大于等于0的最小的數(shù),使得所得到的消息長度(模512,單位為比特)為448
追加消息的長度;
(沒有比特'1'或填充),以比特為單位,64位大字節(jié)序(這將使整個后處理的長度為512比特的倍數(shù))
以連續(xù)512比特一塊的方式處理消息:
將消息按512比特一塊拆分;
對于每個塊:
{
創(chuàng)建一個64條記錄的為32位字的消息表數(shù)組w[0..63];
(w[0..63]的初始值并不重要,所以這里用許多零填充)
將塊復(fù)制到消息表數(shù)組的第一個16個字w[0..15];
將第一個16個字?jǐn)U大到消息表數(shù)組的其余48個字w[16..63]:
對于i,其從16到63:
s0 := (w[i-15] 右旋 7) xor (w[i-15] 右旋18) xor (w[i-15] 右移 3);
s1 := (w[i-2] 右旋17) xor (w[i-2] 右旋19) xor (w[i-2] 右移10);
w[i] := w[i-16] + s0 + w[i-7] + s1;
初始化工作變量為當(dāng)前散列值:
a := h0;
b := h1;
c := h2;
d := h3;
e := h4;
f := h5;
g := h6;
h := h7;
壓縮功能的主循環(huán):
對(for) i ,從(from) 0到 63:
{
S1 := (e 右旋(rightrotate) 6) xor (e 右旋 11) xor (e右旋25);
ch := (e and f) xor ((not e) and g);
temp1 := h + S1 + ch + k[i] + w[i];
S0 := (a右旋2) xor (a右旋13) xor (a右旋22);
maj := (a and b) xor (a and c) xor (b and c);
temp2 := S0 + maj;
h := g;
g := f;
f := e;
e := d + temp1;
d := c;
c := b;
b := a;
a := temp1 + temp2;
}
將壓縮塊添加到當(dāng)前散列值:
h0 := h0 + a;
h1 := h1 + b;
h2 := h2 + c;
h3 := h3 + d;
h4 := h4 + e;
h5 := h5 + f;
h6 := h6 + g;
h7 := h7 + h;
}
產(chǎn)生最終的散列值(大字節(jié)序):
摘要 := 散列 := h0 追加(append) h1追加h2追加h3追加h4追加h5追加h6追加h7
**********
下文中,為了便于參考,我們可以使用上面?zhèn)未a中提出的術(shù)語來談本發(fā)明的各方面。此外,通過舉例的方式,本公開內(nèi)容將集中討論研究比特幣協(xié)議,盡管我們意識到其他加密貨幣系統(tǒng)可能受益于本發(fā)明。
許多散列函數(shù),包括SHA-1、SHA-2和RIPEMD家族,采用與SHA-256類似的方案。每種算法采用一種適于將輸入消息(message)擴(kuò)展(expand)到消息表(message schedule)的擴(kuò)展函數(shù)(expansion function)(有時被稱為擴(kuò)展操作(expansion operation)),然后采用一種適于將消息表壓縮(compress)成散列值(value)或結(jié)果(result)(有時被稱為消息摘要(message digest),或者簡單地稱為摘要(digest))的壓縮函數(shù)(compression function)(有時被稱為壓縮操作(compression operation))。通常情況下,壓縮函數(shù)是可遞歸循環(huán)的(recursive),每次循環(huán)(round)壓縮消息表中的一個字(word)。當(dāng)應(yīng)用于硬件實(shí)現(xiàn)時,這些函數(shù)的遞歸性質(zhì)適合于公知的循環(huán)展開(loop unrolling)方法,結(jié)果得到計算元件(computational elements)的典型流水式(pipelined)配置。
通常,當(dāng)在比特幣內(nèi)計算散列時,它被計算兩次,即,SHA-256散列的SHA-256散列(有時被稱為雙SHA(double-SHA),或簡單地SHA2)。大多數(shù)時候,只在例如散列的交易或區(qū)塊頭部(block headers)時使用SHA-256散列。然而,當(dāng)更短的散列摘要是可取的時,例如,當(dāng)對公鑰(public key)散列以獲得比特幣地址(Bitcoin address)時,RIPEMD-160也可用于第二次散列。
通過設(shè)計,區(qū)塊鏈具有競爭性。貨幣獎勵正比于已開發(fā)(solved)的區(qū)塊的數(shù)量,其反過來正比于散列率,而散列率與整個網(wǎng)絡(luò)的散列率相關(guān)。隨著競爭加劇,礦機(jī)都在積極尋求即使是改進(jìn)小的散列率。一種改善散列率的已知方法是將散列查找(hash search)分散(scatter)到最大數(shù)量的散列引擎(hash engines),每種散列引擎適于獨(dú)立地搜索(search)滿足(satisfy)(例如,低于)所需難度目標(biāo)的散列的整個隨機(jī)數(shù)空間(nonce-space)的相應(yīng)部分。
通常,當(dāng)在比特幣內(nèi)計算散列時,正被散列的消息具有固定長度。這對于例如區(qū)塊頭部(headers)(80個字節(jié)(bytes))是這樣的情況,無論何時,散列值(32個字節(jié))本身正被散列。散列值在所有雙SHA應(yīng)用中都被散列。在Merkle樹(Merkle tree)的信息中,以樹數(shù)據(jù)結(jié)構(gòu)(tree data structure)排列的散列值對(64個字節(jié))被散列。一般情況下,適用于散列固定長度消息的散列引擎可能會更優(yōu)于且不同于適用于散列任意長度消息的散列引擎。
如果在專用集成電路(“ASIC”,application specific integrated circuit)中實(shí)現(xiàn)散列引擎時,設(shè)計目標(biāo)的關(guān)鍵是改善功率、性能和面積。當(dāng)許多相同的短長度的消息必須被散列時,采用流水式實(shí)現(xiàn)散列核心(core)是可能的。例如,圖1示出了這種流水式的現(xiàn)有技術(shù)的一個程序塊。在典型的ASIC中,在中央控制單元的控制下,若干個這樣的流水式程序塊被具現(xiàn)化并適于并行(parallel)或串行(serially)地操作,該中央控制單元(central control unit)可以是常規(guī)的微處理器單元(“MPU”,microprocessor unit)或是具現(xiàn)化于同一ASIC中的專用控制器(圖未示出)。
在區(qū)塊鏈的挖掘中,許多消息(區(qū)塊)的散列僅在最后塊(chunk)(即,該部分包含隨機(jī)數(shù))上不同。對于該特定類型的應(yīng)用,壓縮器(compressor)的中間狀態(tài)(mid-state)(即,執(zhí)行壓縮功能的硬件部件)可被預(yù)先計算,只要它不依賴于隨機(jī)數(shù)。然后,對于依賴于隨機(jī)數(shù)的最后應(yīng)用,可以使用如圖1所示的流水式核心10。在圖1中,我們已經(jīng)使用常規(guī)符號表示總線寬度,用表示為32位的雙字(“dwords”,double-words)作為單位。有時,根據(jù)使用環(huán)境,壓縮器14可被稱為半散列器(semi-hasher),而擴(kuò)展器12和壓縮器14的組合被稱為全散列器(full-hasher)。對于本發(fā)明的目的,我們提出核心10可以流水線式(pipelined)或回旋式(rolled)具現(xiàn)化。
我們已于圖2中示出了現(xiàn)有技術(shù)的回旋式核心(rolled core)10'的基本硬件結(jié)構(gòu)。通常,在這種結(jié)構(gòu)中,大約需要67個周期來計算一個SHA-256循環(huán),包括64個計算周期加上少數(shù)的額外周期來加載具有初始值的寄存器。通常,若干核心10'之間共享常量(constants)的只讀存儲器(“ROM”,read-only-memory)。一般地,現(xiàn)有技術(shù)的專用回旋式核心10'可以概念化為如圖3所示,其中散列計算硬件被描述成組合邏輯(combinational logic)云(cloud)。圖4通過示例方式描述了現(xiàn)有技術(shù)中高度結(jié)構(gòu)化的SHA2流水式核心10。在圖5中,我們已經(jīng)示出了一種典型的比特幣SHA2引擎16的高級表示。
圖6所示為比特幣區(qū)塊頭部的格式,其中,標(biāo)示的字段長度(field sizes)是以8比特字節(jié)標(biāo)示。可以看出,在偏移(offset)36處,32字節(jié)的Merkle根字段跨越區(qū)塊頭部的Block[0](有時簡稱為"B0")和Block[1]("B1")之間的邊界。例如,圖7已經(jīng)示出了一3級Merkle樹,其具有包含4次交易(transactions)的樹葉(leaf),但是可以認(rèn)識到,根據(jù)被散列的交易的數(shù)量,典型的Merkle樹可以具有另外的分層散列層級(hierarchical hash levels)。為了便于參考,圖8中已經(jīng)示出了比特幣區(qū)塊鏈內(nèi)典型的3塊序列,其中每個塊包含一區(qū)塊頭部(請見圖6)和各自的一組交易(以明文(clear text)方式呈現(xiàn)以便于區(qū)塊瀏覽(block browsing))。在可用交易的數(shù)量小于二級工作證明(power-of-two)的情況,填充(padding)交易,例如其采用復(fù)制或虛設(shè)的方式,將被添加到樹葉層級,以完成二級工作證明的樹結(jié)構(gòu)。根據(jù)比特幣協(xié)議,每個區(qū)塊的第一次交易常常是產(chǎn)量(generation)(或基于貨幣(coinbase))交易,其由將區(qū)塊添加得到鏈的礦機(jī)而產(chǎn)出(generated)。
正如我們在臨時申請中所解釋的那樣,已經(jīng)提出了在區(qū)塊頭部(請見圖6)劃分4字節(jié)的版本(Version)字段,并使用例如高2字節(jié)部分作為附加隨機(jī)數(shù)范圍??蛇x地,比特幣規(guī)范在基于貨幣(coinbase)或產(chǎn)量(generation)交易的格式中定義了extraNonce字段(請見圖16b)。但是,比特幣規(guī)范認(rèn)可extraNonce字段的增加會導(dǎo)致Merkle樹的重新計算,因?yàn)榛谪泿沤灰资亲钭筮叺娜~節(jié)點(diǎn)。在這種方法中,每次增加extraNonce時,產(chǎn)生完整的Merkle根部,因此需要重新處理完整的區(qū)塊頭部。
我們可以察知到,當(dāng)前的硬件平臺設(shè)計存在一個問題,每個散列核心需要適于獨(dú)立于實(shí)例化的硬件中的其他所有散列核心來進(jìn)行完整的SHA-256。需要一種方法和裝置來讓多個壓縮器時刻共享單個擴(kuò)展器時刻。
技術(shù)實(shí)現(xiàn)要素:
在本發(fā)明的一種實(shí)施例中,我們提供一種用于區(qū)塊挖掘的方法,區(qū)塊包括區(qū)塊頭部,作為應(yīng)用在區(qū)塊頭部的選定的散列函數(shù)的函數(shù),選定的散列函數(shù)包括擴(kuò)展操作和壓縮操作。根據(jù)我們的方法,首先開發(fā)m個中間狀態(tài),每個中間狀態(tài)作為有選擇地改變區(qū)塊頭部的選定的第一部分的函數(shù);然后對區(qū)塊頭部的選定的第二部分執(zhí)行擴(kuò)展操作以產(chǎn)生消息表;最后對于m個中間狀態(tài)中的每一個,對中間狀態(tài)與消息表執(zhí)行壓縮操作以產(chǎn)生相應(yīng)的m個結(jié)果中的一個。
在另一種實(shí)施例中,我們提供用于執(zhí)行我們區(qū)塊挖掘方法的裝置。
在又一實(shí)施例中,我們的用于區(qū)塊挖掘的方法可以具現(xiàn)化于包含可執(zhí)行指令的計算機(jī)可讀介質(zhì),可執(zhí)行指令在處理系統(tǒng)中執(zhí)行時,使處理系統(tǒng)執(zhí)行我們方法的步驟。
附圖說明
本發(fā)明可以通過一些優(yōu)選實(shí)施方式以及附圖的描述得以更全面的理解,其中附圖包括:
圖1以框圖形式示出了現(xiàn)有技術(shù)中專用SHA流水線;
圖2以框圖形式示出了現(xiàn)有技術(shù)中專用SHA回旋式核心;
圖3以框圖形式示出了現(xiàn)有技術(shù)中另一專用SHA回旋式核心;
圖4以框圖形式示出了現(xiàn)有技術(shù)中具有流水式核心的比特幣SHA2散列引擎;
圖5以框圖形式示出了現(xiàn)有技術(shù)中具有回旋式核心或流水式核心的比特幣SHA2散列引擎;
圖6以表格方式示出了比特幣區(qū)塊頭部的格式;
圖7以框圖形式示出了比特幣協(xié)議中采用的多層Merkle樹;
圖8以框圖形式示出了包含區(qū)塊鏈的比特幣區(qū)塊的通用格式;
圖9以框圖形式示出了根據(jù)我們的臨時專利申請中公開的本發(fā)明構(gòu)造的比特幣SHA2散列引擎;
圖10以框圖形式示出了根據(jù)我們的臨時專利申請中公開的本發(fā)明的一種可行的硬件具現(xiàn)化;
圖11以邏輯流程圖形式示出了根據(jù)我們的臨時專利申請中公開的本發(fā)明的用于操作圖10的實(shí)施例的一種可行的方法;
圖12以框圖形式示出了根據(jù)我們的臨時專利申請中公開的本發(fā)明的一種可行的并行消息表共享(message schedule sharing)實(shí)施例;
圖13以框圖形式示出了根據(jù)本發(fā)明的一種可行的級聯(lián)型(cascaded)消息表共享實(shí)施例;
圖14以框圖形式示出了根據(jù)本發(fā)明的一種替代的流水式消息表預(yù)計算(message schedule pre-computation)實(shí)施例;
圖15包含圖15a和圖15b,以框圖形式示出了適于用在例如圖14的可行的消息表預(yù)計算引擎;
圖16包含圖16a和圖16b,以框圖形式示出了用于圖7的多層Merkle樹的若干可行形式;
圖17以流程圖形式示出了根據(jù)本發(fā)明的一種用于產(chǎn)生多個Merkle根部的可行方法;
圖18以框圖形式示出了根據(jù)本發(fā)明的一種具有回旋式核心的可行的級聯(lián)型消息表共享實(shí)施例;以及
圖19以框圖形式示出了根據(jù)本發(fā)明的具有回旋式核心的消息表預(yù)計算實(shí)施例。
在附圖中,相似元件將盡可能標(biāo)記相似。然而,該做法僅是為了便于參考并且避免不必要的附圖標(biāo)記的激增,而并不意在暗示或提示本公開內(nèi)容要求若干實(shí)施方式中的功能或結(jié)構(gòu)的一致性。
具體實(shí)施方式
圖9以高層次形式示出根據(jù)我們的臨時專利申請中公開的本發(fā)明構(gòu)造的比特幣SHA2散列引擎16。圖10介紹了我們臨時專利申請中公開的本發(fā)明的基本實(shí)現(xiàn)。優(yōu)選的實(shí)施例是以ASIC形式具現(xiàn)化散列引擎16',其包含選定的多個例如200個SHA-256半散列器12以及相應(yīng)的多個全SHA-256散列器14。每個半散列器12與相應(yīng)的每個全散列器14進(jìn)行流水處理。每個散列器流水線,其將一個半散列器12和一個全散列器14組合起來,輸出結(jié)果為每時鐘周期(clock tick)一個SHA2。每個半散列器12具有12字節(jié)中間狀態(tài)寄存器18和64*4字節(jié)預(yù)計算的消息表寄存器20,其中,中間狀態(tài)寄存器包含預(yù)計算的中間狀態(tài),消息表寄存器包含預(yù)計算的消息表,并且所有SHA循環(huán)展開(unrolled),并用硬件實(shí)現(xiàn)。按照常規(guī),每個全散列器14包含消息表創(chuàng)建邏輯,以在每個時鐘周期從輸入?yún)^(qū)塊獲得消息表;并且循環(huán)也是展開的。消息表移位寄存器12a適于執(zhí)行類似擴(kuò)展器流水線,來以16雙字滑動窗口(sliding windows)(有時也稱為通道(slots))的64深度下推堆棧(push-down stack)順序地開發(fā)輸入?yún)^(qū)塊的消息表,其中,在堆棧中,消息的每個新的雙字進(jìn)入頂部,而最早的雙字于底部被移除。在操作中,每個滑動窗口被向下推導(dǎo)下一個更深的通道,以跟隨與通道相對應(yīng)的散列循環(huán)。在全散列器14的循環(huán)61處,我們提供專用的中間比較邏輯模塊22,以在進(jìn)行所有64次循環(huán)之前檢查區(qū)塊的解決方案。如果發(fā)現(xiàn)解決方案,則喚起(raised)中斷(interrupt)(“IRQ”);可選地,所有全散列器14可以被循序繼續(xù)搜索其他的解決方案,或者可以停止以節(jié)省功率。采用外部的微處理器(“MPU”,microprocessor)來處理異常,讀取全散列器14的輸出,并從中找到一個可以解決區(qū)塊的全散列器。此外,我們提供最后32比特的檢查器26,以便于為預(yù)計算重用散列器流水線。
根據(jù)本發(fā)明的一個實(shí)施例,我們直接提出了選擇性地改變位于Block[0](請見圖6)的Merkle根部的28字節(jié)部分。我們的方法要求礦機(jī)先執(zhí)行準(zhǔn)備階段(preparation stage),在該階段構(gòu)建許多不同的有效Merkle根部。然而,與通常的做法相反,我們的目標(biāo)是要找到若干候選Merkle根部,其以相同的4字節(jié)格式結(jié)束。例如,一種方式是選擇預(yù)定的固定格式(例如4個零字節(jié))。另一種方式是為每種格式存儲Merkle根部候選,直至發(fā)現(xiàn)足夠的侯選根部以所需格式結(jié)束。
如我們在臨時專利申請中所述,散列引擎16'的操作的功能流程如圖11所示。這里通過偽代碼形式(用縮進(jìn)表示for循環(huán)(for-loop)結(jié)構(gòu))解釋其工作:
**********
1. 通過將SHA的第一塊處理應(yīng)用于區(qū)塊頭部來預(yù)計算s個中間狀態(tài)MS0,..,MSs-1,該區(qū)塊頭部是通過設(shè)置Merkle根部字段到s個Merkle根部MR0,..,Mrs-1來修改。
2. 為固定格式創(chuàng)建具有B1集合的最前面32比特的B1,所有MR_i的各自最后4個字節(jié)共用。為B1的其它字段(|比特|和|時間|)設(shè)置適當(dāng)?shù)闹怠?/p>
3. 對于每個隨機(jī)數(shù)v,
3.1. 在B1中存儲隨機(jī)數(shù),并為B1預(yù)計算消息表Wv。
3.1 對于從0到s-1的每個i:
3.1.1 使用預(yù)計算消息表Wv使中間狀態(tài)成為完整SHA實(shí)施,以獲得中間的摘要Ti,v。
3.1.2. 將第二SHA操作應(yīng)用到Ti,v,已得到雙SHA摘要Di,v。
3.1.3. 比較Di,v和目標(biāo)(如果最后一輪優(yōu)化在使用中,該比較將在第二SHA實(shí)施引擎內(nèi)完成)。
**********
為了快速計算許多有效的候選根部,一種方式是通過增加extraNonce字段并重新計算樹上的父節(jié)點(diǎn)直至根節(jié)點(diǎn)的散列來構(gòu)造它們。另一種方式是通過交換子節(jié)點(diǎn)(例如左和右)來重新排列Merkle樹的子樹,并重新計算父節(jié)點(diǎn)直至根節(jié)點(diǎn);這種方法可以包括置換(permuting)交易樹葉。每計算一個新的候選根部,要重新檢查所需的格式,如果不匹配,則丟棄候選根部,否則將它存儲起來。正如我們在臨時專利申請中指出的,當(dāng)Merkle樹種包含Q個交易時,這種技術(shù)要求礦機(jī)執(zhí)行大約s*2^32*log2(Q)次SHA2散列摘要以獲得相同結(jié)果的元素。
如我們在臨時專利申請所解釋的,我們提出通過組合兩組預(yù)生成的Merkle子樹來實(shí)現(xiàn)更高的性能(雖然可以動態(tài)地組合所生成的Merkle子樹,但是我們發(fā)現(xiàn)這通常更糟)。我們的準(zhǔn)備階段分三個步驟進(jìn)行:
1. 在準(zhǔn)備階段的第一步,我們通過有選擇地重新排列Merkle樹種的交易集合,或者,也許還可以通過從所有待處理的交易池中選擇不同組的交易,開發(fā)K1個節(jié)點(diǎn)散列,這可以在大約(K1+1)*log2(#Q1)次SHA2操作中完成,其中Q1是一組交易散列,#Q1是該組(即,左節(jié)點(diǎn))的交易散列的數(shù)量,由于一旦建立Q1交易的樹,則,通過交換子節(jié)點(diǎn)可以獲得新的根部,并且每個父節(jié)點(diǎn)的計算需要平均log2(Q1)次SHA2散列摘要。只有父節(jié)點(diǎn)散列需要保存,而實(shí)際的樹隨后可以從內(nèi)存中去除。
2. 在準(zhǔn)備階段的第二步,我們開發(fā)了一組節(jié)點(diǎn)子樹的一組K2父節(jié)點(diǎn)散列摘要,其中交易的集合是Q2,交易(左節(jié)點(diǎn))的數(shù)量是#Q2=#Q1(如上所述,這通常是可能的,因?yàn)楸忍貛臡erkle根部使用重復(fù)的交易散列來填充樹的空節(jié)點(diǎn))。注意,集合Q1和Q2不相交(intersect),并且通過將Q1的訂單與Q2的任意訂單級聯(lián)(concatenation)而創(chuàng)建的交易的任何訂單必須是有效的交易訂單。另請注意,Q1的幾乎所有可能的訂單一般都是有效的,因?yàn)榇蠖鄶?shù)礦機(jī)不產(chǎn)生那種具有依賴于區(qū)塊內(nèi)其他交易的交易區(qū)塊(唯一例外的是,產(chǎn)量交易永遠(yuǎn)是第一位)。
對于Q1,左子樹的可能候選根部的數(shù)量是(#Q1-1)!(存在3628800種可能的訂單)。
對于Q2,為簡單起見,我們可以假設(shè)沒有重復(fù)的交易散列(即#Q1+#Q2是二級工作證明)。因此,右子樹的可能候選根部的數(shù)量是(#Q2)!。如果我們選擇#Q1=#Q2=11,那么存在至少2^46個可能的候選根部,其可以通過將左邊集合的元素與右邊集合的元素相組合而簡單計算出。注意K1和K2并不需要很大,且能夠表示一個小的可能訂單的子集,并可使用#Q1和#Q2的更高的值。
3. 在準(zhǔn)備階段的第三步(其通常用我們的散列引擎16'來執(zhí)行),第一組的一個父節(jié)點(diǎn)的散列反復(fù)地與第二組的一個父節(jié)點(diǎn)組合(一個左節(jié)點(diǎn)組合一個右節(jié)點(diǎn)),然后進(jìn)行SHA2散列,得到根部節(jié)點(diǎn)散列。每次組合只需要從表中獲得2個散列并執(zhí)行SHA2操作。
圖12所示為適用于圖9的系統(tǒng)的核心10,其包括一個適于共享相同消息表的擴(kuò)展器12以及一對同步運(yùn)行的壓縮器14a和14b。如上所述,每個壓縮器14從使用例如我們的候選根部生成處理來生成的唯一的中間狀態(tài)開始。隨著散列過程通過壓縮器14繼續(xù)同步向下進(jìn)行,消息表字流并行地通過擴(kuò)展器12向下。一旦完成,每個壓縮器14提供一個相應(yīng)的唯一的輸出狀態(tài)。如在我們的基本結(jié)構(gòu)那樣,中間狀態(tài)在完全隨機(jī)數(shù)范圍內(nèi)保持恒定,而消息表字內(nèi)的隨機(jī)數(shù)在全流水線時鐘速率時增加。與傳統(tǒng)結(jié)構(gòu)形成鮮明對比的是,我們的散列引擎16'只需要單個共用的擴(kuò)展器12,從而不僅總系統(tǒng)硬件明顯減少,而且功耗也明顯降低。
圖13所示為適用于圖9的系統(tǒng)的通用級聯(lián)核心10,其包括一個適于共享相同消息表的擴(kuò)展器12以及多個同步運(yùn)行的壓縮器14a-14b。在這個核心10中,若干個壓縮器14按級聯(lián)方式連接,每個消息表元素從壓縮器到壓縮器順序地傳遞,每個壓縮器存在一個延遲間隔(適用于特定的硬件實(shí)現(xiàn))。每個壓縮器14從唯一的中間狀態(tài)開始,一旦完成,可提供各自的唯一輸出狀態(tài);然而,對應(yīng)相同消息的輸出狀態(tài)歲時間相隔一個延遲間隔而順序提供。需要注意的是,這種設(shè)置包括謹(jǐn)慎協(xié)調(diào)的2維流水線以及從上到下、從左到右的工作流程。在操作中,在每一個周期,所有壓縮器14產(chǎn)生各自的輸出狀態(tài),但對應(yīng)不同消息。
在圖14已經(jīng)示出了我們消息表預(yù)計算方法的通用級聯(lián)形式,其中散列引擎16包含適于動態(tài)地為多個壓縮器14中的每一個生成唯一的中間狀態(tài)的中間狀態(tài)生成器28,以及適于延遲相應(yīng)的中間狀態(tài)到相應(yīng)的壓縮器14的最后級的64級延遲FIFO 30。中間狀態(tài)生成器28在每一壓縮器的管道時鐘必須開發(fā)新的中間狀態(tài),而每個中間狀態(tài)要在相同的管道時鐘頻率沿這一連串的壓縮器傳遞。在我們的消息表預(yù)計算散列引擎16的實(shí)施例中,通過合適的消息表預(yù)計算引擎32動態(tài)地開發(fā)消息表字W0-W63,其例子我們已在圖15中示出。在散列引擎16中,消息表字和隨機(jī)數(shù)在相對長的時間內(nèi)恒定。在圖15a所示的實(shí)施例中,輸出的字存儲于和每個壓縮器14相關(guān)的一組64個消息表寄存器34中。雖然我們在圖15a中示出了單個共享的回旋式消息擴(kuò)展器32a,但每個壓縮器14具有本地的回旋式消息擴(kuò)展器32a(未示出)。在圖15b所示的替代實(shí)施例中,每個壓縮器14具有與其關(guān)聯(lián)的適于動態(tài)生成消息表字的組合邏輯云32b;因此,在這個實(shí)施例中不需要寄存器34。由于消息表寄存器34的更新相對不頻繁,應(yīng)該有足夠的時間來解決深邏輯32b。
在圖16a中,為便于參考,我們已經(jīng)描述了一簡單的三級二進(jìn)制Merkle樹,其具有4個葉節(jié)點(diǎn),即交易[1::4]。根據(jù)我們的發(fā)明,尋求產(chǎn)生盡可能多的候選根部散列,然后確定和存儲那些最后雙字匹配的。一種我們稱之為分而治之("D&C",divide-and-conquer)的方法的工作原理的偽代碼形式如下:
**********
D&C算法:
輸入:Q=2^n交易的集合(即樹的葉)。
輸出:L=k個根節(jié)點(diǎn)散列值的列表。
1. 將葉集合劃分成大小為2^(n-1)的兩組Q1和Q2;
2. 產(chǎn)生散列摘要列表L1,其中每個元素為通過置換樹的節(jié)點(diǎn)而從Q1創(chuàng)建的Merkle樹的根節(jié)點(diǎn)
3. 產(chǎn)生散列摘要列表L2,其中每個元素為通過置換樹的節(jié)點(diǎn)而從Q2創(chuàng)建的Merkle樹的根節(jié)點(diǎn)
3.1 對于L1中的所有x1:
3.1.1 對于L2中的所有x2:
3.1.1.1 計算x=SHA2(x1||x2),并追加到L;
4. 返回包含#L1*#L2根部的列表L。
**********
注釋:
1)本流程在圖17中示出。在內(nèi)部循環(huán)步驟2.1.1,我們使用"::"符合表示追加操作。
2)我們的基本交易交換機(jī)制通過例如圖16a的示例示出,其中右子樹Q2的交易3已經(jīng)與右子樹Q2的交易4的交換。
3)在圖16b中,我們已強(qiáng)調(diào)產(chǎn)量交易必須始終是最左側(cè)的交易。因此在我們的D&C算法的步驟1中,產(chǎn)量交易被限制留在Q1。
4)由于k1、k2可以相對較?。ㄐ枰蠹s1M列表元素的訂單),我們優(yōu)選以駐留在MPU 24內(nèi)的軟件模塊來實(shí)現(xiàn)所有步驟,除了我們的D&C算法的外部遞歸外,即步驟2。一旦開發(fā)完,L1和L2可能會轉(zhuǎn)發(fā)到散列核心10的流水線,以產(chǎn)生根部散列,然后搜索列表L中滿足我們標(biāo)準(zhǔn)(大約1T列表元素的訂單)的根部。
一種快速開發(fā)一組候選根部散列的可替代的方法是,在每個產(chǎn)量交易中增加可用的extraNonce字段(請見圖16b)。由于extraNonce字段是從2到100個字節(jié)的可變長度,所以通過簡單地使用extraNonce字段可以容易且快速地生成很大的候選根部散列池。雖然迄今已建議使用extraNonce字段來增加挖掘操作的有效隨機(jī)數(shù)范圍,但是我們并不知道任何方案所得的一組根部散列的結(jié)果,其使用預(yù)定的過濾函數(shù)(filter function)進(jìn)行過濾(filtered),該過濾函數(shù)特別適用于識別那些最后4字節(jié)匹配給定標(biāo)準(zhǔn)的散列,例如我們已在我們的臨時專利申請中揭露的全零或任何其他給定值。我們方法的基本優(yōu)點(diǎn)是,只有B0受影響,允許B1的消息表被預(yù)先計算。要記住的是,最終的目標(biāo)是為了方便我們的兩個主要機(jī)制:消息表共享以及消息表預(yù)計算。
在圖18中,我們已經(jīng)說明了根據(jù)本發(fā)明采用回旋式核心結(jié)構(gòu),來使用我們的消息表共享方法。在示出的核心10'中,由單個消息擴(kuò)展器12開發(fā)的消息表,并行地應(yīng)用到多個同步運(yùn)行的壓縮器14。如圖12的實(shí)施例那樣,每個壓縮器14用不同的中間狀態(tài)初始化;這是有效的,因?yàn)橐话阍谝呀?jīng)用盡隨機(jī)數(shù)范圍之后,新中間狀態(tài)的需求相對不頻繁。
在圖19中,我們已經(jīng)說明了如何根據(jù)本發(fā)明的采用回旋式核心結(jié)構(gòu),來使用我們的消息表預(yù)計算方法。在示出的核心10'中,由單個消息擴(kuò)展器12開發(fā)的消息表,并行地應(yīng)用到多個級聯(lián)的壓縮器14。如圖14的實(shí)施例那樣,生成的中間狀態(tài)級聯(lián)地向下通過一組相應(yīng)的中間狀態(tài)寄存器,經(jīng)由總線運(yùn)行于大約核心頻率/67的頻率。在這個實(shí)施例中,由于消息表更新相對不頻繁,我們可以在寄存器文件中增加常數(shù)以及存儲預(yù)計算的總和。
雖然我們已經(jīng)通過具體實(shí)施方式描述了本發(fā)明,但是本領(lǐng)域普通技術(shù)人員將容易地認(rèn)識到,這些實(shí)施方式可以作出許多修改,以適用于特定的實(shí)現(xiàn)。在未來,如果比特幣區(qū)塊頭部的其他部分可以用作擴(kuò)展的隨機(jī)數(shù)空間,例如前個區(qū)塊散列(previous block hash)的前32位,那么我們的方法和裝置還可以使用這些額外的隨機(jī)數(shù)空間,以創(chuàng)建本發(fā)明所需的一組中間狀態(tài)。
因此,我們已經(jīng)提供了區(qū)塊挖掘的改進(jìn)方法和裝置。特別地,我們提出的新方法和裝置允許一個單一的擴(kuò)展時刻由多個壓縮器時刻的共享。此外,我們提出的方法和設(shè)備提供了總體上優(yōu)于最好的現(xiàn)有技術(shù)的性能。