Tarifas de transacción y transacciones con bitcoin-cli. Saldo de la dirección de la billetera negativo

Estoy tratando de hacer un sitio web de bitcoin y traté de implementar una especie de botón de 'retirar' que le permitiría enviar su dinero en la dirección de la billetera a otra dirección. El problema al que me enfrento es que, después de la transacción, el saldo de la dirección es negativo.

Esta es la configuración:

  1. Hay bitcoind ejecutándose en segundo plano, así que tengo una billetera en el servidor. Tiene un nombre de cuenta predeterminado de ""(cadena vacía) con alguna dirección.
  2. Genero una nueva dirección para cada usuario en la billetera. Digamos que cada usuario obtiene su propia cuenta llamada "user_1", "user_2", etc. Genero direcciones básicamente haciendo bitcoin-cli getaccountaddress user_1.
  3. Los usuarios pueden depositar/retirar dinero a/desde esta dirección.
  4. Si retiro demasiado dinero de esta dirección, el saldo de la dirección será negativo y supongo que también está sacando monedas de la cuenta maestra, es decir, la ""cuenta.

Para las transferencias estoy usando el siguiente comando bitcoin-cli sendfrom user_1 <some_other_bitcoin_address> <amount> <min_confirmations> <comment> <comment_to>. Si realmente elijo más dinero del que está disponible en la billetera, aparecerá un error y me dirá que no tengo suficiente saldo. Pero en cierto caso extremo, pasa y hace que el saldo de la dirección sea negativo.

Me imagino que hay dos enfoques para esta solución:

Opción 1 : Calcule la tarifa de transacción precisa y, en función de esa tarifa, haga un cheque.

Opción 2 : Usar bitcoin-cli move "" "user_1" <amount_that_is_negative>para que parezca que el saldo no es realmente negativo y que el propietario del sitio ha decidido pagar la tarifa en exceso.

Básicamente, necesito resolver el problema del saldo negativo de la dirección y también podría aclarar lo siguiente:

  • ¿Cómo hacer #1? es decir, ¿cómo calcular el tamaño de la transacción (en bytes) + tarifa de transacción por adelantado?
  • El uso bitcoin-cli settxfee <amount>parece ser verdadero, pero la tarifa de transacción real que se me aplicó fue mucho más alta. ¿Por qué fue este el caso?
  • Necesito saber más detalles sobre cómo funciona el comando de movimiento. ¿La mudanza es una transacción real que incurrirá en tarifas de transacción?
  • ¿Es la opción 2 una buena opción para ocultar/resolver mi problema?
  • ¿Cuáles son otras opciones/implementación correcta para implementar un botón de retiro?
  • ¿Se puede sendfromsacar dinero de otras cuentas distintas a la ""cuenta?

¡Gracias!

La pregunta es un duplicado de bitcoin.stackexchange.com/questions/14260/… y, como se sugiere, "mover" es una buena manera de hacerlo.

Respuestas (1)

¿Cómo hacer #1? es decir, ¿cómo calcular el tamaño de la transacción (en bytes) + tarifa de transacción por adelantado?

Puede utilizar el fundrawtransactionRPC introducido recientemente:

  • Primero cree una transacción con solo las salidas que desea pero sin entradas, usando createrawtransaction.
  • Luego llámelo fundrawtransaction(que calculará la tarifa y agregará entradas y cambio).
  • Observe la tarifa y verifique el saldo de su usuario.
  • Si es aceptable, firme la transacción (usando signrawtransaction) y transmítala (usando sendrawtransaction).

El uso de bitcoin-cli settxfee parece volverse verdadero, pero la tarifa de transacción real que se me aplicó fue mucho más alta. ¿Por qué fue este el caso?

settxfeeestablece la tarifa por 1000 bytes, no el total. Si su transacción termina siendo mayor a 1000 bytes, la tarifa será más alta.

Necesito saber más detalles sobre cómo funciona el comando de movimiento. ¿La mudanza es una transacción real que incurrirá en tarifas de transacción?

Infórmese sobre cómo funciona el sistema de cuentas . No hay ninguna transacción involucrada, ya que los saldos de las cuentas son simplemente contadores de frijoles locales. Todas las monedas en su billetera se comparten en todas las cuentas. Los saldos de las cuentas solo hacen un seguimiento de cuántos de ellos pertenecen a quién (pero no qué monedas específicas pertenecen a quién). Move simplemente actualiza los saldos sin ninguna transacción en la red.

¿Es la opción 2 una buena opción para ocultar/resolver mi problema? ¿Cuáles son otras opciones/implementación correcta para implementar un botón de retiro?

No, porque el sistema de cuentas está obsoleto y se eliminará en una versión futura. La razón de esto es que es muy difícil de entender (¡como muestra esta pregunta!) y hace que las copias de seguridad sean casi imposibles (ya que la información de la cuenta para enviar desde no se puede recuperar de la cadena de bloques, restaurar una copia de seguridad de la billetera estropeará su contabilidad).

En su lugar, utilice el mecanismo de transacción de extracción de fondos descrito anteriormente e implemente los saldos de los usuarios en una capa de nivel superior (que, por ejemplo, almacena la información de la cuenta en una base de datos con las copias de seguridad adecuadas).

¿Sendfrom puede retirar dinero de otras cuentas que no sean la cuenta ""?

Por definición, no. Crea una transacción utilizando todas las monedas en la billetera completa para financiarla y luego resta la cantidad enviada más la tarifa de la cuenta especificada.