¿Cómo gasto bitcoins de varias billeteras en una sola transacción?

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 createrawtransactiony signrawtransactionde 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"

...O gaste bitcoins de múltiples billeteras en una sola transacción con cualquier herramienta.
@zylstra gracias. He generalizado mi pregunta.

Respuestas (2)

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, fundrawtransactiony 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 createrawtransactiono fundrawtransactionpara crear la transacción sin procesar.

createrawtransactionsolo 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). fundrawtransactionpuede 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 sendrawtransactionpara 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 *psbtRPC 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 walletcreatefundedpsbty 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 fundrawtransactionpoder 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 walletprocesspsbtprimero 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 finalizepsbty 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 *psbtRPC 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 joinpsbtsunir 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 walletprocesspsbtpara 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 combinepsbtpara combinar todas las firmas y la información de entrada en el mismo PSBT, luego crea la transacción de red final usando finalizepsbty 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