Cellula.id: `.cell` names on CKB, with the contracts public and reproducible

Cellula.id,.cell is a naming protocol on CKB, live on mainnet since 21 September. A name is one live cell under a fixed type script; its records ride in the witness and the cell commits to their
hash. The product story, why a name here can be paid in ways an ENS name cannot, is on Scryve: A name you can be paid at | Scryve .

The type script cannot check a signature

account-cell-type verifies no signature and has no code that could. Every account cell sits
under a uniform always-success lock, so the type script is the only guardian, and it runs on
inputs and outputs alike. Ownership is a lock hash in the cell’s data. An owner action
(edit, delegate, transfer, sell) is proven by spending, in the same transaction, a cell under
that lock. Which algorithm that lock runs is the lock’s business.

Two things fall out of that:

  • Every lock CKB has works today, and every lock CKB gets later works without a release from us. JoyID, secp256k1, OmniLock, a passkey.
  • A name can be owned by sphincs-all-in-one-lock today. We ran the whole loop countless times: transfer to a SPHINCS+ owner, delegate an everyday manager, edit from the manager, transfer back. The contract was not changed for it; the app grew a screen. The footnote belongs in the same paragraph: on mainnet that lock is a type-id cell under a multisig that is not ours, so the resolver fingerprints the deployed code every ten minutes and the app refuses to protect a name while the fingerprint differs.

The other way to support many wallets is a verifier per scheme compiled into the script. We put that question in the lock, where the cell model already answers it, so nothing on our side has to grow when a new wallet appears

Registration is permissionless, and the predecessor cannot be harmed

Names are kept unique by a ring: registering x spends the predecessor cell and recreates it
pointing at x. The predecessor belongs to someone else, so a stranger has to be able to
spend it. The type script allows exactly that and nothing else: on register the predecessor
is preserved byte for byte except its next pointer, and its capacity may not shrink. Whoever
drives the transaction can splice in a well-formed name and can do nothing to the neighbour,
which is why no signature is asked of them. Genesis is gated by a one-time token whose type
hash is the namespace id, because a type script cannot see global state.

The arithmetic a percentage fee cannot survive

1% of 100 CKB is 1 CKB. No cell can be 1 CKB, because a cell holds its own bytes, and ours is
63 of them. A small fee is not small here; it is impossible. So the sale lock charges nothing
under 630 CKB, a flat cell up to 6,300, and 1% above. The same reasoning is why the fee in the
contract is a ceiling and not an oracle: a separate price cell may discount it, by at most a
sixteenth every six hours, within a band the contract enforces, and nothing can charge above
the schedule. The keeper that steps it is one key that can move the factor a sixteenth
either way, once every six hours, and never above the ceiling.

What is public, and what is not

What we would like from here

  • It is live on mainnet, at cellula.id.
  • Tell us what a wallet needs in order to resolve a name.
  • If you run a resolver, say so. A second one anywhere is a full one.

Questions answered here, same day.

5 Likes

Congrats on the launch, and thanks for publishing the contracts together with the decision records!

One that stood out to me is Decided: the audited upstream lock, watched (2026-09-11). Data hash vs. type hash (whether to pin a dependency’s exact bytes or follow its type id) is a choice unique (read: innovation!) to CKB that every builder faces sooner or later, and it deserves to be taken seriously. Following the type id while watching the deployed code’s hash is a well-considered trade-off: a third way beyond the obvious either/or. Hats off to all the thinking behind the scenes.

The new patterns, decisions, and pitfalls shared are really valuable. Thanks for adding new Common Knowledge!

3 Likes

Your insights are very astute! Wisely pointing out the critical thinking involved by the team.

1 Like

I sincerely appreciate this forum for sharing new concepts and ideas. Nervos Network is built on solid technical foundation. Developers are starting to utilize the technology at the front end of crypto adoption. We need more of this type of thinking /projects and it is happening.

2 Likes

Thanks, Jan. The watcher behind that decision is public, MIT, in cells-resolver/src/lockwatch.ts, for anyone who wants to watch a type id the same way. And thank you for adding .cell to ckbadger so quickly. Cheers.