diff --git a/stratum/client.cpp b/stratum/client.cpp index 0ce11cf..455ffbf 100644 --- a/stratum/client.cpp +++ b/stratum/client.cpp @@ -122,6 +122,7 @@ bool client_validate_user_address(YAAMP_CLIENT *client) // debuglog("user %s testing on coin %s ...\n", client->username, coind->symbol); if(!coind_can_mine(coind)) continue; if(coind->pos) continue; + if(strlen(g_current_algo->name) && strcmp(g_current_algo->name, coind->algo)) continue; if(coind_validate_user_address(coind, client->username)) { debuglog("new user %s for coin %s\n", client->username, coind->symbol); client->coinid = coind->id; @@ -139,14 +140,25 @@ bool client_validate_user_address(YAAMP_CLIENT *client) } YAAMP_COIND *coind = (YAAMP_COIND *)object_find(&g_list_coind, client->coinid); - if(!coind) { - clientlog(client, "unable to find wallet for coinid %d...", client->coinid); + if (!coind) { + clientlog(client, "unable to find the wallet for coinid %d...", client->coinid); return false; + } else { + if(g_current_algo && strlen(g_current_algo->name) && strcmp(g_current_algo->name, coind->algo)) { + clientlog(client, "%s address is on the wrong coin %s, reset to auto...", client->username, coind->symbol); + client->coinid = 0; + CommonLock(&g_db_mutex); + db_init_user_coinid(g_db, client); + CommonUnlock(&g_db_mutex); + return false; + } } bool isvalid = coind_validate_user_address(coind, client->username); if (isvalid) { client->coinid = coind->id; + } else { + clientlog(client, "unable to verify %s address for user coinid %d...", coind->symbol, client->coinid); } return isvalid; } @@ -196,9 +208,8 @@ bool client_authorize(YAAMP_CLIENT *client, json_value *json_params) debuglog("new client %s, %s, %s\n", client->username, client->password, client->version); #endif -#ifdef NO_EXCHANGE // when auto exchange is disabled, only authorize good wallet address... - if (!client_validate_user_address(client)) { + if (!g_autoexchange && !client_validate_user_address(client)) { clientlog(client, "bad mining address %s", client->username); client_send_result(client, "false"); @@ -209,7 +220,6 @@ bool client_authorize(YAAMP_CLIENT *client, json_value *json_params) return false; } -#endif client_send_result(client, "true"); client_send_difficulty(client, client->difficulty_actual); diff --git a/stratum/client_submit.cpp b/stratum/client_submit.cpp index 0860947..c59e150 100644 --- a/stratum/client_submit.cpp +++ b/stratum/client_submit.cpp @@ -63,6 +63,9 @@ void client_do_submit(YAAMP_CLIENT *client, YAAMP_JOB *job, YAAMP_JOB_VALUES *su if(!templ->auxs[i]) continue; YAAMP_COIND *coind_aux = templ->auxs[i]->coind; + if(!coind_aux || !strcmp(coind->symbol, coind_aux->symbol2)) + continue; + unsigned char target_aux[1024]; binlify(target_aux, coind_aux->aux.target); diff --git a/stratum/coind.h b/stratum/coind.h index 9e3c6ef..c86d121 100644 --- a/stratum/coind.h +++ b/stratum/coind.h @@ -26,7 +26,9 @@ public: // bool closing; char name[1024]; - char symbol[1024]; + char symbol[256]; + char symbol2[256]; + char algo[256]; char wallet[1024]; char pubkey[1024]; diff --git a/stratum/coind_template.cpp b/stratum/coind_template.cpp index 08c0126..a3a07e5 100644 --- a/stratum/coind_template.cpp +++ b/stratum/coind_template.cpp @@ -151,6 +151,16 @@ YAAMP_JOB_TEMPLATE *coind_create_template(YAAMP_COIND *coind) if (strcmp(coind->symbol, "DRP")) // not in Dropcoin strcpy(templ->flags, json_get_string(json_coinbaseaux, "flags")); + // temporary hack, until wallet is fixed... + if (!strcmp(coind->symbol, "MBL")) { // MBL: chainid in version + unsigned int nVersion = (unsigned int)json_get_int(json_result, "version"); + if (nVersion & 0xFFFF0000UL == 0) { + nVersion |= (0x16UL << 16); + debuglog("%s version %s >> %08x\n", coind->symbol, templ->version, nVersion); + } + sprintf(templ->version, "%08x", nVersion); + } + // debuglog("%s ntime %s\n", coind->symbol, templ->ntime); // uint64_t target = decode_compact(json_get_string(json_result, "bits")); // coind->difficulty = target_to_diff(target); diff --git a/stratum/db.cpp b/stratum/db.cpp index e47ee31..4852ba2 100644 --- a/stratum/db.cpp +++ b/stratum/db.cpp @@ -141,7 +141,7 @@ void db_update_coinds(YAAMP_DB *db) db_query(db, "select id, name, rpchost, rpcport, rpcuser, rpcpasswd, rpcencoding, master_wallet, reward, price, "\ "hassubmitblock, txmessage, enable, auto_ready, algo, pool_ttf, charity_address, charity_amount, charity_percent, "\ - "reward_mul, symbol, auxpow, actual_ttf, network_ttf, usememorypool, hasmasternodes "\ + "reward_mul, symbol, auxpow, actual_ttf, network_ttf, usememorypool, hasmasternodes, algo, symbol2 "\ "from coins where enable and auto_ready and algo='%s' order by index_avg", g_stratum_algo); MYSQL_RES *result = mysql_store_result(&db->mysql); @@ -207,6 +207,9 @@ void db_update_coinds(YAAMP_DB *db) if(row[24]) coind->usememorypool = atoi(row[24]); if(row[25]) coind->hasmasternodes = atoi(row[25]); + if(row[26]) strcpy(coind->algo, row[26]); + if(row[27]) strcpy(coind->symbol2, row[27]); // if pool + aux, prevent double submit + //////////////////////////////////////////////////////////////////////////////////////////////////// coind->touch = true; diff --git a/stratum/job.cpp b/stratum/job.cpp index 05b6e9b..0efddfa 100644 --- a/stratum/job.cpp +++ b/stratum/job.cpp @@ -18,13 +18,11 @@ static bool job_assign_client(YAAMP_JOB *job, YAAMP_CLIENT *client, double maxha RETURN_ON_CONDITION(client_find_job_history(client, job->id), true); RETURN_ON_CONDITION(maxhash > 0 && job->speed + client->speed > maxhash, true); -#ifdef NO_EXCHANGE - if(maxhash >= 0. && client->coinid != job->coind->id) { + if(!g_autoexchange && maxhash >= 0. && client->coinid != job->coind->id) { //debuglog("prevent client %c on %s, not the right coin\n", // client->username[0], job->coind->symbol); - return false; + return true; } -#endif if(job->remote) { @@ -184,6 +182,7 @@ void job_assign_clients(YAAMP_JOB *job, double maxhash) void job_assign_clients_left(double factor) { + bool b; for(CLI li = g_list_coind.first; li; li = li->next) { if(!job_has_free_client()) return; @@ -198,13 +197,19 @@ void job_assign_clients_left(double factor) for(CLI li = g_list_client.first; li; li = li->next) { YAAMP_CLIENT *client = (YAAMP_CLIENT *)li->data; -#ifdef NO_EXCHANGE - debuglog("%s factor %f=>100 nethash %f\n", coind->symbol, factor, nethash); - if (client->coinid == coind->id) - factor = 100; -#endif - bool b = job_assign_client(coind->job, client, nethash*factor); - if(!b) break; + if (!g_autoexchange) { + if (client->coinid == coind->id) + factor = 100.; + else + factor = 0.; + } + + //debuglog("%s %s factor %f nethash %.3f\n", coind->symbol, client->username, factor, nethash); + + if (factor > 0.) { + b = job_assign_client(coind->job, client, nethash*factor); + if(!b) break; + } } g_list_client.Leave(); diff --git a/stratum/stratum.cpp b/stratum/stratum.cpp index e5a5ece..81f9657 100644 --- a/stratum/stratum.cpp +++ b/stratum/stratum.cpp @@ -30,6 +30,7 @@ double g_stratum_difficulty; int g_stratum_max_ttf; bool g_stratum_reconnect; bool g_stratum_renting; +bool g_autoexchange = true; time_t g_last_broadcasted = 0; YAAMP_DB *g_db = NULL; @@ -146,6 +147,11 @@ int main(int argc, char **argv) initlog(argv[1]); +#ifdef NO_EXCHANGE + // todo: init with a db setting or a yiimp shell command + g_autoexchange = false; +#endif + char configfile[1024]; sprintf(configfile, "%s.conf", argv[1]); diff --git a/stratum/stratum.h b/stratum/stratum.h index 114d8e4..7203ef8 100644 --- a/stratum/stratum.h +++ b/stratum/stratum.h @@ -106,6 +106,8 @@ extern YAAMP_DB *g_db; extern YAAMP_ALGO g_algos[]; extern YAAMP_ALGO *g_current_algo; +extern bool g_autoexchange; + ///////////////////////////////////////////////////////////////////////////////////////// YAAMP_ALGO *stratum_find_algo(const char *name); diff --git a/stratum/user.cpp b/stratum/user.cpp index a58e611..e173ce6 100644 --- a/stratum/user.cpp +++ b/stratum/user.cpp @@ -122,7 +122,13 @@ void db_update_workers(YAAMP_DB *db) void db_init_user_coinid(YAAMP_DB *db, YAAMP_CLIENT *client) { - db_query(db, "UPDATE accounts SET coinid=%d WHERE id=%d AND IFNULL(coinid,0) = 0", - client->coinid, client->userid); + if (!client->userid) + return; + + if (!client->coinid) + db_query(db, "UPDATE accounts SET coinid=NULL WHERE id=%d", client->userid); + else + db_query(db, "UPDATE accounts SET coinid=%d WHERE id=%d AND IFNULL(coinid,0) = 0", + client->coinid, client->userid); }