Sha256

checksum = SHA256(SHA256(prefix+data)) - 為什麼要使用雙重雜湊?

  • February 22, 2022

從’掌握比特幣’ -

checksum = SHA256(SHA256(prefix+data))

例如,“數據”是使用 SHA256 和 RIPEMD160 計算的地址。為什麼我們在計算校驗和時需要雙重雜湊?

中本聰標準化使用雙 SHA256 處理 32 字節雜湊,使用 SHA256+RIPEMD160(每次一次)處理 20 字節雜湊,大概是因為(可能被誤導)擔心某些攻擊(如長度擴展攻擊,這僅適用於散列秘密數據),然後到處使用:

  • P2PKH scriptPubKeys 使用公鑰的 SHA256+RIPEMD160
  • P2PKH 地址校驗和使用有效負載的截斷雙 SHA256
  • 交易雜湊 (txids) 使用雙 SHA256
  • 塊雜湊(以及等效的工作證明)使用雙 SHA256
  • 交易 Merkle 樹使用雙 SHA256 來計算下一層。
  • P2P 網路數據包使用有效載荷的截斷雙 SHA256 作為校驗和。
  • 經 ECDSA 簽名以授權交易的消息 (sighash) 是交易序列化變體的雙 SHA256 雜湊。

據我所知,這些案例實際上都沒有從雙重雜湊中受益。

後來的添加起初複製了這種做法,大概是因為其基本原理並沒有被很好地理解,並且繼續使用相同的方法最容易說服人們是安全的:

在更現代的添加中,不再使用它:

  • P2WSH scriptPubKeys 使用公鑰 ( BIP141 )的單個SHA256 散列。
  • Bech32 和 Bech32m 地址編碼(用於原生 P2WPKH、P2WSH 以及很快的 P2TR)地址使用基於糾錯碼的校驗和,而不是散列(BIP173BIP350)。
  • 即將到來的 Taproot 軟分叉將引入 P2TR scriptPubKeys,它結合了公鑰和腳本,在一個涉及多個散列步驟的方案中,但它們都是單 SHA256(帶有前綴標籤以保證唯一性)。對於被 (Schnorr) 簽名的消息和簽名算法中的散列也是如此。(BIP340BIP341BIP342)。

此外,不需要加密大小雜湊的各個地方也一直在使用其他雜湊函式:

  • 在(現已棄用)伺服器端 Bloom 過濾協議中,MurmurHash3用於確定過濾器位置(BIP37)。
  • 在客戶端緊湊塊過濾中,SipHash-2-4用於確定過濾器位置(BIP158)。
  • 在緊湊塊 P2P 協議擴展中,SipHash-2-4用於生成短(48 位)交易標識符(BIP152)。

免責聲明:我是這裡提到的幾個提案的合著者,可能忘記了其他擴展。

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