Address

如何將 pubkey 類型的 script_pub_key 轉換為 public_key

  • January 6, 2022

這是一個反復出現的問題(請參閱Parse the output field of getrawtransaction to generate a common address hash),但我有不同的看法。

考慮以下scriptPubKey欄位:

 "scriptPubKey": {
   "asm": "0400d0ade32217e076945e0946ef7bed72d9aea035aa8891e4bf0749ae6e24f8a7d3ea56efafe472ac3943dbed3af7c093729720ac9ab04e8eba09286e3a00fe41 OP_CHECKSIG",
   "hex": "410400d0ade32217e076945e0946ef7bed72d9aea035aa8891e4bf0749ae6e24f8a7d3ea56efafe472ac3943dbed3af7c093729720ac9ab04e8eba09286e3a00fe41ac",
   "type": "pubkey"
 }

我無法根據 wiki https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses中提供的資訊建構公鑰。

1-給定以下十六進制,公鑰中的字節數是多少?我們如何計算它?410400d0ade32217e076945e0946ef7bed72d9aea035aa8891e4bf0749ae6e24f8a7d3ea56efafe472ac3943dbed3af7c093729720ac9ab04e8eba09286e3a00fe41ac

2- 給定上面的十六進制,如何重建公鑰?

3- Blockchair.com 之類的網站如何將此 HEX 轉換為地址1JAL1WRvwbJqWWd1Ktks4Q89zCeUYSQM12

P2PK 腳本的格式為PUSH <KEY> OP_CHECKSIG.

你的例子:

41
0400d0ade32217e076945e0946ef7bed72d9aea035aa8891e4bf0749ae6e24f8a7d3ea56efafe472ac3943dbed3af7c093729720ac9ab04e8eba09286e3a00fe41
ac

表示推送0x41(65) 個字節。緊隨其後的是公鑰(首先04表明它是未壓縮的公鑰)。最後0xac是OP_CHECKSIG。

所以總結一下,關鍵是0400d0ade32217e076945e0946ef7bed72d9aea035aa8891e4bf0749ae6e24f8a7d3ea56efafe472ac3943dbed3af7c093729720ac9ab04e8eba09286e3a00fe41

問題 3 是按照您連結的 wiki 頁面上的確切步驟完成的。

其他常見的 scriptPubKey 格式有:

  • OP_DUP OP_HASH160 <push of 20-byte public key hash> OP_EQUALVERIFY OP_CHECKSIG(P2PKH)
  • OP_HASH160 <push of 20-byte script hash> OP_EQUAL(P2SH)
  • OP_0 <push of 20-byte key hash>(P2WPKH)
  • OP_0 <push of 32-byte script hash>(P2WSH)
  • OP_1 <push of 32-byte public key>(P2TR)

只有 P2PKH 和 P2SH 的編碼方式與 wiki 相同(稱為“遺留地址”)。P2WPKH、P2WSH 和 P2TR 地址都使用 Bech32(m) 編碼,稱為原生 segwit 地址。編碼這些地址的方法是技術上有點複雜,但是網上有很多程式碼片段可以做到這一點。

請注意,一個 20 字節的推送是0x14,一個 32 字節的推送是0x20.

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