ASIC 執行挖礦過程的哪一部分?
如果 ASIC 被描述為一個黑匣子,它們的輸入會是什麼?
顯然,實際的散列,SHA-256 函式的攪動是由 ASIC 執行的。此外,他們當然必須能夠判斷何時成功,因此他們必須有一種機制來儲存目標並將其與結果進行比較。
然而,ASIC 執行了多少預處理步驟?我會假設他們會增加隨機數,因為它會在不到一秒的時間內完成,也許是額外的隨機數?他們可以更改時間戳嗎?他們管理完整的區塊頭嗎?ASIC 本身有多少塊頭變化?
ASIC 會組裝自己的區塊嗎?
TL;DR:ASIC 輸入/輸出是下面的粗體文本。
不,ASIC 不組裝塊。
該塊由礦池伺服器組裝。如果你是單獨挖礦,你可以讓 bitcoind 組裝區塊,但你仍然需要礦池或代理軟體,以使現代 ASIC 機器(僅限地層)和 bitcoind(僅限 getblocktemplate)進行通信。
現代 ASIC 礦工內置了一台小型電腦,充當控制器。有些人使用比格骨。這是一台低性能電腦,它處理層協議,生成工作,將工作推送到機器中的 ASIC 晶片,並從它們那裡接收結果。ASIC 晶片只處理必須重複數十億次的數字運算部分。
當礦工通過 Stratum 協議接收數據時,它可以更改 nonce、時間戳和 coinbase 的一部分(通常稱為額外的 nonce)。一個 ASIC 晶片可以很快地遍歷所有可能的 nonce 值,因此控制器需要能夠使用額外的 nonce 來完成更多的工作。
當控制器更改額外的 nonce 時,它需要為 coinbase 交易(現已修改)生成一個新的散列,並將這個散列與從池伺服器接收到的 merkle 分支一起使用來生成一個新的 merkle 根。這個 merkle 根進入區塊頭。
生成 merkle 根後,控制器現在可以計算中間狀態。比特幣區塊頭為 80 字節。SHA-256 散列以 64 字節的塊完成。由於我們要更改的有趣部分不在第一個塊中,因此控制器將對第一個塊進行一次雜湊處理,然後 ASIC 晶片將執行其餘的數十億次,同時每次更改第二個塊中的隨機數。中間狀態是處理完第一個塊後 SHA-256 雜湊引擎的狀態。
所以 ASIC 晶片的輸入是中間狀態(32 個字節)和第二個塊的 16 個字節(我們的比特幣塊頭的最後 16 個字節)。**輸出是隨機數(4 個字節),導致雜湊低於目標。**這些隨機數由控制器檢索並傳遞給池伺服器。
那麼除了中態之外,ASIC 晶片還需要哪些 16 字節數據呢?比特幣區塊頭的最後 16 個字節是 merkle 根的最後 4 個字節、4 個時間戳字節、4 個字節表示目前比特幣目標/難度的“位”和 4 個隨機數字節。
實際上,ASIC 不需要從控制器接收 4 字節隨機數。它將自己嘗試不同的隨機數值。所以我們只剩下這個:
ASIC 晶片的輸入是 32 字節的中間狀態、默克爾根的最後 4 字節、4 字節的時間戳和 4 字節的“位”(目標/難度)。
如果我設法正確解釋了上述內容,那麼您現在應該明白為什麼 ASIC 晶片專注於工作的這一特定部分。每次到完成中間狀態的工作完成時,該點之後的工作都會重複數十億次。
您還可以看到,生成一個新的中間狀態(這也需要生成一個新的 merkle 根)比僅僅增加時間戳要多得多。因此,一旦你有足夠的中間狀態來讓 ASIC 晶片保持一秒鐘的快樂,你就可以通過增加時間戳來一遍又一遍地重複使用相同的中間狀態。如果控制器足夠慢並且 ASIC 足夠快,那麼這種“時間滾動”可能是機器工作所必需的。
控制器的緩慢也可能意味著 ASIC 機器的操作難度最低。否則它將獲得比它可以處理的更多的結果(隨機數)。但同樣的事情也適用於礦池伺服器,它也不想被垃圾郵件致死。
為了獲得最大效率,ASIC 被設計為僅處理昂貴的專業化真正獲得回報的有限區域,而其餘部分則由非常便宜且非常節能的微型電腦處理。
注意:製造商之間當然存在一些差異。例如,一些 ASIC 晶片不會掃描整個 nonce 範圍。但以上應該是它的要點。