| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -381,7 +381,7 @@ struct txntable { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						UT_hash_handle hh; | 
					 | 
					 | 
					 | 
						UT_hash_handle hh; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int id; | 
					 | 
					 | 
					 | 
						int id; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						char hash[68]; | 
					 | 
					 | 
					 | 
						char hash[68]; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						const char *data; | 
					 | 
					 | 
					 | 
						char *data; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						int refcount; | 
					 | 
					 | 
					 | 
						int refcount; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}; | 
					 | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -1129,14 +1129,14 @@ static void add_txn(sdata_t *sdata, txntable_t **txns, const char *hash, const c | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							found = true; | 
					 | 
					 | 
					 | 
							found = true; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ck_runlock(&sdata->workbase_lock); | 
					 | 
					 | 
					 | 
						ck_runlock(&sdata->workbase_lock); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (found) | 
					 | 
					 | 
					 | 
						if (found) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return; | 
					 | 
					 | 
					 | 
							return; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						txn = ckzalloc(sizeof(txntable_t)); | 
					 | 
					 | 
					 | 
						txn = ckzalloc(sizeof(txntable_t)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						memcpy(txn->hash, hash, 65); | 
					 | 
					 | 
					 | 
						memcpy(txn->hash, hash, 65); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						/* Note that data is pointing to a string in a json struture which will
 | 
					 | 
					 | 
					 | 
						txn->data = strdup(data); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						 * be destroyed so we can only use the data value until then. */ | 
					 | 
					 | 
					 | 
						txn->refcount = 10; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						txn->data = data; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						HASH_ADD_STR(*txns, hash, txn); | 
					 | 
					 | 
					 | 
						HASH_ADD_STR(*txns, hash, txn); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -1266,6 +1266,7 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if (tmp->refcount--) | 
					 | 
					 | 
					 | 
							if (tmp->refcount--) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								continue; | 
					 | 
					 | 
					 | 
								continue; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							HASH_DEL(sdata->txns, tmp); | 
					 | 
					 | 
					 | 
							HASH_DEL(sdata->txns, tmp); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							dealloc(tmp->data); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							dealloc(tmp); | 
					 | 
					 | 
					 | 
							dealloc(tmp); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							purged++; | 
					 | 
					 | 
					 | 
							purged++; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -1278,9 +1279,6 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							/* Move to the sdata transaction table */ | 
					 | 
					 | 
					 | 
							/* Move to the sdata transaction table */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							HASH_DEL(txns, tmp); | 
					 | 
					 | 
					 | 
							HASH_DEL(txns, tmp); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							HASH_ADD_STR(sdata->txns, hash, tmp); | 
					 | 
					 | 
					 | 
							HASH_ADD_STR(sdata->txns, hash, tmp); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							/* Empty data once used to not dereference since the json structure
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							 * will be destroyed. */ | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							tmp->data = NULL; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							added++; | 
					 | 
					 | 
					 | 
							added++; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ck_wunlock(&sdata->workbase_lock); | 
					 | 
					 | 
					 | 
						ck_wunlock(&sdata->workbase_lock); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -5723,7 +5721,33 @@ static void init_client(sdata_t *sdata, const stratum_instance_t *client, const | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						stratum_send_update(sdata, client_id, true); | 
					 | 
					 | 
					 | 
						stratum_send_update(sdata, client_id, true); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void *set_node_latency(void *arg) | 
					 | 
					 | 
					 | 
					/* When a node first connects it has no transactions so we have to send all
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 * current ones to it. */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					static void send_node_all_txns(sdata_t *sdata, const stratum_instance_t *client) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						json_t *txn_array, *val, *txn_val; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						txntable_t *txn, *tmp; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						smsg_t *msg; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						txn_array = json_array(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						ck_rlock(&sdata->workbase_lock); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						HASH_ITER(hh, sdata->txns, txn, tmp) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							JSON_CPACK(txn_val, "{ss,ss}", "hash", txn->hash, "data", txn->data); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							json_array_append_new(txn_array, txn_val); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						ck_runlock(&sdata->workbase_lock); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						JSON_CPACK(val, "{ss,so}", "node.method", stratum_msgs[SM_TRANSACTIONS], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							   "transaction", txn_array); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						msg = ckzalloc(sizeof(smsg_t)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						msg->json_msg = val; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						msg->client_id = client->id; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						ckmsgq_add(sdata->ssends, msg); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						LOGNOTICE("Sending new node client %"PRId64" all transactions", client->id); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					static void *setup_node(void *arg) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					{ | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						stratum_instance_t *client = (stratum_instance_t *)arg; | 
					 | 
					 | 
					 | 
						stratum_instance_t *client = (stratum_instance_t *)arg; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -5732,6 +5756,8 @@ static void *set_node_latency(void *arg) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						client->latency = round_trip(client->address) / 2; | 
					 | 
					 | 
					 | 
						client->latency = round_trip(client->address) / 2; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						LOGNOTICE("Node client %"PRId64" %s latency set to %dms", client->id, | 
					 | 
					 | 
					 | 
						LOGNOTICE("Node client %"PRId64" %s latency set to %dms", client->id, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							  client->address, client->latency); | 
					 | 
					 | 
					 | 
							  client->address, client->latency); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						sleep(5); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						send_node_all_txns(client->sdata, client); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						dec_instance_ref(client->sdata, client); | 
					 | 
					 | 
					 | 
						dec_instance_ref(client->sdata, client); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return NULL; | 
					 | 
					 | 
					 | 
						return NULL; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -5753,7 +5779,7 @@ static void add_mining_node(ckpool_t *ckp, sdata_t *sdata, stratum_instance_t *c | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						LOGWARNING("Added client %"PRId64" %s as mining node on server %d:%s", client->id, | 
					 | 
					 | 
					 | 
						LOGWARNING("Added client %"PRId64" %s as mining node on server %d:%s", client->id, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							   client->address, client->server, ckp->serverurl[client->server]); | 
					 | 
					 | 
					 | 
							   client->address, client->server, ckp->serverurl[client->server]); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						create_pthread(&pth, set_node_latency, client); | 
					 | 
					 | 
					 | 
						create_pthread(&pth, setup_node, client); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void add_remote_server(sdata_t *sdata, stratum_instance_t *client) | 
					 | 
					 | 
					 | 
					static void add_remote_server(sdata_t *sdata, stratum_instance_t *client) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -6223,7 +6249,7 @@ static void add_node_txns(sdata_t *sdata, const json_t *val) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ck_wunlock(&sdata->workbase_lock); | 
					 | 
					 | 
					 | 
						ck_wunlock(&sdata->workbase_lock); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						LOGINFO("Stratifier added %d node transactions", added); | 
					 | 
					 | 
					 | 
						LOGNOTICE("Stratifier added %d node transactions", added); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Entered with client holding ref count */ | 
					 | 
					 | 
					 | 
					/* Entered with client holding ref count */ | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |