Name Service

Name registry

Name registry menyimpan informasi tentang domain name. Itu terbuat dari dua hal:

  • Header
  • Data

Data untuk suatu domain name selalu diawali oleh header, di bawah ini adalah struktur header dalam JS:

Press </> button to view full source
import { PublicKey } from "@solana/web3.js";
import { Schema } from "borsh";

export class NameRegistryState {
  parentName: PublicKey;
  owner: PublicKey;
  class: PublicKey;
  data: Buffer | undefined;

  static HEADER_LEN = 96;

  static schema: Schema = new Map([
    [
      NameRegistryState,
      {
        kind: "struct",
        fields: [
          ["parentName", [32]],
          ["owner", [32]],
          ["class", [32]],
        ],
      },
    ],
  ]);
  constructor(obj: {
    parentName: Uint8Array;
    owner: Uint8Array;
    class: Uint8Array;
  }) {
    this.parentName = new PublicKey(obj.parentName);
    this.owner = new PublicKey(obj.owner);
    this.class = new PublicKey(obj.class);
  }
}

Resolving SOL domains

.SOL domain itu unik, domain name mudah dibaca berubah menjadi publicKeys. Banyak wallet yang menggunakan hal ini sebagai pilihan lain untuk mengirim token atau SOL. Kamu bisa mengubah .SOL domain ke publicKey-nya dengan cara berikut ini:

Press </> button to view full source
import {
  getHashedName,
  getNameAccountKey,
  NameRegistryState,
} from "@bonfida/spl-name-service";

import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js";

(async () => {
  const domain = "levi.sol";
  const hashedName = await getHashedName(domain.replace(".sol", ""));
  const nameAccountKey = await getNameAccountKey(
    hashedName,
    undefined,
    new PublicKey("58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx") // SOL TLD Authority
  );
  const owner = await NameRegistryState.retrieve(
    new Connection(clusterApiUrl("mainnet-beta")),
    nameAccountKey
  );
  console.log(owner.registry.owner.toBase58());
  // JUskoxS2PTiaBpxfGaAPgf3cUNhdeYFGMKdL6mZKKfR
})();

Reverse look up

Hal ini dapat digunakan untuk resolve domain name dari public key-nya

Press </> button to view full source
import { performReverseLookup } from "@bonfida/spl-name-service";
import { PublicKey, Connection, clusterApiUrl } from "@solana/web3.js";

async () => {
  const connection = new Connection(clusterApiUrl("mainnet-beta"));
  // Public key of bonfida.sol
  const domainKey = new PublicKey(
    "Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb"
  );

  const domainName = await performReverseLookup(connection, domainKey); // bonfida
};

Subdomain look up

Untuk resolve suatu subdomain kamu perlu:

  1. Mendapatkan parent domain key
  2. Mendapatkan subdomain key
  3. Mengambil account info
Press </> button to view full source
import {
  getHashedName,
  getNameAccountKey,
  NameRegistryState,
  getDNSRecordAddress,
} from "@bonfida/spl-name-service";
import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js";

async () => {
  const SOL_TLD_AUTHORITY = new PublicKey(
    "58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx"
  );
  const connection = new Connection(clusterApiUrl("mainnet-beta"));

  // Resolution of demo.bonfida.sol

  const parentDomain = "bonfida";
  const subDomain = "demo";

  // Step 1
  const hashedParentDomain = await getHashedName(parentDomain);
  const parentDomainKey = await getNameAccountKey(
    hashedParentDomain,
    undefined,
    SOL_TLD_AUTHORITY
  );

  // Step 2
  const subDomainKey = await getDNSRecordAddress(parentDomainKey, subDomain);

  // Step 3
  const registry = await NameRegistryState.retrieve(connection, subDomainKey);
};

Menemukan semua domain name yang dimiliki oleh suatu public key

Kamu bisa mengambil semua domain name suatu wallet dengan cara melakukan request getProgramAccountsdengan filtermemcmp

Press </> button to view full source
import { Connection, PublicKey } from "@solana/web3.js";
import { NAME_PROGRAM_ID } from "@bonfida/spl-name-service";

export async function findOwnedNameAccountsForUser(
  connection: Connection,
  userAccount: PublicKey
): Promise<PublicKey[]> {
  const filters = [
    {
      memcmp: {
        offset: 32,
        bytes: userAccount.toBase58(),
      },
    },
  ];
  const accounts = await connection.getProgramAccounts(NAME_PROGRAM_ID, {
    filters,
  });
  return accounts.map((a) => a.publicKey);
}

Resolve Twitter handle

Twitter handle bisa teregistrasi di Solana name serviceopen in new window dan digunakan seperti .SOL domain names

Press </> button to view full source
import { PublicKey, clusterApiUrl, Connection } from "@solana/web3.js";
import { getHandleAndRegistryKey } from "@bonfida/spl-name-service";

async () => {
  const connection = new Connection(clusterApiUrl("mainnet-beta"));
  // Pubkey of the wallet you want to retrieve the Twitter handle
  const pubkey = new PublicKey("FidaeBkZkvDqi1GXNEwB8uWmj9Ngx2HXSS5nyGRuVFcZ");

  const [handle, registryKey] = await getHandleAndRegistryKey(
    connection,
    pubkey
  );
};

Reverse look up suatu Twitter handle

Untuk menemukan SOL address yang berkaitan dengan suatu Twitter handle kamu bisa melakukan reverse look up

Press </> button to view full source
import { getTwitterRegistry } from "@bonfida/spl-name-service";
import { Connection, clusterApiUrl } from "@solana/web3.js";

async () => {
  const handle = "bonfida";
  const connection = new Connection(clusterApiUrl("mainnet-beta"));

  const registry = await getTwitterRegistry(connection, handle);
};
Last Updated:
Contributors: akangaziz