功能 combinerawtransaction 不起作用
我有多個部分簽名的交易,我想將它們合併為一個交易。所有這些交易都使用相同的密鑰進行簽名,因此應該可以將所有這些部分簽名的交易組合成一個可以使用一個密鑰一次簽名和廣播的組合交易。根據比特幣的 rpc 函式
combinerawtransaction
在我的情況下使用是正確的,但該函式不起作用,因為不是將所有部分簽名的交易組合成一個,而是只返回第一個部分簽名的交易(數組的順序無關緊要,它將始終返回第一個元素)在這裡,您可以嘗試組合兩個部分簽名的地址:
bitcoin-cli combinerawtransaction '["020000000001014a05cf2073d4ee6aa61256159e421d9f12291c44fc9607d99a4045ab192a580a01000000232200209acb3925f27bec7d8ac16b49705f6d47d5b87d48dc8571d3f49b10dcc7d89051ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa2386040047304402207abf6df0650b8723677d493b182e742a8dddd89ad1ee8eaa1c65a9b559841ecb022052fe5bcad01702e0e73c3b34cbfef957ba8e4744d614104f5d8fbc3d57cad4ce010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221029791c6e3f0dc5bfa63db3f5aa0066badd6c5608d2a75394124d14df78795178153ae00000000", "02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000"]'
上面的命令執行沒有任何錯誤,並返回以下事務:
02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000
而該原始交易正是數組中傳遞給 combinerawtransaction 函式並未經修改返回的第一個原始交易
我有點迷茫,因為我不知道沒有合併兩個交易會發生什麼。另外,我正在使用比特幣測試網,我可以單獨簽署和廣播這些交易,但我不能將它們組合成一個,任何幫助將不勝感激
重現我如何創建這些原始交易的步驟:
- 首先,我創建一個 2-3 多重簽名地址:
$participants = []; $participants[] = "03e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb2";//pubkey1 $participants[] = "03f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db";//pubkey2 $participants[] = "029791c6e3f0dc5bfa63db3f5aa0066badd6c5608d2a75394124d14df787951781";//pubkey3 $res = $this->bitcoin->addmultisigaddress($participants, $pubkey_str); $multisig_address = $res["address"]; $redeemScript = $res["redeemScript"]; $this->bitcoin->importaddress($multisig_address, "", false); // I import the multisig address so I can check incoming transactions
上面的程式碼是創建與第一個原始交易關聯的多重簽名地址,創建與第二個交易關聯的多重簽名地址重複相同的步驟,但為此更改第三個公鑰
027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc
- 一旦我創建了兩個多重簽名地址,我就會繼續向這兩個多重簽名地址發送一些資金。您可以同時檢查 txids:
0a582a19ab45409ad90796fc441c29129f1d429e155612a66aeed47320cf054a
和071d12f061a3ba38eb56c8e4efdb77f66194bc699e240a89868b0f98a8719e41
(分別)。為了為這兩個地址提供資金,我剛剛使用電子開設了一個測試網賬戶並花費了一些 btc 測試網。- 現在下一步是創建部分簽名的交易(使用第三個公鑰)。為此,我需要檢查未使用的輸出並根據該數據創建原始交易。
$res = $this->bitcoin->listunspent(2, 9999999, json_decode('["'.$multisig_address.'"]')); $fee = 0.00002; $total_amount = 0.00; $total_amount = 0.00; $txids = []; $vouts = []; $amounts = []; $scriptPubs = []; for($i=0; $i<count($transactions); $i++){ $txids[] = $transactions[$i]["txid"]; $total_amount+=$transactions[$i]["amount"]; $vouts[] = $transactions[$i]["vout"]; $amounts[] = $transactions[$i]["amount"]; $scriptPubs[] = $transactions[$i]["scriptPubKey"]; } $amount1 = 0.00176252; $amount2 = 0.00007506; $amount3 = 0.00001876; $address1 = "tb1q3pp8yv4fppd54dkrxnrpz4e9wevxff4d2v3r6e"; $address2 = "tb1qctlp9ynkndv9hy0m3vz9cega0yuctzwv6z273w"; $address3 = "tb1q2nrysxf8nwxv8euwtu470wgjruw25guxkal3wd"; $inputs = '['; for($j=0; $j<count($vouts); $j++){ $inputs.='{ "txid": "'.$txids[$j].'", "vout": '.$vouts[$j].' }'; if($j+1!=count($vouts)){ $inputs.=','; } } $inputs.=']'; $outputs = '{"'.$address1.'": '.$amount1.', "'.$address2.'": '.$amount2.', "'.$address3.'": '.$amount3.'}'; $rawtransaction = $this->bitcoin->createrawtransaction(json_decode($inputs), json_decode($outputs)); $prevtxs = '['; for($j=0; $j<count($txids); $j++){ $prevtxs .= '{ "txid": "'.$txids[$j].'", "vout": '.$vouts[$j].', "scriptPubKey": "'.$scriptPubs[$j].'", "redeemScript": "'.$redeemScript.'", "amount": '.$amounts[$j].' }'; if($j+1!=count($txids)){ $prevtxs.=','; } } $prevtxs.=']'; $private_key = $this->dumpKey($pubkey3_privkey); // replace this value with cTe9h3HqgqC7wzUsVVw7hgoPkBNLUuChZNB7aKFsSYeTi5MYcABX or cQon9MgHPoAj3wBU8ne2BVaThTuRkXvb9FUFyQdjePUrYWTjdCaE $partially_signed = $this->signrawtransactionwithkey($rawtransaction, json_decode('["'.$private_key.'"]'), json_decode($prevtxs))["hex"]; // and in this step I get the transaction hex string
如果你有一個帶有 testnet 區塊鏈的比特幣節點,你可以驗證 pubkey1 (
cPkPnf3qhf1AALzroHixPTYBq2cLQ9HLs9fvkTsS82ccBGZDHFaV
) 或 pubkey2 (cQmzvzai8ft574ErkUH7nPVcP2SbR7xaPurKigWGPYVbhfMop9ia
) 可以簽署部分簽名的原始交易
這裡的問題是這兩個事務是不同的,並且
combinerawtransaction
不對不同的事務進行操作(顯然它只是默默地什麼都不做)。聽起來您希望combinerawtransaction
採用兩個單獨的事務並創建一個具有兩個事務的輸入和輸出的新事務。(或者可能採用兩個具有相同輸出但不同輸入的事務,並產生一個具有組合輸入和相同輸出的事務)。然而,這不是它的作用。相反,它實際上採用相同的交易(即相同的輸入和輸出)並將相同輸入的簽名合併在一起。不可能做你想做的事,因為簽名送出到該交易的特定輸入和輸出。一旦您嘗試與另一筆交易加入交易,這些簽名就會失效,整個交易都需要重新簽名。