Anhang A: Benutzung von bitcoin-cli

Dieser Anhang führt [run-your-own-full-node] weiter. Ich zeige dir, wie du ein Bitcoin Wallet aufsetzt, bitcoin empfängst und verschickst, und die Blockchain mit dem bitcoin-cli Kommandozeilen Tool erforschst.

Beachte, dass dieser Anhang bitcoin-cli nicht in grosser Tiefe behandelt. Er sollte nur als Quelle der Inspiration verstanden werden; er wird dich mit den Grundlagen ausstatten, damit du anfangen kannst. Ich ermuntere dich ausdrücklich, weiter herum zu forschen.

A.1. Kommunikation mit bitcoind

Wenn bitcoind startet, startet es auch einen Web Server, der defaultmässig auf TCP Port 8332 horcht. Wenn du bitcoin-cli benutzt, verbindet der sich an diesen Web Server schickt dein Kommando an ihn über HTTP, und zeigt dir relevante Teile der Antwort an.

Zum Beispiel angenommen, du willst die Block ID des Genesis Blocks (Block an Height 0) wissen, und schickst das folgende Kommando ab:

$ ./bitcoin-cli getblockhash 0

bitcoin-cli erzeugt einen HTTP POST Request mit dem Body

{"method":"getblockhash","params":[0],"id":1}

und schickt ihn an den Web Server, den bitcoind laufen lässt. Die method Property des Request-Inhalts ist das Kommando, das du ausführen willst, und das Argument 0 wird an den Web Server als Array mit einem einzelnen Element übergeben.

Der Web Server arbeitet den HTTP Request ab, indem er in der Blockchain den Block Hash nachschaut, und antwortet mit einer HTTP Antwort mit dem folgenden Body:

{"result":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f","error":null,"id":"1"}

bitcoin-cli zeigt dann den Wert der result Property auf dem Terminal an:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Dieser Body des HTTP Requests folgt einem Standard namens JSON-RPC, der beschreibt, wie ein Client Funktionen auf einem Remote Prozess mittels JavaScript Object Notation (JSON) aufrufen kann.

A.1.1. Benutzung von curl

Weil die Kommunikation mit bitcoind über HTTP geht, kann jedes Programm, das HTTP POST Requests schicken kann, wie das Kommandozeilen Tool curl, zum kommunizieren mit bitcoind benutzt werden. Aber um andere Tools als bitcoin-cli zu verwenden, musst du einen Usernamen und Passwort definieren, mit denen du dich gegenüber dem Web Server authentifizierst.

Mehr Parameter

Bitcoin Core bietet eine Menge Optionen. Gib ./bitcoind --help ein, um die vollständige Liste zu bekommen.

Stoppe den Node mit ./bitcoin-cli stop. Öffnen oder erstelle die Konfigurationsdatei ~ / .bitcoin / bitcoin.conf von Bitcoin Core, falls diese nicht vorhanden ist, und füge die folgenden Zeilen hinzu:

rpcuser=<a username that you select>
rpcpassword=<a password that you select>

Nachdem du die Datei ~/.bitcoin/bitcoin.conf geändert und abgespeichert hast, starte deinen Node wieder mit bitcoind -daemon, um die Änderungen wirksam zu machen.

So habe ich getblockhash mit curl aufgerufen (Das Backslash \ Zeichen bedeutet, die Kommandozeile setzt sich auf der nächsten Zeile fort):

curl --user kalle --data-binary \
    '{"method":"getblockhash","params":[0],"id":1}' \
    -H 'content-type: text/plain;' http://127.0.0.1:8332/
Enter host password for user 'kalle':
{"result":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f","error":null,"id":1}

Denk daran, den Usernamen von kalle auf den Usernamen zu ändern, den du in bitcoind.conf konfiguriert hast.

Das Kommando fordert zur Eingabe des Passworts auf. Gib das Passwort ein und drücke Enter. Die Antwort vom Webserver ist dieselbe wie bei Verwendung von "bitcoin-cli", du musst jedoch den Antworttext durchsuchen, um das Ergebnis zu erkennen, bei dem es sich um den Hash von Block 0 handelt.

A.2. Graphisches User Interface

Bitcoin Core kommt mit einem grafischen User Interface (GUI). Dieser Anhang beschäftigt sich hauptsächlich mit dem Kommandozeilen-Interface bitcoin-cli zur Kontrolle und Abfrage deines laufenden bitcoind. Aber wenn du Bitcoin Core als Bitcoin Wallet benutzen willst (und nicht nur als Full Node), dann kann es nützlich sein, sich mit dem GUI vertraut zu machen. Die GUI Version von Bitcoin Core lässt dich die meisten gängigen Aufgaben erledigen, die von einem Bitcoin Wallet erwartet werden, aber um den vollen Satz an Features von Bitcoin Core zu benutzen, musst du bitcoin-cli verwenden.

Um die GUI Version von Bitcoin Core zu benutzen, musst du den laufenden Node stoppen und die GUI Version starten, die bitcoin-qt heisst.

Warum -qt?

Das Bitcoin Core GUI wurde mit einer GUI Programmierbibliothek geschrieben, die QT heisst. Daher der Name bitcoin-qt.

$ ./bitcoin-cli stop
Bitcoin server stopping
$ ./bitcoin-qt &

Wenn bitcoind nicht genügend Zeit zum Herunterfahren hatte, bevor du bitcoin-qt gestartet hast, bekommst du eine Fehlermeldung von bitcoin-qt. In diesem Fall, klicke auf OK und versuche es damit, ./bitcoin-qt & in ein paar Sekunden nochmal zu starten.

bitcoin-qt benutzt dasselbe Datenverzeichnis, ~/.bitcoin/, wie bitcoind, was bedeutet, bitcoin-qt wird die bereits heruntergeladene und verifizierte Blockchain und dasselbe Wallet wie bitcoind benutzen. Es ist nur das User Interface, das anders ist.

Per Default wird bitcoin-qt den Web Server zum Akzeptieren von JSON-RPC Requests nicht starten, so wie bitcoind das tut. Um bitcoin-cli zu verwenden, starte bitcoin-qt stattdessen wie folgt:

$ ./bitcoin-qt -server &

A.3. bitcoin-cli kennenlernen

Du hast Bitcoin Core im Hintergrund gestartet, indem du eingegeben hast

 $ ./bitcoind -daemon

Das wichtigste Kommando, das man kennen muss, ist das help Kommando. Starte es ohne Argumente, um eine Liste aller möglichen Kommandos zu bekommen:

$ ./bitcoin-cli help

Dir wird eine lange Liste von Kommandos angezeigt, die nach Thema gruppiert sind–zum Beispiel Blockchain, Mining und Wallet. Einige Kommandos sind selbsterklärend, aber wenn du mehr über ein bestimmtes Kommando wissen willst, kannst du help mit dem Kommandonamen als Argument eingeben, zum Beispiel:

$ ./bitcoin-cli help getblockhash
getblockhash height

Returns hash of block in best-block-chain at height provided.

Arguments:
1. height         (numeric, required) The height index

Result:
"hash"         (string) The block hash

Examples:
> bitcoin-cli getblockhash 1000
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockhash", "params": [1000] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

Du kannst bitcoin-cli auf zwei Arten aufrufen:

  • Mit Positions-Argumenten–Die Bedeutungen der Argumente basieren auf deren relativer Position: zum Beispiel ./bitcoin-cli getblockhash 1000. Dies ist der gängigste Weg, bitcoin-cli zu verwenden.

  • Mit benannten Argumenten–Die Argumente werden auf der Kommandozeile namentlich genannt: zum Beispiel ./bitcoin-cli -named getblockhash height=1000. Das ist manchmal nützlich, wenn das Kommando optionale Argumente nimmt, und du das zweite optionale Argument angeben willst, aber nicht das erste. Du wirst später Beispiele dazu sehen.

A.4. An die Arbeit

Erzeugen wir ein verschlüsseltes Wallet und machen ein Backup davon. Dann bekommst du etwas bitcoin und gibst das Geld an eine andere Adresse weiter, während wir die Details der Transaktionen auseinandernehmen–alles mit bitcoin-cli.

A.4.1. Erzeugen eines verschlüsselten Wallets

Wenn bitcoind (oder bitcoin-qt) startet, erzeugt es automatisch ein Wallet und speichert es in der Datei ~/.bitcoin/wallet.dat. Aber dieses Wallet ist nicht verschlüsselt, was bedeutet, die private Keys darin und der Seed, der wie in [ch04] besprochen zur Ableitung von Keypaaren dient, werden im Klartext auf deiner Festplatte gespeichert. Schauen wir uns ein paar Daten zu solch einem Wallet an:

$ ./bitcoin-cli getwalletinfo
{
  "walletname": "",
  "walletversion": 169900,
  "balance": 0.00000000,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 0,
  "keypoololdest": 1541941001,
  "keypoolsize": 1000,
  "keypoolsize_hd_internal": 1000,
  "paytxfee": 0.00000000,
  "hdseedid": "bb989ad4e23f7bb713eab0a272eaef3d4857f5e3",
  "hdmasterkeyid": "bb989ad4e23f7bb713eab0a272eaef3d4857f5e3",
  "private_keys_enabled": true
}

Der Output des Befehls "getwalletinfo" zeigt verschiedene Informationen zu der aktuell verwendeten Wallet an. Diese automatisch erstellte Wallet ist unbenannt, weshalb "walletname" leer ist.

balance ist die Summe der bestätigten bitcoins, die du hast (einschliesslich unbestätigten ausgehenden Transaktionen), und unconfirmed_balance ist die Summe der eingehenden Zahlungen. immature_balance ist nur für Miner relevant und gibt die Anzahl neu erzeugter bitcoins an, die nicht vor Ablauf von 100 Blocks ausgegeben werden können. Schaue in den Hilfeabschnitt über getwalletinfo für mehr Details zum Output.

Um ein verschlüsseltes Wallet zu generieren, musst du ein neues Wallet mit dem Kommando encryptwallet erzeugen:

$ ./bitcoin-cli -stdin encryptwallet
secretpassword<ENTER>
<CTRL-D>
wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed and a new HD seed was generated (if you are using HD). You need to make a new backup.

Dieses Kommando erzeugt ein neues verschlüsseltes Wallet. Die -stdin Option wird benutzt, um das Passwort-Argument vom Standard Input zu lesen, was in diesem Falle heisst, du tippst das Passwort in dein Terminal, nachdem du das Kommando abgeschickt hast. Beende die Eingabe durch Drücken von Enter und Ctrl-D. Der Grund für die Benutzung von -stdin ist, dass du das Passwort nicht direkt in das Kommando schreiben möchtest, weil die meisten Shell Interpreter, wie bash, die Historie der Kommandos in einer Datei speichern. Die ´-stdin` Option stellt sicher, dass das Passwort nicht in solchen History-Files auftaucht.

Es ist wichtig, ein neues verschlüsseltes Wallet zu erzeugen, statt einfach das bestehende Wallet zu verschlüsseln, da das alte Wallet möglicherweise schon auf deiner Festplatte kompromittiert wurde. Wie im Output erwähnt, wurde bitcoind gestoppt. Bitcoin Core kann derzeit nicht im laufenden Betrieb das Wallet wechseln.

Starten wir bitcoind erneut und schauen uns das Wallet an. Du wirst etwasAähnliches wie hier sehen:

$ ./bitcoind -daemon
Bitcoin server starting
$ ./bitcoin-cli getwalletinfo
{
  "walletname": "",
  "walletversion": 169900,
  "balance": 0.00000000,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 0,
  "keypoololdest": 1541941063,
  "keypoolsize": 1000,
  "keypoolsize_hd_internal": 1000,
  "unlocked_until": 0,
  "paytxfee": 0.00000000,
  "hdseedid": "590ec0fa4cec43d9179e5b6f7b2cdefaa35ed282",
  "hdmasterkeyid": "590ec0fa4cec43d9179e5b6f7b2cdefaa35ed282",
  "private_keys_enabled": true
}

Dein altes, unverschlüsseltes wallet.dat ist von dem neuen, verschlüsselten wallet.das überschrieben worden. Aber zur Sicherheit wurde dein alter Seed in dem neuen, verschlüsselten Wallet abgelegt, falls du tatsächlich Geld in dem alten Wallet hattest oder in Zukunft versehentlich Geld auf dieses alte Wallet geschickt bekommst. Der unlocked_until Wert von 0 bedeutet, deine private Keys sind mit dem Passwort verschlüsselt, das du beim Verschlüsseln des Wallets eingegeben hattest. Von jetzt an musst du deine private Keys entschlüsseln, wenn du sie benutzen willst. Du wirst das später tun, wenn du bitcoin schickst.

A.4.2. Backup des Wallets

Du hast ein leeres Wallet generiert, und bevor du es anfängst zu benutzen, solltest du davon ein Backup machen. In [ch04] haben wir über mnemonische Sätze, wie definiert in BIP39, gesprochen, die das Anfertigen von Backups für hierarchische deterministische (HD) Wallet Seeds einfach machen. Aber dieses Feature ist nicht in Bitcoin Core implementiert, aus ein paar Gründen–hauptsächlich dem, dass dem mnemonischen Satz Informationen fehlen über das folgende:

  • Die Version des Seed Formats

  • Der Geburtstag, was der Zeitpunkt ist, zu dem der Seed generiert wurde. Ohne einen Geburtstag musst du die gesamte Blockchain scannen, um deine alten Transaktionen zu finden. Mit einem Geburtstag musst du die Blockchain erst ab dem Geburtstag durchsuchen.

  • Die Ableitungspfade, die zur Wiederherstellung benutzt werden sollen. Das kann zu einem gewissem Grade dadurch behoben werden, dass man die Standard Ableitungspfade benutzt, aber nicht alle Wallets implementieren den Standard.

  • Sonstige beliebige Metadaten, wie Labels auf Adressen.

Um ein Backup von deinem Bitcoin Core Wallet zu machen, musst du eine Kopie der wallet.dat Datei machen. Pass auf, dass du die Datei nicht mit den Kopierprogrammen deines Betriebssystems sicherst, während bitcoind oder bitcoin-qt laufen. Wenn du das tust, könnte dein Backup in einem inkonsistenten Zustand sein, weil bitcoind vielleicht gerade Daten hineinschreibt, während du kopierst. Um sicherzustellen, dass du eine konsistente Kopie der Datei bekommst, während Bitcoin Core läuft, benutze das folgende Kommando:

$ ./bitcoin-cli backupwallet ~/walletbackup.dat

Dies instruiert bitcoind, eine Kopie der wallet.dat Datei in walletbackup.dat in deinem Heimatverzeichnis zu sichern (man kann den Namen und Pfad nach Belieben ändern). Die Backup Datei wird eine exakte Kopie der Original wallet.dat Datei sein. Lege die walletbackup.dat Datei an einer sichern Stelle ab–zum Beispiel auf einem USB Stick in einem Bankschliessfach oder auf einem Computer im Appartement deines Bruders.

A.4.3. Geld erhalten

Du hast ein verschlüsseltes, gesichertes Wallet. Grossartig! Tun wir etwas bitcoin hinein. Um dies zu tun, brauchst du eine Bitcoin Adresse, an der du die Bitcoin bekommen willst, also holen wir uns eine:

$ ./bitcoin-cli -named getnewaddress address_type=bech32
bc1q2r9mql4mkz3z7yfxvef76yxjd637r429620j75

Das Kommando erzeugt eine bech32 p2wpkh Adresse für dich. Wenn dir eine andere Adressart lieber ist, kannst du bech32 in ` legacy` ändern für eine p2pkh Adresse oder in p2sh-segwit um eine p2wpkh eingebettet ist p2sh Adresse zu bekommen. Schlag in [recap-of-payment-types] nach, um deine Erinnerung an die verschiedenen Zahlungs- und Adresstypen aufzufrischen.

Jetzt schicken wir bitcoin an diese Adresse. Pass auf, dass du kein Geld an die in diesem Buch abgedruckte Adresse schickst (obwohl ich das natürlich fröhlich nehmen würde), sondern stattdessen an die Adresse, die du selbst mit deinem eigenen Full Node Wallet generiert hast.

Das wirft die Frage auf, wie du bitcoins bekommst, die du an dein Wallet senden kannst. Du kannst bitcoins auf verschiedenen Wegen bekommen:

Im Web

Gehe auf [web-getting-started], um mehr darüber herauszufinden, wie man bitcoins dort bekommen kann, wo du wohnst.

  • Kaufe bitcoins auf einer Echange.

  • Frage Freunde, die bitcoins haben, ob sie dir welche geben oder verkaufen können.

  • Verdiene bitcoins als Bezahlung für deine Arbeit.

  • Mine bitcoins.

Ich überlasse es dir, wo du bitcoins herbekommst, und nehme an, dass du irgendwie bitcoins an die Adresse bekommen wirst, die du vorhin erzeugt hast.

Ich habe eine Zahlung an meine neue Adresse geleistet und dann mein Wallet gecheckt:

$ ./bitcoin-cli getunconfirmedbalance
0.00500000

Dies zeigt einen ausstehenden Zahlungseingang von 5 mBTC (0,005 BTC). Ich muss jetzt warten, bis es in der Blockchain bestätigt ist. In der Zwischenzeit kannst du dich in die Transaktion vertiefen, indem du das listtransactions Kommando ausführst. Hier sind meine Ergebnisse:

$ ./bitcoin-cli listtransactions
[
  {
    "address": "bc1q2r9mql4mkz3z7yfxvef76yxjd637r429620j75",
    "category": "receive",
    "amount": 0.00500000,
    "label": "",
    "vout": 1,
    "confirmations": 0,
    "trusted": false,
    "txid": "ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195",
    "walletconflicts": [
    ],
    "time": 1541941483,
    "timereceived": 1541941483,
    "bip125-replaceable": "yes"
  }
]

Diese Transaktion hat 0 Confirmations und zahlt 0,005 BTC. Du kannst auch sehen, dass die txid dieser Transaktion ebfd0d14…ba45c195 ist.

Schauen wir uns die Transaktion näher an, und zwar mit dem Kommando getrawtransaction:

$ ./bitcoin-cli getrawtransaction \
    ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195 1
{
  "txid": "ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195",
  "hash": "ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195",
  "version": 1,
  "size": 223,
  "vsize": 223,
  "weight": 892,
  "locktime": 549655,
  "vin": [
    {
      "txid": "8a4023dbcf57dc7f51d368606055e47636fc625a512d3481352a1eec909ab22f",
      "vout": 0,
      "scriptSig": {
        "asm": "3045022100cc095e6b7c0d4c42a1741371cfdda4f1b518590f1af0915578d3966fee7e34ea02205fc1e976edcf4fe62f16035a5389c661844f7189a9eb45adf59e061ac8cc6fd3[ALL] 030ace35cc192cedfe2a730244945f1699ea2f6b7ee77c65c83a2d7a37440e3dae",
        "hex": "483045022100cc095e6b7c0d4c42a1741371cfdda4f1b518590f1af0915578d3966fee7e34ea02205fc1e976edcf4fe62f16035a5389c661844f7189a9eb45adf59e061ac8cc6fd30121030ace35cc192cedfe2a730244945f1699ea2f6b7ee77c65c83a2d7a37440e3dae"
      },
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 0.00313955,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 6da68d8f89dced72d4339959c94a4fcc872fa089 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a9146da68d8f89dced72d4339959c94a4fcc872fa08988ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "1AznBDM2ZfjYNoRw3DLSR9NL2cwwqDHJY6"
        ]
      }
    },
    {
      "value": 0.00500000,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 50cbb07ebbb0a22f11266653ed10d26ea3e1d545",
        "hex": "001450cbb07ebbb0a22f11266653ed10d26ea3e1d545",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "bc1q2r9mql4mkz3z7yfxvef76yxjd637r429620j75"
        ]
      }
    }
  ],
  "hex": "01000000012fb29a90ec1e2a3581342d515a62fc3676e455606068d3517fdc57cfdb23408a000000006b483045022100cc095e6b7c0d4c42a1741371cfdda4f1b518590f1af0915578d3966fee7e34ea02205fc1e976edcf4fe62f16035a5389c661844f7189a9eb45adf59e061ac8cc6fd30121030ace35cc192cedfe2a730244945f1699ea2f6b7ee77c65c83a2d7a37440e3daefdffffff0263ca0400000000001976a9146da68d8f89dced72d4339959c94a4fcc872fa08988ac20a107000000000016001450cbb07ebbb0a22f11266653ed10d26ea3e1d54517630800"
}

Dieses Kommando gibt die gesamte Transaktion in menschenlesbarer (naja, zumindest in Entwickler-lesbarer) Form aus. Fangen wir oben an und gehen durch die offensichtlich relevantesten Teile der Transaktion durch. Die txid ist die Transaktions-ID. Der hash ist der Doppel-SHA256 Hash der gesamten Transaktion, einschliesslich des Witness. Für non-SegWit Transaktionen ist hash dasselbe wie txid.

Die size der Transaktion ist 223 Bytes, und vsize (die virtuelle Grösse) ist ebenfalls 223 vBytes; vsize ist die Anzahl der Weight Units (892) dieser Transaktion, dividiert durch 4, sodass die virtuelle Grösse einer non-SegWit Transaktion (was diese hier ist, weil sie nur non-SegWit Outputs ausgibt) so gross ist wie ihre tatsächliche size.

Die Lock Time dieser Transaktion steht auf 549655, was die Height der stärksten Chain war zu dem Zeitpunkt, als die Transaktion generiert wurde. Daher kann die Transaktion nicht bestätigt werden vor Block Height 549656. Das verringert die Attraktivität einer Attacke, in der ein Miner vorsätzlich versucht, die Blockchain zu reorganisieren und die Transaktion in eine Block Height zu integrieren, die schon mined wurde.

Als nächstes kommt die Liste der Inputs. Diese Transaktion hat einen einzelnen Input, der einen Output an Index 0 (vout) von der Transaktion mit der txid 8a4023db…909ab22f ausgibt. Der Input gibt einen p2pkh Output.

Die Sequenznummer des Inputs lautet 4294967293, was fffffffd in Hex Code ist. Das bedeutet Lock Time ist enabled (≤fffffffe) und die Transaktion ist ersetzbar (≤fffffffd) gemäss BIP125. Die Bedeutung der Sequenznummer wurde in [tab0901] zusammengefasst.

Hinter der Liste der Inputs kommt die Liste der Transaktions Outputs. Diese Transaktion hat eine Liste von zwei Outputs. Der erste zahlt 0,00313955 BTC an eine p2pkh Adresse, die du noch nicht gesehen hast. Das ist vermutlich ein Change Output. Der zweite Output schickt 0,005 BTC an die p2wpkh Adresse, die wir vorhin erzeugt hatten.

Schauen wir mal, ob die Transaktion inzwischen bestätigt wurde. Du kannst das zum Beispiel mit getbalance checken. In meinem Fall, wenn es 0.00500000 zeigt, dann heisst das, die Transaktion wurde bestätigt.

$ ./bitcoin-cli getbalance
0.00500000

Cool, das Geld ist confirmed! Machen wir weiter.

A.4.4. Versenden von Geld

Du hast ein einige bitcoins erhalten. Jetzt möchtest du die bitcoins an jemand anderen schicken. Um bitcoins zu schicken, kannst du das sendtoaddress Kommando benutzen. Du musst aber erst ein paar Entscheidungen treffen:

  • Zieladresse

  • Zu sendender Betrag: 0,001 BTC

  • Wie dringend die Transaktion ist: nicht dringend (du bist schon froh, wenn sie innerhalb von 20 Blocks bestätigt wird)

Ich sende die bitcoins an Adresse bc1qu456…5t7uulqm, aber du solltest dir eine andere Adresse zum schicken aussuchen. Wenn du kein anderes Wallet hast, kannst du auch in Bitcoin Core eine neue Adresse generieren, an die du zum Experimentieren schicken kannst. Ich habe meine Adresse unten unkenntlich gemacht, damit du nicht versehentlich an meine Adresse schickst.

$ ./bitcoin-cli -named sendtoaddress \
    address="bc1qu456w7a5mawlgXXXXXXu03wp8wc7d65t7uulqm" \
    amount=0.001 conf_target=20 estimate_mode=ECONOMICAL
error code: -13
error message:
Error: Please enter the wallet passphrase with walletpassphrase first.

Oh, nein! Ein Fehler. Wie in der Fehlermessage angegeben, liegen die private Keys in der verschlüsselten wallet.dat Datei. Bitcoin Core braucht aber die private Keys, um die Transaktion zu signieren. Um die private Keys nun zugreifbar zu machen, musst du sie entschlüsseln. Das tust du mit dem walletpassphrase Kommando mit der -stdin Option, um zu verhindern, dass der Passphrase von deinem Kommandointerpreter, wie bash, gespeichert wird.

$ ./bitcoin-cli -stdin walletpassphrase
secretpassword<ENTER>
300<ENTER>
<CTRL-D>

Das letzte Argument, 300, ist die Anzahl Sekunden, die das Wallet entschlüsselt bleiben soll. Nach 300 Sekunden wird das Wallet automatisch wieder verschlüsselt, für den Fall dass du vergisst, es manuell wieder zu verschlüsseln. Probieren wir das sendtoaddress Kommando:

$ ./bitcoin-cli -named sendtoaddress \
    address="bc1qu456w7a5mawlgXXXXXXu03wp8wc7d65t7uulqm" \
    amount=0.001 conf_target=20 estimate_mode=ECONOMICAL
a13bcb16d8f41851cab8e939c017f1e05cc3e2a3c7735bf72f3dc5ef4a5893a2

Das Kommando hat eine txid für die neu erzeugte Transaktion ausgegeben. Das bedeutet, es ist gut gegangen. Du kannst das Wallet mit dem walletlock Kommando wieder verschlüsseln:

$ ./bitcoin-cli walletlock

Das Wallet ist jetzt verschlüsselt. Ich werde meine Transaktionen nochmal auflisten:

$ ./bitcoin-cli listtransactions
[
  {
    "address": "bc1q2r9mql4mkz3z7yfxvef76yxjd637r429620j75",
    "category": "receive",
    "amount": 0.00500000,
    "label": "",
    "vout": 1,
    "confirmations": 1,
    "blockhash": "000000000000000000240eec03ac7499805b0f3df34a7d5005670f3a8fa836ca",
    "blockindex": 311,
    "blocktime": 1541946325,
    "txid": "ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195",
    "walletconflicts": [
    ],
    "time": 1541941483,
    "timereceived": 1541941483,
    "bip125-replaceable": "no"
  },
  {
    "address": "bc1qu456w7a5mawlg35y00xu03wp8wc7d65t7uulqm",
    "category": "send",
    "amount": -0.00100000,
    "vout": 1,
    "fee": -0.00000141,
    "confirmations": 0,
    "trusted": true,
    "txid": "a13bcb16d8f41851cab8e939c017f1e05cc3e2a3c7735bf72f3dc5ef4a5893a2",
    "walletconflicts": [
    ],
    "time": 1541946631,
    "timereceived": 1541946631,
    "bip125-replaceable": "no",
    "abandoned": false
  }
]

Die neue Transaktion ist die letzte der beiden. Sie ist noch nicht bestätigt, was durch "confirmations": 0 angezeigt wird. Die bezahlte Fee betrug 141 satoshis. Schauen wir uns die Transaktion noch einmal im Detail an:

$ ./bitcoin-cli getrawtransaction \
    a13bcb16d8f41851cab8e939c017f1e05cc3e2a3c7735bf72f3dc5ef4a5893a2 1
{
  "txid": "a13bcb16d8f41851cab8e939c017f1e05cc3e2a3c7735bf72f3dc5ef4a5893a2",
  "hash": "554a3a3e57dcd07185414d981af5fd272515d7f2159cf9ed9808d52b7d852ead",
  "version": 2,
  "size": 222,
  "vsize": 141,
  "weight": 561,
  "locktime": 549665,
  "vin": [
    {
      "txid": "ebfd0d14c2ea74ce408d01d5ea79636b8dee88fe06625f5d4842d2a0ba45c195",
      "vout": 1,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "txinwitness": [
        "30440220212043afeaf70a97ea0aa09a15749ab94e09c6fad427677610286666a3decf0b022076818b2b2dc64b1599fd6b39bb8c249efbf4c546e334bcd7e1874115da4dfd0c01",
        "020127d82280a939add393ddbb1b8d08f0371fffbde776874cd69740b59e098866"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.00399859,
      "n": 0,
      "scriptPubKey": {
        "asm": "0 4bf041f271bd94385d6bcac8487adf6c9a862d10",
        "hex": "00144bf041f271bd94385d6bcac8487adf6c9a862d10",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "bc1qf0cyrun3hk2rshttetyys7kldjdgvtgs6ymhzz"
        ]
      }
    },
    {
      "value": 0.00100000,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 e569a77bb4df5df446847bcdc7c5c13bb1e6ea8b",
        "hex": "0014e569a77bb4df5df446847bcdc7c5c13bb1e6ea8b",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "bc1qu456w7a5mawlg35y00xu03wp8wc7d65t7uulqm"
        ]
      }
    }
  ],
  "hex": "0200000000010195c145baa0d242485d5f6206fe88ee8d6b6379ead5018d40ce74eac2140dfdeb0100000000feffffff02f3190600000000001600144bf041f271bd94385d6bcac8487adf6c9a862d10a086010000000000160014e569a77bb4df5df446847bcdc7c5c13bb1e6ea8b024730440220212043afeaf70a97ea0aa09a15749ab94e09c6fad427677610286666a3decf0b022076818b2b2dc64b1599fd6b39bb8c249efbf4c546e334bcd7e1874115da4dfd0c0121020127d82280a939add393ddbb1b8d08f0371fffbde776874cd69740b59e09886621630800"
}

Als erstes fällt auf, dass txid und hash sich unterscheiden. Das liegt daran, dass dies eine SegWit Transaktion ist. Wie du dich von [ch10] erinnern wirst, ist der Witness nicht in der txid enthalten–so vermeidest du Transaction Malleability–aber der hash im Output enthält ihn. Beachte, dass size und vsize sich ebenfalls unterscheiden, was von einer SegWit Transaktion erwartet werden kann. Die Fee war 141 satoshis, wie durch das listtransactions Kommando ausgegeben, und die vsize war 141 vbytes. Als Fee Rate wurde von Bitcoin Core also 1 sat/vByte gewählt.

Die Transaktion hat einen einzelnen Input, der Output 1 der Transaktion ebfd0d14…ba45c195 verbraucht. Du solltest diesen Output aus dem Abschnitt kennen, in dem ich 0,005 BTC an mein Bitcoin Core Wallet geschickt habe. Weil dieser Output ein p2wpkh Output war, ist das Signatur Script (scriptSig) leer und der txinwitness enthält die Signatur und den public Key.

Die Sequenznummer des Inputs ist 4294967294, was gleich fffffffe ist. Das bedeutet, die Transaktion hat Lock Time enabled, ist aber nicht ersetzbar mit BIP125 (opt-in Replace-by-Fee).

Ich habe zwei Outputs. Der erste ist der Change Output von 0,00399859 BTC zurück an eine Adresse, die mir gehört. Der andere ist die eigentliche Zahlung von 0,001 BTC. Checken wir das Saldo erneut:

 ./bitcoin-cli getbalance
0.00399859

Ja, da ist es. Ich musste nicht auf die Bestätigung warten, um den neuen Saldo zu sehen, da "getbalance" immer meine eigenen ausgehenden nicht bestätigten Transaktionen enthält. Ich habe meine einzige UTXO (von 0,005 BTC) ausgegeben und mir eine neue UTXO von 0,00399859 an mich selbst erzeugt:

Spent:   0.005
Pay:    -0.001
Fee:    -0.00000141
===================
Change:  0.00399859

Die Summe stimmt exakt.

Ich habe einige Kommandos gezeigt, die du benutzen kannst, um mit deinem Bitcoin Core Node loszulegen, aber es gibt noch viel mehr. Guck dir die Ausgabe von ./bitcoin-cli help an, um mehr herauszufinden.