Browse Source

Update stratum mining.capabilities method to use a single Object for all parameters

Luke Dashjr 11 years ago
parent
commit
5265ba5d69
2 changed files with 11 additions and 9 deletions
  1. 3 6
      driver-stratum.c
  2. 8 3
      util.c

+ 3 - 6
driver-stratum.c

@@ -442,14 +442,11 @@ void stratumsrv_mining_capabilities(struct bufferevent * const bev, json_t * con
 	conn->capabilities = 0;
 	
 	json_t * const caps = (json_array_size(params) < 1) ? NULL : json_array_get(params, 0);
-	if (caps && (!json_is_null(caps)) && json_is_array(caps))
+	if (caps && (!json_is_null(caps)) && json_is_object(caps))
 	{
-		for (size_t i = json_array_size(caps); i-- > 0; )
+		for (void *iter = json_object_iter(caps); iter; iter = json_object_iter_next(caps, iter))
 		{
-			json_t * const j = json_array_get(caps, i);
-			if (!json_is_string(j))
-				continue;
-			const char * const s = json_string_value(j);
+			const char * const s = json_object_iter_key(iter);
 			if (!strcasecmp(s, "notify"))
 				conn->capabilities |= SCC_NOTIFY;
 			else

+ 8 - 3
util.c

@@ -3278,10 +3278,15 @@ resend:
 	if (uri_get_param_bool(pool->rpc_url, "goalreset", false))
 	{
 		// Default: ["notify", "set_difficulty"] (but these must be explicit if mining.capabilities is used)
-		sprintf(s, "{\"id\":null,\"method\":\"mining.capabilities\",\"params\":[[\"notify\",\"set_difficulty\",\"set_goal\"]");
+		snprintf(s, sizeof(s), "{\"id\":null,\"method\":\"mining.capabilities\",\"params\":[{\"notify\":[],\"set_difficulty\":{},\"set_goal\":[],\"malgo\":{");
+		struct mining_algorithm *malgo;
+		LL_FOREACH(mining_algorithms, malgo)
+		{
+			tailsprintf(s, sizeof(s), "\"%s\":{}%c", malgo->name, malgo->next ? ',' : '}');
+		}
 		if (request_target_str)
-			tailsprintf(s, sizeof(s), ", {\"suggested_target\":\"%s\"}", request_target_str);
-		tailsprintf(s, sizeof(s), "]}");
+			tailsprintf(s, sizeof(s), ",\"suggested_target\":\"%s\"", request_target_str);
+		tailsprintf(s, sizeof(s), "}]}");
 		_stratum_send(pool, s, strlen(s), true);
 	}