Mining-Technical-Details
解釋一下來自比特幣 miner.cpp 源的關於 nNonce 的評論?
此評論位於 0.9.3 miner.cpp 比特幣原始碼中,位於
ScanHash_CryptoPP
定義的正上方。// // ScanHash 掃描隨機數以尋找至少有一些零位的散列。 // 它對大端數據進行操作。呼叫者執行字節反轉。 // 所有輸入緩衝區都是 16 字節對齊的。nNonce 通常被保留 // 在呼叫之間,但周期性地或者如果 nNonce 為 0xffff0000 或更高, // 塊被重建並且 nNonce 從零開始。 // 無符號整數靜態 ScanHash_CryptoPP...
- 輸入緩衝區是 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 個字元需要什麼?
- 為什麼只嘗試 0xffff 隨機數?這只是一個人為的限制,以便散列不會永遠存在嗎?
- >
輸入緩衝區是 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;
有人可能應該移動評論。