Servicio de nombres

Registro de nombres

El registro de nombres almacena información sobre el nombre de dominio. esta compuesto de dos cosas:

  • La cabecera
  • Los datos

Los datos para un nombre de dominio siempre tienen el prefijo del encabezado, a continuación se muestra la estructura del encabezado en JS:

Press </> button to view full source
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);
  }
}

Resolviendo dominios SOL

Los dominios .SOL son nombres de dominio únicos y fáciles de usar que se convierten en claves públicas. Muchas billeteras las usan como otra opción para enviar tokens o SOL. Puedes convertir .SOL dominios a su clave pública con lo siguiente:

Press </> button to view full source
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

Búsqueda inversa

Esto se puede usar para resolver el nombre de dominio a partir de una clave pública.

Press </> button to view full source
// Public key of bonfida.sol
const domainKey = new PublicKey("Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb");

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

Búsqueda de subdominios

Para resolver un subdominio necesitas:

  1. Obtener la llave padre del dominio
  2. Obtener la llave del subdominio
  3. Obtener la información de la cuenta
Press </> button to view full source
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);

Encuentre todos los nombres de dominio que pertenecen a una clave pública

Puede recuperar todos los nombres de dominio de una billetera haciendo una solicitud getProgramAccounts con un filtro memcmp

Press </> button to view full source
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);
}

Resolver un identificador de Twitter

Los identificadores de Twitter se pueden registrar en el servicio de nombres de Solanaopen in new window y usarse como nombres de dominio .SOL

Press </> button to view full source
// Pubkey of the wallet you want to retrieve the Twitter handle
const pubkey = new PublicKey("FidaeBkZkvDqi1GXNEwB8uWmj9Ngx2HXSS5nyGRuVFcZ");

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

Búsqueda inversa de un identificador de Twitter

Para encontrar la dirección SOL asociada a un identificador de Twitter, puede realizar una búsqueda inversa

Press </> button to view full source
const handle = "bonfida";

const registry = await getTwitterRegistry(connection, handle);
Last Updated: 9/19/2022, 9:04:23 PM
Contributors: Marco Ordonez