如何在 SHA 算法通道中填充比特幣標頭?
對於任何比特幣塊,我們結合各種 Header 欄位來創建一個字元串,該字元串是 2 pass SHA 算法的輸入。生成的散列必須與塊頭中的散列匹配,塊才有效。
為了測試這個邏輯以及SHA算法中,我使用的塊編號695877(標題<https://blockchain.info/rawblock/695877?format=json>)來創建輸入字元串04008020546c359986812644420e453113e209afeaaeeb316f3a07000000000000000000b8fa13b3fca087c1456daac626ab9b8a47eae821a326f17e0ffffc15433df709b0f718610b1812175a5c9544。
現在,當我應用 2 pass SHA 算法時,生成的雜湊與塊中的雜湊匹配(暫時忽略 Endian 部分)。
計算雜湊:629ef98d63e12f6b01476419a5a71efa8814dea40aec09000000000000000000
塊雜湊:00000000000000000009ec0aa4de1488fa1ea7a5196447016b2fe1638df99e62
但它傳遞給2通SHA算法如下之前當我墊頭手動: 04008020546c359986812644420e453113e209afeaaeeb316f3a07000000000000000000b8fa13b3fca087c1456daac626ab9b8a47eae821a326f17e0ffffc15433df709b0f718610b1812175a5c9544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280 這導致一個不正確的散列。
我看不到填充中有什麼問題。有人可以指出嗎?
您的填充是正確的,但您不需要填充。
看來您正在使用的 SHA256 實現本身已經執行了填充(事實證明,當以未填充的塊頭作為輸入時它可以正常工作)。因此,如果您改為手動填充,則有效計算的雜湊是執行兩次填充操作的結果。
填充不一定是冪等操作(= 再次應用它不能是無操作),否則會導致微不足道的衝突:任何字元串及其手動填充的版本都會給出相同的結果。