Einführung für PHP-Entwickler

Aus Bitcoin Wiki
Wechseln zu: Navigation, Suche

Dieser Artikel ist für Entwickler geschrieben, die eine LAMP-Umgebung (Linux-Apache-MySQL-PHP) zur Verfügung haben und eine Webanwendung entwickeln möchten, die mit dem Bitcoin-Netzwerk interagiert. Grundlegende Kenntnisse in Bitcoin und PHP sollten vorhanden sein.

Hier geht es um PHP, aber die Prinzipien sind natürlich in jeder Programmiersprache gleich. Informationen über andere Sprachen findest du in der API-Referenz.

Die einfachste Möglichkeit ist es, Bitcoin als Daemon laufen zu lassen, mit dem PHP über lokale HTTP-Requests kommunizieren kann. Eine Library namens JSON-RPC wird verwendet, um die Funktionen von bitcoind aufzurufen. Bitcoind antwortet dann mit einem JSON-Objekt.

Bitcoin aufsetzen

Der Bitcoin-Daemon kann von der Hauptseite als Binary oder als Quellcode heruntergeladen werden. Details zum Thema Konfiguration von bitcoind findest du zur Zeit leider nur im englischen Wiki unter Running Bitcoin.

Vor dem ersten Start von bitcoind musst du eine Konfigurationsdatei erstellen (~/.bitcoin/bitcoin.conf unter Linux). Erstellst du keine Konfigurationsdatei, warnt dich bitcoind beim Start.

rpcuser=user
rpcpassword={hier aus Sicherheitsgründen ein starkes Passwort wählen}


Jetzt kannst du bitcoind starten:

$ ./bitcoind
# warte einige Sekunden, während es startet.
$ ./bitcoind getinfo
# diverse Informationen werden angezeigt. Bekommst du einen Fehler, probiere es so lange erneut, bis du Daten bekommst.
$ ./bitcoind help
# für Hilfe zu den Befehlen

Bitcoind wird damit beginnen, mit dem Netzwerk zu synchronisieren, und wird die Blockchain komplett herunterladen. Derzeit (Dezember 2012) handelt es sich dabei um mehr als 2 GB Daten, die heruntergeladen und überprüft werden müssen. Es wird daher mehrere Stunden dauern. Du weißt, dass es fertig ist, wenn die Zahl der heruntergeladenen Blocks der Nummer des aktuellen Blocks entspricht.

Getinfo (Bitcoinds Version von "Hello World")

Wenn bitcoind mit dem Initialisierungsprozess fertig ist und die Blockchain heruntergeladen hat, lade die Datei jsonRPCClient.php von JSON-RPC PHP herunter und platziere sie in einem Verzeichnis, aus dem der Webserver auf Dateien zugreifen kann.

Dann erzeuge eine PHP-Datei mit folgendem Inhalt und rufe sie mit dem Browser auf, um zu testen, ob alles funktioniert.

  require_once 'jsonRPCClient.php';
 
  $bitcoin = new jsonRPCClient('http://benutzername:passwort@127.0.0.1:8332/');
 
  echo "<pre>\n";
  print_r($bitcoin->getinfo());
  echo "</pre>";

Genauigkeit

Bitcoinmengen können von einem Satoshi (0,00000001 BTC) bis 2,1 Billiarden Satoshis (21 Millionen BTC) reichen. Um Rundungsfehler zu vermelden, musst du sicherstellen, dass deine PHP-Implementation diese Werte unterstützt, ohne Ungenauigkeiten einzubauen. Die meisten PHP-Implementationen unterstützen IEEE-64-Bit-Gleitkommazahlen mit 53 Bits Genauigkeit; in diesem Fall können alle Werte korrekt verarbeitet werden.

Mehr Informationen findest du unter Korrektes Handling von Geldbeträgen.

Falls deine PHP-Implementation 64-Bit-Gleitkommazahlen nicht unterstützen sollte (was sehr selten ist), musst du eine Version von bitcoind verwenden, die die Werte als Zeichenketten (Strings) sendet ("genjix" bietet eine solche Version unter [1] an) und die GMP- und BC-Math-Libraries für alle Berechnungen verwenden.

Konten

Bei Bitcoin wird Geld an Adressen gesendet, wobei auf ein Wallet beliebig viele Adressen zeigen können. Standardmäßig zeigt bitcoind die Summe aller Bitcoins in allen Adressen, die zum Wallet gehören.

Allerdings kannst du auch Konten einrichten. Auch Konten können mehrere Adressen zugewiesen sein; jedes Konto agiert wie eine eigene Instanz Mehr Informationen im englischen Wiki.

$ ./bitcoind listaccounts
# zeige die Liste aller Konten und Infos über sie
$ ./bitcoind getaccountaddress user889
# zeige die erste Adresse, die dem Konto "user889" zugewiesen ist
$ ./bitcoind getbalance user889
# zeige die Summe des Geldes in allen Adressen an, die dem Konto "user889" zugewiesen sind

In deiner Applikation sollte jeder Kunde einen eigenen Benutzernamen (also ein eigenes Konto) haben. Bitcoind gibt mit dem Befehl $bitcoin->getaccountaddress("user889"); die erste Adresse des Kontos "user889" aus; mit $bitcoin->getnewaddress("user889"); wird eine neue Adresse erzeugt und "user889" zugewiesen.

Der Kunde kann dann sein Geld auf diese Adresse einzahlen. Du kannst dann mit $bitcoin->getbalance("user889", 4); überprüfen, ob die Zahlung am Konto angekommen ist. Die 4 steht für die minimale Zahl an Bestätigung, die eingehen müssen, bis die Zahlung als gültig angesehen wird.

Falls du Konten für mehrere Ein- und Auszahlungen längerfristig nutzen willst, ist es für dich möglicherweise sinnvoller, die Zahlungen in deiner eigenen Datenbank zu speichern. Das vereinfacht Transfers zwischen zwei Konten und löst die Verbindung zwischen Kundenkonten und Bitcoinkonten.

"getnewaddress" vs. "getaccountaddress"

Die Verwendung von "getnewaddress" ermöglicht eine größere Anonymität für dich und deine Kunden, da immer neue Adressen es schwer machen, von außen die Geldflüsse zu verfolgen. Allerdings bedeutet es auch, dass dein Wallet mit zahlreichen neuen Adressen gefüllt wird.

Es wird daher empfohlen, die Zahl der Adressen, die ein Kunde verlangen kann, zu beschränken. Hier ein Beispiel (mit Sessions):

<?php
    require_once('jsonRPCClient.php');
    $bitcoin = new jsonRPCClient('http://root:root@127.0.0.1:8332/'); 
    # überprüfe, ob Geld vorhanden ist
    try {
        $benutzername = ...
        if(isset($_SESSION['sendeadresse']))
            $sendeadresse = $_SESSION['sendeadresse'];
        else {
            $sendeadresse = $bitcoin->getnewaddress($benutzername);
            $_SESSION['sendeadresse'] = $sendeadresse;
        }
        $balance = $bitcoin->getbalance($benutzername);
    }
    catch (Exception $e) {
        die("<p>Serverfehler! Bitte den Administrator kontaktieren.</p>");
    }
?>

Dieses Codestück erzeugt eine neue Adresse pro Session und speichert sie in einer Session-Variable.

Siehe auch

Hinweis

Diese Seite wurde aus dem Englischen übersetzt.