btccom/btcagent

miner sessionId 类型为 uint16_t的疑问

Closed this issue · 4 comments

@SwimmingTiger
btcagent是把8 bytes的extranonce2,拆成4bytes的miner_sessionId和4bytes的miner_extranonce2,那么这里的sessionId_为什么不直接定义为uint32_t,而是定义为uint16_t,请问这里限制miner上限为65535的目的是什么呢?

void StratumSessionBitcoin::handleRequest_Subscribe(const string &idStr,
const StratumMessageBitcoin &smsg) {
if (state_ != DOWN_CONNECTED) {
responseError(idStr, StratumStatus::UNKNOWN);
return;
}
state_ = DOWN_SUBSCRIBED;
//
// params[0] = client version [optional]
// params[1] = session id of pool [optional]
//
// client request eg.:
// {"id": 1, "method": "mining.subscribe", "params": ["bfgminer/4.4.0-32-gac4e9b3", "01ad557d"]}
//
string minerAgent;
if (!smsg.parseMiningSubscribe(minerAgent)) {
minerAgent = "unknown";
}
// 30 is max length for miner agent
minerAgent_ = minerAgent.substr(0, 30);
//
// Response:
//
// result[0] = 2-tuple with name of subscribed notification and subscription ID.
// Theoretically it may be used for unsubscribing, but obviously miners won't use it.
// result[1] = ExtraNonce1, used for building the coinbase.
// result[2] = Extranonce2_size, the number of bytes that the miner users for its ExtraNonce2 counter
//
assert(kExtraNonce2Size_ == 4);
const uint32_t extraNonce1 = (uint32_t)sessionId_;
const string s = Strings::Format("{\"id\":%s,\"result\":[[[\"mining.set_difficulty\",\"%08x\"]"
",[\"mining.notify\",\"%08x\"]],\"%08x\",%d],\"error\":null}\n",
idStr.c_str(), extraNonce1, extraNonce1,
extraNonce1, kExtraNonce2Size_);
sendData(s);
}

每个上行连接超过1万台矿机,我估计上行连接会受不了。除非改变架构,自动增加上行连接,否则增加下行连接没有太大的意义。

@SwimmingTiger
明白了,现在up session是5个,最大127?(这个限制跟魔法数字0x7f有什么关系吗?),所以限制down session最大为6w,如果扩展up session的话,理论上单agent是不是就可以不受限了,当然pool测也要配合修改 agent sessionId -> uint32_t

0x7f只是用来识别agent二进制消息的,就像JSON对象以{开头,agent二进制消息以0x7f开头。

pool侧不需要修改也可以,因为上行连接的session id都是独立的。所以连接a和连接b可以有不同的session id,互不影响。

所以,只要把session id分配器由一个改成多个,每个上行连接一个,就可以实现扩展了。

其实目前已经可以实现这种方案了,就是在linux里用同一配置文件启动多个agent进程。它们会监听在相同端口,Linux会通过SO_REUSEPORT机制进行负载均衡,总客户端数量可以超过6万个。

@YihaoPeng
好的,谢谢