Jumpcoin-Wallet via RPC in Python steuern

In diesem Tutorial kannst du erfahren, wie du das Jumpcoin-Wallet via RPC (Remote Procedure Call) in Python steuern kannst.

Vielleicht hast du ja bereits einmal die Konsole im Jumpcoin-Wallet entdeckt, mit welcher du beispielsweise via Command Transaktionen durchführen kannst, wie auch über die GUI (Benutzeroberfläche) des Wallets, aber auch Zugriff auf Funktionen erhältst, welche dir in der GUI vollkommen verwehrt bleiben, wie zum Beispiel mithilfe einer beliebigen Transaktions-ID aus der gesamten Jumpcoin Blockchain, welche nie etwas mit deinen Transaktionen zu tun hatte, die Transaktion mit all seinen Details einzusehen, aber auch andere Spielereien oder durchaus sinnvolle Anwendungen.

Hast du jetzt vor, ein Programm zu entwickeln, welches die Jumpcoin Blockchain einbindet, brauchst du wahrscheinlich Zugriff auf genau diese Commands.

Aus Gründen der Simplizität und weiten Verbreitung heutzutage, werde ich in diesem Tutorial Python verwenden. Es kann jedoch jede Programmiersprache verwendet werden, mit welcher man POST-Requests im json-Format versenden kann.

Einzelne Schritte der Implementierung

Zu aller erst muss die Bibliothek requests importiert werden:
»import requests
Dies ist eine Bibliothek, welche standardmäßig mit Python mitinstalliert wird. Hiermit lassen sich allerlei Netzwerk Anfragen bearbeiten, wie unter Anderem die, die für die RPC-Steuerung des Wallets notwendig ist.


Als nächstes wird die ebenfalls standardmäßig mitgelieferte Bibliothek json benötigt:
»import json
Hiermit lässt sich dann die Anfrage an das Wallet richtig formatieren.


Als nächstes sollten einige Konstanten festgelegt werden:
»RpcUser = ‘username‘
»RpcPassword = ‘password‘
»RpcPort = ‘12345‘

Diese Konstanten sind die Zugangsdaten zur RPC-Schnittstelle des Wallets. Sie werden in der Konfigurationsdatei (jumpcoin.conf) des Wallets hinterlegt. Diese Datei findet man im Installationsverzeichnis des Wallets. Sollte diese Datei dort nicht vorhanden sein, kann sie einfach eine leere Datei mit diesem Namen erstellt werden und die relevanten Informationen können hineingeschrieben werden:
»…
»server=1
»rpcuser=username
»rpcpassword=password
»rpcport=12345
»…

Die Konfigurationsvariable server bestimmt, ob das Wallet als Server fungieren darf, oder nicht. Eine 1 steht dabei für True bzw. ja, während eine 0 für False bzw. nein steht. Für unseren Zweck muss der Wert dieser Variable 1 sein. Nutzername, Passwort und Port des Servers werden in den folgenden 3 Zeilen angegeben. Dabei sollte berücksichtigt werden, dass diese Werte möglichst sicher sein sollten, da diese Werte vollen Zugriff auf das Wallet gewähren.


Jetzt geht es wieder zurück in den Code des Programms!
Hier sollte jetzt die URL als eine weitere Konstante erstellt werden:
»url = “http://{}:{}@127.0.0.1:{}“.format(RpcUser, RpcPassword, RpcPort)
Die zuvor erstellten Konstanten Variablen werden hier nun dort eingetragen, wo sich die geschwungenen Klammern befinden. Zwar hätte man diese Daten auch direkt hier eintragen können, jedoch ist diese Lösung um einiges übersichtlicher. Es gilt zu beachten, dass ich davon ausgehe, dass das Wallet, sowie das Python Programm, welches mit dem Wallet interagieren soll, auf der selben Maschine laufen, woraus die auf sich selbst verweisende IP-Adresse 127.0.0.1 resultiert. Sollten diese 2 Dinge auf unterschiedlichen Maschinen laufen, muss an dieser Stelle die IP-Adresse mit der Adresse, der Maschine, auf welcher das Wallet läuft ersetzt werden. Befinden sich die Maschinen im selben Netzwerk, sollte die LAN-Adresse, welche i.d.R. folgendes Format hat, verwendet werden: 192.168.0.x.
Befinden sich die Maschinen in unterschiedlichen Netzweken, muss auf die globale IP zurückgegriffen werden. In jedem Fall kann es notwendig sein, in der Firewall und/oder dem Router Portfreigaben für den betroffenen Port einzurichten.


Jetzt fehlt noch eine letzte Konstante bevor der richtige Spaß beginnt:
»jsonrpc = ‘2.0‘
Hier wird gespeichert, dass die zu verwendene Version von jsonrpc die Version 2.0 sein soll.


Wenn wir jetzt beispielsweise die aktuelle Blockhöhe, welche unserem Wallet bekannt ist abfragen wollen, legen wir das zuerst in einer Variable mit dem Namen payload fest:
»payload = {‘jsonrpc‘: jsonrpc, ‘method‘: ‘getblockcount‘, ‘params‘: None}
Der Payload wird in einem Dictionary gespeichert, in welchem wir zuerst nochmal die jsonrpc Version spezifizieren. Danach wird die gewünschte Methode eingetragen. Im Fall von der aktuellen Blockhöhe wird hier die Methode getblockcount benötigt. Der Name der Methode entspricht dem ersten Keyword des Commands in der Konsole. Danach folgen die vom Command gefragten Parameter. Diese entsprechen den Werten, die nach dem ersten Keyword des Commands folgen. Im Fall von getblockcount gibt es keine möglichen Parametern, weshalb dieser mit dem Python- Keyword None als leer definiert wird.
Werden einer oder mehrere Parameter verlangt, so müssen diese als ein Array übergeben werden.
Ein Beispiel dazu gibt es am Ende in einem vollständigen Programmbeispiel.


Jetzt sind alle Vorbereitungen abgeschlossen und die Anfrage kann an das Wallet versendet werden.
Das geschieht wie folgt:
»walletReturn = requests.post(url, data=json.dumps(payload))
Die Variable walletReturn fungiert als Speichervariable für die Antwort des Wallets auf unsere Anfrage. Mit requests.post() wird eine POST-Request ausgeführt. Darin wird zum einen die URL, an welche die Request gehen soll definiert, aber auch, was wir denn genau an das Wallet senden wollen. Dies haben wir ja bereits zuvor in der Variable payload festgelegt. Die richtige Formatierung für das Wallet, dass dieses mit der Information arbeiten kann, erhalten wir mit der Funktion json.dumps() von der json Bibliothek.
Jetzt haben wir eine Antwort des Wallets vorliegen. Wollen wir diese nun weiterverwenden – zum Beispiel ausgeben – dann kann man das so machen:
»print(walletReturn.json())
der Anhang mit .json() sorgt dafür, dass wir auch den tatsächlichen Inhalt der Antwort im json-Format erhalten. Würde man diesen Schritt nicht gehen, dann wäre die ausgegebene Antwort lediglich der Erfolgsstatus der Anfrage.

Vollständiges Demo-Programm

»import requests
»import json
»
»user = "user"
»pw = "passwort"
»port = "12345"
»
»url = "http://{}:{}@127.0.0.1:{}".format(user, pw, port)
»jsonrpc = "2.0"
»
»def getBlockHash(index):
» method = 'getblockhash'
» params = [int(index)] # *
» payload = {"jsonrpc": jsonrpc, "method": method, "params": params}
» walletReply = requests.post(url, data=json.dumps(payload)).json()
» return r
»
»while True:
» blockReq = input('Für welchen Block hätten sie gerne den Hash? ')
» blockHash = getBlockHash(blockReq)
» print('Der Hash des Blocks {} lautet {}'.format(blockReq, blockHash['result']))

In diesem Programm wird der User gefragt, für welchen Block er denn gerne den Hash hätte. Danach wird mit seiner angegeben Blockhöhe die Frage an das Wallet weitergeleitet und die Antwort wird dem User ausgeben.

*weitere Parameter könnten angehängt werden: [param1, param2, …] !! ACHTUNG: Trennung durch Komma

Fazit

Das einbinden des Jumpcoin Wallets in externe Programme via RPC-Connection ist gar nicht so schwer und hat eine ganze Reihe an Anwendungen. Jetzt wo du die Grundlagen gelernt hast, kannst du sie direkt in dein nächstes Projekt für die Community mit einbauen!

Klicke, um diesen Beitrag zu bewerten!
[Gesamt: 2 Durchschnitt: 5]
Veröffentlicht in Tutorial, Unkategorisiert und verschlagwortet mit , , , , .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert