minor improvements and modified monitor to real time.
This commit is contained in:
parent
8884bb58d7
commit
4f83b1ac48
@ -122,7 +122,7 @@ void loop() {
|
||||
checkResetConfigButton();
|
||||
|
||||
//Run miner on main core when there is time --Currently on test
|
||||
runMiner();
|
||||
// runMiner();
|
||||
|
||||
runMonitor();
|
||||
}
|
104
src/mining.cpp
104
src/mining.cpp
@ -12,11 +12,13 @@
|
||||
#include "mining.h"
|
||||
|
||||
#define TARGET_BUFFER_SIZE 64
|
||||
#define BUFFER_JSON_DOC 1024
|
||||
#define BUFFER_JSON_DOC 4096
|
||||
|
||||
unsigned long templates = 0;
|
||||
unsigned long hashes= 0;
|
||||
unsigned long Mhashes = 0;
|
||||
unsigned long totalKHashes = 0;
|
||||
unsigned long mStart = millis();
|
||||
|
||||
int halfshares; // increase if blockhash has 16 bits of zeroes
|
||||
int shares; // increase if blockhash has 32 bits of zeroes
|
||||
@ -79,11 +81,10 @@ int to_byte_array(const char *in, size_t in_size, uint8_t *out) {
|
||||
}
|
||||
}
|
||||
|
||||
bool verifyPayload (String line){
|
||||
String inData=line;
|
||||
if(inData.length() == 0) return false;
|
||||
inData.trim();
|
||||
if(inData.isEmpty()) return false;
|
||||
bool verifyPayload (String* line){
|
||||
if(line->length() == 0) return false;
|
||||
line->trim();
|
||||
if(line->isEmpty()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -133,6 +134,8 @@ void runWorker(void *name) {
|
||||
|
||||
// connect to pool
|
||||
WiFiClient client;
|
||||
IPAddress serverIP; //Temporally save poolIPaddres
|
||||
bool isMinerSuscribed = false;
|
||||
bool continueSecuence = false;
|
||||
String line, extranonce1, extranonce2 = String("0");
|
||||
unsigned long id = 0, extranonce_number = 0;
|
||||
@ -140,27 +143,39 @@ void runWorker(void *name) {
|
||||
|
||||
while(true) {
|
||||
|
||||
if(WiFi.status() != WL_CONNECTED) continue;
|
||||
if(WiFi.status() != WL_CONNECTED){
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
continue;
|
||||
}
|
||||
|
||||
// get template
|
||||
StaticJsonDocument<BUFFER_JSON_DOC> doc;
|
||||
|
||||
char payload[BUFFER_JSON_DOC] = {0};
|
||||
|
||||
if (!client.connect(poolString, portNumber)) {
|
||||
if (!client.connected()) {
|
||||
isMinerSuscribed = false;
|
||||
Serial.println("Client not connected, trying to connect...");
|
||||
if (!client.connect(serverIP, portNumber)) {
|
||||
Serial.println("Imposible to connect to : " + String(poolString));
|
||||
WiFi.hostByName(poolString, serverIP);
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// STEP 1: Pool server connection (SUBSCRIBE)
|
||||
// Docs:
|
||||
// - https://cs.braiins.com/stratum-v1/docs
|
||||
// - https://github.com/aeternity/protocol/blob/master/STRATUM.md#mining-subscribe
|
||||
if(!isMinerSuscribed){
|
||||
id = getNextId(id);
|
||||
sprintf(payload, "{\"id\": %u, \"method\": \"mining.subscribe\", \"params\": [\"NerdMinerV2\"]}\n", id);
|
||||
Serial.printf("[WORKER] %s ==> Mining subscribe\n", (char *)name);
|
||||
Serial.print(" Sending : "); Serial.println(payload);
|
||||
client.print(payload);
|
||||
line = client.readStringUntil('\n');
|
||||
if(!verifyPayload(line)) return;
|
||||
if(!verifyPayload(&line)) continue;
|
||||
Serial.print(" Receiving: "); Serial.println(line);
|
||||
deserializeJson(doc, line);
|
||||
if (checkError(doc)) {
|
||||
@ -178,22 +193,6 @@ void runWorker(void *name) {
|
||||
Serial.print(" extranonce1: "); Serial.println(extranonce1);
|
||||
Serial.print(" extranonce2_size: "); Serial.println(extranonce2_size);
|
||||
|
||||
// Recibe Work
|
||||
//line = "{\"params\": [\"b3ba\", \"7dcf1304b04e79024066cd9481aa464e2fe17966e19edf6f33970e1fe0b60277\", \"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff270362f401062f503253482f049b8f175308\", \"0d2f7374726174756d506f6f6c2f000000000100868591052100001976a91431482118f1d7504daf1c001cbfaf91ad580d176d88ac00000000\", [\"57351e8569cb9d036187a79fd1844fd930c1309efcd16c46af9bb9713b6ee734\", \"936ab9c33420f187acae660fcdb07ffdffa081273674f0f41e6ecc1347451d23\"], \"00000002\", \"1b44dfdb\", \"53178f9b\", true], \"id\": null, \"method\": \"mining.notify\"}";
|
||||
line = client.readStringUntil('\n');
|
||||
doc.clear();
|
||||
deserializeJson(doc, line);
|
||||
Serial.print("doc size: "); Serial.println(doc.size());
|
||||
String job_id = String((const char*) doc["params"][0]);
|
||||
String prevhash = String((const char*) doc["params"][1]);
|
||||
String coinb1 = String((const char*) doc["params"][2]);
|
||||
String coinb2 = String((const char*) doc["params"][3]);
|
||||
JsonArray merkle_branch = doc["params"][4];
|
||||
String version = String((const char*) doc["params"][5]);
|
||||
String nbits = String((const char*) doc["params"][6]);
|
||||
String ntime = String((const char*) doc["params"][7]);
|
||||
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());
|
||||
@ -202,6 +201,8 @@ void runWorker(void *name) {
|
||||
doc.garbageCollect();
|
||||
continue;
|
||||
}
|
||||
isMinerSuscribed=true;
|
||||
}
|
||||
|
||||
// STEP 2: Pool authorize work (Block Info)
|
||||
id = getNextId(id);
|
||||
@ -212,9 +213,22 @@ void runWorker(void *name) {
|
||||
Serial.print(" Sending : "); Serial.println(payload);
|
||||
client.print(payload);
|
||||
line = client.readStringUntil('\n');
|
||||
if(!verifyPayload(line)) return;
|
||||
if(!verifyPayload(&line)) continue;
|
||||
Serial.print(" Receiving: "); Serial.println(line);
|
||||
client.stop();
|
||||
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n'));
|
||||
Serial.print(" Receiving: "); Serial.println(client.readStringUntil('\n'));
|
||||
// client.stop();
|
||||
|
||||
deserializeJson(doc, line);
|
||||
String job_id = String((const char*) doc["params"][0]);
|
||||
String prevhash = String((const char*) doc["params"][1]);
|
||||
String coinb1 = String((const char*) doc["params"][2]);
|
||||
String coinb2 = String((const char*) doc["params"][3]);
|
||||
JsonArray merkle_branch = doc["params"][4];
|
||||
String version = String((const char*) doc["params"][5]);
|
||||
String nbits = String((const char*) doc["params"][6]);
|
||||
String ntime = String((const char*) doc["params"][7]);
|
||||
bool clean_jobs = doc["params"][8]; //bool
|
||||
|
||||
#ifdef DEBUG_MINING
|
||||
Serial.print(" job_id: "); Serial.println(job_id);
|
||||
@ -228,14 +242,11 @@ void runWorker(void *name) {
|
||||
Serial.print(" clean_jobs: "); Serial.println(clean_jobs);
|
||||
#endif
|
||||
//Check if parameters where correctly received
|
||||
if((job_id.length() == 0)||(prevhash.length() == 0)||(coinb2.length() == 0)||(ntime.length() == 0)) {
|
||||
Serial.println(">>>>>>>>> Worker aborted");
|
||||
client.stop();
|
||||
doc.clear();
|
||||
if (checkError(doc)) {
|
||||
Serial.printf("[WORKER] %s >>>>>>>>> Work aborted\n", (char *)name);
|
||||
continue;
|
||||
}
|
||||
|
||||
doc.clear();
|
||||
templates++;
|
||||
|
||||
// calculate target - target = (nbits[2:]+'00'*(int(nbits[:2],16) - 3)).zfill(64)
|
||||
@ -456,19 +467,6 @@ void runWorker(void *name) {
|
||||
while(true) {
|
||||
memcpy(bytearray_blockheader + 77, &nonce, 3);
|
||||
|
||||
// double sha
|
||||
// Sin midstate
|
||||
/*mbedtls_sha256_starts_ret(&ctx,0);
|
||||
mbedtls_sha256_update_ret(&ctx, bytearray_blockheader, 80);
|
||||
mbedtls_sha256_finish_ret(&ctx, interResult);
|
||||
|
||||
mbedtls_sha256_starts_ret(&ctx,0);
|
||||
mbedtls_sha256_update_ret(&ctx, interResult, 32);
|
||||
mbedtls_sha256_finish_ret(&ctx, shaResult);
|
||||
for (size_t i = 0; i < 32; i++)
|
||||
Serial.printf("%02x", shaResult[i]);
|
||||
Serial.println("");*/
|
||||
|
||||
//Con midstate
|
||||
// Primer SHA-256
|
||||
mbedtls_sha256_clone(&ctx, midstate); //Clonamos el contexto anterior para continuar el SHA desde allí
|
||||
@ -487,12 +485,10 @@ void runWorker(void *name) {
|
||||
if (nonce++> TARGET_NONCE) break; //exit
|
||||
|
||||
// check if 16bit share
|
||||
if(hash[31]!=0) continue;
|
||||
if(hash[30]!=0) continue;
|
||||
if(hash[31] !=0 || hash[30] !=0) continue;
|
||||
halfshares++;
|
||||
// check if 32bit share
|
||||
if(hash[29]!=0) continue;
|
||||
if(hash[28]!=0) continue;
|
||||
if(hash[29] !=0 || hash[28] !=0) continue;
|
||||
shares++;
|
||||
|
||||
// check if valid header
|
||||
@ -601,14 +597,14 @@ void runMiner(void) {
|
||||
|
||||
void runMonitor() {
|
||||
|
||||
Serial.println("[MONITOR] started");
|
||||
// Serial.println("[MONITOR] started");
|
||||
|
||||
unsigned long mStart = millis();
|
||||
while(1){
|
||||
|
||||
//while(1){
|
||||
background.pushImage(0, 0, MinerWidth, MinerHeight, MinerScreen);
|
||||
|
||||
unsigned long mElapsed = millis()-mStart;
|
||||
unsigned long totalKHashes = (Mhashes*1000) + hashes/1000;
|
||||
unsigned long totalKHashes = (Mhashes*1000) + hashes/1000 - totalKHashes;
|
||||
//Serial.println("[runMonitor Task] -> Printing results on screen ");
|
||||
|
||||
// Serial.printf(">>> Completed %d share(s), %d Khashes, avg. hashrate %.3f KH/s\n",
|
||||
@ -655,5 +651,5 @@ void runMonitor() {
|
||||
|
||||
// Pause the task for 5000ms
|
||||
// vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user