Build with VerusID

VerusID is a self-sovereign identity system built into the Verus blockchain. Every identity is a full-featured on-chain object with recoverable keys, encrypted storage, and protocol-level authentication — no smart contracts required.

What is VerusID?

A VerusID is a human-readable blockchain identity (like veruscx@) that replaces raw addresses. It's not just a name — it's a programmable container with built-in security, storage, and authentication.

👤

Human-Readable Names

Send to alice@ instead of R7yh3.... Names are unique, on-chain, and resolve to addresses automatically.

🔒

Vault Security

Lock your identity so funds can't move even if your key is stolen. Revoke and recover with separate authority keys.

🔐

Passwordless Auth

Users sign cryptographic challenges with their VerusID. No passwords to store, no OAuth provider, no credential database to leak.

📦

On-Chain Storage

Every identity has a contentmultimap — a key-value store for data. Public or encrypted, up to ~4KB per entry.

💰

Payments

Send to any VerusID name. Generate payment QR codes and deep links. Works with Verus Mobile out of the box.

🔗

Sub-IDs

Create namespaced identities under your ID. blog.alice@ or app.alice@ — each with their own keys and storage.

Login Demo Pay Demo Blog Demo Selective Disclosure All Demos

Identity Structure

Every VerusID is an on-chain object returned by getidentity. Here's what it contains:

// getidentity "veruscx@"
{
  "name": "veruscx",
  "identityaddress": "i6QEbNsGThm2JHUwpLwxSu77DwzFWvfHv6",
  "primaryaddresses": ["RAhD9vgrWZ3ALkq541xdqL2oLYEvsLNrzn"],
  "minimumsignatures": 1,
  "revocationauthority": "i6QEb...",  // can revoke access
  "recoveryauthority": "i6QEb...",   // can recover identity
  "flags": 0,                           // 0=unlocked, 2=locked
  "timelock": 0,                        // unlock delay (blocks)
  "contentmultimap": {},               // on-chain data store
  "contentmap": {}
}
FieldPurpose
nameHuman-readable identity name (unique on-chain)
primaryaddressesAddresses that can spend/sign for this identity
minimumsignaturesMulti-sig threshold (1 = single sig)
revocationauthorityIdentity that can revoke (lock) this ID. Can be self or another ID
recoveryauthorityIdentity that can recover (update keys). Can be self or another ID
flagsBit 1 = locked. When locked, no transactions can be sent
timelockMinimum block height before unlocking takes effect
contentmultimapKey-value data store (VDXF keys to arrays of values)

Content Multimap

Every VerusID has a built-in on-chain data store called the contentmultimap. It maps VDXF keys to arrays of values — each value up to ~4KB. Think of it as a blockchain-native key-value database attached to your identity.

Writing data

Data is written via updateidentity. Values are typically hex-encoded JSON stored under a VDXF key.

# Store data in your identity
DATA=$(echo -n '{"type":"post","title":"Hello"}' | xxd -p | tr -d '\n')

./verus updateidentity '{
  "name": "yourname",
  "parent": "iParentIdHere",
  "contentmultimap": {
    "iVDXFKeyHere": ["'$DATA'"]
  }
}'

Reading data

Read via getidentity and decode the hex values. From a browser, call the public RPC:

const resp = await fetch('https://api.verus.services', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '1.0', id: '1',
    method: 'getidentity',
    params: ['veruscx@']
  })
});
const { result } = await resp.json();
const cmm = result.identity.contentmultimap;
// Decode hex values: hex → bytes → UTF-8 → JSON

Encryption

Data can be encrypted using Verus's built-in Sapling (zk-SNARK) addresses. Encrypt with signdata using an encrypttoaddress parameter, then store the encrypted descriptor in the contentmultimap. Decrypt with decryptdata — only the holder of the z-address private key can read it.

This enables selective disclosure: encrypt each field separately, share viewing keys per-field to reveal only what's needed.

Blog Demo (public data) Social Demo (tiered encryption) Selective Disclosure

Vault Security

Every VerusID has built-in security features that don't exist in normal crypto wallets.

Lock & Revoke

Lock your identity so no transactions can be sent — even if your private key is stolen. Only the revocation authority can unlock, and only after a timelock delay.

# Lock an identity
./verus updateidentity '{"name":"veruscx","flags":2}'

# Unlock (starts timelock countdown)
./verus updateidentity '{"name":"veruscx","flags":0}'

Recovery

Lost your key? Your recovery authority can update the identity to use a new primary address. Set it to yourself (self-sovereign) or a trusted party like your spouse, company, or friend.

This is impossible with Bitcoin, Ethereum, or any standard crypto wallet. With VerusID, losing your key doesn't mean losing your funds.

Timelock

Set a minimum block height before an unlock takes effect. Even if an attacker has your revocation key, they can't move funds instantly — you have time to notice and respond.

Verus Connect

verus-connect is a drop-in package for adding VerusID login and payments to any website. QR codes, deep links, and browser extension support — all handled.

Quick start

# Install
npm install github:Fried333/verus-connect
npm install git+https://github.com/VerusCoin/verusid-ts-client.git

# Configure .env
SIGNING_IADDRESS=iYourVerusIDAddress
PRIVATE_KEY=UxYourWIFPrivateKey
CALLBACK_URL=https://yoursite.com/verusidlogin

# Run (zero code)
npx verus-connect start

Or as Express middleware

const { verusAuth } = require('verus-connect/server');
app.use('/verus', verusAuth({
  iAddress: process.env.SIGNING_IADDRESS,
  privateKey: process.env.PRIVATE_KEY,
  callbackUrl: process.env.CALLBACK_URL,
}));

Endpoints

EndpointPurpose
POST /loginCreate login challenge, returns QR deep link
GET /result/:idPoll for login result
POST /pay-deeplinkGenerate payment QR — accepts name@, i-address, or R-address
POST /identity-update-requestRequest user to update their contentmultimap
GET /healthHealth check
Try Login Demo Try Pay Demo GitHub

Key RPC Methods

MethodPurpose
getidentityLook up any identity by name or i-address
updateidentityUpdate primary addresses, flags, contentmultimap, authorities
registernamecommitmentFirst step to register a new VerusID
registeridentityComplete VerusID registration
signdataSign or encrypt data with an identity (supports MMR, z-addr encryption)
decryptdataDecrypt data encrypted to a z-address
verifydataVerify a signature from an identity
signmessageSign a message with an address (used for challenges)
verifymessageVerify a signed message

Libraries

verus-typescript-primitives — Core types: LoginConsentRequest, VerusPayInvoice, TransferDestination, VDXF keys.

verusid-ts-client — VerusID interface for signing, verifying, and RPC interaction.

verus-connect — Drop-in VerusID login and payments for any website.