Multi-Signature

如何找到用於創建多重簽名地址的比特幣地址

  • September 30, 2018

假設我們有一個 2 of 3 的多重簽名地址,我們將一些比特幣發送到該地址。

然後我們通過簽署和廣播交易來使用該地址的資金。

僅通過查看該交易,您能分辨出用於簽署該交易的私鑰的公鑰嗎?

是的。

花費多重簽名交易在區塊鏈上(不是資金交易)後,您可以看到用於花費這些多重簽名資金的公鑰。

這些公鑰可在支出交易中提供的完整兌換腳本中找到。在此處查看多重簽名支出交易的細分,這表明redeemScript 確實包含在支出交易中。請在此處查看完整的redeemScript 的細分,這表明公鑰包含在此完整的redeemScript 中。

讓我澄清一下,在資金交易中看不到公鑰,因為這裡只顯示了兌換腳本雜湊,而不是完整的兌換腳本。

注意:在上面的解釋中,我假設您談論的是多重簽名的支付到腳本雜湊 (P2SH) 形式,它是多重簽名的更常見和現代的形式。對於非 P2SH 多重簽名交易,您的問題的答案仍然是肯定的,只是公鑰在資金交易中可見,而不是在支出交易中可見。公鑰在資金交易的 scriptPubKey 中顯示,如下所示:

<m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG

來源:https ://bitcoin.org/en/developer-guide#multisig

P2SH multisig Tx(首次出現在9c08a4d78931342b37fd5f72900fb9983087e6f46c4a097d8a1f52c74e28eaf6)與 P2PKH(支付給 pubkeyhash)相當,因為雜湊是支出 Tx 的 scriptSig(即最終“解鎖資金”的 Tx)所引用的內容

如果您有興趣了解 P2SH 地址是如何計算的,請參閱下面的 Python 2.7 程式碼。請注意,multisig Tx 的一般形式(如@soroushjp 所述)是<m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG,並且贖回腳本必須****按順序執行簽名,並且腳本必須OP_0以/開頭,0x00因為off by 1 錯誤會從堆棧中彈出一個額外的值。

蟒蛇程式碼:

我將使用 pybitcointools

from bitcoin import * # 這是導入所有 pybitcointools 函式

privkeys, pubkeys, addrs = [], [], []
privkeys = [random_key() for x in range(0, 3)]
pubkeys = [privtopub(x) for x in privkeys]
addrs = [privtoaddr(x, magicbyte=0) for x in privkeys] # magicbyte = 0x6f for testnet
mykeys = zip(privkeys, pubkeys, addrs)

print mykeys
>>> [('b24b72423d008a252f47bcfcb270dcd71a364a91a574adb266e1aa22d3d2543d', '04eba461feced2a3d86aae5ca726c4d41f6d2a84f68fb83b5d91ead68fb0f9974886b0f24032db18a1603530c4039b54095acc460f84e47f192ee001230171be36', '18oYZEBqN2xPsiWvbmvSNVQDaS49RK2wCq'), ('f0764f256ad87129fbbc77af32b016680bce7e91be236231ee08ab4b66a6de84', '049ca1fa12b955f2fc1b6dab2e3138946f2d9ba6cb0c477c47bf3397f21d5709e100040d9675cef90cc1a0389293ec8ffdb2487093265290cbe66390dee36dcadd', '1DkBSD6pCRrNbWAkhxTbppnRPe42ciu2jB'), ('62666580151ada2dbf70d2a80c94a2bc20f5cc2f871a9aabb0eb11c6af24464b', '04982b9b7c004edc76cbedd363dd198fb4bcb6140e2bd589b4e33c9ecb741ed28c2ca3a6a54907d6d27f18be8898e88095cec7a7dc8cdffe7e5900794fa782ee8f', '1E7gn9B82hXmawmeyY7sJ9BPoSfYCXkxh7')]

  # making the raw script
  rawscript = mk_multisig_script(pubkeys, 2)  # means make a 2 of 3 multisig redeemScript
  descript = deserialize_script(script) # shows the op_codes pushed to stack
  print descript
  print script

[2, '04eba461feced2a3d86aae5ca726c4d41f6d2a84f68fb83b5d91ead68fb0f9974886b0f24032db18a1603530c4039b54095acc460f84e47f192ee001230171be36', '049ca1fa12b955f2fc1b6dab2e3138946f2d9ba6cb0c477c47bf3397f21d5709e100040d9675cef90cc1a0389293ec8ffdb2487093265290cbe66390dee36dcadd', '04982b9b7c004edc76cbedd363dd198fb4bcb6140e2bd589b4e33c9ecb741ed28c2ca3a6a54907d6d27f18be8898e88095cec7a7dc8cdffe7e5900794fa782ee8f', 3, 174]

524104eba461feced2a3d86aae5ca726c4d41f6d2a84f68fb83b5d91ead68fb0f9974886b0f24032db18a1603530c4039b54095acc460f84e47f192ee001230171be3641049ca1fa12b955f2fc1b6dab2e3138946f2d9ba6cb0c477c47bf3397f21d5709e100040d9675cef90cc1a0389293ec8ffdb2487093265290cbe66390dee36dcadd4104982b9b7c004edc76cbedd363dd198fb4bcb6140e2bd589b4e33c9ecb741ed28c2ca3a6a54907d6d27f18be8898e88095cec7a7dc8cdffe7e5900794fa782ee8f53ae

# cheating here, but see comments following
scriptaddress = scriptaddr(script)    # 37TtE1nfm51u6LNkNzzsjuBcuYmhTEmkq6

scriptaddr正在執行以下操作:

  1. SHA256 的524104eb...8f53ae
  2. #1 的 RIPEMD160
  3. 從十六進制轉換#2 ==> Base58

值得一提的是,標準 Tx(即被核心軟體、礦工接受)確實允許直接使用腳本(不使用 P2SH),但是這種方法的限制是 2of3 多重簽名。為什麼?以使用未壓縮公鑰的 m-of-15 為例,它的最小大小為15 * 65 = 975 bytes僅用於輸出的大小。

其他一些多重簽名變體:

OP_1 OP_DATA_65 OP_DATA_65 OP_2 OP_CHECK_MULTISIG:60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1 OP_1 OP_DATA_33 OP_DATA_33 OP_DATA_33 OP_3 OP_CHECK_MULTISIG:0109e3f8d2d324b8d0c0fdd34d369ebcc69fbcc5a0cabe781f69867a0ba1dd74 OP_1 OP_DATA_65 OP_DATA_33 OP_DATA_33 OP_3 OP_CHECK_MULTISIG:14015bd586c0c7a28979ca294b114441f23bfc97be17cd6077b9e12e2709fec3 OP_2 OP_DATA_65 OP_DATA_65 OP_DATA_65 OP_3 OP_CHECK_MULTISIG:6d5088c138e2fbf4ea7a8c2cb1b57a76c4b0a5fab5f4c188696aad807a5ba6d8 OP_2 OP_DATA_65 OP_DATA_65 OP_2 OP_CHECK_MULTISIG:947539645c59e6ab0cda61826cbacb55ef97a8178f012f8c18abe504bf66d4ce OP_1 OP_DATA_33 OP_1 OP_CHECK_MULTISIG:b96af3b69b48a82c5eae3e44ebb6ef93f30d7764b1d5b40243e11b0d374ac1b7

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