Multi-Signature

關於 MultiSig 輸出的問題

  • September 3, 2021

剛剛在 Telegram 上看到了很好的問題:

所以我研究了一種算法,可以下載和處理比特幣塊,特別是其中的交易。我想獲取一個塊中每筆交易的每個輸出地址,並查詢我的數據庫是否有任何使用者擁有這個地址作為他們的存款地址。最初我認為一個輸出只能有一個地址,所以我可以將那個輸出的數量歸功於擁有它的人。但現在我發現一個輸出實際上可以有多個地址,這就是所謂的多重簽名。我真的不明白這個概念。那麼,如果一個人使用我給他們的存款地址作為第一個地址,並且他們還在單個輸出中使用他們自己的另一個地址作為第二個地址怎麼辦?他們可以使用該輸出和他們的地址來浪費它,這樣我就失去了他們存入的錢嗎?

地址只是編碼鎖定腳本的簡寫。當鎖定腳本需要解鎖多個簽名時,它仍然是一個地址。因此,當您編寫索引器時,您可能會在第一次迭代中不區分單簽名和多簽名地址而僥倖逃脫。

看看這個交易

055f9c6dc094cf21fa224e1eb4a54ee3cc44ae9daa8aa47f98df5c73c48997f9(比特幣主網)

( <https://www.blockchain.com/btc/tx/055f9c6dc094cf21fa224e1eb4a54ee3cc44ae9daa8aa47f98df5c73c48997f9> )

但是,網路瀏覽器無法正確顯示這些內容,因此如果您使用自己的節點對其進行解碼,則會得到以下結果:

{
   "txid": "055f9c6dc094cf21fa224e1eb4a54ee3cc44ae9daa8aa47f98df5c73c48997f9",
   "version": 1,
   "locktime": 0,
   "vin": [
       {
           "txid": "b187426f2fdd5a7ac2f49d822f68e07f48486ee53a8a45de2494f12acb37a0d8",
           "vout": 3,
           "scriptSig": {
               "asm": "3046022100d78c31a20fa11533475be893b229eb4d252e600dcc2a0735d360c541b6aec813022100e3eaa72c915ef47d94ccbd18c2ba6d9ae5b98be6e9fbf968d4bbbb003e06d68701 030e001332b43924be343986cca3df669f57b0dedd120990e727787f8dea50fdbc"
           },
           "sequence": 4294967295,
           "n": 0,
           "addr": "1FrbMcddiM1v3HMpUqygjZYCamBykWCWao",
           "valueSat": 1114144,
           "value": 0.01114144,
           "doubleSpentTxID": null
       }
   ],
   "vout": [
       {
           "value": "0.00010860",
           "n": 0,
           "scriptPubKey": {
               "asm": "1 030e001332b43924be343986cca3df669f57b0dedd120990e727787f8dea50fdbc 20434e545250525459000000140001a9e0e85838b5000000174876e800010053b6 2 OP_CHECKMULTISIG",
               "reqSigs": 1,
               "type": "multisig",
               "addresses": [
                   "1FrbMcddiM1v3HMpUqygjZYCamBykWCWao",
                   "1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E"
               ]
           }
       },
       {
           "value": "0.00010860",
           "n": 1,
           "scriptPubKey": {
               "asm": "1 030e001332b43924be343986cca3df669f57b0dedd120990e727787f8dea50fdbc 20a3c3000000000000000000000000000000000000000000000000000000000000 2 OP_CHECKMULTISIG",
               "reqSigs": 1,
               "type": "multisig",
               "addresses": [
                   "1FrbMcddiM1v3HMpUqygjZYCamBykWCWao",
                   "1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E"
               ]
           }
       },
       {
           "value": "0.00010860",
           "n": 2,
           "scriptPubKey": {
               "asm": "1 030e001332b43924be343986cca3df669f57b0dedd120990e727787f8dea50fdbc 100000000000000000000000000000000000000000000000000000000000000000 2 OP_CHECKMULTISIG",
               "reqSigs": 1,
               "type": "multisig",
               "addresses": [
                   "1FrbMcddiM1v3HMpUqygjZYCamBykWCWao",
                   "1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E"
               ]
           }
       },
       {
           "value": "0.01061564",
           "n": 3,
           "scriptPubKey": {
               "asm": "OP_DUP OP_HASH160 a2f2d251cc06ec1e789800127e3fa6ed9e515651 OP_EQUALVERIFY OP_CHECKSIG",
               "reqSigs": 1,
               "type": "pubkeyhash",
               "addresses": [
                   "1FrbMcddiM1v3HMpUqygjZYCamBykWCWao"
               ]
           }
       }
   ],
   "blockhash": "0000000000000000491fdff68a1c99de7798278a791e461b8d5bebdd9df9de46",
   "confirmations": 1,
   "time": 1401911255,
   "blocktime": 1401911255,
   "valueOut": 0.01094144,
   "size": 433,
   "valueIn": 0.01114144,
   "fees": 0.0002
}

我實際上是提出這個問題的人,經過大量研究,我很確定這種交易不會發生在您為使用者提供唯一比特幣地址以進行存款的情況下。我認為這只會發生在地址是故意進行多重簽名時,但是,我不確定如何以及為什麼。

我做了一個小實驗,創建了一個測試網多重簽名地址並向它發送了一些資金。我期待它的行為與上述交易中的完全一樣,但事實並非如此。我認為這是因為必須有不同類型的腳本,我想知道它是什麼以及如何使用它。

這是我所做的:

首先,我創建了 2 個新地址。

index@LAPTOP-QHUBB7MI:~$ btc getnewaddress
2MsTYs9Ymsh332Ctou3dyxVe5PoTW4fLp2o
index@LAPTOP-QHUBB7MI:~$ btc getnewaddress
2N2yDtoRTChgrD675GJ12JE3wXzk3hMzgoP

然後我使用 getaddressinfo rpc 獲得了他們的公鑰。

index@LAPTOP-QHUBB7MI:~$ btc getaddressinfo 2MsTYs9Ymsh332Ctou3dyxVe5PoTW4fLp2o
{
 "address": "2MsTYs9Ymsh332Ctou3dyxVe5PoTW4fLp2o",
 "scriptPubKey": "a9140254bfce5627cc6267eb2aaa75dce00f03bc13dc87",
 "ismine": true,
 "solvable": true,
 ...
 "pubkey": "02d01d8e315567fb3571f31d86eb53d21729c6072751276d0c2617d787d48b2af8",
 ...

}
index@LAPTOP-QHUBB7MI:~$ btc getaddressinfo 2N2yDtoRTChgrD675GJ12JE3wXzk3hMzgoP
{
 "address": "2N2yDtoRTChgrD675GJ12JE3wXzk3hMzgoP",
 "scriptPubKey": "a9146aaa8606a93804de00e4e91c683dbfd5e1caa7d887",
 "ismine": true,
 "solvable": true,
 ...
 "pubkey": "0236240c39790e770bc0c378bebb1a86d2ac24f835b6e81e69c623262b1f0e0326",
 ...
}

然後我創建了多重簽名地址。

index@LAPTOP-QHUBB7MI:~$ btc createmultisig 1 '["0236240c39790e770bc0c378bebb1a86d2ac24f835b6e81e69c623262b1f0e0326", "02d01d8e315567fb3571f31d86eb53d21729c6072751276d0c2617d787d48b2af8"]'
{
 "address": "2Mu6J8iXwzCgWxJzVNkzfQ8yZwJ92YWW6es",
 "redeemScript": "51210236240c39790e770bc0c378bebb1a86d2ac24f835b6e81e69c623262b1f0e03262102d01d8e315567fb3571f31d86eb53d21729c6072751276d0c2617d787d48b2af852ae"
}

最後,我向該地址發送了一些比特幣。

index@LAPTOP-QHUBB7MI:~$ btc sendtoaddress 2Mu6J8iXwzCgWxJzVNkzfQ8yZwJ92YWW6es 0.00999744
1373fd7a2da3199e0f4ead0a5456266b52263356a86b726882dbc03da1625ed1

我解碼了該交易(測試網)並得到了這個

{
 "txid": "1373fd7a2da3199e0f4ead0a5456266b52263356a86b726882dbc03da1625ed1",
 "hash": "290a0ec0c306a4485a7099c1f7813d9f9a741a9b4fcc68c5decc68de5ddb1b14",
 "version": 2,
 "size": 338,
 "vsize": 173,
 "weight": 692,
 "locktime": 1572217,
 "vin": [
   {
     "txid": "7e57de9ce9797e8c5face7c3ed7ce89eb3107b05e00c129f336cebc1b1113dcb",
     "vout": 1,
     "scriptSig": {
       "asm": "00205a010c52d33bfac812f62f2cb7f917a3b84f67c66c1ac9ac1701c7caa4e5da7c",
       "hex": "2200205a010c52d33bfac812f62f2cb7f917a3b84f67c66c1ac9ac1701c7caa4e5da7c"
     },
     "txinwitness": [
       "",
       "304402206b7f9fcdf972a2aaa6a734e921d1f76b3da3a0f7a98e2bf3657241ed0cc4433a022040b1f0f31b6231ff73465986c3379ce15cbf2b33e28b09460aac8812d8e9826801",
       "304402200ffeeb246535a312f33c05652f9ef5d696fd26883659e6429731e5f0416be9fc022067a5852e99f96c5def0f7288b9a7ba567e3df258fd79071a60694580ac3de1fc01",
       "522103a8f863c198bfa005273ae53d9db239e3be2cabcd5cbf34f52318795166f5cdff2102cff91271435f4f121aa90f3babc5551090f862575e5eb12429acb8e6daf4d8cd52ae"
     ],
     "sequence": 4294967294
   }
 ],
 "vout": [
   {
     "value": 0.00999744,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_HASH160 143ff7e3677973ecd914d8d134efde5adff4a96b OP_EQUAL",
       "hex": "a914143ff7e3677973ecd914d8d134efde5adff4a96b87",
       "reqSigs": 1,
       "type": "scripthash",
       "addresses": [
         "2Mu6J8iXwzCgWxJzVNkzfQ8yZwJ92YWW6es"
       ]
     }
   }
 ]
}

這是一個完全正常的外觀。

儘管我幾乎可以肯定這不會在我描述的場景中發生,但我希望得到了解這些交易如何工作和解釋的人的最終確認。

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