stratum: reduce defines, prepare the autoexchange variable

also improve the user wallet addresses checks

and allow to mine aux coins in normal (gbt) + aux at the same time
This commit is contained in:
Tanguy Pruvot 2015-09-26 06:50:51 +02:00
parent edd36ad5f9
commit 9d4c4d41c7
9 changed files with 67 additions and 20 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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];

View file

@ -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);

View file

@ -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;

View file

@ -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();

View file

@ -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]);

View file

@ -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);

View file

@ -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);
}