Merge branch 'master' of https://github.com/alcar21/NerdMiner_v2 into feature/add_platformio_support_and_improvements

This commit is contained in:
Alfonso C. Alvarez 2023-05-03 21:09:37 +02:00
parent 73a5ee1df4
commit 8884bb58d7
5 changed files with 167 additions and 116 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.pio .pio
.vscode .vscode
NerdMinerLog.txt NerdMinerLog.txt
platformio-device-monitor*.log

View File

@ -18,22 +18,20 @@ framework = arduino
monitor_filters = monitor_filters =
esp32_exception_decoder esp32_exception_decoder
time time
log2file
board_build.arduino.memory_type = qio_opi board_build.arduino.memory_type = qio_opi
monitor_speed = 115200 monitor_speed = 115200
upload_speed = 115200 upload_speed = 115200
# 2 x 4.5MB app, 6.875MB SPIFFS
;board_build.partitions = large_spiffs_16MB.csv
;board_build.partitions = default_8MB.csv
board_build.partitions = huge_app.csv board_build.partitions = huge_app.csv
;board_build.partitions = default.csv
build_flags = build_flags =
-D LV_LVGL_H_INCLUDE_SIMPLE -D LV_LVGL_H_INCLUDE_SIMPLE
-D BOARD_HAS_PSRAM -D BOARD_HAS_PSRAM
-D ARDUINO_USB_MODE=1 -D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_CDC_ON_BOOT=1
;-D DEBUG_MINING=1 -D DEBUG_MINING=1
;-D DEBUG_MINING_SHARE
lib_deps = lib_deps =
https://github.com/takkaO/OpenFontRender https://github.com/takkaO/OpenFontRender
bblanchon/ArduinoJson@^6.21.2 bblanchon/ArduinoJson@^6.21.2

View File

@ -79,7 +79,6 @@ void setup()
// Higher prio monitor task // Higher prio monitor task
Serial.println(""); Serial.println("");
Serial.println("Initiating tasks..."); Serial.println("Initiating tasks...");
xTaskCreate(runMonitor, "Monitor", 5000, NULL, 4, NULL);
/******** CREATE MINER TASKS *****/ /******** CREATE MINER TASKS *****/
for (size_t i = 0; i < THREADS; i++) { for (size_t i = 0; i < THREADS; i++) {
@ -88,8 +87,10 @@ void setup()
// Start mining tasks // Start mining tasks
BaseType_t res = xTaskCreate(runWorker, name, 30000, (void*)name, 1, NULL); BaseType_t res = xTaskCreate(runWorker, name, 30000, (void*)name, 1, NULL);
Serial.printf("Starting %s %s!\n", name, res == pdPASS? "successful":"failed"); Serial.printf("Starting miner %s %s!\n", name, res == pdPASS? "successful":"failed");
} }
Serial.println("NerdMiner v2 started......");
} }
void app_error_fault_handler(void *arg) { void app_error_fault_handler(void *arg) {
@ -123,4 +124,5 @@ void loop() {
//Run miner on main core when there is time --Currently on test //Run miner on main core when there is time --Currently on test
runMiner(); runMiner();
runMonitor();
} }

View File

@ -3,6 +3,7 @@
#include <WiFi.h> #include <WiFi.h>
#include <algorithm> #include <algorithm>
#include <TFT_eSPI.h> // Graphics and font library for ILI9341 driver chip #include <TFT_eSPI.h> // Graphics and font library for ILI9341 driver chip
#include <limits.h>
#include "media/Free_Fonts.h" #include "media/Free_Fonts.h"
#include "media/images.h" #include "media/images.h"
#include "mbedtls/md.h" #include "mbedtls/md.h"
@ -11,6 +12,7 @@
#include "mining.h" #include "mining.h"
#define TARGET_BUFFER_SIZE 64 #define TARGET_BUFFER_SIZE 64
#define BUFFER_JSON_DOC 1024
unsigned long templates = 0; unsigned long templates = 0;
unsigned long hashes= 0; unsigned long hashes= 0;
@ -29,8 +31,6 @@ extern char btcString[80];
extern OpenFontRender render; extern OpenFontRender render;
extern TFT_eSprite background; extern TFT_eSprite background;
bool checkValid(unsigned char* hash, unsigned char* target) { bool checkValid(unsigned char* hash, unsigned char* target) {
bool valid = true; bool valid = true;
for(uint8_t i=31; i>=0; i--) { for(uint8_t i=31; i>=0; i--) {
@ -42,7 +42,7 @@ bool checkValid(unsigned char* hash, unsigned char* target) {
break; break;
} }
} }
#ifdef DEBUG_MINING #ifdef DEBUG_MINING_SHARE
if (valid) { if (valid) {
Serial.print("\tvalid : "); Serial.print("\tvalid : ");
for (size_t i = 0; i < 32; i++) for (size_t i = 0; i < 32; i++)
@ -87,21 +87,55 @@ bool verifyPayload (String line){
return true; return true;
} }
unsigned long getNextId(unsigned long id) {
if (id == ULONG_MAX) {
id = 1;
return id;
}
return ++id;
}
void getNextExtranonce2(int extranonce2_size, char *extranonce2) {
unsigned long extranonce2_number = strtoul(extranonce2, NULL, 10);
extranonce2_number++;
memset(extranonce2, '0', 2 * extranonce2_size);
if (extranonce2_number > long(pow(10, 2 * extranonce2_size))) {
return;
}
char next_extranounce2[2 * extranonce2_size + 1];
memset(extranonce2, '0', 2 * extranonce2_size);
ultoa(extranonce2_number, next_extranounce2, 10);
memcpy(extranonce2 + (2 * extranonce2_size) - long(log10(extranonce2_number)) - 1 , next_extranounce2, strlen(next_extranounce2));
extranonce2[2 * extranonce2_size] = 0;
}
bool checkError(const StaticJsonDocument<BUFFER_JSON_DOC> doc) {
if (doc["error"].size() == 0) {
return false;
}
Serial.printf("ERROR: %d | reason: %s \n", (const int) doc["error"][0], (const char*) doc["error"][1]);
return true;
}
void runWorker(void *name) { void runWorker(void *name) {
// TEST: https://bitcoin.stackexchange.com/questions/22929/full-example-data-for-scrypt-stratum-client // TEST: https://bitcoin.stackexchange.com/questions/22929/full-example-data-for-scrypt-stratum-client
Serial.println(""); Serial.println("");
Serial.printf("\n[WORKER] Started. Running %s on core %d\n", (char *)name, xPortGetCoreID()); Serial.printf("\n[WORKER] Started. Running %s on core %d\n", (char *)name, xPortGetCoreID());
Serial.printf("### [Total Heap / Free heap]: %d / %d \n", ESP.getHeapSize(), ESP.getFreeHeap());
String ADDRESS = String(btcString); #ifdef DEBUG_MEMORY
Serial.printf("### [Total Heap / Free heap]: %d / %d \n", ESP.getHeapSize(), ESP.getFreeHeap());
#endif
// connect to pool // connect to pool
WiFiClient client; WiFiClient client;
bool continueSecuence = false; bool continueSecuence = false;
String line, extranonce1; String line, extranonce1, extranonce2 = String("0");
unsigned long id = 1; unsigned long id = 0, extranonce_number = 0;
unsigned int extranonce2_size; unsigned int extranonce2_size;
while(true) { while(true) {
@ -109,54 +143,47 @@ void runWorker(void *name) {
if(WiFi.status() != WL_CONNECTED) continue; if(WiFi.status() != WL_CONNECTED) continue;
// get template // get template
DynamicJsonDocument doc(4 * 1024); StaticJsonDocument<BUFFER_JSON_DOC> doc;
String payload;
char payload[BUFFER_JSON_DOC] = {0};
if (!client.connect(poolString, portNumber)) { if (!client.connect(poolString, portNumber)) {
continue; continue;
} }
// STEP 1: Pool server connection // STEP 1: Pool server connection (SUBSCRIBE)
payload = "{\"id\": "+ String(id++) +", \"method\": \"mining.subscribe\", \"params\": [\"" + ADDRESS + "\", \"password\"]}\n"; // Docs:
// - https://cs.braiins.com/stratum-v1/docs
// - https://github.com/aeternity/protocol/blob/master/STRATUM.md#mining-subscribe
id = getNextId(id);
sprintf(payload, "{\"id\": %u, \"method\": \"mining.subscribe\", \"params\": [\"NerdMinerV2\"]}\n", id);
Serial.printf("[WORKER] %s ==> Mining subscribe\n", (char *)name); Serial.printf("[WORKER] %s ==> Mining subscribe\n", (char *)name);
Serial.print(" Sending : "); Serial.println(payload); Serial.print(" Sending : "); Serial.println(payload);
client.print(payload.c_str()); client.print(payload);
line = client.readStringUntil('\n'); line = client.readStringUntil('\n');
if(!verifyPayload(line)) return; if(!verifyPayload(line)) return;
Serial.print(" Receiving: "); Serial.println(line); Serial.print(" Receiving: "); Serial.println(line);
deserializeJson(doc, line); deserializeJson(doc, line);
int error = doc["error"]; if (checkError(doc)) {
Serial.printf("[WORKER] %s >>>>>>>>> Work aborted\n", (char *)name);
continue;
}
String sub_details = String((const char*) doc["result"][0][0][1]); String sub_details = String((const char*) doc["result"][0][0][1]);
extranonce1 = String((const char*) doc["result"][1]); extranonce1 = String((const char*) doc["result"][1]);
int extranonce2_size = doc["result"][2]; int extranonce2_size = doc["result"][2];
// DIFFICULTY // DIFFICULTY
line = client.readStringUntil('\n'); line = client.readStringUntil('\n');
Serial.print(" Receiving: "); Serial.println(line);
Serial.print(" sub_details: "); Serial.println(sub_details); Serial.print(" sub_details: "); Serial.println(sub_details);
Serial.print(" extranonce1: "); Serial.println(extranonce1); Serial.print(" extranonce1: "); Serial.println(extranonce1);
Serial.print(" extranonce2_size: "); Serial.println(extranonce2_size); Serial.print(" extranonce2_size: "); Serial.println(extranonce2_size);
Serial.print(" error: "); Serial.println(error);
if((extranonce1.length() == 0) || line.length() == 0 || (error != 0)) {
Serial.printf("[WORKER] %s >>>>>>>>> Work aborted\n", (char *)name);
Serial.printf("extranonce1 length: %u | line2 length: %u | error code: %u \n", extranonce1.length(), line.length(), error);
client.stop();
doc.clear();
doc.garbageCollect();
continue;
}
// STEP 2: Pool authorize work // Recibe Work
payload = "{\"params\": [\"" + ADDRESS + "\", \"password\"], \"id\": "+ String(id++) +", \"method\": \"mining.authorize\"}\n"; //line = "{\"params\": [\"b3ba\", \"7dcf1304b04e79024066cd9481aa464e2fe17966e19edf6f33970e1fe0b60277\", \"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff270362f401062f503253482f049b8f175308\", \"0d2f7374726174756d506f6f6c2f000000000100868591052100001976a91431482118f1d7504daf1c001cbfaf91ad580d176d88ac00000000\", [\"57351e8569cb9d036187a79fd1844fd930c1309efcd16c46af9bb9713b6ee734\", \"936ab9c33420f187acae660fcdb07ffdffa081273674f0f41e6ecc1347451d23\"], \"00000002\", \"1b44dfdb\", \"53178f9b\", true], \"id\": null, \"method\": \"mining.notify\"}";
Serial.printf("[WORKER] %s ==> Autorize work\n", (char *)name);
Serial.print(" Sending : "); Serial.println(payload);
client.print(payload.c_str());
line = client.readStringUntil('\n'); line = client.readStringUntil('\n');
if(!verifyPayload(line)) return; doc.clear();
Serial.print(" Receiving: "); Serial.println(line);
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n'));
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n'));
client.stop();
deserializeJson(doc, line); deserializeJson(doc, line);
Serial.print("doc size: "); Serial.println(doc.size());
String job_id = String((const char*) doc["params"][0]); String job_id = String((const char*) doc["params"][0]);
String prevhash = String((const char*) doc["params"][1]); String prevhash = String((const char*) doc["params"][1]);
String coinb1 = String((const char*) doc["params"][2]); String coinb1 = String((const char*) doc["params"][2]);
@ -167,6 +194,28 @@ void runWorker(void *name) {
String ntime = String((const char*) doc["params"][7]); String ntime = String((const char*) doc["params"][7]);
bool clean_jobs = doc["params"][8]; //bool bool clean_jobs = doc["params"][8]; //bool
if((extranonce1.length() == 0) || line.length() == 0) {
Serial.printf("[WORKER] %s >>>>>>>>> Work aborted\n", (char *)name);
Serial.printf("extranonce1 length: %u | line2 length: %u \n", extranonce1.length(), line.length());
client.stop();
doc.clear();
doc.garbageCollect();
continue;
}
// STEP 2: Pool authorize work (Block Info)
id = getNextId(id);
sprintf(payload, "{\"params\": [\"%s\", \"x\"], \"id\": %u, \"method\": \"mining.authorize\"}\n",
btcString,
id);
Serial.printf("[WORKER] %s ==> Autorize work\n", (char *)name);
Serial.print(" Sending : "); Serial.println(payload);
client.print(payload);
line = client.readStringUntil('\n');
if(!verifyPayload(line)) return;
Serial.print(" Receiving: "); Serial.println(line);
client.stop();
#ifdef DEBUG_MINING #ifdef DEBUG_MINING
Serial.print(" job_id: "); Serial.println(job_id); Serial.print(" job_id: "); Serial.println(job_id);
Serial.print(" prevhash: "); Serial.println(prevhash); Serial.print(" prevhash: "); Serial.println(prevhash);
@ -183,7 +232,6 @@ void runWorker(void *name) {
Serial.println(">>>>>>>>> Worker aborted"); Serial.println(">>>>>>>>> Worker aborted");
client.stop(); client.stop();
doc.clear(); doc.clear();
doc.garbageCollect();
continue; continue;
} }
@ -196,7 +244,7 @@ void runWorker(void *name) {
memset(target, '0', TARGET_BUFFER_SIZE); memset(target, '0', TARGET_BUFFER_SIZE);
int zeros = (int) strtol(nbits.substring(0, 2).c_str(), 0, 16) - 3; int zeros = (int) strtol(nbits.substring(0, 2).c_str(), 0, 16) - 3;
memcpy(target + zeros - 2, nbits.substring(2).c_str(), nbits.length() - 2); memcpy(target + zeros - 2, nbits.substring(2).c_str(), nbits.length() - 2);
target[TARGET_BUFFER_SIZE+1] = 0; target[TARGET_BUFFER_SIZE] = 0;
Serial.print(" target: "); Serial.println(target); Serial.print(" target: "); Serial.println(target);
// bytearray target // bytearray target
uint8_t bytearray_target[32]; uint8_t bytearray_target[32];
@ -214,30 +262,15 @@ void runWorker(void *name) {
} }
// get extranonce2 - extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size) // get extranonce2 - extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size)
uint32_t extranonce2_a_bin = esp_random(); char extranonce2_char[2 * extranonce2_size+1];
uint32_t extranonce2_b_bin = esp_random(); extranonce2.toCharArray(extranonce2_char, 2 * extranonce2_size + 1);
String extranonce2_a = String(extranonce2_a_bin, HEX); getNextExtranonce2(extranonce2_size, extranonce2_char);
String extranonce2_b = String(extranonce2_b_bin, HEX); //extranonce2 = String(extranonce2_char);
uint8_t pad = 8 - extranonce2_a.length(); extranonce2 = "00000002";
char extranonce2_a_char[pad+1];
for (int k = 0; k < pad; k++) {
extranonce2_a_char[k] = '0';
}
extranonce2_a_char[pad+1] = 0;
extranonce2_a = String(extranonce2_a_char) + extranonce2_a;
pad = 8 - extranonce2_b.length();
char extranonce2_b_char[pad+1];
for (int k = 0; k < pad; k++) {
extranonce2_b_char[k] = '0';
}
extranonce2_b_char[pad+1] = 0;
extranonce2_b = String(extranonce2_b_char) + extranonce2_b;
String extranonce2 = String(extranonce2_a + extranonce2_b).substring(0, 17 - (2 * extranonce2_size));
//get coinbase - coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest() //get coinbase - coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest()
String coinbase = coinb1 + extranonce1 + extranonce2 + coinb2; String coinbase = coinb1 + extranonce1 + extranonce2 + coinb2;
Serial.print(" coinbase: "); Serial.println(coinbase);
size_t str_len = coinbase.length()/2; size_t str_len = coinbase.length()/2;
uint8_t bytearray[str_len]; uint8_t bytearray[str_len];
@ -330,7 +363,8 @@ void runWorker(void *name) {
Serial.println(""); Serial.println("");
// calculate blockheader // calculate blockheader
String blockheader = version + prevhash + String(merkle_root) + nbits + ntime + "00000000"; // j.block_header = ''.join([j.version, j.prevhash, merkle_root, j.ntime, j.nbits])
String blockheader = version + prevhash + String(merkle_root) + ntime + nbits + "00000000";
str_len = blockheader.length()/2; str_len = blockheader.length()/2;
uint8_t bytearray_blockheader[str_len]; uint8_t bytearray_blockheader[str_len];
res = to_byte_array(blockheader.c_str(), str_len*2, bytearray_blockheader); res = to_byte_array(blockheader.c_str(), str_len*2, bytearray_blockheader);
@ -373,30 +407,35 @@ void runWorker(void *name) {
for (size_t i = 0; i < 4; i++) for (size_t i = 0; i < 4; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("version"); Serial.print("version ");
for (size_t i = 0; i < 4; i++) for (size_t i = 0; i < 4; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("prev hash"); Serial.print("prev hash ");
for (size_t i = 4; i < 4+32; i++) for (size_t i = 4; i < 4+32; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("merkle root"); Serial.print("merkle root ");
for (size_t i = 36; i < 36+32; i++) for (size_t i = 36; i < 36+32; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("time"); Serial.print("nbits ");
for (size_t i = 68; i < 68+4; i++) for (size_t i = 68; i < 68+4; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("difficulty"); Serial.print("difficulty ");
for (size_t i = 72; i < 72+4; i++) for (size_t i = 72; i < 72+4; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("nonce"); Serial.print("nonce ");
for (size_t i = 76; i < 76+4; i++) for (size_t i = 76; i < 76+4; i++)
Serial.printf("%02x", bytearray_blockheader[i]); Serial.printf("%02x", bytearray_blockheader[i]);
Serial.println(""); Serial.println("");
Serial.println("bytearray_blockheader: ");
for (size_t i = 0; i < str_len; i++) {
Serial.printf("%02x", bytearray_blockheader[i]);
}
Serial.println("");
#endif #endif
mbedtls_sha256_context midstate[32]; mbedtls_sha256_context midstate[32];
@ -409,7 +448,8 @@ void runWorker(void *name) {
// search a valid nonce // search a valid nonce
enableGlobalHash = true; enableGlobalHash = true;
uint32_t nonce = 0;
unsigned long nonce = TARGET_NONCE - MAX_NONCE;
uint32_t startT = micros(); uint32_t startT = micros();
unsigned char *header64 = bytearray_blockheader + 64; unsigned char *header64 = bytearray_blockheader + 64;
Serial.println(">>> STARTING TO HASH NONCES"); Serial.println(">>> STARTING TO HASH NONCES");
@ -444,7 +484,7 @@ void runWorker(void *name) {
Serial.println(""); */ Serial.println(""); */
hashes++; hashes++;
if (nonce++> MAX_NONCE) break; //exit if (nonce++> TARGET_NONCE) break; //exit
// check if 16bit share // check if 16bit share
if(hash[31]!=0) continue; if(hash[31]!=0) continue;
@ -457,7 +497,6 @@ void runWorker(void *name) {
// check if valid header // check if valid header
if(checkValid(hash, bytearray_target)){ if(checkValid(hash, bytearray_target)){
//Serial.printf("%s on core %d: ", (char *)name, xPortGetCoreID());
Serial.printf("[WORKER] %s CONGRATULATIONS! Valid completed with nonce: %d | 0x%x\n", (char *)name, nonce, nonce); Serial.printf("[WORKER] %s CONGRATULATIONS! Valid completed with nonce: %d | 0x%x\n", (char *)name, nonce, nonce);
valids++; valids++;
Serial.printf("[WORKER] %s Submiting work valid!\n", (char *)name); Serial.printf("[WORKER] %s Submiting work valid!\n", (char *)name);
@ -466,11 +505,18 @@ void runWorker(void *name) {
vTaskDelay(1000 / portTICK_PERIOD_MS); vTaskDelay(1000 / portTICK_PERIOD_MS);
} }
// STEP 3: Submit mining job // STEP 3: Submit mining job
payload = "{\"params\": [\"" + ADDRESS + "\", \"" + job_id + "\", \"" + extranonce2 + "\", \"" + ntime + "\", \"" + String(nonce, HEX) + "\"], \"id\": "+ String(id++) +", \"method\": \"mining.submit\"}"; id = getNextId(id);
sprintf(payload, "{\"params\": [\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"], \"id\": %u, \"method\": \"mining.submit\"}",
btcString,
job_id,
extranonce2,
ntime,
String(nonce, HEX),
id
);
Serial.print(" Sending : "); Serial.println(payload); Serial.print(" Sending : "); Serial.println(payload);
client.print(payload.c_str()); client.print(payload);
line = client.readStringUntil('\n'); Serial.print(" Receiving: "); Serial.println(client.readString());
Serial.print(" Receiving: "); Serial.println(line);
client.stop(); client.stop();
// exit // exit
nonce = MAX_NONCE; nonce = MAX_NONCE;
@ -482,22 +528,31 @@ void runWorker(void *name) {
mbedtls_sha256_free(midstate); mbedtls_sha256_free(midstate);
enableGlobalHash = false; enableGlobalHash = false;
// TODO Pending doub
if(hashes>=MAX_NONCE) { Mhashes=Mhashes+MAX_NONCE/1000000; hashes=hashes-MAX_NONCE;} if(hashes>=MAX_NONCE) { Mhashes=Mhashes+MAX_NONCE/1000000; hashes=hashes-MAX_NONCE;}
if (nonce == MAX_NONCE) { if (nonce == TARGET_NONCE) {
Serial.printf("[WORKER] %s SUBMITING WORK... MAX Nonce reached > MAX_NONCE\n", (char *)name); Serial.printf("[WORKER] %s SUBMITING WORK... MAX Nonce reached > MAX_NONCE\n", (char *)name);
// STEP 3: Submit mining job // STEP 3: Submit mining job
id = getNextId(id);
if (client.connect(poolString, portNumber)) { if (client.connect(poolString, portNumber)) {
payload = "{\"params\": [\"" + ADDRESS + "\", \"" + job_id + "\", \"" + extranonce2 + "\", \"" + ntime + "\", \"" + String(nonce, HEX) + "\"], \"id\": "+ String(id++) +", \"method\": \"mining.submit\"}"; sprintf(payload, "{\"params\": [\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"], \"id\": %u, \"method\": \"mining.submit\"}",
btcString,
job_id,
extranonce2,
ntime,
String(nonce, HEX),
id
);
Serial.print(" Sending : "); Serial.println(payload); Serial.print(" Sending : "); Serial.println(payload);
client.print(payload.c_str()); client.print(payload);
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n')); unsigned long timeout = millis();
while (client.available()) { Serial.print(" Receiving: "); Serial.println(client.readString());
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n')); Serial.printf("[WORKER] %s SUBMITED WORK\n", (char *)name);
}
client.stop(); client.stop();
} }
} }
uint32_t duration = micros() - startT; uint32_t duration = micros() - startT;
} }
@ -505,7 +560,6 @@ void runWorker(void *name) {
//////////////////THREAD CALLS/////////////////// //////////////////THREAD CALLS///////////////////
//Testeamos hashrate final usando hilo principal //Testeamos hashrate final usando hilo principal
//this is currently on test //this is currently on test
@ -545,7 +599,7 @@ void runMiner(void){
} }
void runMonitor(void *name){ void runMonitor() {
Serial.println("[MONITOR] started"); Serial.println("[MONITOR] started");
@ -556,8 +610,9 @@ void runMonitor(void *name){
unsigned long mElapsed = millis()-mStart; unsigned long mElapsed = millis()-mStart;
unsigned long totalKHashes = (Mhashes*1000) + hashes/1000; unsigned long totalKHashes = (Mhashes*1000) + hashes/1000;
//Serial.println("[runMonitor Task] -> Printing results on screen "); //Serial.println("[runMonitor Task] -> Printing results on screen ");
Serial.printf(">>> Completed %d share(s), %d Khashes, avg. hashrate %.3f KH/s\n",
shares, totalKHashes, (1.0*(totalKHashes*1000))/mElapsed); //Serial.printf(">>> Completed %d share(s), %d Khashes, avg. hashrate %.3f KH/s\n",
// shares, totalKHashes, (1.0*(totalKHashes*1000))/mElapsed);
//Hashrate //Hashrate
render.setFontSize(70); render.setFontSize(70);
@ -599,6 +654,6 @@ void runMonitor(void *name){
background.pushSprite(0,0); background.pushSprite(0,0);
// Pause the task for 5000ms // Pause the task for 5000ms
vTaskDelay(5000 / portTICK_PERIOD_MS); // vTaskDelay(5000 / portTICK_PERIOD_MS);
} }
} }

View File

@ -1,14 +1,9 @@
// Mining // Mining
#define THREADS 1 #define THREADS 1
#define MAX_NONCE 3000000 #define MAX_NONCE 5000000U
// #define MAX_NONCE 1.215.752.192 #define TARGET_NONCE 471136297U
// Pool void runMonitor();
//#define POOL_URL "solo.ckpool.org" //"btc.zsolo.bid" "eu.stratum.slushpool.com"
//#define POOL_PORT 3333 //6057 //3333
void runMonitor(void *name);
void runWorker(void *name); void runWorker(void *name);
void runMiner(void); void runMiner(void);