一、mining.subscribe请求过程
矿机启动后,先和矿池建立TCP连接,然后向矿池发送订阅消息,消息内容如下:
{"id":1,"method":"mining.subscribe","params":[]}
矿池收到矿机的订阅消息后,响应消息内容如下:
{"id":1,"result":[[["mining.set_difficulty","01000000"],["mining.notify","01000000"]],"01000000",8],"error":null}
其中id与订阅消息中id相同。result是一个数组,它包含三部分,第一部分也是个数组其实可以为空,第二部分是extraNonce1(一般是session id),第三部分是extraNonce2的长度,一般为8字节。
二、initiate_stratum函数主要完成mining.subscribe的解析
1、sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": [\""PACKAGE"/"VERSION""STRATUM_USER_AGENT"\"]}", swork_id++);组装命令
2、_stratum_send(pool, s, strlen(s)) 向矿池发送请求mining.subscribe命令
3、接收矿池数据 sret = recv_line(pool);
4、res_val = json_object_get(val, "result");获得result中数据
5、sessionid = get_sessionid(res_val);获取session id
6、nonce1 = json_array_string(res_val, 1); 获取extraNonce2信息
7、n2size = json_integer_value(json_array_get(res_val, 2)); 获取extraNonce2的长度
8、根据解析信息初始化矿池对象的数据
pool->sessionid = sessionid;
pool->nonce1 = nonce1;
pool->n1_len = strlen(nonce1) / 2;
pool->nonce1bin = cgcalloc(pool->n1_len, 1);
hex2bin(pool->nonce1bin, pool->nonce1, pool->n1_len);
pool->n2size = n2size;
//同时设置矿池状态/初始难度信息
pool->stratum_active = true;
pool->next_diff = pool->diff_after = 0;
pool->sdiff = 1;