Usando, por ejemplo, la línea de comando de Bitcoin Core, ¿cómo podría gastar bitcoins de múltiples billeteras en una sola transacción?
Este comentario dice:
en lugar de enviar la transacción a la red, se la envía a la siguiente persona que agregará sus entradas y salidas y también las firmará, y así sucesivamente. La última persona luego transmitiría la transacción en la red.
Supongo que uso createrawtransaction
y signrawtransaction
de alguna manera, pero ¿cómo hago exactamente esto?
cf. Mastering Bitcoin (1st ed.), §"Uso de la API JSON-RPC de Bitcoin Core desde la línea de comandos" , §§"Creación, firma y envío de transacciones basadas en salidas no gastadas"
Actualmente hay tres formas diferentes de hacer esto: transacciones sin procesar, PSBT en 0.17 y PSBT en 0.18. Le recomiendo que use PSBT en 0.18, ya que es lo menos complicado, pero describiré los tres aquí para usted.
Tradicionalmente, haría esto con createrawtransaction
, fundrawtransaction
y signrawtransactionwithkey
/ signrawtransactionwithwallet
. Una persona tendría que conocer todas las entradas que se usaron en la transacción o tenerlas todas almacenadas en su billetera (es decir, han importado las claves públicas y/o los scripts redimidos de todos los demás en su billetera) y luego pueden usar createrawtransaction
o fundrawtransaction
para crear la transacción sin procesar.
createrawtransaction
solo toma entradas y salidas especificadas por el usuario y proporciona la transacción resultante tal cual (por lo que debe tener cuidado con las tarifas y el cambio). fundrawtransaction
puede elegir las entradas que usará para usted usando su billetera y manejará las tarifas y cambiará las salidas por sí mismo. Sin embargo fundrawtransaction
, necesita conocer toda la información necesaria para construir la transacción final (excepto la clave privada, puede usar una firma ficticia) para estimar correctamente las tarifas de la transacción, razón por la cual necesita importar las claves públicas y los scripts. en tu billetera.
Una vez que tenga la transacción sin procesar, la envía a cada una de las otras personas involucradas en la transacción. Luego lo firman usando signrawtransactionwithwallet
(si las claves y los scripts están en su billetera) o signrawtransactionwithkey
(si sus claves y scripts no están en su billetera). La mayoría de la gente usará signrawtransactionwithwallet
. Luego, le envían el resultado donde debe combinar todas las transacciones firmadas en la transacción final usando combinerawtransaction
. Entonces puedes transmitirlo con sendrawtransaction
.
En lugar de enviar las transacciones a todos para que las firmen al mismo tiempo, puede enviarlas a una persona que firma, que luego las envía a la siguiente persona y así sucesivamente. Esto no requeriría combinerawtransaction
. La última persona firmaría y luego usaría sendrawtransaction
para transmitir.
Este proceso es un poco voluminoso y requiere que una persona conozca parte (o toda) de la información de las entradas que se utilizan (excepto las claves privadas).
Desde Bitcoin Core 0.17, puede usar varios *psbt
RPC para lograr lo mismo. Con 0.17, el flujo es bastante similar al flujo de transacción sin procesar descrito anteriormente. Debería tener toda la información para crear la transacción final en su billetera (excepto las claves privadas) para que la estimación de la tarifa se pueda realizar correctamente para la selección de monedas, o necesita saber qué entradas usar. De cualquier manera, usa walletcreatefundedpsbt
y especifica las entradas que desea y las salidas que desea. Bitcoin Core luego elegirá automáticamente entradas adicionales si no hay suficientes para cubrir la cantidad de salida y creará una salida de cambio para usted. Debido a que también necesita convertir las tarifas de transacción, debe tener la misma información que usted necesita para fundrawtransaction
poder estimar las tarifas de las entradas que elige.
Luego, enviaría la transacción a todos los demás que agregarían sus firmas (y otros metadatos) usando walletprocesspsbt
. También puede hacerlo walletprocesspsbt
primero antes de enviar la transacción a todos para que se agreguen de antemano varios metadatos necesarios para la firma (como el UTXO que se gasta para cada entrada). Una vez firmado, todos le enviarán la transacción y usted los combinará usando combinepsbts
. Luego, cree la transacción final para transmitir usando finalizepsbt
y envíe el resultado usandosendrawtransaction.
Por supuesto, al usar PSBT puede hacer lo mismo descrito anteriormente, donde cada persona envía la transacción a la siguiente persona para que la firme en lugar de enviársela a usted para que la combine.
Una vez más, este proceso es un poco voluminoso y requiere que una persona conozca parte (o toda) de la información de las entradas que se utilizan (excepto las claves privadas). Pero es un poco menos probable que produzca un error que el método de transacción sin procesar. Los PSBT también le permiten usar otras billeteras que no sean Bitcoin Core que admitan PSBT, y puede usar este método con billeteras que no están conectadas a Internet o que no tienen la cadena de bloques o los UTXO que se gastan en la transacción.
Sin embargo, Bitcoin Core 0.18 en realidad hace que todo este proceso sea mucho más fácil. Bitcoin Core 0.18 presenta un par de *psbt
RPC nuevos que hacen que una persona no necesite conocer todas las entradas que se utilizan y toda la información de cada entrada. La única advertencia es que este método asume que cada persona tiene sus propios resultados que desea crear en lugar de que varias personas reúnan sus Bitcoin para crear un resultado grande.
Con 0.18, todos crearían su propio PSBT usando walletcreatefundedpsbt
. Especifican cualquiera de sus propias entradas que quieren usar y todas sus salidas. Cualquier salida de cambio se agregará, y se agregarán entradas adicionales de la billetera para cubrir el monto de salida y la tarifa de transacción si el usuario no especificó lo suficiente. Dado que cada usuario hace esto con su propia billetera, nadie necesita saber nada sobre lo que los otros usuarios tienen en sus billeteras.
Luego, cada persona enviaría el PSBT a un coordinador designado que suele joinpsbts
unir cada PSBT en un PSBT grande. Este PSBT tendrá todas las entradas y salidas que cada persona quiera gastar y crear. Entonces, en lugar de tener muchos PSBT individuales con sus propias entradas y salidas, ahora hay un gran PSBT con las entradas y salidas de todos.
Este PSBT luego se envía de vuelta a cada persona que lo usa walletprocesspsbt
para actualizar el PSBT y agregar su información de entrada al PSBT y lo firma. Incluso si un usuario tiene una configuración de airgapped donde sus claves privadas están en algún lugar que no tiene acceso a la cadena de bloques, puede actualizar el PSBT desde una billetera solo de visualización en línea y enviar el PSBT a la máquina fuera de línea para que se firme.
Una vez que todos han firmado el PSBT, se envía de regreso al coordinador que usa combinepsbt
para combinar todas las firmas y la información de entrada en el mismo PSBT, luego crea la transacción de red final usando finalizepsbt
y la transmite usando sendrawtransaction
.
Nuevamente, esto se puede hacer en serie como los otros métodos descritos anteriormente y, por lo tanto, omitir la necesidad de combinepsbt
.
No he verificado el comando Bitcoin-core cuando se trata de Retirar todos los saldos de todas las billeteras en una sola transacción, pero sé cuál es la estructura y el flujo, supongo que es el mismo (ESTA NO ES LA RESPUESTA, ESTO ES SÓLO UN FLUJO LÓGICO):
/api/v2/withdraw_from_addresses/?api_key=API KEY&from_addresses=ADDRESS1,ADDRESS2,...&to_addresses=ADDRESS1,ADDRESS2,...&amounts=AMOUNT1,AMOUNT2,...&pin=SECRET PIN
El código es de block.io
zylstra
Geremia