Seal it. Nobody reads it early -- not even you, not a custodian, not me.
NexEth encrypts a payload so it can only be opened at or after a moment you choose. Release is gated by a real drand threshold signature, verified on chain via the EIP-2537 BLS12-381 precompiles, against a public key pinned at deployment. The contract trusts a pairing check -- nothing and no one else.
A payload, in the clear. Any file.
Three small pieces. The chain enforces the one that matters.
The registry stores hashes and gates a boolean. The verifier checks a pairing equation. Everything else -- encryption, key sealing, watching for rounds -- happens off chain, because none of it needs to be trusted.
submitRound(round, signature) hashes the round to G1 (RFC 9380), then runs the EIP-2537 pairing check on chain. Permissionless and idempotent -- anyone can submit, a repeat submission just returns early. 482,068 gas, measured on a live devnet.
createLock stores a ciphertext hash, target round, and owner -- never a secret. markReleased checks BeaconVerifier.isRoundVerified(round) and nothing else. No caller-supplied round, so one lock can't be released by another lock's evidence.
The CLI hybrid-encrypts with tlock-js and registers the lock. unseal checks on-chain state before ever contacting drand. The relayer watches LockCreated events and submits rounds unattended -- or you can always submit one yourself.
Working prototype. Every number below is measured, not projected.
Run for real against a live 4-validator Besu QBFT devnet and the real drand quicknet network -- not simulated, not mocked, including a full end-to-end demo. See the worked example below for the actual run, verbatim.
A real run. Nothing here is staged.
Copied verbatim from an actual terminal, against the live devnet, with nexeth-relayer running unattended in the background. Click through the steps.
$ echo "Board meeting minutes unlock at 15:00 UTC." > payload.txt $ cat payload.txt Board meeting minutes unlock at 15:00 UTC.
There's no such thing as timed-release encryption with zero trust. The real question is what kind of trust to accept.
Some schemes try to lock a message using a math puzzle that simply takes time to solve, no key required. It sounds trustless, but it isn't: better hardware solves the puzzle faster than expected, and a future quantum computer breaks the puzzle outright. Either way, you're quietly trusting that nobody out there has hardware you didn't plan for. Every timed-release scheme ends up trusting something.
Drand (pronounced “dee-rand,” short for distributed randomness) makes that trust visible instead of hidden through its threshold beacon. It publishes a fresh, publicly verifiable value every few seconds, and producing each one takes a known group of operators combining their pieces of a shared key -- no single operator can make one alone, and no single one can block one either. That is a very different bet than a stranger's unverifiable hardware. It isn't immune to future quantum computers either -- but if it's ever broken, everyone can see who was responsible. A silent hardware edge never tells you when it happened.
On a permissioned consortium chain, that trust is usually already in place: the people running the network are already known and already bound by contract, for reasons that have nothing to do with this. This prototype exists to show that actually works, not just that it should.
- Agreed clockEvery node agrees on the block timestamp. “The time has come” is something the network confirms together -- not a claim made by whoever happens to run a service.
- Immutable audit trailWhen a lock is created and when it's released are both written on chain, along with a hash of the sealed content -- anyone can check the record later.
- An enforcement pointA smart contract checks the beacon's signature itself. Whoever submits it is just a messenger, not an authority -- they can hold a message back, but they can't fake it, backdate it, or release it early.
Explicitly out of scope
Not built (yet)
- An HTTP API or authentication layer
- Persistence beyond what the demo needs
- A consumer callback pattern
- Key rotation
- Any threshold committee of our own
- Production version (no demo)
Non-negotiable
- No code path releases a lock without a verified on-chain signature
- No plaintext or key material ever touches chain state
- No secret ever appears in a log or error message
- These hold regardless of flags -- there is no override
Interested in any of the above? Propose it on GitHub -- issues and pull requests are welcome.
