¿Cómo saber en qué cuenta está una salida no gastada?

Cuando voy a enviar monedas, quiero que la transacción ignore las monedas no gastadas en una cuenta determinada.

Creo que puedo hacer esto en wallet.cpp, pero no estoy seguro de cómo hacerlo.

¿Quizás en la función AvailableCoins()? ¿Hacer que continúe si las monedas están en esta cuenta? Supongo que necesito crear una función como:

bool isInAccount(string strAccountName, CWalletTx *wtx)

¿Cómo puedo hacer esto?

Respuestas (2)

Su pregunta se basa en un malentendido del sistema de cuentas. Sin embargo, es un malentendido muy común.

Los productos no gastados no están asociados con cuentas.

Las transacciones entrantes acreditan el saldo de la cuenta asociada a la dirección con la que se recibe la transacción. Pero las cuentas solo tienen un saldo: no son "dueñas" de las monedas que se les envían. Los saldos de las cuentas pueden volverse negativos y se pueden modificar a través del movecomando, sin cambiar las monedas.

Las salidas no gastadas pertenecen a la billetera como un todo, y las cuentas solo hacen un seguimiento de quién/qué posee qué cantidad de ellas, no cuáles específicamente. Es como tener una billetera con dinero que te pertenece a ti y a un amigo. Realiza un seguimiento de cuánto le debe a su amigo, pero no realiza un seguimiento de qué billetes o monedas específicos en la billetera le pertenecen.

Para hacer lo que desea, debe usar billeteras separadas (que mantienen las monedas por separado por completo), o usar el control de monedas o la API de transacciones sin procesar, que le permiten especificar manualmente qué monedas usar.

Pieter, ¿no sería mejor si la función de cuentas funcionara de esta manera, asociando los UTXO con cuentas específicas y luego gastando solo de los UTXO de una cuenta? Si no se especifica ninguna cuenta, entonces el software podría tomar eso como un gasto de los UTXO de cualquiera o todas las cuentas. Parece que así es como la mayoría de la gente espera/quiere que funcione. ¿Quizás el problema de hacer esto es la compatibilidad con versiones anteriores?
Ese es un modelo completamente diferente, y no, eso no sucederá. Es probable que la función de cuentas quede obsoleta y se elimine en algún momento en el futuro.
Lo que estás describiendo suena como tener soporte para múltiples billeteras. Nadie está en desacuerdo con eso, pero sin que las personas desarrollen activamente la implementación de la billetera Bitcoin Core, eso llevará un tiempo.

¿Estás buscando poder hacer esto con el demonio de bitcoin? Podrías revisar el

obtener cuenta
llamada RPC. La ayuda para este método es:

obtener cuenta "dirección bitcoin"

Devuelve la cuenta asociada a la dirección dada.

Argumentos: 1. "bitcoinaddress" (cadena, requerida) La dirección de bitcoin para la búsqueda de cuenta.

Resultado: "nombre de cuenta" (cadena) la dirección de la cuenta

Ejemplos:
> bitcoin-cli obtener cuenta "1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ"
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "método": "getaccount", "params": ["1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ"] }' -H 'tipo de contenido: texto/sin formato;' http://localhost:8332/
Sé que esto es para una dirección determinada y que está buscando un vout en particular, pero supongo que los dos probablemente correspondan en su caso.
No, quiero hacer esto desde el propio núcleo de Bitcoin. Digamos que tengo una cuenta llamada 'reservada'. Cada vez que envío monedas, no quiero que se utilicen monedas de la cuenta 'reservada'. Es posible que tenga 1 o 100 direcciones en 'reservadas', pero nunca quiero que las monedas recibidas no gastadas en esa cuenta se usen cuando envíe monedas.