Every Arkognito record’s payload is a small JSON envelope around the app’s own data:
The signature
sig is the one-time owner’s EIP-191 signature over:
canonicalAttributes is a deterministic encoding of the record’s on-chain attributes. Because the
signature covers the data, the attributes, the lifetime and the encryption flag, a relayer that
changes any of them, or hands the record to a different owner, produces a record whose signature no
longer recovers to $owner. Anyone can check this with verifyRecord().
A reader also checks that the record’s on-chain lifetime ($expiresAt - $createdAt) matches exp
within 30 blocks, so a relayer cannot quietly shorten or extend a record.
Fixed sizes and lifetimes
- Size: the envelope is padded to exactly 512, 1024, 4096 or 16384 bytes. The bucket is chosen
as if the payload were encrypted, so encrypted and plain records of the same input are the same
size. Records larger than 16 KB are refused.
- Lifetime: rounded up to 1 hour, 1 day, 7 days, 30 days or 90 days. Longer is refused.
Odd sizes and odd lifetimes would otherwise act as fingerprints. See
fingerprinting.
The exact byte layout is in the protocol reference. Last modified on October 12, 2026