Sha256
checksum = SHA256(SHA256(prefix+data)) - 為什麼要使用雙重雜湊?
從’掌握比特幣’ -
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 雜湊。
據我所知,這些案例實際上都沒有從雙重雜湊中受益。
後來的添加起初複製了這種做法,大概是因為其基本原理並沒有被很好地理解,並且繼續使用相同的方法最容易說服人們是安全的:
- P2SH 地址 ( BIP13 ) 使用截斷的雙 SHA256 作為校驗和。
- P2SH scriptPubKeys ( BIP16 ) 使用腳本的 SHA256+RIPEMD160。
- WIF(“錢包導入格式”)私鑰也使用截斷的雙 SHA256 作為校驗和。
- 擴展密鑰 xpub 和 xprv 格式 ( BIP32 ) 也是如此。那裡的密鑰派生算法使用HMAC -SHA512(為此目的類似於雙 SHA512)。
- P2WPKH scriptPubKeys 使用公鑰 ( BIP141 )的 SHA256+RIPEMD160 散列
- 見證交易標識符 (wtxids) 像普通 txids ( BIP141 )一樣使用雙 SHA256 。
- 見證 Merkle 樹使用與交易樹 ( BIP141 )相同的基於雙 SHA256 的散列。
- 為授權見證 v0 腳本而進行 ECDSA 簽名的消息是不同消息方案 ( BIP143 )的雙 SHA256 雜湊。
在更現代的添加中,不再使用它:
- P2WSH scriptPubKeys 使用公鑰 ( BIP141 )的單個SHA256 散列。
- Bech32 和 Bech32m 地址編碼(用於原生 P2WPKH、P2WSH 以及很快的 P2TR)地址使用基於糾錯碼的校驗和,而不是散列(BIP173和BIP350)。
- 即將到來的 Taproot 軟分叉將引入 P2TR scriptPubKeys,它結合了公鑰和腳本,在一個涉及多個散列步驟的方案中,但它們都是單 SHA256(帶有前綴標籤以保證唯一性)。對於被 (Schnorr) 簽名的消息和簽名算法中的散列也是如此。(BIP340、BIP341、BIP342)。
此外,不需要加密大小雜湊的各個地方也一直在使用其他雜湊函式:
- 在(現已棄用)伺服器端 Bloom 過濾協議中,MurmurHash3用於確定過濾器位置(BIP37)。
- 在客戶端緊湊塊過濾中,SipHash-2-4用於確定過濾器位置(BIP158)。
- 在緊湊塊 P2P 協議擴展中,SipHash-2-4用於生成短(48 位)交易標識符(BIP152)。
免責聲明:我是這裡提到的幾個提案的合著者,可能忘記了其他擴展。