Track cumulative work via accounted_diff_shares, surface round effort

Total work was summing pool.Shares (ckpool's accounted_shares — raw
per-share count) and multiplying by 2^32, which is nonsense: each
share's actual difficulty was ignored, so a pool running at any
real hashrate would show a tiny number. Switch to pool.Accepted,
which ckpool exposes as accounted_diff_shares (sum of each accepted
share's difficulty in diff-1-normalized units). cumulative_shares *
2^32 is now actually total hashes.

Bump the kv key from "cumulative_shares" to "cumulative_work" so
any value saved under the old name is orphaned rather than mixed
into the new (correctly-unit'd) counter on upgrade.

Total work tile's sub-info now shows the round effort:
cumulative_shares / network_difficulty * 100. Matches ckpool's own
formula at stratifier.c:8201 for the percent-of-block display.
Drop the duplicate effort text from the Expected block tile, which
was an uptime-based approximation of the same thing.
This commit is contained in:
satoshi
2026-04-22 21:34:10 +03:00
parent 64ca14435c
commit cbea202929
2 changed files with 28 additions and 16 deletions
+12 -9
View File
@@ -26,11 +26,14 @@
return expectedBlockSeconds(data.hashrate_hs_1m, data.network_hashrate_hs, diff);
});
const effort = $derived.by(() => {
if (!isFinite(expected) || expected <= 0) return 0;
const uptime = data.uptime_seconds;
if (!uptime || uptime <= 0) return 0;
return (uptime / expected) * 100;
// Round effort: share of the expected work-to-find-a-block that the
// pool has already submitted, at the current network difficulty.
// Matches ckpool's own accounted_diff_shares / network_diff * 100
// (stratifier.c:8201).
const roundEffort = $derived.by(() => {
const d = data.chain?.difficulty ?? 0;
if (!d || d <= 0) return 0;
return (data.cumulative_shares / d) * 100;
});
// Blocks remaining + ETA until the retarget. The predicted adjustment
@@ -121,15 +124,15 @@
<div class="card">
<div class="stat-label">Total work</div>
<div class="stat-value">{formatWork(totalHashes)}</div>
<div class="stat-sub">hashes submitted by pool</div>
<div class="stat-sub">
round effort {roundEffort.toFixed(1)}% of current difficulty
</div>
</div>
<div class="card">
<div class="stat-label">Expected block</div>
<div class="stat-value">{formatDuration(expected)}</div>
<div class="stat-sub">
effort {effort.toFixed(1)}% · uptime {formatUptime(data.uptime_seconds)}
</div>
<div class="stat-sub">uptime {formatUptime(data.uptime_seconds)}</div>
</div>
<div class="card">