|
@@ 285-291 (lines=7) @@
|
| 282 |
|
|
| 283 |
|
// Stratum supported blockhash solution entry |
| 284 |
|
$stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution = ? LIMIT 1"); |
| 285 |
|
if ($this->checkStmt($stmt) && $stmt->bind_param('s', $aBlock['hash']) && $stmt->execute() && $result = $stmt->get_result()) { |
| 286 |
|
$this->oUpstream = $result->fetch_object(); |
| 287 |
|
$this->share_type = 'stratum_blockhash'; |
| 288 |
|
if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) |
| 289 |
|
return true; |
| 290 |
|
} |
| 291 |
|
|
| 292 |
|
// Stratum scrypt hash check |
| 293 |
|
$scrypt_hash = swapEndian(bin2hex(Scrypt::calc($header_bin, $header_bin, 1024, 1, 1, 32))); |
| 294 |
|
$stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution = ? LIMIT 1"); |
|
@@ 295-301 (lines=7) @@
|
| 292 |
|
// Stratum scrypt hash check |
| 293 |
|
$scrypt_hash = swapEndian(bin2hex(Scrypt::calc($header_bin, $header_bin, 1024, 1, 1, 32))); |
| 294 |
|
$stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution = ? LIMIT 1"); |
| 295 |
|
if ($this->checkStmt($stmt) && $stmt->bind_param('s', $scrypt_hash) && $stmt->execute() && $result = $stmt->get_result()) { |
| 296 |
|
$this->oUpstream = $result->fetch_object(); |
| 297 |
|
$this->share_type = 'stratum_solution'; |
| 298 |
|
if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) |
| 299 |
|
return true; |
| 300 |
|
} |
| 301 |
|
|
| 302 |
|
// Failed to fetch via startum solution, try pushpoold |
| 303 |
|
// Fallback to pushpoold solution type |
| 304 |
|
$ppheader = sprintf('%08d', $aBlock['version']) . word_reverse($aBlock['previousblockhash']) . word_reverse($aBlock['merkleroot']) . dechex($aBlock['time']) . $aBlock['bits'] . dechex($aBlock['nonce']); |
|
@@ 306-312 (lines=7) @@
|
| 303 |
|
// Fallback to pushpoold solution type |
| 304 |
|
$ppheader = sprintf('%08d', $aBlock['version']) . word_reverse($aBlock['previousblockhash']) . word_reverse($aBlock['merkleroot']) . dechex($aBlock['time']) . $aBlock['bits'] . dechex($aBlock['nonce']); |
| 305 |
|
$stmt = $this->mysqli->prepare("SELECT SUBSTRING_INDEX( `username` , '.', 1 ) AS account, username as worker, id FROM $this->table WHERE solution LIKE CONCAT(?, '%') LIMIT 1"); |
| 306 |
|
if ($this->checkStmt($stmt) && $stmt->bind_param('s', $ppheader) && $stmt->execute() && $result = $stmt->get_result()) { |
| 307 |
|
$this->oUpstream = $result->fetch_object(); |
| 308 |
|
$this->share_type = 'pp_solution'; |
| 309 |
|
if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) |
| 310 |
|
return true; |
| 311 |
|
} |
| 312 |
|
|
| 313 |
|
// Still no match, try upstream result with timerange |
| 314 |
|
$stmt = $this->mysqli->prepare(" |
| 315 |
|
SELECT |
|
@@ 323-329 (lines=7) @@
|
| 320 |
|
AND UNIX_TIMESTAMP(time) >= ? |
| 321 |
|
AND UNIX_TIMESTAMP(time) <= ( ? + 60 ) |
| 322 |
|
ORDER BY id ASC LIMIT 1"); |
| 323 |
|
if ($this->checkStmt($stmt) && $stmt->bind_param('iii', $last, $aBlock['time'], $aBlock['time']) && $stmt->execute() && $result = $stmt->get_result()) { |
| 324 |
|
$this->oUpstream = $result->fetch_object(); |
| 325 |
|
$this->share_type = 'upstream_share'; |
| 326 |
|
if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) |
| 327 |
|
return true; |
| 328 |
|
} |
| 329 |
|
|
| 330 |
|
// We failed again, now we take ANY result matching the timestamp |
| 331 |
|
$stmt = $this->mysqli->prepare(" |
| 332 |
|
SELECT |
|
@@ 339-345 (lines=7) @@
|
| 336 |
|
AND id > ? |
| 337 |
|
AND UNIX_TIMESTAMP(time) >= ? |
| 338 |
|
ORDER BY id ASC LIMIT 1"); |
| 339 |
|
if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $last, $aBlock['time']) && $stmt->execute() && $result = $stmt->get_result()) { |
| 340 |
|
$this->oUpstream = $result->fetch_object(); |
| 341 |
|
$this->share_type = 'any_share'; |
| 342 |
|
if (!empty($this->oUpstream->account) && !empty($this->oUpstream->worker) && is_int($this->oUpstream->id)) |
| 343 |
|
return true; |
| 344 |
|
} |
| 345 |
|
$this->setErrorMessage($this->getErrorMsg('E0052', $aBlock['height'])); |
| 346 |
|
return false; |
| 347 |
|
} |
| 348 |
|
|