bitcoin-cli getbalance diferente de listunspent

Probablemente he entendido mal el significado del comando bitcoind 'getbalance'.

Estoy usando bitcoind en modo de registro.

Estoy usando direcciones de solo reloj de bitcoin multisig importadas, que son las siguientes:

mirko_180603243: 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p
mirko_1169810029: 2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj
mirko_1977534765: 2NANSy3VqQZmhQH36tNADVxEahLHJzQovdz

En el estado inicial no tengo tal transacción, como se esperaba: listtransactions mirko_180603243 10 0 verdadero: [] listtransactions mirko_1169810029 10 0 verdadero: [] listtransactions mirko_1977534765 10 0 verdadero: []

Luego envío algo de dinero a la primera cuenta (mirko_180603243)

sendtoaddress 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p 10 "Initial load"
setgenerate true 6

Desde el punto de vista del equilibrio, todo está bien:

getbalance mirko_180603243 0 true: 10
listaccounts 1 true: "mirko_180603243" : 10.00000000

listunspent:
    {
        "txid" : "3c9970cda24b87ebf7080ff40d3be7cdded1afb6eafe3d9b7ade31f9c7fadc13",
        "vout" : 0,
        "address" : "2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p",
        "account" : "mirko_180603243",
        "scriptPubKey" : "a9142480ec8ccaea0328c6392c2ba4a4cd6fb0f6638b87",
        "amount" : 10.00000000,
        "confirmations" : 6,
        "spendable" : false
    }

Desde el punto de vista de las transacciones, todo es consistente:

listtransactions "mirko_180603243" 10 0 true: 
    {
        "involvesWatchonly" : true,
        "account" : "mirko_180603243",
        "address" : "2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p",
        "category" : "receive",
        "amount" : 10.00000000,
        "vout" : 0,
        "confirmations" : 12,
        "blockhash" : "0000a083a8b0543d68059d9c3421b4ff681630601e80c3f4d4e58a05e228385d",
        "blockindex" : 1,
        "blocktime" : 1414401010,
        "txid" : "3c9970cda24b87ebf7080ff40d3be7cdded1afb6eafe3d9b7ade31f9c7fadc13",
        "walletconflicts" : [
    ],
        "time" : 1414400968,
        "timereceived" : 1414400968,
        "comment" : "Initial load"
    }

Luego envío 3 BTC de la primera cuenta (mirko_180603243: 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p) a la segunda (mirko_1169810029: 2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj). Como solo tengo 10 BTC en un bloque, me devuelvo 7 BTC.

Esta es la transacción final:

gettransaction 153c45f199eba376d43cad614c2cd410140d2c9597b0de8392fa71209f6e43a5
{
    "amount" : 10.00000000,
    "confirmations" : 6,
    "blockhash" : "0000da6254c04d050c93bb9949a5fdaec9256038edce3daa9798d2e0feca8199",
    "blockindex" : 1,
    "blocktime" : 1414401566,
    "txid" : "153c45f199eba376d43cad614c2cd410140d2c9597b0de8392fa71209f6e43a5",
    "walletconflicts" : [
],
    "time" : 1414401480,
    "timereceived" : 1414401480,
    "details" : [
],
    "hex" : "010000000113dcfac7f931de7a9b3dfeeab6afd1decde73b0df40f08f7eb874ba2cd70993c00000000fa0047304402205bb11653b7668488cf60a61c458bc729619b395d7b5d82c597d223956c0dc62d0220396fef209b3077b129648797ba72b9da0be94334dcebf067d1d5e31bb26ecf4a014730440220203dcdd4169db7c1259c14c7fe8ed0eb449b3f26a2732cbba3713779034afd9d022020c85a7ec67a8aaad642ff96b63b0c98ff9dedb35a68c3dfddd296ee7db08ac1014c67522102a880b200040eb0f4e3984263ce3fb86b39cb5ba4c9ea247bb2c4de4d36eec4ff4104abc0c6d83b138ff68b60ee11b5deb98da1bd4fe9d4894fe1041e436f5cebfb7be7cf886f15ea34a746302700008c88c1257b2f37128d764bc922940b2e01038752aeffffffff0200a3e1110000000017a914578335446ee73c6379c7cef95c4fc8c3c576e3a0870027b9290000000017a9142480ec8ccaea0328c6392c2ba4a4cd6fb0f6638b8700000000"
}

decoderawtransaction 010000000113dcfac...cd6fb0f6638b8700000000
{
    "txid" : "153c45f199eba376d43cad614c2cd410140d2c9597b0de8392fa71209f6e43a5",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "3c9970cda24b87ebf7080ff40d3be7cdded1afb6eafe3d9b7ade31f9c7fadc13",
            "vout" : 0,
            "scriptSig" : {
                "asm" : "0 304402205bb11653b7668488cf60a61c458bc729619b395d7b5d82c597d223956c0dc62d0220396fef209b3077b129648797ba72b9da0be94334dcebf067d1d5e31bb26ecf4a01 30440220203dcdd4169db7c1259c14c7fe8ed0eb449b3f26a2732cbba3713779034afd9d022020c85a7ec67a8aaad642ff96b63b0c98ff9dedb35a68c3dfddd296ee7db08ac101 522102a880b200040eb0f4e3984263ce3fb86b39cb5ba4c9ea247bb2c4de4d36eec4ff4104abc0c6d83b138ff68b60ee11b5deb98da1bd4fe9d4894fe1041e436f5cebfb7be7cf886f15ea34a746302700008c88c1257b2f37128d764bc922940b2e01038752ae",
                "hex" : "0047304402205bb11653b7668488cf60a61c458bc729619b395d7b5d82c597d223956c0dc62d0220396fef209b3077b129648797ba72b9da0be94334dcebf067d1d5e31bb26ecf4a014730440220203dcdd4169db7c1259c14c7fe8ed0eb449b3f26a2732cbba3713779034afd9d022020c85a7ec67a8aaad642ff96b63b0c98ff9dedb35a68c3dfddd296ee7db08ac1014c67522102a880b200040eb0f4e3984263ce3fb86b39cb5ba4c9ea247bb2c4de4d36eec4ff4104abc0c6d83b138ff68b60ee11b5deb98da1bd4fe9d4894fe1041e436f5cebfb7be7cf886f15ea34a746302700008c88c1257b2f37128d764bc922940b2e01038752ae"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 3.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_HASH160 578335446ee73c6379c7cef95c4fc8c3c576e3a0 OP_EQUAL",
                "hex" : "a914578335446ee73c6379c7cef95c4fc8c3c576e3a087",
                "reqSigs" : 1,
                "type" : "scripthash",
                "addresses" : [
                    "2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj"
                ]
            }
        },
        {
            "value" : 7.00000000,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_HASH160 2480ec8ccaea0328c6392c2ba4a4cd6fb0f6638b OP_EQUAL",
                "hex" : "a9142480ec8ccaea0328c6392c2ba4a4cd6fb0f6638b87",
                "reqSigs" : 1,
                "type" : "scripthash",
                "addresses" : [
                    "2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p"
                ]
            }
        }
    ]
}

Todo es consistente con los bloques no gastados:

{
    "txid" : "153c45f199eba376d43cad614c2cd410140d2c9597b0de8392fa71209f6e43a5",
    "vout" : 1,
    "address" : "2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p",
    "account" : "mirko_180603243",
    "scriptPubKey" : "a9142480ec8ccaea0328c6392c2ba4a4cd6fb0f6638b87",
    "amount" : 7.00000000,
    "confirmations" : 6,
    "spendable" : false
}
{
    "txid" : "153c45f199eba376d43cad614c2cd410140d2c9597b0de8392fa71209f6e43a5",
    "vout" : 0,
    "address" : "2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj",
    "account" : "mirko_1169810029",
    "scriptPubKey" : "a914578335446ee73c6379c7cef95c4fc8c3c576e3a087",
    "amount" : 3.00000000,
    "confirmations" : 6,
    "spendable" : false
}

Lo que no logro entender es el balance final:

getbalance mirko_180603243 1 true:
    17 instead of 7

getbalance mirko_1169810029 1 true:
    3

Básicamente, parece ser que 'getbalance' suma todas las transacciones entrantes, ignorando las que salen.

Actualmente, estoy calculando la cantidad disponible sumando todos los bloques no gastados para cada cuenta. Sin embargo, desafortunadamente, eso no es muy fácil de usar, ya que cuando paga 3 BTC y tiene un solo bloque de 10 BTC, antes de las confirmaciones ve 0. También podría incluir las transacciones de 0 confirmaciones, pero el usuario puede pensar que podía gastar ese dinero, lo cual es falso.

Perdón por el mensaje largo.

PD: Olvidé mencionar que descubrí que las cuentas NO se usan para débito: si desea pagar, debe usar 'mover' o 'enviar desde', pero solo quiero tener direcciones de solo reloj, como yo no desea conservar las claves privadas.

Por esta razón, no puedo confiar en los comandos 'mover' o 'enviar desde', sino que tengo que crear manualmente y firmar varias veces mi transacción.

Esta es una muy buena explicación. github.com/bitcoin/bitcoin/issues/4572 Sin embargo, no sé cómo calcular el saldo...

Respuestas (1)

Desde la página wiki de bitcoin "Explicación de cuentas" ( https://en.bitcoin.it/wiki/Accounts_explained ):

Cuando recibe bitcoins, siempre se asignan a una de sus cuentas, y puede cambiar qué cuenta se acredita en función de qué dirección de bitcoin recibe las monedas, al igual que le dice a un cajero de banco en qué cuenta acreditar cuando deposita efectivo en su banco . Sin embargo, enviar bitcoins es como retirar efectivo del banco; las monedas que se envían y debitan de una cuenta casi siempre no son las mismas monedas que se depositaron en esa cuenta.

Entonces, realmente no puede hacer lo que dijo (a continuación), enviar desde una cuenta a otra cuenta. Sin embargo, puede transferir movesaldos de una cuenta a otra cuenta con el movecomando, pero esto no requiere una transacción de bitcoin.

Luego envío 3 BTC de la primera cuenta (mirko_180603243: 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p) a la segunda (mirko_1169810029: 2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj).

Creo que si lo haces:

./bitcoin-cli listaccounts

Verá algunas cuentas con saldos negativos para dar cuenta del saldo extra alto que está viendo.

Nota: "fromaccount" en el sendfromcomando solo le dice al cliente en qué cuenta debitar cuando envía a la dirección especificada.

Hola Esteban, gracias por tu respuesta. Tienes razón, no he sido muy claro: cuando digo que envío 3 BTC de la primera cuenta a la segunda, me refiero a que creo una transacción en bruto, la multifirmo y finalmente la envío. Ese tx tiene un script p2ph que corresponde a la dirección multisig de la segunda cuenta. Considerándolo todo, lo que me gustaría hacer sería encontrar el equilibrio sin usar el método rpc 'getbalance'. De nuevo, gracias por tu ayuda.