Skip to main content
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