如何找到用於創建多重簽名地址的比特幣地址
假設我們有一個 2 of 3 的多重簽名地址,我們將一些比特幣發送到該地址。
然後我們通過簽署和廣播交易來使用該地址的資金。
僅通過查看該交易,您能分辨出用於簽署該交易的私鑰的公鑰嗎?
是的。
在花費多重簽名交易在區塊鏈上(不是資金交易)後,您可以看到用於花費這些多重簽名資金的公鑰。
這些公鑰可在支出交易中提供的完整兌換腳本中找到。在此處查看多重簽名支出交易的細分,這表明redeemScript 確實包含在支出交易中。請在此處查看完整的redeemScript 的細分,這表明公鑰包含在此完整的redeemScript 中。
讓我澄清一下,在資金交易中看不到公鑰,因為這裡只顯示了兌換腳本雜湊,而不是完整的兌換腳本。
注意:在上面的解釋中,我假設您談論的是多重簽名的支付到腳本雜湊 (P2SH) 形式,它是多重簽名的更常見和現代的形式。對於非 P2SH 多重簽名交易,您的問題的答案仍然是肯定的,只是公鑰在資金交易中可見,而不是在支出交易中可見。公鑰在資金交易的 scriptPubKey 中顯示,如下所示:
<m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG
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
正在執行以下操作:
- SHA256 的
524104eb...8f53ae
- #1 的 RIPEMD160
- 從十六進制轉換#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