¿Cómo puedo codificar una solicitud "getwork" de Bitcoin JSON-RPC en Java?

No estoy completamente seguro de si hacer esta pregunta sobre Bitcoin-SE o Stack Overflow, pero decidí publicarla aquí debido a la relevancia directa de la pregunta para Bitcoin y la prominencia general de la experiencia de programación que he observado en Bitcoin-SE. . Si Bitcoin-SE es el lugar incorrecto para publicarlo, me disculpo de antemano; Soy nuevo en SE y esta fue mi mejor suposición.

Estoy intentando, para comprender mejor cómo funciona la minería de Bitcoin, codificar un minero de CPU de Bitcoin simple en Java, con el que tengo algo de experiencia, pero no mucha. Todos los recursos en línea sobre la implementación de JSON-RPC en Java que he encontrado están desactualizados y ya no funcionan o son incomprensibles para alguien con experiencia limitada en Java. ¿Cómo, de la manera más simple posible, codificaría una getworksolicitud JSON-RPC (a un servidor de grupo) en Java y analizaría correctamente el resultado en las variables requeridas para la minería?

+1 Este es el foro adecuado para preguntar. (Y bitcoinj sería un buen lugar para implementar esta característica, no estoy seguro si ya la tienen).
@Thilo Gracias, me alegro de haberlo publicado en el lugar correcto. BitcoinJ implementa un nodo solo para clientes; no procesará solicitudes RPC de ningún tipo. Buena idea, pero me temo que no funcionará.
No lo hará en este momento, pero (al menos) para un cliente RPC debería ofrecer soporte algún día (en mi humilde opinión).
Lo siento si el "nodo de solo cliente" fue engañoso; eso es justo lo que se indica en su página de Google Code. Revisé la documentación y no encontré nada en RPC. Estoy de acuerdo en que debería implementar soporte para clientes RPC, pero eso no significa que lo hará . En cualquier caso, actualmente no lo hace.
Sí, podemos estar de acuerdo en eso ;-) Actualice esta publicación con una respuesta propia si descubre cómo hacer RPC con Java (incluso si tiene que ejecutarlo manualmente solo con las bibliotecas JDK).
O podrías usar BitCoinJ .

Respuestas (3)

El protocolo JSON-RPC es muy simple. PUBLICA en el grupo de minería (o en el cliente bitcoind):

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

y vuelve:

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

Solo necesita los primeros 80 bytes de result.data: cambia los últimos 4 bytes (nonce) y calcula los hash. Luego, cuando encuentra un hash que es menor que el "objetivo" (generalmente un hash con los 32 bits de orden superior igual a cero), llama a getwork nuevamente para informar su hash (y ganar una parte del grupo):

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

Hay un montón de codificación de orden de bytes inestable en la llamada de trabajo estándar. Por lo general, querrá invertir los bytes en cada entero largo (4 bytes) antes de aplicarle hash, y hacer lo mismo antes de informar el bloque encontrado al grupo. Consulte el ejemplo de pyminer para ver una implementación de referencia simple de un minero (en python). Dentro de la función Miner.work() es donde ocurre la magia. La función de trabajo toma dos parámetros: datastreste es el valor almacenado dentro result.datay targetstreste es el valor almacenado dentro result.target.

Otra cosa: la mayoría de los grupos requieren que use la autenticación básica cuando realiza la POST, por lo que deberá incluir su nombre de usuario y contraseña en el encabezado de su solicitud.

Eche un vistazo al código fuente de DiabloMiner (Java): https://github.com/Diablo-D3/DiabloMiner

Es un minero de GPU, pero tiene el material de trabajo JSON-RPC que necesita.

Después de poner en marcha el trabajo básico, es posible que desee ver la implementación de extensiones: https://en.bitcoin.it/wiki/Getwork

He revisado el código de Diablo; Estaba buscando algo más fácil de entender. (Diablo no comenta nada, y tengo poca experiencia en Java) Si nadie más habla, lo revisaré más de cerca y trataré de simplificarlo yo mismo. Gracias por la sugerencia en cualquier caso.

Para todos los demás, que se topan con esta pregunta:

He escrito un envoltorio de Java alrededor del JSON-RPC proporcionado por bitcoin/litecoin.

https://github.com/codificación-idiota/Litecoin-Bitcoin-RPC-Java-Connector

Utiliza Htmlunit y GoogleGson y es bastante fácil de entender y ampliar.

Se ve bien. lo estare probando