> ## Documentation Index
> Fetch the complete documentation index at: https://docs.solanatracker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Solana .sol 域名解析：SNS RPC 方法

> 用 Solana Tracker RPC 解析主 .sol 域名、批量查询钱包名称、列出钱包拥有的域名，并查找域名所有者。

使用 SNS RPC 方法把钱包地址转换为 `.sol` 显示名称，或把域名解析到所有者。渲染持有者列表或排行榜时，批量查询主域名。

> [!NOTE]
>
> 每个 SNS RPC 方法每次调用消耗 **1 积分**。不支持 Twitter/X 账号名（`.twitter`）。

| 目标 | 方法 |
| - | - |
| 获取单个钱包的主 `.sol` 域名 | [`getPrimaryDomain`](https://docs.solanatracker.io/cn/solana-rpc/http/getprimarydomain) |
| 解析多个钱包的主域名 | [`getMultiplePrimaryDomains`](https://docs.solanatracker.io/cn/solana-rpc/http/getmultipleprimarydomains) |
| 列出钱包拥有的全部 `.sol` 域名 | [`getAllDomains`](https://docs.solanatracker.io/cn/solana-rpc/http/getalldomains) |
| 把 `name.sol` 解析为所有者钱包 | [`resolveSolDomain`](https://docs.solanatracker.io/cn/solana-rpc/http/resolvesoldomain) |

## RPC 端点

所有示例都通过 HTTP 使用 JSON-RPC 2.0：

```bash theme={null}
https://rpc-mainnet.solanatracker.io/?api_key=YOUR_API_KEY
```

## 获取钱包的主域名

使用 `getPrimaryDomain` 获取钱包的主 `.sol` 显示名称。

```bash cURL theme={null}
curl "https://rpc-mainnet.solanatracker.io/?api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getPrimaryDomain",
    "params": ["9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p"]
  }'
```

```javascript JavaScript theme={null}
const rpcUrl = "https://rpc-mainnet.solanatracker.io/?api_key=YOUR_API_KEY";

const { result } = await fetch(rpcUrl, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "getPrimaryDomain",
    params: ["9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p"]
  })
}).then(r => r.json());

const label = result.value.domain ?? result.value.wallet;
console.log(label);
```

```python Python theme={null}
import requests

res = requests.post(
    "https://rpc-mainnet.solanatracker.io/?api_key=YOUR_API_KEY",
    json={
        "jsonrpc": "2.0",
        "id": 1,
        "method": "getPrimaryDomain",
        "params": ["9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p"]
    }
)

result = res.json()["result"]["value"]
print(result["domain"] or result["wallet"])
```

存在域名时：

```json theme={null}
{
  "context": { "slot": 423867852, "apiVersion": "3.0.0" },
  "value": {
    "wallet": "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
    "domain": "solanatracker.sol"
  }
}
```

没有主域名时，`domain` 为 `null`：

```json theme={null}
{
  "context": { "slot": 423867852, "apiVersion": "3.0.0" },
  "value": {
    "wallet": "FMmaHPDL47V1gXsfh9WjgAT7Er3dfDvarQubTU1Jxc1r",
    "domain": null
  }
}
```

> [!TIP]
>
> 在界面中，有域名时用域名作标签；`domain` 为 `null` 时回退到缩写的钱包地址。

## 批量查询主域名

使用 `getMultiplePrimaryDomains` 查询一组钱包：

该方法最多接受 **100 个钱包**，结果顺序与输入列表相同。

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getMultiplePrimaryDomains",
  "params": [
    [
      "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
      "FMmaHPDL47V1gXsfh9WjgAT7Er3dfDvarQubTU1Jxc1r"
    ]
  ]
}
```

响应示例：

```json theme={null}
{
  "context": { "slot": 423867852, "apiVersion": "3.0.0" },
  "value": {
    "results": [
      {
        "wallet": "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
        "domain": "solanatracker.sol"
      },
      {
        "wallet": "FMmaHPDL47V1gXsfh9WjgAT7Er3dfDvarQubTU1Jxc1r",
        "domain": null
      }
    ]
  }
}
```

响应保留了输入顺序，因此可以按数组索引合并回钱包列表：

```javascript theme={null}
const wallets = [
  "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
  "FMmaHPDL47V1gXsfh9WjgAT7Er3dfDvarQubTU1Jxc1r"
];

const { result } = await fetch(rpcUrl, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "getMultiplePrimaryDomains",
    params: [wallets]
  })
}).then(r => r.json());

const rows = wallets.map((wallet, i) => ({
  wallet,
  displayName: result.value.results[i].domain ?? `${wallet.slice(0, 4)}...${wallet.slice(-4)}`
}));
```

## 获取钱包拥有的全部域名

使用 `getAllDomains` 列出钱包拥有的 `.sol` 域名。

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getAllDomains",
  "params": ["9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p"]
}
```

响应：

```json theme={null}
{
  "context": { "slot": 423867852, "apiVersion": "3.0.0" },
  "value": {
    "wallet": "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
    "domains": ["solanatracker.sol", "othername.sol"]
  }
}
```

如果钱包没有域名，`domains` 是空数组。

## 把域名解析到所有者

使用 `resolveSolDomain` 把 `.sol` 名称解析到其所有者钱包。

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "resolveSolDomain",
  "params": ["solanatracker.sol"]
}
```

响应：

```json theme={null}
{
  "context": { "slot": 423867852, "apiVersion": "3.0.0" },
  "value": {
    "domain": "solanatracker.sol",
    "owner": "9aoUCn5J4sxhvYERCVwVnakPQxyXTHQVXe86CUJYxY8p",
    "nameAccount": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"
  }
}
```

找不到域名时，`value` 为 `null`。

`resolveSolDomain` 支持 `name.sol` 这样的根 `.sol` 域名，以及 `sub.parent.sol` 这样的一级子域名。

## 示例：钱包身份辅助函数

这个辅助函数用主域名做显示，同时保留钱包地址，用于跳转、复制或发起交易。

```javascript theme={null}
function shortWallet(wallet) {
  return `${wallet.slice(0, 4)}...${wallet.slice(-4)}`;
}

async function getWalletIdentity(wallet) {
  const { result } = await fetch(
    "https://rpc-mainnet.solanatracker.io/?api_key=YOUR_API_KEY",
    {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "getPrimaryDomain",
        params: [wallet]
      })
    }
  ).then(r => r.json());

  return {
    wallet,
    label: result.value.domain ?? shortWallet(wallet),
    domain: result.value.domain
  };
}
```

## 选择合适的 SNS 方法

| 场景 | 建议 |
| - | - |
| 单个钱包的资料页头部 | `getPrimaryDomain` |
| 排行榜或持有者表格 | `getMultiplePrimaryDomains` |
| 域名资产页 | `getAllDomains` |
| 搜索框接受 `.sol` 名称 | `resolveSolDomain` |
| PnL V2 响应已包含 `identity.sns` | 使用 PnL V2 自带的身份字段 |

> [!NOTE]
>
> PnL V2 在支持的钱包和代币分析响应中已包含 SNS 身份。需要直接通过 Solana RPC 解析 SNS 时，再使用这些 RPC 方法。

## 界面和产品建议

* 即使显示域名，也要始终保留钱包地址。
* 把 `domain: null` 当作正常结果，而不是错误。
* 表格和信息流使用批量解析，不要循环调用 `getPrimaryDomain`。
* 用 `.sol` 名称做标签，但复制和跳转都使用底层钱包地址。
* 用户搜索时，先解析 `.sol` 名称，再用返回的所有者钱包继续处理。

> [card] [getMultiplePrimaryDomains](https://docs.solanatracker.io/cn/solana-rpc/http/getmultipleprimarydomains.md)
>
> 批量查询最多 100 个钱包的主 `.sol` 域名。

> [card] [SNS 钱包名称](https://docs.solanatracker.io/cn/guides/pnl-v2/sns-identity.md)
>
> 查看 SNS 身份出现在哪些 PnL V2 响应中。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.