Repository navigation
Expand file tree
/
Copy pathslice.html
More file actions
766 lines (727 loc) · 37.9 KB
/
Copy pathslice.html
File metadata and controls
766 lines (727 loc) · 37.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SLICE — Fair, transparent, verifiable miner payouts | DMND</title>
<meta name="description" content="SLICE is DMND's payout system for Stratum V2. It splits block rewards into subsidy (paid by PPLNS on hashrate) and fees (paid by PPLNS + Job Declaration scoring) — so miners are rewarded for the value of the block they build, not just the work.">
<meta property="og:title" content="SLICE — Fair, transparent, verifiable miner payouts">
<meta property="og:description" content="A mining pool payout system built for Stratum V2. Comparable variance to PPLNS with fairer fee attribution, none of FPPS's insurance overhead, and fully compatible with miner-built block templates.">
<meta property="og:image" content="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-1-block-reward-split.png">
<meta property="og:url" content="https://www.dmnd.work/slice.html">
<meta property="og:type" content="article">
<meta name="twitter:card" content="summary_large_image">
<link rel="canonical" href="https://www.dmnd.work/slice.html">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0A0A0F;
--bg-elevated: #14141C;
--bg-card: #1A1A24;
--border: #26262F;
--text: #F5F5F7;
--text-dim: #A0A0AC;
--text-muted: #6C6C78;
--accent: #E23744;
--accent-dim: #B62A34;
--success: #2A9D8F;
--warning: #F4A261;
--info: #457B9D;
--max-width: 1200px;
--content-width: 720px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; scroll-padding-top: 80px; }
body {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.7;
font-size: 17px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
img { max-width: 100%; height: auto; display: block; }
code {
font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
font-size: 0.9em;
background: var(--bg-card);
padding: 2px 6px;
border-radius: 4px;
border: 1px solid var(--border);
}
/* Top nav */
nav.top {
position: sticky;
top: 0;
z-index: 100;
background: rgba(10, 10, 15, 0.85);
backdrop-filter: saturate(180%) blur(10px);
-webkit-backdrop-filter: saturate(180%) blur(10px);
border-bottom: 1px solid var(--border);
}
nav.top .inner {
max-width: var(--max-width);
margin: 0 auto;
padding: 16px 32px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
nav.top .brand {
font-weight: 800;
font-size: 18px;
letter-spacing: -0.01em;
color: var(--text);
}
nav.top .brand span { color: var(--accent); }
nav.top .links { display: flex; gap: 28px; align-items: center; }
nav.top .links a { color: var(--text-dim); font-size: 14px; font-weight: 500; }
nav.top .links a:hover { color: var(--text); text-decoration: none; }
nav.top .cta {
padding: 8px 18px;
background: var(--accent);
color: #fff;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
}
nav.top .cta:hover { background: var(--accent-dim); text-decoration: none; }
/* Hero */
header.hero {
padding: 80px 32px 60px;
text-align: center;
border-bottom: 1px solid var(--border);
background:
radial-gradient(ellipse 60% 40% at 50% 0%, rgba(226, 55, 68, 0.12), transparent 70%),
var(--bg);
}
header.hero .eyebrow {
display: inline-block;
padding: 6px 14px;
background: rgba(226, 55, 68, 0.12);
color: var(--accent);
border: 1px solid rgba(226, 55, 68, 0.3);
border-radius: 100px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.02em;
margin-bottom: 24px;
}
header.hero h1 {
font-size: clamp(40px, 6vw, 72px);
font-weight: 800;
letter-spacing: -0.03em;
line-height: 1.05;
margin-bottom: 20px;
background: linear-gradient(180deg, #fff 0%, #A0A0AC 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
header.hero .subtitle {
font-size: clamp(18px, 2.2vw, 22px);
color: var(--text-dim);
max-width: 720px;
margin: 0 auto 40px;
line-height: 1.5;
font-weight: 400;
}
header.hero .hero-cta {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 28px;
background: var(--accent);
color: #fff;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
box-shadow: 0 4px 20px rgba(226, 55, 68, 0.25);
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
header.hero .hero-cta:hover { transform: translateY(-1px); box-shadow: 0 6px 24px rgba(226, 55, 68, 0.35); text-decoration: none; }
header.hero .hero-cta.secondary {
background: transparent;
color: var(--text);
border: 1px solid var(--border);
box-shadow: none;
margin-left: 12px;
}
header.hero .hero-cta.secondary:hover { background: var(--bg-card); }
/* Layout: sticky TOC + article */
.layout {
max-width: var(--max-width);
margin: 0 auto;
display: grid;
grid-template-columns: 240px 1fr;
gap: 60px;
padding: 60px 32px 100px;
}
aside.toc {
position: sticky;
top: 100px;
height: fit-content;
max-height: calc(100vh - 120px);
overflow-y: auto;
font-size: 13px;
}
aside.toc .toc-label {
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 11px;
color: var(--text-muted);
font-weight: 600;
margin-bottom: 16px;
padding-left: 12px;
}
aside.toc ul { list-style: none; border-left: 1px solid var(--border); }
aside.toc li a {
display: block;
padding: 8px 14px;
color: var(--text-dim);
font-size: 13px;
line-height: 1.5;
margin-left: -1px;
border-left: 1px solid transparent;
transition: color 0.15s ease, border-color 0.15s ease;
}
aside.toc li a:hover { color: var(--text); text-decoration: none; }
aside.toc li a.active { color: var(--accent); border-left-color: var(--accent); }
article {
max-width: var(--content-width);
min-width: 0;
}
article > * + * { margin-top: 1.2em; }
article h2 {
font-size: 32px;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.2;
margin-top: 2.5em;
margin-bottom: 0.5em;
color: var(--text);
scroll-margin-top: 100px;
}
article h2:first-child { margin-top: 0; }
article h3 {
font-size: 22px;
font-weight: 600;
margin-top: 2em;
margin-bottom: 0.4em;
}
article p { color: var(--text-dim); }
article strong { color: var(--text); font-weight: 600; }
article em { color: var(--text); font-style: italic; }
article ul, article ol { padding-left: 24px; }
article li { color: var(--text-dim); margin-bottom: 8px; }
article li strong { color: var(--text); }
/* TL;DR card */
.tldr {
background: var(--bg-card);
border: 1px solid var(--border);
border-left: 3px solid var(--accent);
padding: 24px 28px;
border-radius: 8px;
font-size: 17px;
}
.tldr .tldr-label {
display: inline-block;
color: var(--accent);
font-weight: 700;
font-size: 12px;
letter-spacing: 0.1em;
margin-bottom: 12px;
text-transform: uppercase;
}
.tldr p { color: var(--text); margin: 0; }
/* Pull quote */
.pullquote {
margin: 32px 0;
padding: 24px 28px;
border-left: 3px solid var(--accent);
background: rgba(226, 55, 68, 0.06);
border-radius: 0 8px 8px 0;
font-size: 22px;
font-weight: 700;
letter-spacing: -0.01em;
color: var(--text);
line-height: 1.3;
}
/* Glossary */
.glossary {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
padding: 24px;
}
.glossary dt {
color: var(--accent);
font-weight: 700;
font-size: 14px;
letter-spacing: 0.02em;
margin-top: 12px;
}
.glossary dt:first-child { margin-top: 0; }
.glossary dd { color: var(--text-dim); font-size: 15px; margin-left: 0; }
/* Figures */
figure {
margin: 32px 0;
background: #fff;
border-radius: 12px;
padding: 20px;
border: 1px solid var(--border);
}
figure img { border-radius: 4px; }
figure figcaption {
margin-top: 16px;
font-size: 14px;
color: var(--text-muted);
text-align: center;
line-height: 1.5;
}
/* Comparison table */
.compare-table {
margin: 32px 0;
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
}
.compare-table table { width: 100%; border-collapse: collapse; font-size: 14px; }
.compare-table th, .compare-table td {
padding: 14px 16px;
text-align: left;
border-bottom: 1px solid var(--border);
}
.compare-table th {
background: var(--bg-card);
font-weight: 600;
color: var(--text);
font-size: 13px;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.compare-table th:first-child { color: var(--text-muted); }
.compare-table th.slice { color: var(--accent); }
.compare-table td { color: var(--text-dim); }
.compare-table td:first-child { color: var(--text); font-weight: 500; }
.compare-table td.slice { color: var(--text); background: rgba(226, 55, 68, 0.06); }
.compare-table tr:last-child td { border-bottom: none; }
/* Callout */
.callout {
background: var(--bg-elevated);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px 24px;
margin: 24px 0;
font-size: 15px;
color: var(--text-dim);
}
.callout strong { color: var(--text); }
.callout.proof { border-left: 3px solid var(--success); }
/* Worked example box */
.worked-example {
background: linear-gradient(180deg, rgba(226, 55, 68, 0.06) 0%, rgba(226, 55, 68, 0.02) 100%);
border: 1px solid rgba(226, 55, 68, 0.2);
border-radius: 12px;
padding: 28px;
margin: 32px 0;
}
.worked-example h3 { margin-top: 0; color: var(--accent); font-size: 18px; text-transform: uppercase; letter-spacing: 0.05em; }
.worked-example .example-math {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 6px;
padding: 16px 20px;
margin-top: 16px;
font-family: ui-monospace, 'SF Mono', Menlo, monospace;
font-size: 14px;
color: var(--text);
}
.worked-example .example-math .row { padding: 4px 0; }
.worked-example .example-math .comment { color: var(--text-muted); }
/* Practical points */
.practical {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin: 24px 0;
}
.practical .card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 8px;
padding: 24px;
}
.practical .card h4 {
color: var(--accent);
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 8px;
font-weight: 700;
}
.practical .card p { color: var(--text-dim); font-size: 15px; margin: 0; }
/* Final CTA */
section.final-cta {
max-width: var(--max-width);
margin: 0 auto;
padding: 80px 32px 120px;
text-align: center;
border-top: 1px solid var(--border);
background:
radial-gradient(ellipse 50% 30% at 50% 100%, rgba(226, 55, 68, 0.1), transparent 70%),
var(--bg);
}
section.final-cta h2 {
font-size: clamp(32px, 4.5vw, 56px);
font-weight: 800;
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: 20px;
}
section.final-cta p {
font-size: 18px;
color: var(--text-dim);
max-width: 640px;
margin: 0 auto 32px;
}
section.final-cta .buttons {
display: inline-flex;
gap: 12px;
flex-wrap: wrap;
justify-content: center;
}
section.final-cta a.primary {
padding: 16px 32px;
background: var(--accent);
color: #fff;
border-radius: 8px;
font-weight: 600;
font-size: 16px;
box-shadow: 0 4px 20px rgba(226, 55, 68, 0.3);
transition: transform 0.15s ease;
}
section.final-cta a.primary:hover { transform: translateY(-1px); text-decoration: none; }
section.final-cta a.secondary {
padding: 16px 32px;
background: transparent;
color: var(--text);
border: 1px solid var(--border);
border-radius: 8px;
font-weight: 600;
font-size: 16px;
}
section.final-cta a.secondary:hover { background: var(--bg-card); text-decoration: none; }
section.final-cta .whitepaper-link { margin-top: 20px; font-size: 14px; }
section.final-cta .whitepaper-link a { color: var(--text-dim); text-decoration: underline; text-decoration-color: var(--border); }
section.final-cta .whitepaper-link a:hover { color: var(--text); }
/* Footer */
footer {
max-width: var(--max-width);
margin: 0 auto;
padding: 32px;
border-top: 1px solid var(--border);
color: var(--text-muted);
font-size: 13px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
}
footer a { color: var(--text-dim); }
footer .sources { max-width: 100%; margin-top: 24px; font-size: 13px; color: var(--text-muted); line-height: 1.7; }
footer .sources a { color: var(--text-dim); text-decoration: underline; text-decoration-color: var(--border); }
footer .sources a:hover { color: var(--text); }
/* Mobile */
@media (max-width: 900px) {
.layout { grid-template-columns: 1fr; gap: 24px; padding: 40px 24px 80px; }
aside.toc { position: static; display: none; }
nav.top .links { display: none; }
nav.top .inner { padding: 14px 20px; }
header.hero { padding: 60px 24px 48px; }
.practical { grid-template-columns: 1fr; }
article h2 { font-size: 26px; }
figure { padding: 12px; }
}
</style>
</head>
<body>
<nav class="top">
<div class="inner">
<a href="/" class="brand">DMND<span>.</span></a>
<div class="links">
<a href="/">Home</a>
<a href="/slice.html">SLICE</a>
<a href="api.html">API Docs</a>
<a href="https://blog.dmnd.work/">Blog</a>
<a href="https://dashboard.dmnd.work">Login</a>
<a href="https://join.dmnd.work" class="cta">Join Now</a>
</div>
</div>
</nav>
<header class="hero">
<div class="eyebrow">Payout system — PPLNS + Job Declaration</div>
<h1>SLICE</h1>
<p class="subtitle">Fair, transparent, verifiable miner payouts — built for Stratum V2. Comparable variance to PPLNS with fairer fee attribution, none of FPPS's insurance overhead, and fully compatible with miner-built block templates.</p>
<a href="https://join.dmnd.work" class="hero-cta">Start mining with DMND →</a>
<a href="#tldr" class="hero-cta secondary">Read the explainer</a>
</header>
<div class="layout">
<aside class="toc">
<div class="toc-label">On this page</div>
<ul>
<li><a href="#tldr">TL;DR</a></li>
<li><a href="#glossary">Glossary</a></li>
<li><a href="#intro">Introduction</a></li>
<li><a href="#adapting">Adapting PPLNS to SV2</a></li>
<li><a href="#necessity">Why it's required</a></li>
<li><a href="#fair-slices">Creating fair slices</a></li>
<li><a href="#slice-size">The size of a slice</a></li>
<li><a href="#measuring">Measuring hashrate</a></li>
<li><a href="#share-treatment">How shares are treated</a></li>
<li><a href="#payouts">Payouts</a></li>
<li><a href="#example">A worked example</a></li>
<li><a href="#lifecycle">Life of a share</a></li>
<li><a href="#compare">SLICE vs FPPS vs PPLNS</a></li>
<li><a href="#practical">What this means for you</a></li>
</ul>
</aside>
<article>
<section id="tldr" class="tldr">
<div class="tldr-label">TL;DR</div>
<p>SLICE is a mining pool payout system built for Stratum V2. It splits each block reward into two parts: the <strong>subsidy</strong> is paid by classic PPLNS on hashrate alone, while the <strong>fees</strong> are paid by PPLNS with Job Declaration scoring — so miners are compensated for the <em>value</em> of the block they built, not just the work. Slicing the lookback window into short time-boxed slices removes the unfairness of comparing shares submitted hours apart.</p>
</section>
<h2 id="glossary">Glossary</h2>
<dl class="glossary">
<dt>PPLNS <span style="color: var(--text-muted); font-weight: 400;">— Pay Per Last N Shares</span></dt>
<dd>A payout method where the pool pays miners based on their share of hashrate contributed inside a rolling lookback window of the last N shares.</dd>
<dt>FPPS <span style="color: var(--text-muted); font-weight: 400;">— Full Pay Per Share</span></dt>
<dd>A payout method where the pool pays each share at a fixed rate (subsidy + expected fees), acting as an insurer that absorbs variance. Expensive to operate and centralizing.</dd>
<dt>JD <span style="color: var(--text-muted); font-weight: 400;">— Job Declaration</span></dt>
<dd>A Stratum V2 feature that lets miners construct their own block templates using their own node, instead of accepting a template pushed by the pool.</dd>
<dt>MMEV <span style="color: var(--text-muted); font-weight: 400;">— Maximum Mempool Extractable Value</span></dt>
<!-- CONFIRM (ein): denominator used in scoring — is it the best OBSERVED share in the slice (as worked example 0.4/0.5 implies), or an independently COMPUTED mempool optimum? Definition below is written to the observed-proxy reading. Flip if computed. -->
<dd>The highest total fee value a block could capture from the mempool at a given moment. True MMEV cannot be measured directly in real time, so SLICE scores each slice against the highest-fee template <em>actually observed</em> in it — an empirical proxy for MMEV within that slice.</dd>
<dt>SRI <span style="color: var(--text-muted); font-weight: 400;">— Stratum Reference Implementation</span></dt>
<dd>The FOSS reference implementation of Stratum V2.</dd>
</dl>
<h2 id="intro">Introduction</h2>
<p>DMND Pool mined the first Stratum V2 block a miner built themselves, end to end — block 955,318, on 25 June 2026. Stratum V2 is a protocol developed over the past five years by FOSS developers in the Bitcoin space, primarily the Stratum Reference Implementation (SRI) team. Its goal is to decentralize Bitcoin — specifically mining and pooled mining — by fixing the wrong turn Stratum V1 took when it shifted block template creation from miners to pool operators.</p>
<p>But decentralizing pooled mining is a <strong>two-front problem — technical and economic</strong>. Stratum V2 addresses the technical front by handing template creation back to miners. It does not touch the economic front. Full Pay Per Share (FPPS) has quietly centralized the network at the economic layer: because the pool must estimate fees and pay a fixed rate per share, it absorbs all the variance — which is expensive to run and pushes hashrate toward the few pools large enough to bankroll it. The result is that today a handful of pools decide which transactions get mined. Even with universal Stratum V2 adoption, FPPS-style incentives would still push the industry toward centralization.</p>
<p>SLICE is a mining pool payment system designed to close the economic gap. It's engineered to work alongside Stratum V2's technical design, so both centralization vectors — technical and economic — are addressed together. Fair, transparent, low variance, and aligned with decentralization.</p>
<h2 id="adapting">SLICE: adapting PPLNS to Stratum V2</h2>
<p>For a pool trying to decentralize, PPLNS is one of the best options available. It's transparent, easy to verify, cheap to operate — it's an actual payout, not an insurance product like FPPS — and it distributes rewards proportionally to hashrate contributed. That cost difference matters beyond the balance sheet: because SLICE never has to bankroll variance the way an FPPS pool does, DMND isn't pushed onto the grow-or-die treadmill that FPPS economics create. The pool's incentives stay aligned with paying miners fairly, not with getting large enough to absorb risk.</p>
<p>PPLNS assumes every miner is working on the same block template. If two miners submit equal work, they earn equal reward — because they had the same opportunity to collect transaction fees. Once miners build their own blocks, that assumption no longer holds: two miners contributing identical hashrate may be building different blocks with different fee values, and classic PPLNS has no mechanism to tell them apart. That's the Achilles heel, and it gets worse as fees become a larger share of block revenue.</p>
<p>SLICE fixes this by splitting each block reward in two:</p>
<ul>
<li><strong>Block subsidy</strong> — distributed by classic PPLNS, based purely on hashrate contributed inside the lookback window.</li>
<li><strong>Transaction fees</strong> — distributed by PPLNS <em>plus</em> Job Declaration scoring, so each share is weighted by both its hashrate and the fee value of the block it was building.</li>
</ul>
<p>Because the fee portion uses Stratum V2's Job Declarator, SLICE is also called PPLNS+JD.</p>
<div class="pullquote">Subsidy rewards work. Fees reward valuable work.</div>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-1-block-reward-split.png" alt="Block reward split: subsidy paid by classic PPLNS, fees paid by PPLNS + JD scoring" loading="lazy">
<figcaption>Block reward split: the subsidy is paid by classic PPLNS, the fees by PPLNS + JD scoring.</figcaption>
</figure>
<h2 id="necessity">Why building your own block requires template-aware payouts</h2>
<p>Building your own block doesn't just give you control — it makes a new payout system necessary. The logic is short:</p>
<ol>
<li>Classical PPLNS assumes every miner is building the same block.</li>
<li>When miners build their own blocks, that assumption breaks — different miners build blocks of different fee value.</li>
<li>Therefore a payout system must distinguish between equally difficult work done on blocks of different value — or it systematically underpays the miners building the most valuable blocks.</li>
</ol>
<p>None of those premises names a specific design. They only establish that <strong>template awareness is now required</strong>. SLICE is our answer to that requirement.</p>
<div class="callout proof">
<strong>Not theoretical.</strong> DMND has run Stratum V2 with miner-built blocks in production since block 955,318 (25 June 2026) — the first time any pool mined a block a miner built themselves, end to end. Everything below describes a system that is live, not a proposal.
</div>
<h2 id="fair-slices">Creating fair slices</h2>
<p>Splitting the reward isn't enough on its own. If we scored every share inside the lookback window against the same fee benchmark, we'd punish earlier shares for something they had no control over: fewer transactions in the mempool when they were submitted.</p>
<p>The mempool is not static. New transactions arrive constantly, often at higher fee rates than the ones already there. A share submitted at 10:00 has access to a mempool that literally could not have existed at 09:55. Scoring both against the same maximum-fee benchmark would penalise the 09:55 share for transactions that had not yet entered the mempool. In effect, it would ask miners to compete against a future they could not observe. This is the same failure mode that sank older systems like SCORE.</p>
<p>The fix is to divide the lookback window into short slices of time. Inside each slice, every share is scored against the highest-value share <em>observed in that slice</em> — the assumption being that within a short enough window, everyone had roughly the same opportunity to build a valuable template. The benchmark (our observed proxy for MMEV) keeps climbing as new high-fee transactions land, so the incentive to construct the best possible block is continuous.</p>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-3-mmev-curve.png" alt="MMEV rises over time; shares are scored against the best share in their own slice, not across the whole window" loading="lazy">
<figcaption>MMEV rises over time. Each share is scored against the best in its own slice — not across the whole window.</figcaption>
</figure>
<p>Within any single slice, that scoring looks like this — the best share sets the benchmark at 1.0 and every other share is graded against it:</p>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-4-share-normalization.png" alt="Shares normalized against the best share in the slice" loading="lazy">
<figcaption>Shares are normalized against the best share in the slice.</figcaption>
</figure>
<p>This is what makes SLICE fair not just across miners, but across time. It's the ingredient that lets Job Declaration work without punishing anyone for the clock.</p>
<h2 id="slice-size">The size of a slice</h2>
<p>A slice ends and a new one begins when either of the following happens:</p>
<ol>
<li>A new block is found — the current slice closes.</li>
<li>MMEV increases by a threshold X — the current slice closes and a new one waits until MMEV rises by another X.</li>
</ol>
<!-- CONFIRM (ein): what is X? Fixed satoshi amount / percentage of current MMEV / operator-tuned per conditions? Add a concrete definition or example here once decided. -->
<p>X is set by the pool. Smaller X means more slices, which means finer-grained fairness. Slice length is dynamic and driven by real mempool activity, not a fixed clock.</p>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-2-slice-timeline.png" alt="Slices close on new blocks or when MMEV rises by X" loading="lazy">
<figcaption>Slices close on new blocks or when MMEV rises by X.</figcaption>
</figure>
<p>Each slice contains all the shares submitted during that period. Every share has a difficulty attached, which tells the pool how much work it represents. The total difficulty across all shares is the "size" of the slice.</p>
<h2 id="measuring">A note on measuring hashrate</h2>
<div class="callout">
Hashrate is never observed directly. It is inferred statistically from valid work submitted over time — no machine, farm, pool, or even the network itself has a directly measurable hash rate. That's why every hashrate number fluctuates: it's a statistical estimate that gets better with more samples. Pools ask for many shares per minute specifically to smooth this out. <strong>Quick sanity check:</strong> compare daily blocks to network hashrate on Glassnode or Coinmetrics — they track tightly over any two-week difficulty period, then jump at the adjustment.
</div>
<h2 id="share-treatment">How SLICE treats shares</h2>
<p>Pool difficulty exists solely to regulate how often miners submit proofs of work. It's a measurement tool, not a measure of value. DMND Pool targets 6 shares per minute per client and adjusts each miner's pool difficulty dynamically to hit that rate.</p>
<p>When a miner submits a share above their pool difficulty, it's added to the current slice — but <strong>every share is valued at the pool difficulty, not at the actual difficulty of the specific share it happened to be</strong>. This matters for fairness.</p>
<p>Consider a miner who gets lucky and finds a block. Say network difficulty is around 110T, and DMND's lookback window covers 8× the network difficulty of work. If we counted the lucky share at its true difficulty, that single share would occupy an eighth of the entire window and vacuum up an eighth of all rewards — including rewards owed to other miners who did the same amount of actual work.</p>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-5-lookback-window.png" alt="Lookback window = 8× network difficulty, containing many slices, sliding forward over time" loading="lazy">
<figcaption>Lookback window = 8× the current network difficulty of work. When the boundary lands mid-slice, the whole slice is included.</figcaption>
</figure>
<div class="callout">
<strong>What this protects:</strong> valuing every share at pool difficulty — including a block-finding share — means a luckier neighbour can't capture the reward your work earned. Nobody wins a windfall at the expense of miners who did the same actual work. That's a protection SLICE gives you, not an accounting detail.
</div>
<h2 id="payouts">Payouts in SLICE</h2>
<p>DMND's lookback window is 8× the current network difficulty of work. When a block is found, the pool walks back through recent slices until the accumulated difficulty reaches that threshold.</p>
<div class="callout">
<strong>No share left behind.</strong> If the window boundary lands in the middle of a slice, the whole slice is included rather than truncated — so no share is ever orphaned by rounding. Every valid share you submit is accounted for in full.
</div>
<p>Inside the window, shares pay out under the two-track rule: <strong>subsidy by hashrate, fees by hashrate weighted by fee score within the share's slice</strong>.</p>
<h2 id="example">A worked example</h2>
<div class="worked-example">
<h3>Payout math in one slice</h3>
<p>Say a miner submits <strong>100 shares</strong> at their assigned pool difficulty during one slice. The slice contains <strong>1,000 shares</strong> total from all miners. The highest-fee share in the slice was built against a template worth <strong>0.5 BTC</strong> in fees. Our miner's shares were built against templates worth <strong>0.4 BTC</strong> on average. <span style="color: var(--text-muted);">(Figures illustrative.)</span></p>
<div class="example-math">
<div class="row"><span class="comment"># Subsidy portion — proportional to raw share count</span></div>
<div class="row">subsidy_share = 100 / 1,000 = <strong style="color: var(--warning);">10%</strong> of slice's subsidy allocation</div>
<div class="row" style="margin-top: 12px;"><span class="comment"># Fee portion — scored against the best share in the slice</span></div>
<div class="row">fee_score = 0.4 BTC / 0.5 BTC = 0.80</div>
<div class="row">fee_weighted = 100 × 0.80 = <strong style="color: var(--success);">80 effective shares</strong></div>
</div>
<p style="margin-top: 20px; color: var(--text);">Both allocations are then scaled by the slice's weight in the overall lookback window. That's the mechanic in a nutshell: <strong>subsidy rewards work, fees reward valuable work.</strong></p>
</div>
<h2 id="lifecycle">Life of a share</h2>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-7-share-lifecycle.png" alt="Life of a share: from miner submission through payout to ageing out" loading="lazy">
<figcaption>From submission through payout to ageing out.</figcaption>
</figure>
<p>Because the lookback window is 8× network difficulty, an average share stays in the window for roughly eight payout rounds before ageing out. It's not that a share is paid eight separate times — it's that the sliding window keeps including that share until enough newer work has been submitted to push it out.</p>
<figure>
<img src="https://storage.ghost.io/c/8f/fc/8ffc4c5e-fd08-45c1-9a1c-d73a3116a148/content/images/2026/08/image-6-ramp-up-down.png" alt="Ramp-up when you start mining, ramp-down when you stop — payouts lag hashrate by about 8 rounds" loading="lazy">
<figcaption>Payouts lag hashrate by about 8 rounds — both on the way in and on the way out.</figcaption>
</figure>
<div class="practical">
<div class="card">
<h4>Ramp-up</h4>
<p>When you start mining, your first payouts are smaller than the steady-state rate. It takes about eight rounds before your full contribution is reflected.</p>
</div>
<div class="card">
<h4>Ramp-down — your work keeps paying</h4>
<p>When you stop mining, your earnings don't stop with you. The shares you already contributed keep paying out as they age out of the window — you're compensated for hashrate you actually delivered, not cut off the instant you disconnect.</p>
</div>
</div>
<h2 id="compare">SLICE vs FPPS vs PPLNS</h2>
<div class="compare-table">
<table>
<thead>
<tr>
<th></th>
<th>FPPS</th>
<th>PPLNS</th>
<th class="slice">SLICE</th>
</tr>
</thead>
<tbody>
<tr>
<td>Rewards template quality</td>
<td>No</td>
<td>No</td>
<td class="slice">Yes</td>
</tr>
<tr>
<td>Independently verifiable</td>
<td>No (opaque fee assumptions)</td>
<td>Not typically (trust the pool's share count)</td>
<td class="slice">Yes — shares and scoring are published</td>
</tr>
<tr>
<td>Payout basis</td>
<td>Insurance (fixed rate per share)</td>
<td>Rolling hashrate window</td>
<td class="slice">Rolling window + fee-weighted scoring</td>
</tr>
<tr>
<td>Miner variance</td>
<td>Very low</td>
<td>Moderate</td>
<td class="slice">Comparable to PPLNS</td>
</tr>
<tr>
<td>Cost to pool</td>
<td>High (pool absorbs variance)</td>
<td>Low</td>
<td class="slice">Low</td>
</tr>
<tr>
<td>Centralization pressure</td>
<td>High</td>
<td>Low</td>
<td class="slice">Low</td>
</tr>
</tbody>
</table>
</div>
<h2 id="practical">What this means if you're mining with DMND</h2>
<p>Your first few payout rounds are a ramp-up — don't panic. When you disconnect, your payouts continue for another few rounds as your shares age out — that's your earlier work still earning, not a delay. And when you build your own block — a better template, on your own node — your fee-portion payout goes up directly. That's the incentive SLICE is built to preserve.</p>
<p>Underneath all of it is one thing FPPS pools can't offer: building your own block gives you real control — on your own node, within Bitcoin's existing consensus rules. No protocol changes, no asking permission. Block construction goes back into miners' hands, and SLICE makes sure you're paid for the value you put into it.</p>
</article>
</div>
<section class="final-cta">
<h2>Ready to mine on a pool that pays you fairly?</h2>
<p>DMND mined the first Stratum V2 block a miner built themselves, end to end — with SLICE, you get transparent payouts, low variance, and the freedom to choose the blocks you mine.</p>
<div class="buttons">
<a href="https://join.dmnd.work" class="primary">Join Now</a>
<a href="https://blog.dmnd.work/understanding-slice-pplns-jd/" class="secondary">Read the deep-dive</a>
</div>
<div class="whitepaper-link"><a href="https://www.dmnd.work/pplns-with-job-declaration/pplns-with-job-declaration.pdf">Read the PPLNS with Job Declaration whitepaper →</a></div>
</section>
<footer>
<div>© 2026 dmnd pool. all rights reserved.</div>
<div>
<a href="api.html">API Docs</a> ·
<a href="/termsofservice.html">Terms</a> ·
<a href="/privacypolicy.html">Privacy</a> ·
<a href="/responsibledisclosurepolicy.html">Responsible Disclosure</a>
</div>
<div class="sources" style="width: 100%; border-top: 1px solid var(--border); padding-top: 20px; margin-top: 12px;">
<strong style="color: var(--text-dim);">Sources:</strong>
<a href="https://www.dmnd.work/pplns-with-job-declaration/pplns-with-job-declaration.pdf">PPLNS with Job Declaration Whitepaper</a> ·
<a href="https://delvingbitcoin.org/t/pplns-with-job-declaration/1099">Delving Bitcoin discussion</a> ·
<a href="https://arxiv.org/abs/1112.4980">Rosenfeld, Analysis of Bitcoin Pooled Mining Reward Systems</a> ·
<a href="https://timroughgarden.org/papers/bitcoin.pdf">Roughgarden, Incentive Compatibility of Bitcoin Mining Pool Reward Functions</a>
</div>
</footer>
<script>
// TOC scroll-spy
const toc = document.querySelectorAll('aside.toc a');
const sections = [...toc].map(a => document.querySelector(a.getAttribute('href'))).filter(Boolean);
function updateActive() {
const scrollY = window.scrollY + 120;
let current = sections[0]?.id;
for (const s of sections) {
if (s.offsetTop <= scrollY) current = s.id;
}
toc.forEach(a => {
a.classList.toggle('active', a.getAttribute('href') === '#' + current);
});
}
window.addEventListener('scroll', updateActive, { passive: true });
updateActive();
</script>
</body>
</html>