Language

Choose a language

Technical · Trust in Action

Trust in action: how verification caught an fp8 miner

Infographic: Trust in action: how verification caught an fp8 miner

Miners should optimise. Better kernels, tighter scheduling and better use of every watt are exactly what competition is supposed to produce. But consensus still has to distinguish faster honest work from a cheaper computation passed off as something it was not.

That line was tested on mainnet. A miner ran the committed model at fp8 on a smaller GPU, then submitted two proofs declaring the reference precision, bfloat16. Both blocks reached the network. Neither earned any work.

A precision lie, dressed up to pass

The forgery took real work. The attacker modified the miner’s source code to report a precision it wasn’t running, and had to make sure the fp8 values snapped onto the bf16 grid so the numbers would pass as genuine bf16. But that only settles the storage format — not the precision of the computation that produced them.

The proof was internally consistent too. At each of its 256 generation steps, the verifier re-derived the mandated random draw u from the committed inputs and replayed it against the miner’s submitted support. It reproduced the claimed token 256 out of 256 times for the honest control and both fp8 proofs.

That proves the token follows the submitted support. It does not prove that the support came from a bf16 forward pass.

The catch: independently recompute the model

Full verification does the decisive thing: it runs the committed model again at bf16 and compares the fresh logits with the submitted evidence.

The calibrated Mahalanobis test produces a p-value at each step. Under its honest null those p-values should be roughly uniform. For the two fp8 proofs they instead piled up at zero:

ProofSteps with p < 0.05Steps with p < 0.001
Block 1173 / 256155 / 256
Block 2105 / 25687 / 256

Per-step Mahalanobis p-values for both fp8 blocks pile up at p≈0 under an independent bf16 replay.

The recomputation also exposed large changes in the submitted top-50 support order. This rank_error is the aggregate displacement of those 50 submitted tokens in the bf16 ranking — not the chosen token’s vocabulary rank. The two proofs had median displacements of 602 and 557, with worst-step values of 110,888 and 15,726. Those figures are corroborating forensics; the calibrated p-value collapse is the production detection result.

Observed top-50 support-order displacement for the two fp8 proofs under an independent bf16 recomputation.

Both blocks were marked RED and assigned zero work. They appear as orphans, but this was not a propagation race: the chain never extended them.

The smarter attack: search in fp8, then refine in bf16

The attack that happened was direct precision substitution. A smarter version would try to neutralise the statistical comparison:

  1. Search cheaply in fp8 and find a desirable candidate trajectory.
  2. Recompute genuine bf16 support and logits only for that candidate.
  3. Submit the genuine bf16 values, which now pass recompute-and-compare.

This is where the sampling path matters. Each u is derived from the running context. The fp8 search consumed those draws while following the fp8 support. Replace that support with genuine bf16 evidence and the same draw can select a different token.

In a counterfactual replay, after replacing the fp8 support and logits with recomputed bf16 evidence, the recorded draws selected a different token at 62 and 69 of 256 steps. These are changed-token counts from the counterfactual, not production verdicts or an honest-versus-fp8 failure rate.

Refining an fp8 candidate to genuine bf16 values passes the statistical comparison but changes the sampled trajectory, invalidating the candidate found by the fp8 search.

Only one change is needed. A different token changes the next context; that changes the next context-derived u; the rest of the trajectory changes with it. The candidate found by the cheap fp8 search is gone.

Refinement repairs the submitted values but invalidates the trajectory the attacker searched for. To recover a valid candidate, the miner has to sample and search again under bf16, eliminating the shortcut.

Trust in action

The first attack failed because the independently recomputed values disagreed. Its obvious refinement fails because the values and the sampled trajectory must describe the same computation.

That is what trust in action means here: not trust us, but a proof anyone can recompute. Optimise everything around the work. The work itself still has to be real.

Run your own verifier. Don’t trust the proof. Check it.

Authored pseudonymously by Imosuke Takakuni.

Our mission

TensorCash turns useful AI work into open money.

Out of the potato age, as our whitepaper says…

We believe people deserve a cheaper, more efficient financial system, and fairer AI that works for everyone. TensorCash makes AI work verified and verifiable. Verification gives AI a face: proof of which model did the work, what it saw, and the rules it followed. That lets anyone confidently buy or sell AI work at the most efficient price. The result is more accessible, more sustainable AI, powering a new generation of financial systems. Today's currencies are the potatoes: antiquated, expensive to move, and trapped behind fee-takers. TensorCash is a more efficient way to move and store value — one that harnesses AI's computational power for everyone while pushing the control outward instead of concentrating it.

— Imosuke Takakuni

About us

Imosuke Takakuni is a pseudonym. The Japanese name is both a tribute to Satoshi Nakamoto and a nod to Potato Land — the parable from our whitepaper. The mission is bigger than any one contributor; it should outlast personalities and charisma. Decentralisation works for everyone, or it doesn't work at all. We want everyone to participate in TensorCash as equals.

Open the mission page →

Get involved

How to get TSC

TensorCash is not selling TSC. The project is not running a token sale, pre-sale, ICO, IDO, or official investment round. New TSC enters circulation through active mining. You can mine it, receive it peer-to-peer from someone who already has it, or run the wallet and be ready for mainnet.

TensorCash is not running an official sale. Do not send money to anyone claiming to sell official allocations.

Get involved

Run the Core wallet

The practical first step is to run TensorCash Core, create a wallet, and learn the RPC surface. Today the public guide starts with regtest so you can create addresses and move coins locally before touching mainnet funds.

Get involved

Donate

No mainnet donation address is published yet. For testing only, the TensorCash testnet address below was generated from the running Core wallet; do not send mainnet funds to it.

Get involved

Spread the word

The shortest useful explanation is: TensorCash turns useful AI work into open money. Share the mission page, the flagship whitepaper, or the Get involved page with one person who cares about cheaper financial rails, fairer AI, or open infrastructure.

TensorCash turns useful AI work into open money.

Get involved

Emission schedule

Bitcoin set the baseline: block rewards only, no discretionary minting, and an exact integer subsidy total of 20,999,999.97690000 BTC. TensorCash keeps the fixed-supply discipline and changes the release curve for a compute-mined network; the implemented recurrence ends at 21,184,153.03530240 TSC.

Supply over blocks

Total subsidy issued

Exact integer subsidy rules from Core: Bitcoin halvings against the TensorCash epoch-decay schedule, shown through the first 6,000,000 blocks.

Horizon
...
BTC @ 6M
...
TSC @ 6M
...
BTC and TSC total subsidy over block count At 6,000,000 blocks, Bitcoin has issued 20,999,999.92710000 BTC and TensorCash has issued 20,979,987.36365355 TSC under the implemented epoch-decay schedule.
Block 0
BTC supply 0 BTC
TSC supply 0 TSC
BTC: 50 BTC, 210,000-block halvings TSC: 715 TSC, 715-block epoch, reward x 3/5, capped epoch length