¿Cómo maneja bitcoind las transacciones fuera de la cadena?

Estoy tratando de averiguar cómo bitcoind realmente maneja las transacciones.

Estoy mirando la lista completa de métodos RPC y falta documentación para algunos de los métodos más interesantes.

moverse

Sé que hay dos métodos para mover bitcoins entre direcciones, ya sea mediante una transacción p2p directa o mediante la llamada transacción fuera de la cadena . Si creo correctamente, la billetera integrada de bitcoind nos permite enviar transacciones fuera de la cadena a través del método de movimiento . Lamentablemente, no está muy bien documentado, pero quiero saber exactamente cómo funciona.

Aquí está la documentación para ello:

move <fromaccount> <toaccount> <amount> [minconf=1] [comment]

Move from one account in your wallet to another
  1. Entonces, si la cuenta A tiene un BTC y la cuenta B tiene cero. ¿Qué sucederá si primero muevo un BTC de A a B usando una transacción fuera de la cadena y luego emito una transacción directa de 1 BTC de B a C?

  2. Además, ¿ minconfpara qué parámetro es? Según tengo entendido, las transacciones fuera de la cadena no requieren confirmaciones.

Enviado desde

Aquí está la documentación para el método sendfrom :

sendfrom <fromaccount> <tobitcoinaddress> <amount> [minconf=1] [comment] [comment-to]

<amount> is a real and is rounded to 8 decimal places. Will send the given amount to the given address, ensuring the account has a valid balance using [minconf] confirmations. Returns the transaction ID if successful (not in JSON object).

Requiere una cuenta para enviar bitcoins.

  1. ¿Qué sucede si tengo varias direcciones/transacciones para la cuenta especificada? ¿Qué estrategia usa bitcoind para determinar desde qué direcciones hacer una transacción y cuántos bitcoins usar de cada una?

  2. ¿ minconfPara qué parámetro es?

enviaradirección

sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]

<amount> is a real and is rounded to 8 decimal places. Returns the transaction ID <txid> if successful.
  1. La cuenta no está especificada para esta llamada. ¿Qué cuenta usará bitcoind? ¿El predeterminado?

  2. ¿Por qué no hay ningún minconfparámetro para éste?

Muchas páginas de la wiki están desactualizadas, es posible que desee consultar también la Referencia para desarrolladores de Bitcoin . Esta página wiki está obsoleta, pero explica la funcionalidad de las cuentas de Bitcoin Core . Como Shabahat M. Ayubi explicó a continuación, la función de cuentas en Bitcoin Core está obsoleta.

Respuestas (2)

En primer lugar, hay muchos tipos de transacciones fuera de la cadena. Cualquier movimiento de valor en BTC que no corresponda directamente a una transacción de blockchain puede clasificarse como tal. Esto incluye:

  1. darle a alguien una computadora/teléfono que tenga una billetera con BTC
  2. darle a alguien una clave privada/bitcoin físico.
  3. dar acceso a alguien a una cuenta webwallet compartida
  4. enviar dinero de una cuenta a otra dentro del mismo servicio (que simplemente disminuye el saldo de una persona e incrementa el saldo de otra)
  5. canales de pago, incluido Lightning, que negocian una pequeña cantidad de transacciones que corresponden al efecto neto de muchas más transferencias de valor.

El movecomando en bitcoind no da como resultado una transacción fuera de la cadena; simplemente incrementa un contador interno y decrementa otro. Seguro que está fuera de la cadena, pero es difícil llamarlo una transacción. Todo lo que ha hecho es cambiar la forma en que cuenta el dinero sobre el que ya tiene control.

Un servicio (como el n.° 4 anterior) podría usar potencialmente el comando de movimiento de bitcoind para implementar un sistema de transacciones (simple) fuera de la cadena. Pero al menos requiere tener una configuración en la que varias personas tengan cuentas en su sistema y lo traten como un custodio de su dinero.

En cuanto a las preguntas que haces:

  1. Las cuentas son un concepto completamente independiente de las direcciones. Desde la perspectiva de bitcoind, no existe tal cosa como un saldo de direcciones. Está el saldo de la billetera (cuántas monedas controla la billetera en total) y los saldos de las cuentas (que son simplemente contadores internos de frijoles, sin relación con nada en la cadena de bloques). Cuando una nueva transacción envía M dinero a la dirección A, y la dirección A está asociada con la cuenta C, el saldo de la billetera aumenta M y el saldo de la cuenta C aumenta. Cuando envía dinero con sendfrom, se debita la cuenta nombrada. Pero la transacción en cadena real creada siempre usa cualquier moneda sobre la que la billetera tenga control. Nuevamente: no existe una relación entre las monedas en cadena (salidas de transacciones) y los saldos de las cuentas.

  2. El comando de movimiento solía hacer una verificación de saldo en la cuenta a debitar y fallaba si no tenía suficientes transacciones contando solo con al menos minconfconfirmaciones. Esta funcionalidad se eliminó hace mucho tiempo y ahora se ignora el parámetro minconf.

  3. Bitcoind trata a toda la billetera como si fuera dueña de las monedas, y usará las monedas disponibles para cualquier transacción que cree. No hay relación entre monedas y cuentas. sendfromsimplemente le permite especificar qué saldo de cuenta disminuir.

  4. sendfromrealiza una verificación de saldo en la cuenta debitada y fallará si hace que el saldo de la cuenta sea negativo, contando solo las transacciones de crédito con al menos minconfconfirmaciones. Esta característica no es muy confiable, ya que las tarifas pueden hacer que la cuenta se vuelva negativa a pesar de la verificación de saldo anterior.

  5. sendtoaddresssiempre debita la cuenta "" y no realiza una verificación de saldo, por lo que el saldo de la cuenta "" puede volverse negativo (siempre que el saldo de la billetera, la suma de los saldos de la cuenta, sea positivo). Nuevamente: de ninguna manera restringe qué monedas se usan para construir la transacción.

  6. Debido a sendtoaddressque no realiza una verificación de saldo, no hay forma de que un minconfparámetro tenga un efecto. Normalmente, todas las monedas con 1 confirmación (si provienen de otras billeteras) o 0 confirmación (si provienen de usted mismo) son gastables, aunque, por ejemplo, la spendzeroconfchangeconfiguración modifica esto).

Como ya se señaló, el sistema de saldo de cuenta y el comando de movimiento están en desuso porque son muy difíciles de entender y usar correctamente. Si necesita contabilidad, impleméntela usted mismo en la parte superior.

Gracias Pieter por una respuesta elaborada. Esto realmente me aclaró las cosas ahora. Además, hemos decidido implementar nuestro propio sistema de contabilidad y tratar la billetera Bitcoin como una única cuenta compartida para todos los clientes, como sugirió en la última oración.

Una transacción fuera de la cadena significa en términos simples que las partes involucradas en la transacción básicamente intercambian sus claves privadas. Digamos que quieres pagarle a tu amigo 1 BTC. Simplemente daría la clave privada a su dirección que contiene el 1BTC. Ir a través de este enlace para más detalles. Ahora yendo a sus preguntas.

  1. En primer lugar, tenga en cuenta que las cuentas y la moveAPI han quedado obsoletas y ya no se utilizan. Solo por el bien de la explicación, las cuentas no son más que un conjunto de direcciones en su billetera bitcoind. Ahora, el comando mover en realidad transfiere el BTC de las direcciones de una cuenta a la otra. No hay forma de que pueda convencer al cliente de bitcoind para que comparta la clave privada y no mueva los fondos (porque ya tiene todas las claves privadas). Así que el escenario que has dado no tiene sentido.

  2. El minconf es para que el cliente sepa usar solo aquellas salidas de transacciones que tienen tantas confirmaciones mínimas como usted haya proporcionado.

  3. sendfrom también está en desuso ya que las cuentas están en desuso. Lo que hace la billetera bitcoind es que combina los fondos en todas sus direcciones para enviar el dinero a la dirección especificada (si el valor que desea enviar no está disponible en una sola dirección)

  4. igual que el punto 2

  5. Como dije, las cuentas están obsoletas, por lo que usará la dirección que tenga más del valor especificado y, si no, combinará las direcciones para enviar el dinero a la dirección del destinatario.

  6. igual que el punto 2

Editar: Punto 1: el comando de movimiento simplemente disminuye el saldo virtual interno virtual de una cuenta, e incrementa otro y no mueve los BTC. Corregido por Peter Wuille

Gracias por su respuesta. Me aclara un poco esto. Además, ¿cómo sé qué funciones o llamadas API están en desuso o no? Parece que la documentación es pobre y muy desactualizada.
A través de la terminal, intente escribir la api sin los parámetros que requiere, por ejemplo, simplemente escriba mover y lea el resultado, verá que está escrito que está en desuso, pero aún se puede usar.
El comando mover no mueve fondos de una dirección a otra. Simplemente disminuye un saldo virtual interno e incrementa otro. Las cuentas no son direcciones. De hecho, están programados para eliminarse en una versión futura (en parte porque son muy difíciles de entender).