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.
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.
$ ./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:
-
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.