Skip to content

The pool is the only witness to what your rig did.

That is true at every mining pool, including this one. It is the thing the Glass Ledger exists to end.

Your rig guesses numbers against a target. The pool hands them out, collects the results and decides what counted. A short count and bad luck look identical from where you are standing, and you hold no second copy of anything.

So we write one. Once an hour the Bitcoin pool signs, for every rig, what it counted from it; and each time a new block appears, how fast fresh work went out. Below are the newest receipts, exactly as we signed them.

Pick a receipt on the left. The card says what it records in plain words; the bytes we signed sit one click below it.

latest block
—
fresh work out · typical
—
fresh work out · slowest 1 in 20
—
receipts loaded
0
seqrecordwent out

Paste the address your rigs mine to and your receipts load here. Until then the bench shows one sample receipt, which nobody signed.
Receipt 4831 · samplesample · unsigned

A sample receipt

A sample line that nobody signed, so you can see the shape of a receipt before you give an address.

The bytes we signed
Sample payload · 31 bytes
4831|custody.hash|3600s|2209481
SHA-256 of these bytes · the seal
································································
Signature
none — a sample line, signed by nobody
sample · not signed

Hashed in your browser. This page does not check the signature. That is the one step you should not let us do for you. The key is published below, and the offline verifier is not released yet.

Nothing is stored on our side by looking. The address is the lookup key, and it is the same one your rigs already send us.

Three things get a receipt

Each covers something specific, and each says plainly what it does not cover. Receipts are written per rig, per window of time. They are not written per share, and we will not describe them that way.

counted · custody.hash

Counted

For each of your rigs, each window, we sign what we counted from it. If that rig reports its own hashrate, the receipt carries the gap between the two figures, and only when the gap is wider than ordinary statistical noise does it say so.

We are not going to call noise a loss.

fresh work · custody.time

Useful

Work goes stale the moment somebody else finds a block. Each time we notice a new tip quickly, we sign how fast fresh work went out to you.

The occasional tip we catch only by polling gets no receipt. It would not be honest to sign for a speed we did not achieve.

block found · custody.block

Conserved

The moment a block is won here, a receipt records it going out to every node we reach, and names the coinbase transaction that pays you. Look that transaction up on any block explorer and you see the address for yourself.

It records a block after a rig finds one. It says nothing about when that happens: difficulty sets the odds, the same at every pool.

What is not finished

The offline verifier is not released yet, so the check still runs through this site. The public repository holds the licence and the readme, not the source.

Every receipt above was written by us. So what stops us from writing a different one later?

Change one digit and the seal breaks.

A receipt is a short line of text. Its seal is a 64-character fingerprint of those exact bytes, and our signature is written over the seal.

Try changing one digit below and watch the seal change. That is how you can tell a receipt was not altered after we signed it: the seal either matches or it does not.

receipt
4831 · sample
signed
by nobody · a sample line
Every digit below is a button. Change one and watch which of the 64 characters of the seal move.
|custody.hash|s|
One bar per character of the seal. A bar rises if that character moved on the last edit.
0 / 64 moved
································································
the sample, as written

Computed in your browser over a sample line nobody signed. Give the bench above your address and this becomes one of your receipts.

No edited receipt keeps its seal, and nobody can work backwards from a seal to a number that would fit it.

The seal stops a number from being changed quietly. The signature stops the changed number from being re-issued. Anyone can recompute a seal; only the key holder can sign one.

A receipt cannot make you win. It stops a short count from hiding behind bad luck.

What this does not do

Nothing here improves your odds. Difficulty is set by the network and is the same everywhere. Solo mining is a lottery. Expected time is an average, not a date. Lower difficulty means a shorter wait, not more value.

One key, published once

Copy it the first time you look. Every receipt after that either verifies against it or it does not, and our word stops being part of the answer.

Show the key
Authority pubkey · hex · NexusPool ref-miner
124797e8bc0ec89ed60b77c30e1770c624407f72659dc97aa4c4fd7d9377106c
Authority pubkey · base58check · standard SV2 clients
9amd6GUzTaGXASESCa75c9Rx3vWYihRyLUAE3Vrmqwgm3T9jtxN

BIP340 Schnorr over sequence, type and payload. Procedure at docs/audit.

Every receipt above carries our signature, and a key we hold could sign a different past. What follows takes that option away from us.

Then Bitcoin keeps the time.

Once an hour, every receipt signed since the last hour is folded into one 32-byte root, and that root is written into Bitcoin through OpenTimestamps. From then on a receipt cannot be changed, dropped or dated backwards without breaking a root that Bitcoin already holds.

Pick an hour, or keep the receipt you chose above. The page shows where it stands: created, sealed, in Bitcoin.

hours anchored
—
receipts under a root
—
latest bitcoin block
—
next anchor in
—
hour · utcreceiptsbitcoin

Reading the anchors…

One anchor per hour, newest first. Every anchor stays fetchable by id.

Pick an hour to read its anchor.

Have a receipt of your own?
Every step of the arithmetic
is a receipt in it? · the walk from a receipt to a block
  1. Your receiptnone on the walk yetGive the bench above your address and pick a receipt, or paste one.
waiting for a receipt
Check it yourself, off this site

Take the proof with you

Two files per hour: the proof itself and the anchor, which lists every leaf under the root. Together with your receipt they check anywhere. The script below does it with nothing but Python, and the OpenTimestamps client reads the proof file as it is.

python, nothing elseA 200-line script with no dependencies. It rebuilds the leaf and the root, reads the proof, and with --online asks an explorer for the block.
python3 np-anchor-verify.py nexuspool-receipt-<seq>.json nexuspool-<anchor id>.json --online
np-anchor-verify.py
the opentimestamps clientThe proof is the standard file. info prints the root and the attestations; verify checks the block against your own node.
pip install opentimestamps-client
ots info nexuspool-<anchor id>.ots
ots verify -d <root> nexuspool-<anchor id>.ots
curlThe same two files, from the command line. -OJ keeps the name the pool gives the proof.
curl -OJ 'https://nexuspool.io/api/custody-anchor.ots?id=%3Canchor%20id%3E'
curl -o nexuspool-<anchor id>.json 'https://nexuspool.io/api/custody-anchor?id=%3Canchor%20id%3E'
What an anchor does not do

It does not check the signature; the key above does that. It proves that a receipt existed before one Bitcoin block and has not been altered since. Until that block exists the anchor is pending: the calendars hold the root and have promised to include it, and the page says so rather than guessing.

Catching up

The pool anchors its history in batches, oldest first, so the newest receipts join an anchor within a day of the first one. When a receipt is still waiting, the page says so instead of guessing.

A receipt covers the work we counted. The rest of the path, from a new block to the coinbase that pays you, has its own checks:

Glass Ledger: a signed receipt for the work we counted · NexusPool