@@ -189,7 +189,8 @@ void SessionIDManager::freeSessionId(const uint16_t sessionId) {
189189
190190// /////////////////////////////// StratumMessage //////////////////////////////
191191StratumMessage::StratumMessage (const string &content):
192- content_(content), isStringId_(false ), r_(0 ), diff_(0 ) {
192+ content_(content), isStringId_(false ), r_(0 ), diff_(0 ),
193+ versionMask_(0 ), hasVersionMask_(false ) {
193194 parse ();
194195}
195196StratumMessage::~StratumMessage () {
@@ -240,7 +241,7 @@ void StratumMessage::_parseMiningSubmit() {
240241 // [Worker Name, Job ID, ExtraNonce2(hex), nTime(hex), nonce(hex)]
241242 //
242243 if (jsoneq (&t_[i], " params" ) == 0 && t_[i+1 ].type == JSMN_ARRAY && t_[i+1 ].size >= 5 ) {
243- bool hasVersionMask = t_[i+1 ].size >= 6 ;
244+ hasVersionMask_ = t_[i+1 ].size >= 6 ;
244245
245246 i++; // ptr move to params
246247 i++; // ptr move to params[0]
@@ -254,7 +255,7 @@ void StratumMessage::_parseMiningSubmit() {
254255 // nonce(hex)
255256 share_.nonce_ = (uint32_t )strtoul (getJsonStr (&t_[i+4 ]).c_str (), NULL , 16 );
256257
257- if (hasVersionMask ) {
258+ if (hasVersionMask_ ) {
258259 // versionMask(hex)
259260 share_.versionMask_ = (uint32_t )strtoul (getJsonStr (&t_[i+5 ]).c_str (), NULL , 16 );
260261 }
@@ -905,7 +906,8 @@ StratumSession::StratumSession(const int8_t upSessionIdx,
905906 struct bufferevent *bev, StratumServer *server,
906907 struct in_addr saddr)
907908: state_(DOWN_CONNECTED), minerAgent_(NULL ), upSessionIdx_(upSessionIdx),
908- sessionId_(sessionId), bev_(bev), server_(server), saddr_(saddr)
909+ sessionId_(sessionId), bev_(bev), server_(server), saddr_(saddr),
910+ versionRollingShareCounter_(0 )
909911{
910912 inBuf_ = evbuffer_new ();
911913 assert (inBuf_ != NULL );
@@ -1061,13 +1063,13 @@ void StratumSession::handleRequest_Authorize(const string &idStr,
10611063 // eg. {"params": ["slush.miner1", "password"], "id": 2, "method": "mining.authorize"}
10621064 //
10631065
1064- string workerName, fullWorkerName ;
1065- if (!smsg.parseMiningAuthorize (fullWorkerName )) {
1066+ string workerName;
1067+ if (!smsg.parseMiningAuthorize (fullWorkerName_ )) {
10661068 responseError (idStr, StratumError::INVALID_USERNAME);
10671069 return ;
10681070 }
10691071
1070- workerName = getWorkerName (fullWorkerName ); // split by '.'
1072+ workerName = getWorkerName (fullWorkerName_ ); // split by '.'
10711073 if (workerName.empty ())
10721074 workerName = DEFAULT_WORKER_NAME;
10731075
@@ -1147,6 +1149,27 @@ void StratumSession::handleRequest_Submit(const string &idStr,
11471149 server_->submitShare (share, this );
11481150
11491151 responseTrue (idStr); // we assume shares are valid
1152+
1153+ if (smsg.hasVersionMask ()) {
1154+ versionRollingShareCounter_++;
1155+ }
1156+ else if (versionRollingShareCounter_ > 100 ) {
1157+ // Version rolling disabled mid-way, it may be a firmware issue.
1158+ // Reconnect to avoid loss of hashrate.
1159+ const string s = " {\" id\" :null,\" method\" :\" client.reconnect\" ,\" params\" :[]}\n " ;
1160+ sendData (s);
1161+
1162+ // get source IP address
1163+ char saddrBuffer[INET_ADDRSTRLEN];
1164+ evutil_inet_ntop (AF_INET, &saddr_, saddrBuffer, INET_ADDRSTRLEN);
1165+
1166+ LOG (INFO) << " version rolling disabled mid-way, send client.reconnect. "
1167+ << " worker: " << fullWorkerName_
1168+ << " , ip: " << saddrBuffer
1169+ << " , version rolling shares: " << versionRollingShareCounter_
1170+ << std::endl;
1171+ }
1172+
11501173}
11511174
11521175
0 commit comments