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.
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
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?
Además, ¿ minconf
para qué parámetro es? Según tengo entendido, las transacciones fuera de la cadena no requieren confirmaciones.
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.
¿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?
¿ minconf
Para qué parámetro es?
sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]
<amount> is a real and is rounded to 8 decimal places. Returns the transaction ID <txid> if successful.
La cuenta no está especificada para esta llamada. ¿Qué cuenta usará bitcoind? ¿El predeterminado?
¿Por qué no hay ningún minconf
parámetro para éste?
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:
El move
comando 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:
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.
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 minconf
confirmaciones. Esta funcionalidad se eliminó hace mucho tiempo y ahora se ignora el parámetro minconf.
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. sendfrom
simplemente le permite especificar qué saldo de cuenta disminuir.
sendfrom
realiza 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 minconf
confirmaciones. 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.
sendtoaddress
siempre 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.
Debido a sendtoaddress
que no realiza una verificación de saldo, no hay forma de que un minconf
pará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 spendzeroconfchange
configuració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.
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.
En primer lugar, tenga en cuenta que las cuentas y la move
API 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.
El minconf es para que el cliente sepa usar solo aquellas salidas de transacciones que tienen tantas confirmaciones mínimas como usted haya proporcionado.
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)
igual que el punto 2
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.
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
muro