У меня есть несколько частично подписанных транзакций, которые я хочу объединить в одну транзакцию. Все эти транзакции были подписаны с использованием одного и того же ключа, поэтому должна быть возможность объединить все частично подписанные транзакции в одну комбинированную транзакцию, которая может быть подписана и передана одновременно с использованием одного ключа. В соответствии с биткойнами функция rpc combinerawtransaction
подходит для использования в моем случае, но эта функция не работает, потому что вместо объединения всех частично подписанных транзакций в одну возвращается только первая частично подписанная транзакция (порядок массива не имеет значения, он всегда будет возвращать первый элемент)
Здесь у вас есть способ, которым я пытаюсь объединить два частично подписанных адреса:
bitcoin-cli combinerawtransaction '["020000000001014a05cf2073d4ee6aa61256159e421d9f12291c44fc9607d99a4045ab192a580a01000000232200209acb3925f27bec7d8ac16b49705f6d47d5b87d48dc8571d3f49b10dcc7d89051ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa2386040047304402207abf6df0650b8723677d493b182e742a8dddd89ad1ee8eaa1c65a9b559841ecb022052fe5bcad01702e0e73c3b34cbfef957ba8e4744d614104f5d8fbc3d57cad4ce010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221029791c6e3f0dc5bfa63db3f5aa0066badd6c5608d2a75394124d14df78795178153ae00000000", "02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000"]'
Приведенная выше команда выполняется без ошибок и возвращает следующую транзакцию:
02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000
И эта необработанная транзакция является первой необработанной транзакцией, переданной в массив для функции объединения необработанных транзакций и возвращенной без изменений.
Я немного растерялся, потому что не знаю, что происходит, если обе транзакции не объединены. Кроме того, я использую тестовую сеть биткойнов, я могу подписывать и транслировать эти транзакции по отдельности, но я не могу объединить их в одну, любая помощь будет оценена по достоинству.
Шаги, чтобы воспроизвести, как я создал эти необработанные транзакции:
$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
Если у вас есть биткойн-узел с блокчейном тестовой сети, вы можете убедиться, что pubkey1 ( cPkPnf3qhf1AALzroHixPTYBq2cLQ9HLs9fvkTsS82ccBGZDHFaV
) или pubkey2 ( cQmzvzai8ft574ErkUH7nPVcP2SbR7xaPurKigWGPYVbhfMop9ia
) может подписывать частично подписанные необработанные транзакции.
Проблема здесь в том, что две транзакции разные и combinerawtransaction
не работают с разными транзакциями (очевидно, он просто молча ничего не делает). Похоже, вы ожидаете combinerawtransaction
взять две отдельные транзакции и создать новую, которая имеет входы и выходы обеих транзакций. (или, возможно, возьмите две транзакции с одинаковыми выходами, но разными входами и создайте транзакцию с комбинированными входами и одинаковыми выходами). Однако это не то, что он делает. Вместо этого он фактически берет одну и ту же транзакцию (т.е. одни и те же входы и выходы) и объединяет подписи для одних и тех же входов вместе.
Невозможно делать то, что вы хотите, потому что подписи фиксируют определенные входы и выходы этой транзакции. Как только вы попытаетесь присоединиться к транзакции с другой, эти подписи станут недействительными, и всю транзакцию потребуется переподписать.
createpsbt
и combinepsbt
?
пользователь103136
Кевин Гравелл
Кевин Гравелл