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 getwork
solicitud JSON-RPC (a un servidor de grupo) en Java y analizaría correctamente el resultado en las variables requeridas para la minería?
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: datastr
este es el valor almacenado dentro result.data
y targetstr
este 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
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.
tilo
Mago binario
tilo
Mago binario
tilo
0xcafe