Funktion Combinerawtransaction funktioniert nicht

Ich habe mehrere teilweise signierte Transaktionen, die ich zu einer Transaktion kombinieren möchte. Alle diese Transaktionen wurden mit demselben Schlüssel signiert, sodass es möglich sein sollte, alle diese teilweise signierten Transaktionen zu einer kombinierten Transaktion zu kombinieren, die mit einem Schlüssel gleichzeitig signiert und gesendet werden kann. Gemäß der rpc-Funktion von Bitcoin combinerawtransactionist die richtige Funktion in meinem Fall zu verwenden, aber diese Funktion funktioniert nicht, da anstatt alle teilweise signierten Transaktionen zu einer zu kombinieren, nur die erste teilweise signierte Transaktion zurückgegeben wird (die Reihenfolge des Arrays spielt keine Rolle, es gibt immer das erste Element zurück)

Hier haben Sie die Art und Weise, wie ich versuche, zwei teilweise signierte Adressen zu kombinieren:

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

Der obige Befehl wird ohne Fehler ausgeführt und gibt die folgende Transaktion zurück:

02000000000101419e71a8980f8b86890a249e69bc9461f677dbefe4c856eb38baa361f0121d070000000023220020a8c4e11c15bcc878d57238016fe896c586508c913e0b300d80fa9409b031efb7ffffffff037cb002000000000016001488427232a9085b4ab6c334c6115725765864a6ad521d000000000000160014c2fe1292769b585b91fb8b045c651d79398589cc540700000000000016001454c64819279b8cc3e78e5f2be7b9121f1caa23860400473044022061b31eb92fb0555d368c2349ef9584df89bfc573a37acfd0bbf2de18d6cb51420220785706c33d3b7b735e434decddf1520ce687b168d17b40527da2712a3634f42f010069522103f6de61c401c947aad006ba9dbfdaad795e77be06972a3fb7308e70049d4026db2103e33af80b92e4efd64852166d6126e10aafdcc741579c67c6aa9eb89080cebeb221027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc53ae00000000

Und diese Raw-Transaktion ist genau die erste Raw-Transaktion, die im Array an die Combinerawtransaction-Funktion übergeben und unverändert zurückgegeben wird

Ich bin etwas verloren, weil ich nicht weiß, was passiert, wenn nicht beide Transaktionen kombiniert werden. Außerdem verwende ich Bitcoin Testnet, ich kann diese Transaktionen einzeln signieren und übertragen, aber ich kann sie nicht zu einer kombinieren, jede Hilfe wird geschätzt

Schritte zum Reproduzieren, wie ich diese Rohtransaktionen erstellt habe:

  1. Als erstes erstelle ich eine 2-3 Multisig-Adresse:
$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

Der obige Code dient zum Erstellen der Multisig-Adresse, die der ersten Rohtransaktion zugeordnet ist, zum Erstellen der Multisig-Adresse, die der zweiten Transaktion zugeordnet ist, wiederholen Sie dieselben Schritte, ändern Sie dafür jedoch den dritten Pubkey027152e86c82d162b47684a52cd9e74ed57b9fc2295531d8da6a560a7a602357fc

  1. Sobald ich beide Multisig-Adressen erstellt habe, sende ich etwas Geld an beide Multisig-Adressen. Sie können beide txids überprüfen: 0a582a19ab45409ad90796fc441c29129f1d429e155612a66aeed47320cf054aund 071d12f061a3ba38eb56c8e4efdb77f66194bc699e240a89868b0f98a8719e41(jeweils). Um beide Adressen zu finanzieren, habe ich gerade ein Testnet-Konto mit Elektron eröffnet und etwas BTC-Testnet ausgegeben.

  2. Der nächste Schritt besteht nun darin, teilweise signierte Transaktionen zu erstellen (unter Verwendung von dritten Pubkeys). Dafür muss ich nicht ausgegebene Ausgaben überprüfen und eine Rohtransaktion basierend auf diesen Daten erstellen.

$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

Falls Sie einen Bitcoin-Knoten mit Testnet-Blockchain haben, können Sie überprüfen, ob pubkey1 ( cPkPnf3qhf1AALzroHixPTYBq2cLQ9HLs9fvkTsS82ccBGZDHFaV) oder pubkey2 ( cQmzvzai8ft574ErkUH7nPVcP2SbR7xaPurKigWGPYVbhfMop9ia) teilweise signierte Rohtransaktionen signieren kann

Wie haben Sie diese Transaktionen erstellt? Hilft beim Versuch, das Problem zu reproduzieren.
@Prayank Gib mir ein paar Minuten Zeit und ich werde alle detaillierten Schritte hochladen
@Prayank Fertig! Ich habe es mit einem kleinen PHP-Skript getestet, aber ich denke immer noch, dass der Code klar genug ist. Außerdem habe ich versucht, ihn so einfach wie möglich zu halten, ohne Informationen zu entfernen. Wenn Sie sehen, dass mir etwas fehlt, um diese Transaktionen zu kombinieren, lassen Sie es mich wissen :) Danke!

Antworten (1)

Das Problem hier ist, dass die beiden Transaktionen unterschiedlich sind und combinerawtransactionnicht mit unterschiedlichen Transaktionen arbeiten (es tut anscheinend nur stillschweigend nichts). Es hört sich so an, als würden Sie erwarten combinerawtransaction, zwei separate Transaktionen zu nehmen und eine neue zu erstellen, die die Eingaben und Ausgaben beider Transaktionen enthält. (oder nehmen Sie vielleicht zwei Transaktionen mit denselben Ausgaben, aber unterschiedlichen Eingaben, und erzeugen Sie eine Transaktion mit den kombinierten Eingaben und denselben Ausgaben). Das tut es aber nicht. Stattdessen nimmt es tatsächlich dieselbe Transaktion (dh dieselben Eingaben und Ausgaben) und führt die Signaturen für dieselben Eingaben zusammen.

Es ist nicht möglich, das zu tun, was Sie wollen, da sich die Signaturen auf die jeweiligen Eingaben und Ausgaben dieser Transaktion festlegen. Sobald Sie versuchen, eine Transaktion mit einer anderen zu verbinden, werden diese Signaturen ungültig und die gesamte Transaktion müsste neu signiert werden.

Danke für deine Antwort! Tut mir leid, wenn ich dumme, offensichtliche Fragen stelle, aber ich lerne, wie man Rohtransaktionen erstellt und handhabt. Dank Ihrer Erklärung verstehe ich jetzt, dass die Funktion Signaturen zusammenführt, die sie ungültig machen. Meine Absicht ist es, den Multisig-Prozess zwischen verschiedenen Parteien zu vereinfachen. Wenn Sie mehrere Multisig-Transaktionen signieren müssen, möchte ich, dass Sie mehrere Transaktionen gleichzeitig signieren können (damit Sie nicht eine Transaktion signieren und übertragen müssen, indem Sie die Prozess für alle Ihre Transaktionen). Ist das möglich? Vielleicht mit createpsbtund combinepsbt?
Oder sollte ich den gesamten obigen Prozess wiederholen, aber alle Eingaben und Ausgaben in derselben Transaktion enthalten?
Sie müssen alle Eingaben und Ausgaben in dieselbe Transaktion einbeziehen, wenn Sie sie erstellen.
OK danke! Es hat funktioniert, alle Eingaben und Ausgaben in einer Transaktion zu kombinieren!