Wie kann ich eine Bitcoin JSON-RPC „getwork“-Anfrage in Java codieren?

Ich bin mir nicht ganz sicher, ob ich diese Frage zu Bitcoin-SE oder Stack Overflow stellen soll, aber ich habe mich entschieden, sie hier zu posten, aufgrund der direkten Relevanz der Frage für Bitcoin und der allgemeinen Bedeutung der Programmiererfahrung, die ich bei Bitcoin-SE beobachtet habe . Wenn Bitcoin-SE der falsche Ort ist, um es zu posten, entschuldige ich mich im Voraus; Ich bin neu bei SE und das war meine beste Vermutung.

Ich versuche, um besser zu verstehen, wie Bitcoin-Mining funktioniert, einen einfachen Bitcoin-CPU-Miner in Java zu codieren, mit dem ich etwas, aber nicht viel Erfahrung habe. Alle Online-Ressourcen zur JSON-RPC-Implementierung in Java, die ich gefunden habe, waren entweder veraltet und nicht mehr funktionsfähig oder für jemanden mit begrenzter Java-Erfahrung unverständlich. Wie würde ich auf möglichst einfache Weise eine JSON-RPC- getworkAnfrage (an einen Pool-Server) in Java codieren und die Ausgabe korrekt in die für das Mining erforderlichen Variablen zerlegen?

+1 Dies ist das richtige Forum, um Fragen zu stellen. (Und bitcoinj wäre ein guter Ort, um diese Funktion zu implementieren, nicht sicher, ob sie es bereits haben).
@Thilo Danke, bin froh, dass ich es an der richtigen Stelle gepostet habe. BitcoinJ implementiert einen Nur-Client-Knoten; es verarbeitet keinerlei RPC-Anfragen. Gute Idee, aber ich fürchte, es wird nicht funktionieren.
Im Moment wird es das nicht, aber (zumindest) für einen RPC- Client sollte es eines Tages Unterstützung bieten (IMHO).
Tut mir leid, wenn der "Nur-Client-Knoten" irreführend war; das ist genau das, was auf ihrer Google Code-Seite angegeben ist. Ich habe die Dokumentation durchgesehen und nichts über RPC gefunden. Ich stimme zu, dass es RPC-Client-Unterstützung implementieren sollte , aber das bedeutet nicht, dass es das tun wird . Jedenfalls aktuell nicht.
Ja, darauf können wir uns einigen ;-) Bitte aktualisieren Sie diesen Beitrag mit einer eigenen Antwort, wenn Sie herausfinden, wie man RPC mit Java macht (auch wenn Sie es nur mit den JDK-Bibliotheken von Hand rollen müssen).
Oder Sie könnten BitCoinJ verwenden .

Antworten (3)

Das JSON-RPC-Protokoll ist sehr einfach. Sie POST an den Mining-Pool (oder den Bitcoin-Client):

{"method": "getwork", "params": [], "id": "anything"}

und zurück:

{"result": {"data": "hex bytes....", "target": "hex bytes...", ...}, ... }

Sie benötigen nur die ersten 80 Bytes von result.data- Sie ändern die letzten 4 Bytes (Nonce) und berechnen die Hashes. Wenn Sie dann einen Hash finden, der kleiner als „Ziel“ ist (im Allgemeinen ein Hash mit den höherwertigen 32 Bit gleich Null), rufen Sie getwork erneut auf, um Ihren Hash zu melden (und einen Anteil am Pool zu verdienen):

{"method": "getwork", "params": ["hex-header"], "id": "anything"}

Es gibt eine Menge an wackeliger Byte-Reihenfolge-Codierung im Standard-Getwork-Aufruf. Sie werden im Allgemeinen die Bytes umkehren wollen, ist jede lange Ganzzahl (4 Bytes), bevor Sie sie hashen, und dasselbe tun, bevor Sie Ihren gefundenen Block an den Pool zurückmelden. Sehen Sie sich den Beispielpyminer für eine einfache Referenzimplementierung eines Miners (in Python) an. In der Miner.work-() Funktion passiert die Magie. Die Arbeitsfunktion benötigt zwei Parameter: datastr, das ist der darin gespeicherte Wert result.dataund targetstrdies ist der darin gespeicherte Wert result.target.

Eine andere Sache – die meisten Pools verlangen, dass Sie beim POST die Basisauthentifizierung verwenden, also müssen Sie Ihren Benutzernamen und Ihr Passwort in den Header Ihrer Anfrage aufnehmen.

Schauen Sie sich den DiabloMiner-Quellcode (Java) an: https://github.com/Diablo-D3/DiabloMiner

Es ist ein GPU-Miner, aber es hat das JSON-RPC-Getwork-Zeug, das Sie brauchen.

Nachdem Sie das grundlegende Getwork zum Laufen gebracht haben, möchten Sie sich vielleicht die Implementierung von Erweiterungen ansehen: https://en.bitcoin.it/wiki/Getwork

Ich habe mir den Code von Diablo angesehen; Ich suchte nach etwas leichter Verständlichem. (Diablo kommentiert überhaupt nicht, und ich habe wenig Java-Erfahrung) Wenn sich sonst niemand meldet, gehe ich näher darauf ein und versuche, es selbst zu vereinfachen. Danke für den Vorschlag auf jeden Fall.

Für alle anderen, die über diese Frage stolpern:

Ich habe einen Java-Wrapper um den von bitcoin/litecoin bereitgestellten JSON-RPC geschrieben.

https://github.com/coding-idiot/Litecoin-Bitcoin-RPC-Java-Connector

Es verwendet Htmlunit & GoogleGson und ist recht einfach zu verstehen und zu erweitern.

Sieht gut aus. Werde es testen