Функция combrawtransaction не работает

У меня есть несколько частично подписанных транзакций, которые я хочу объединить в одну транзакцию. Все эти транзакции были подписаны с использованием одного и того же ключа, поэтому должна быть возможность объединить все частично подписанные транзакции в одну комбинированную транзакцию, которая может быть подписана и передана одновременно с использованием одного ключа. В соответствии с биткойнами функция rpc combinerawtransactionподходит для использования в моем случае, но эта функция не работает, потому что вместо объединения всех частично подписанных транзакций в одну возвращается только первая частично подписанная транзакция (порядок массива не имеет значения, он всегда будет возвращать первый элемент)

Здесь у вас есть способ, которым я пытаюсь объединить два частично подписанных адреса:

bitcoin-cli combinerawtransaction '["020000000001014a05cf2073d4ee6aa61256159e421d9f12291c44fc9607d99a4045ab192a580a01000000232200209acb3925f27bec7d8ac16b49705f6d47d5b87d48dc8571d3f49b10dcc7d89051ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa2386040047304402207abf6df0650b8723677d493b182e742a8dddd89ad1ee8eaa1c65a9b559841ecb022052fe5bcad01702e0e73c3b34cbfef957ba8e4744d614104f5d8fbc3d57cad4ce010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221029791c6e3f0dc5bfa63db3f5aa0066badd6c5608d2a75394124d14df78795178153ae00000000", "02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000"]'

Приведенная выше команда выполняется без ошибок и возвращает следующую транзакцию:

02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000

И эта необработанная транзакция является первой необработанной транзакцией, переданной в массив для функции объединения необработанных транзакций и возвращенной без изменений.

Я немного растерялся, потому что не знаю, что происходит, если обе транзакции не объединены. Кроме того, я использую тестовую сеть биткойнов, я могу подписывать и транслировать эти транзакции по отдельности, но я не могу объединить их в одну, любая помощь будет оценена по достоинству.

Шаги, чтобы воспроизвести, как я создал эти необработанные транзакции:

  1. Прежде всего я создаю 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

  1. После того, как я создал оба мультиподписных адреса, я перешел к отправке средств на оба мультиподписных адреса. Вы можете проверить оба txids: 0a582a19ab45409ad90796fc441c29129f1d429e155612a66aeed47320cf054aи 071d12f061a3ba38eb56c8e4efdb77f66194bc699e240a89868b0f98a8719e41(соответственно). Чтобы пополнить оба адреса, я только что открыл учетную запись в тестовой сети, используя Электрум, и потратил немного тестовой сети BTC.

  2. Теперь следующим шагом является создание частично подписанных транзакций (с использованием третьих открытых ключей). Для этого мне нужно проверить неизрасходованные выходные данные и создать необработанную транзакцию на основе этих данных.

$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) может подписывать частично подписанные необработанные транзакции.

Как вы создали эти транзакции? Поможет в попытке воспроизвести проблему.
@Prayank Позвольте мне несколько минут, и я загружу все подробные шаги
@Prayank Готово! Я тестировал его с помощью небольшого php-скрипта, но все же я думаю, что код достаточно понятен, также я старался сделать его максимально простым, не удаляя никакой информации. Если вы видите, что мне чего-то не хватает для объединения этих транзакций, дайте мне знать :) Спасибо!

Ответы (1)

Проблема здесь в том, что две транзакции разные и combinerawtransactionне работают с разными транзакциями (очевидно, он просто молча ничего не делает). Похоже, вы ожидаете combinerawtransactionвзять две отдельные транзакции и создать новую, которая имеет входы и выходы обеих транзакций. (или, возможно, возьмите две транзакции с одинаковыми выходами, но разными входами и создайте транзакцию с комбинированными входами и одинаковыми выходами). Однако это не то, что он делает. Вместо этого он фактически берет одну и ту же транзакцию (т.е. одни и те же входы и выходы) и объединяет подписи для одних и тех же входов вместе.

Невозможно делать то, что вы хотите, потому что подписи фиксируют определенные входы и выходы этой транзакции. Как только вы попытаетесь присоединиться к транзакции с другой, эти подписи станут недействительными, и всю транзакцию потребуется переподписать.

Спасибо за ваш ответ! Извините, если я задаю глупые очевидные вопросы, но я учусь создавать и обрабатывать необработанные транзакции. Теперь, благодаря вашему объяснению, я понимаю, что функция объединяет подписи, делая их недействительными. Мое намерение состоит в том, чтобы упростить процесс мультиподписи между разными сторонами, если вам нужно подписать несколько транзакций с мультиподписью, я хотел бы сделать так, чтобы вы могли подписывать несколько транзакций одновременно (поэтому вам не нужно подписывать одну транзакцию и транслировать ее, повторяя процесс для всех ваших транзакций). Это возможно? Может быть, используя createpsbtи combinepsbt?
Или мне следует повторить весь описанный выше процесс, но включить все входы и выходы в одну и ту же транзакцию?
Вы должны включить все входы и выходы в одну и ту же транзакцию при ее создании.
Хорошо спасибо! Это сработало, объединив все входы и выходы в одну транзакцию!