Mining-Technical-Details

解釋一下來自比特幣 miner.cpp 源的關於 nNonce 的評論?

  • May 22, 2018

此評論位於 0.9.3 miner.cpp 比特幣原始碼中,位於ScanHash_CryptoPP定義的正上方。

//
// ScanHash 掃描隨機數以尋找至少有一些零位的散列。
// 它對大端數據進行操作。呼叫者執行字節反轉。
// 所有輸入緩衝區都是 16 字節對齊的。nNonce 通常被保留
// 在呼叫之間,但周期性地或者如果 nNonce 為 0xffff0000 或更高,
// 塊被重建並且 nNonce 從零開始。
//
無符號整數靜態 ScanHash_CryptoPP...
  1. 輸入緩衝區是 16 字節對齊的是什麼意思?這對計算雜湊很重要嗎?

我注意到這個方法的一些參數定義如下:

char pmidstatebuf[32+16]; char* pmidstate = alignup<16>(pmidstatebuf);
char pdatabuf[128+16];    char* pdata     = alignup<16>(pdatabuf);
char phash1buf[64+16];    char* phash1    = alignup<16>(phash1buf);

所有數組的長度都可以被 16 整除,額外的 16 個字元需要什麼?

  1. 為什麼只嘗試 0xffff 隨機數?這只是一個人為的限制,以便散列不會永遠存在嗎?
  1. >

輸入緩衝區是 16 字節對齊的是什麼意思?這對計算雜湊很重要嗎?

這意味著起始地址的低四位始終為零。我認為這樣做是出於速度原因。有些指令不適用於非 16 字節對齊的地址。此外,一些 CPU 記憶體可能更喜歡它。我不知道。

不過,它不會影響採礦的完成方式。 2. >

所有數組的長度都可以被 16 整除,額外的 16 個字元需要什麼?

不完全的。注意它是如何獲取這些地址的。它聲明一個數組,然後操作指向該數組的指針。沒有獨立於平台的方法來向作業系統請求對齊的記憶體部分。相反,您必須要求比您想要的稍大的東西,並增加指針直到它落在您想要的邊界上。

旁注:這是一個錯誤的錯誤。真的,數組只需要比正常的大 15 個字節。可能不值得修復。 3. >

為什麼只嘗試 0xffff 隨機數?這只是一個人為的限制,以便散列不會永遠存在嗎?

它嘗試所有的 nonce 值。但是,它每 65536 次迭代從函式返回,因此父函式可以檢查

  • 它仍然在鏈的頂部挖礦,
  • 它實際上仍然連接到網路,
  • 交易沒有過期,並且
  • 隨機數不會環繞。基本上,所有復雜的邏輯都在它的呼叫者中實現,BitcoinMiner.

PS:這個評論是錯誤的。它似乎描述了 ScanHash,但它實際上是在談論這部分程式碼BitcoinMiner

   // Check for stop or if block needs to be rebuilt
   boost::this_thread::interruption_point();
   if (vNodes.empty() && Params().NetworkID() != CChainParams::REGTEST)
       break;
   if (nBlockNonce >= 0xffff0000)
       break;
   if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60)
       break;
   if (pindexPrev != chainActive.Tip())
       break;

有人可能應該移動評論。

引用自:https://bitcoin.stackexchange.com/questions/32829