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- getwork
Anfrage (an einen Pool-Server) in Java codieren und die Ausgabe korrekt in die für das Mining erforderlichen Variablen zerlegen?
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.data
und targetstr
dies 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
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.
Thilo
BinaryMage
Thilo
BinaryMage
Thilo
0xcaff