Build1 distinct publisher3 min readPublished
A signature only binds the bytes it covers, so a receipt carrying its verifying key in the envelope can be re-signed by anybody. The authors say an internal audit forced a dedicated key-swap test before release.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Verification of a signed receipt is two steps that get collapsed in conversation. Step one recomputes a digest over the payload bytes. Step two checks an Ed25519 signature against a public key [4]. Whether the scheme holds is decided entirely by which fields step one covers.
In ComputeLedger, according to its authors, the digest is `sha256Hex(canonicalizeToBytes(payload))`, and `publicKey` sits inside that payload rather than beside it [7][6]. The swap therefore dies at step one: a substituted key yields a different digest, the stored signature matches nothing, and `ledger verify` rejects the receipt before the signature code runs at all [8]. That early rejection is just the scope decision doing its job, a single control rather than a second one layered on top.
The failure this closes is the kind that survives review. A verifier that reads the key out of an envelope field and checks the signature against it is locally correct and passes every happy-path test [9]. It fails exactly one case: generate a fresh keypair, re-sign the same claim, submit. The authors say an internal security audit made them write that test before calling the feature done [9]. OWASP files this class under cryptographic failures rather than access control, because the primitive is fine and the scope is wrong [5].
Pinning the key answers one question: which key signed the bytes. It leaves the harder question untouched, namely whose key that is. A signature establishes that a specific byte string was signed by the holder of a specific private key, and nothing about whether that key is the one you meant to trust [10]. Putting it inside the hash removes the swap and leaves key distribution exactly where it was: you need the provider's public key over a channel that is not the receipt, plus an answer for what happens when it changes.
The load-bearing function in that expression is `canonicalizeToBytes`. There are two independently maintained implementations of the same receipt format, the npm CLI at 0.1.2 for Node 18+ and the PyPI CLI at 0.1.4 for Python 3.10+, and they now version independently instead of in lockstep [2]. That is two patch releases of drift between a signer and a verifier that different parties may be running [14]. For a Node-signed receipt to verify under the Python tool, both have to agree on field ordering and number formatting down to the byte. The write-up demonstrates key generation, a recorded receipt, and a ledger-integrity check against one binary [15]. Cross-implementation agreement is a separate exercise, and it is the one I would want published vectors for before treating a receipt as evidence in a billing dispute.
The demand argument rests on two neighbours: a multi-cloud job orchestrator at 10,463 GitHub stars and a CNCF cost-monitoring project at 6,670, both checked through the GitHub API on 2026-08-08, and neither signing a usage claim a stranger can check [12]. Added together that is 17,133 stars aimed at adjacent problems [13]. GitHub stars are a claim about someone else's workload too. They show that people want cost data. Whether any provider is willing to sign it is a separate question.
So for this format to be worth anything on your side, two things must be true that the code cannot supply: a provider willing to sign usage in it, and a key you obtained without asking the receipt for it. The dashboard problem the authors describe, one vendor's number on one vendor's stack with no third-party check [11], is a commercial problem. The field inside the hash is the part engineering can settle on its own.
Ranked by verification strength, evidence, and original report placement.
There are two independently maintained implementations of the same receipt format: computeledger-cli on npm (Node.js 18+) at 0.1.2 and computeledger-cli on PyPI (Python 3.10+) at 0.1.4 as of writing, and the two implementations now version independently rather than staying in lockstep.
A naive implementation that checks whether the signature verifies against the embedded public key looks completely correct in code review and in every happy-path test, and fails only the test that specifically swaps the key and re-signs; the authors' own security audit required that test before the feature was called done.
ComputeLedger is a provider-agnostic CLI for signing and independently verifying compute-usage receipts, published at github.com/RudrenduPaul/ComputeLedger under Apache-2.0, described in an article co-authored by Rudrendu Paul and Sourav Nandy.
A cryptographic signature does not automatically make a usage receipt unforgeable: if the signer's public key is passed alongside the signed data instead of inside it, an attacker can generate a fresh Ed25519 keypair, re-sign the same claim, and the verification check still passes.
The usage record, covering GPU-hours, hardware and duration, is signed with Ed25519, the same signature scheme used in SSH, TLS 1.3 and the Signal protocol, per Bernstein et al., High-speed high-security signatures.
The authors place this failure under OWASP Top 10:2021 A02, Cryptographic Failures, rather than injection or access control, on the grounds that the crypto is not broken but is applied to the wrong scope.
Distinct publishers with included, body-backed reporting in this cluster.
Follow any of these and your For You feed starts watching them — no settings page required.
build
Your meter now runs on someone else's machine: signed receipts, fsync, and failing open1 distinct publisher
build
Microsoft ships an MIT-licensed agent kernel: policy rings, Ed25519 identity, kill switch1 distinct publisher
build
Signed receipts on MCP tool calls: 20 lines buys you evidence, not trust1 distinct publisher
build
France's e-invoicing deadline is really a bill for supplier data nobody verified1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One authored account, one quotable function
The central technical claim is the only one that does not need trust: hashPayload is quoted body-and-comment, and the repo is public under Apache-2.0, so anyone can confirm the public key really is inside the hashed scope. Everything ringing around it — the registry versions, the audit that supposedly demanded a key-swap test, the promised end-to-end transcripts, two adjacent projects cited by star count but never by name — comes from the same two authors on dev.to with nothing attached to check it against.
Two 0.1.x publishes, no named user
The whole uptake record is a pair of registry entries — 0.1.2 on npm, 0.1.4 on PyPI — with no download figures, no provider emitting these receipts, and nobody outside the two authors described as running the binary. The 17,133 stars in the piece belong to other people's projects and measure appetite for the problem, not adoption of this answer.
Honest about the fix, stretched about the gap
Credit where it is due: the authors say outright that hashing an identity field into the signed scope is not a novel technique, which is the kind of sentence marketing copy deletes. The overreach sits at the edges. A CLI with two 0.1.x releases is cast as the missing portable record for multi-cloud GPU usage, and the argument stops one step short of its own logic — folding the key into the signed bytes defeats swap-and-re-sign only for a verifier who already knows which key to expect. Without that out-of-band step, an attacker can mint a keypair, hash it in alongside the claim, and produce a receipt that verifies cleanly.
Authors reviewing their own security work
Paul and Nandy built ComputeLedger and wrote the account of ComputeLedger, on a platform where the writer is also the editor. The audit story does double duty as credibility and as a product claim — 'our audit made us prove the field was where it needed to be' — with no artefact behind it. Even the competitive framing routes through them: the two projects said to prove demand while failing to solve the problem go unnamed, so the only comparison offered cannot be contested.
Checkable in public, unchecked here
Middling, and for a specific reason: the most useful part of the story is the easiest to confirm — one function, one comment, a public Apache-2.0 repository — while the parts that would normally want a second voice are process and market assertions. Nobody has corroborated any of it, and the sole publisher is the one the authors picked.