bitcoin-cli getbalance unterscheidet sich von listunspent

Ich habe wahrscheinlich die Bedeutung des Bitcoin-Befehls „getbalance“ missverstanden.

Ich verwende Bitcoin im Regtest-Modus.

Ich verwende importierte Multisig-Bitcoin-Watch-only-Adressen, die die folgenden sind:

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

Im Ausgangszustand habe ich wie erwartet keine solche Transaktion: listtransactions mirko_180603243 10 0 true: [] listtransactions mirko_1169810029 10 0 true: [] listtransactions mirko_1977534765 10 0 true: []

Dann sende ich etwas Geld auf das erste Konto (mirko_180603243)

sendtoaddress 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p 10 "Initial load"
setgenerate true 6

Aus Sicht der Bilanz stimmt alles:

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
    }

Aus Sicht der Transaktionen ist alles stimmig:

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"
    }

Dann sende ich 3 BTC vom ersten Konto (mirko_180603243: 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p) zum zweiten (mirko_1169810029: 2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj). Da ich nur 10 BTC in einem Block habe, schicke ich 7 BTC an mich selbst zurück.

Dies ist die letzte Transaktion:

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"
                ]
            }
        }
    ]
}

Alles stimmt mit den nicht verbrauchten Blöcken überein:

{
    "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
}

Was ich nicht verstehe ist die Endbilanz:

getbalance mirko_180603243 1 true:
    17 instead of 7

getbalance mirko_1169810029 1 true:
    3

Grundsätzlich scheint es so zu sein, dass 'getbalance' alle eingehenden Transaktionen zusammenfasst und die ausgehenden ignoriert.

Derzeit berechne ich den verfügbaren Betrag, indem ich alle nicht ausgegebenen Blöcke für jedes Konto zusammenfasse. Leider ist das jedoch nicht sehr benutzerfreundlich, denn wenn Sie für 3 BTC bezahlen und einen einzelnen 10-BTC-Block haben, sehen Sie vor den Bestätigungen 0. Ich könnte auch die 0-Bestätigungstransaktionen einbeziehen, aber der Benutzer denkt vielleicht dass er dieses Geld ausgeben könnte, was falsch ist.

Sorry für die lange Nachricht.

PS Ich habe vergessen zu erwähnen, dass ich festgestellt habe, dass Konten NICHT zum Abbuchen verwendet werden: Wenn Sie bezahlen möchten, müssen Sie 'move' oder 'sendfrom' verwenden, aber ich möchte nur Watch-Only-Adressen haben, wie ich Ich möchte die privaten Schlüssel nicht behalten.

Aus diesem Grund kann ich mich nicht auf die Befehle „move“ oder „sendfrom“ verlassen, sondern muss meine Transaktion manuell erstellen und mehrfach signieren.

Das ist eine sehr gute Erklärung. github.com/bitcoin/bitcoin/issues/4572 Ich weiß jedoch nicht, wie ich das Guthaben berechnen soll ...

Antworten (1)

Von der Bitcoin-Wiki-Seite „Accounts Explained“ ( https://en.bitcoin.it/wiki/Accounts_explained ):

Wenn Sie Bitcoins erhalten, werden sie immer einem Ihrer Konten zugewiesen, und Sie können ändern, welches Konto gutgeschrieben wird, je nachdem, welche Bitcoin-Adresse die Münzen erhält, genau wie Sie einem Bankangestellten mitteilen, welches Konto gutgeschrieben werden soll, wenn Sie Bargeld bei Ihrer Bank einzahlen . Das Senden von Bitcoins ist jedoch wie das Abheben von Bargeld von der Bank; Die Coins, die verschickt und von einem Konto abgebucht werden, sind fast immer nicht die gleichen Coins, die auf dieses Konto eingezahlt wurden.

Sie können also nicht wirklich das tun, was Sie (unten) gesagt haben, nämlich von einem Konto zu einem anderen Konto senden. Sie können jedoch movemit dem Befehl Salden von einem Konto auf ein anderes Konto überweisen, movedies erfordert jedoch keine Bitcoin-Transaktion.

Dann sende ich 3 BTC vom ersten Konto (mirko_180603243: 2MvaEkzFyw6EcQGR2vrFWQd4rDNSiP4Qn7p) zum zweiten (mirko_1169810029: 2N1DwxUDghdk2DRWee8PVLtcY9xxTM374Nj).

Ich denke, wenn du es tust:

./bitcoin-cli listaccounts

Sie werden einige Konten mit negativen Salden sehen, um den besonders hohen Saldo zu berücksichtigen, den Sie sehen.

Hinweis: Das "fromaccount" im sendfromBefehl teilt dem Client nur mit, welches Konto belastet werden soll, wenn er an die angegebene Adresse sendet.

Hallo Stefan, danke für deine Antwort. Sie haben Recht, ich habe mich nicht sehr klar ausgedrückt: Wenn ich sage, dass ich 3 BTC vom ersten Konto zum zweiten sende, meine ich, dass ich eine Rohtransaktion erstelle, sie mehrfach signiere und schließlich einreiche. Dieser TX hat ein p2ph-Skript, das der Multisig-Adresse des zweiten Kontos entspricht. Alles in allem möchte ich das Gleichgewicht finden, ohne die RPC-Methode „getbalance“ zu verwenden. Danke nochmal für deine Hilfe.