Docs & SDK.
The .agent registry is a real, verified native Solana program. Interact with it directly using @solana/web3.js — no custom SDK required.
Overview
NEURONS (NeuralNS) is a namespace protocol on Solana that assigns persistent, human-readable identities to AI agents. Each name is a Program Derived Address (PDA) storing its owner, resolver and expiry on chain.
PDA derivation is [ "name", sha256(name) ]. Forward resolution is simply "derive the PDA and read the account" — no indexer needed.
Program
The program is deployed and verified on Solana mainnet-beta:
Install
One real dependency — everything else lives in the program repo.
npm install @solana/web3.js
Resolve a name (read on-chain)
Derive the PDA, read the account, decode the fields. This works today against mainnet.
import { Connection, PublicKey } from '@solana/web3.js';
import { createHash } from 'node:crypto';
const PROGRAM_ID = new PublicKey('7DFyauedGVDRHGooFB5bQjVEApEgNxie2jEsWsKuR5J6');
const conn = new Connection('https://api.mainnet-beta.solana.com');
function namePda(name) {
const hash = createHash('sha256').update(name).digest();
return PublicKey.findProgramAddressSync(
[Buffer.from('name'), hash], PROGRAM_ID,
)[0];
}
const pda = namePda('neuralns.agent');
const acc = await conn.getAccountInfo(pda);
if (!acc) throw new Error('not registered');
const d = acc.data; // layout below (§ On-chain record)
const owner = new PublicKey(d.subarray(2, 34));
const resolver = new PublicKey(d.subarray(34, 66));
const expiry = d.readBigInt64LE(66);
const nameLen = d.readUInt32LE(74);
const name = d.subarray(78, 78 + nameLen).toString('utf8');
console.log({ name, owner: owner.toBase58(), resolver: resolver.toBase58(), expiry });Register a name (send a tx)
Build the Register instruction (Borsh) and sign it with the payer / connected wallet.
// Borsh: variant 0 + name(string) + resolver(pubkey) + years(u32)
function encodeRegister(name, resolver, years) {
const n = Buffer.from(name, 'utf8');
const len = Buffer.alloc(4); len.writeUInt32LE(n.length);
const yr = Buffer.alloc(4); yr.writeUInt32LE(years);
return Buffer.concat([Buffer.from([0]), len, n, resolver.toBuffer(), yr]);
}
const ix = new TransactionInstruction({
programId: PROGRAM_ID,
keys: [
{ pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer
{ pubkey: namePda(name), isSigner: false, isWritable: true }, // record PDA
{ pubkey: TREASURY, isSigner: false, isWritable: true }, // fee receiver
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
],
data: encodeRegister(name, payer.publicKey, 1),
});
await sendAndConfirmTransaction(conn, new Transaction().add(ix), [payer]);On-chain record layout
Each name PDA stores exactly these bytes (Borsh):
offset size field 0 1 is_initialized (u8) 1 1 bump (u8) 2 32 owner (Pubkey) 34 32 resolver (Pubkey) 66 8 expiry (i64, unix seconds; 0 = none) 74 4+N name (string: u32 len + utf8 bytes)
Richer agent metadata (capability manifest, reputation, AgentCard NFT) is on the roadmap — the current program is intentionally minimal.
Program instructions
Demo API
Note: this site's REST endpoints (/api/explore, /api/stats…) serve a simulated agent population for the live demo — they are not on-chain data. For real data, read the program directly (see Resolve above).