|  |  |  | @ -247,6 +247,14 @@ static void generate_coinbase(ckpool_t *ckp, workbase_t *wb) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void stratum_broadcast_update(bool clean); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void clear_workbase(workbase_t *wb) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	free(wb->flags); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(wb->txn_data); | 
			
		
	
		
			
				
					|  |  |  |  | 	json_decref(wb->merkle_array); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(wb); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* This function assumes it will only receive a valid json gbt base template
 | 
			
		
	
		
			
				
					|  |  |  |  |  * since checking should have been done earlier, and creates the base template | 
			
		
	
		
			
				
					|  |  |  |  |  * for generating work templates. */ | 
			
		
	
	
		
			
				
					|  |  |  | @ -305,8 +313,10 @@ static void update_base(ckpool_t *ckp) | 
			
		
	
		
			
				
					|  |  |  |  | 	sprintf(wb->idstring, "%08x", wb->id); | 
			
		
	
		
			
				
					|  |  |  |  | 	HASH_ITER(hh, workbases, tmp, tmpa) { | 
			
		
	
		
			
				
					|  |  |  |  | 		/*  Age old workbases older than 10 minutes old */ | 
			
		
	
		
			
				
					|  |  |  |  | 		if (tmp->gentime < wb->gentime - 600) | 
			
		
	
		
			
				
					|  |  |  |  | 		if (tmp->gentime < wb->gentime - 600) { | 
			
		
	
		
			
				
					|  |  |  |  | 			HASH_DEL(workbases, tmp); | 
			
		
	
		
			
				
					|  |  |  |  | 			clear_workbase(tmp); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	HASH_ADD_INT(workbases, id, wb); | 
			
		
	
		
			
				
					|  |  |  |  | 	current_workbase = wb; | 
			
		
	
	
		
			
				
					|  |  |  | @ -614,7 +624,52 @@ out: | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static json_t *parse_submit(stratum_instance_t *client, json_t *params_val, json_t **err_val) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	return json_boolean(true); | 
			
		
	
		
			
				
					|  |  |  |  | 	const char *user, *job_id, *nonce2, *ntime, *nonce; | 
			
		
	
		
			
				
					|  |  |  |  | 	bool ret = false; | 
			
		
	
		
			
				
					|  |  |  |  | 	int wb_id; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!json_is_array(params_val))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("params not an array"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(json_array_size(params_val) != 5)) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("Invalid array size"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	user = json_string_value(json_array_get(params_val, 0)); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!user || !strlen(user))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("No username"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	job_id = json_string_value(json_array_get(params_val, 1)); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!job_id || !strlen(job_id))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("No job_id"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	nonce2 = json_string_value(json_array_get(params_val, 2)); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!nonce2 || !strlen(nonce2))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("No nonce2"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	ntime = json_string_value(json_array_get(params_val, 3)); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!ntime || !strlen(ntime))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("No ntime"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	nonce = json_string_value(json_array_get(params_val, 4)); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely(!nonce || !strlen(nonce))) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("No nonce"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	if (strcmp(user, client->workername)) { | 
			
		
	
		
			
				
					|  |  |  |  | 		*err_val = json_string("Worker mismatch"); | 
			
		
	
		
			
				
					|  |  |  |  | 		goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	sscanf(job_id, "%08x", &wb_id); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	ret = true; | 
			
		
	
		
			
				
					|  |  |  |  | out: | 
			
		
	
		
			
				
					|  |  |  |  | 	return json_boolean(ret); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* We should have already determined all the values passed to this are valid
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |