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 combinerawtransaction
ist 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:
$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
Sobald ich beide Multisig-Adressen erstellt habe, sende ich etwas Geld an beide Multisig-Adressen. Sie können beide txids überprüfen: 0a582a19ab45409ad90796fc441c29129f1d429e155612a66aeed47320cf054a
und 071d12f061a3ba38eb56c8e4efdb77f66194bc699e240a89868b0f98a8719e41
(jeweils). Um beide Adressen zu finanzieren, habe ich gerade ein Testnet-Konto mit Elektron eröffnet und etwas BTC-Testnet ausgegeben.
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
Das Problem hier ist, dass die beiden Transaktionen unterschiedlich sind und combinerawtransaction
nicht 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.
createpsbt
und combinepsbt
?
Benutzer103136
Kevin Gravell
Kevin Gravell