Documentation

NornNames (NNS)

NornNames is Norn's native consensus-level name system -- an ENS-like identity layer mapping human-readable names to owner addresses. Names are included in WeaveBlocks and propagate to all nodes via P2P gossip, making them globally visible across the network.

NNS supports name transfers, reverse resolution, and name records (avatar, url, description, twitter, github, email, discord).

Naming Rules

RuleConstraint
Length3--32 characters
Character setLowercase ASCII letters (a-z), digits (0-9), hyphens (-)
HyphensMust not start or end with a hyphen
UniquenessGlobally unique, first-come first-served

Valid names: alice, bob-42, my-validator, norn-relay-1

Invalid names: ab (too short), -alice (leading hyphen), bob- (trailing hyphen), Alice (uppercase), my name (spaces)

Registration Cost

Registering a NornName costs 1 NORN, which is permanently burned (debited from the registrant, not credited to anyone), reducing the circulating supply. Name transfers are free.

CLI Usage

Registration and Resolution

# Register a NornName for the active wallet
norn wallet register-name --name alice
 
# Resolve a NornName to its owner address
norn wallet resolve --name alice
 
# List names owned by the active wallet
norn wallet names

Name Transfers

Name owners can transfer their names to any address:

# Transfer a name to another address
norn wallet transfer-name --name alice --to 0x<ADDRESS>

The transfer is signed by the current owner and included in the next block. The recipient does not need to sign or accept -- ownership updates immediately upon block confirmation.

Reverse Resolution

Look up the primary NNS name for any address:

# Reverse-resolve an address to its primary name
norn wallet reverse-name --address 0x<ADDRESS>

The primary name is the first name registered by that address. If the address has no registered names, no result is returned.

Name Records

Name owners can attach predefined text records to their names. Records are consensus-level and propagate to all nodes.

# Set a record on a name
norn wallet set-name-record --name alice --key avatar --value "https://example.com/avatar.png"
 
# Set multiple records
norn wallet set-name-record --name alice --key description --value "Builder on Norn"
norn wallet set-name-record --name alice --key twitter --value "@alice"
norn wallet set-name-record --name alice --key github --value "alice"
 
# View all records for a name
norn wallet name-records alice

Allowed Record Keys

KeyDescription
avatarProfile image URL
urlWebsite URL
descriptionShort bio or description
twitterTwitter/X handle
githubGitHub username
emailContact email
discordDiscord handle

Constraints

RuleLimit
Max value length256 bytes
Max records per name16
Allowed keysavatar, url, description, twitter, github, email, discord

Using Names in Transfers

Names work seamlessly as transfer recipients. Pass a NornName instead of a hex address:

norn wallet send --to alice --amount 10

The wallet resolves alice to the owner's address via norn_resolveName before constructing the transfer.

RPC Methods

MethodParametersReturnsAuth
norn_registerNamehex (hex-encoded borsh NameRegistration)SubmitResultYes
norn_resolveNamename (string)Option<NameResolution>No
norn_getNamesByOwneraddress (hex)Vec<NameInfo>No
norn_transferNamename, from_hex, transfer_hexSubmitResultYes
norn_reverseNameaddress_hexOption<String>No
norn_setNameRecordname, key, value, owner_hex, update_hexSubmitResultYes
norn_getNameRecordsnameHashMap<String, String>No

TypeScript SDK

import {
  Wallet,
  NornClient,
  buildNameRegistration,
  buildNameTransfer,
  buildNameRecordUpdate,
} from "@norn-protocol/sdk";
 
const wallet = Wallet.fromPrivateKeyHex("abcd1234...");
const client = new NornClient({ url: "https://seed.norn.network" });
 
// Register a name
const regHex = buildNameRegistration(wallet, "alice");
await client.registerName("alice", wallet.addressHex, regHex);
 
// Transfer a name
const transferHex = buildNameTransfer(wallet, { name: "alice", to: "0xrecipient..." });
await client.transferName("alice", wallet.addressHex, transferHex);
 
// Reverse-resolve an address
const name = await client.reverseName("0xaddress...");
 
// Set a name record
const recordHex = buildNameRecordUpdate(wallet, {
  name: "alice",
  key: "avatar",
  value: "https://example.com/avatar.png",
});
await client.setNameRecord("alice", "avatar", "https://example.com/avatar.png", wallet.addressHex, recordHex);
 
// Get all records for a name
const records = await client.getNameRecords("alice");

Explorer

The Norn Explorer displays NNS data:

  • Address pages show the primary NNS name and any attached records
  • Block detail pages show name transfers and name record updates alongside other block activity
  • Name resolution is used throughout to display human-readable names where available