Private-Key

如何從 sha256 私鑰生成比特幣 P2SH WIF 密鑰和地址對?

  • May 13, 2018

假設我有 sha256 私鑰十六進制格式

0000000000000000000000000000000000000000000000000000000000000001

如何獲取P2SH地址及其對應的 WIF 私鑰?

我的P2SH意思是P2SH-P2WPKH地址以3. 這些被稱為 1-of-1 多重簽名地址嗎?

私鑰提供公鑰,它可以提供以 1 開頭的比特幣地址。但 P2SH 地址(以 3 開頭)只是腳本的雜湊,並且該腳本幾乎可以是任何東西,它通常不與單個公鑰/私鑰。也許你的意思是 P2SH-P2WPKH?在這種情況下,您可以閱讀如下內容:https ://bitcoincore.org/en/segwit_wallet_dev/(特別是名為“創建 P2SH-P2WPKH 地址”的部分)。否則可能類似於 1-of-1 多重簽名地址或簡單的 P2SH 編碼普通 P2PK/P2PKH 兌換腳本?如果您明確說明您的意思,我將更新此答案:)

它是一樣的b58check(HASH160),但你正在散列一個腳本。

1 對 1 多重簽名 P2SH 地址的腳本是OP_0 hash160(pubkey).

所以你的地址是b58check(hash160('\x00\x14' + hash160(pubkey)))

長話短說:

1) WIF to pubkey:

secret = b58check_decode(WIF)
pubkey = ECKey(secret).pubkey

2) pubkey to P2PKH (legacy address):

addrtype = 0
addr = b58check(addrtype, hash160(pubkey))

3) pubkey to P2SH (1-to-1 multisig address):

addrtype = 5
addr = b58check(addrtype, hash160('\x00\x14' + hash160(pubkey)))    

where hash160(x) = ripemd160(sha256(x))

基本上就是這樣。另請參閱<https://github.com/joric/pywallet/issues/1>

關於 WIF 轉換的 32 字節秘密 - 比特幣核心無法區分不同的 WIF,它只是 b58check(secret) 類型 0x80。Importprivkey 命令從同一個密鑰生成 3 個不同的地址 - P2PKH、P2SH 和 BECH32,您可以隨時重新導出-重新導入該密鑰。

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