# @anywalletkit/names-ens 中文文档

规范地址：https://npmcn.com/package/%40anywalletkit/names-ens/

版本：0\.5\.3
npm 元数据更新时间：2026-11-06T21:21:07.428Z
中文译文更新时间：2026-11-06T22:30:11.998Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40anywalletkit/names-ens
原文对照：https://npmcn.com/package/%40anywalletkit/names-ens/?lang=original
项目主页：https://docs.anywallet.tech/
源码仓库：https://github.com/ultratestbro/anywalletkit

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：312 kB，40 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=22
- 运行依赖：4 个
- peer 依赖：@anywalletkit/core 0\.8\.0
- 首次发布：2026-10-24T18:40:52.460Z
- 最新版本发布：2026-11-06T21:21:06.963Z
- 近 30 天下载量：2250（2026-10-06 至 2026-11-04，npm 官方下载统计）
- 已发布版本数：14（近 12 个月 14 个）

## 中文简介

任意钱包的 ENS 名称: valificik.eth / name.base.eth / alic.cb.id – 一个链的地址(ENSIP-9/11多链,通配符+CCIP-Read),被验证的主名,异形,外观警告. 执行核心名称解析器.

## 安装

```sh
npm install @anywalletkit/names-ens
```

也可以使用：`pnpm add @anywalletkit/names-ens`、`yarn add @anywalletkit/names-ens`、`bun add @anywalletkit/names-ens`

## README

# @ anywalletkit/ names- ens (英语)

[![npm](https://img.shields.io/npm/v/@anywalletkit/names-ens?label=npm)](https://www.npmjs.com/package/@anywalletkit/names-ens)

**在任何钱包套件上所建钱包的 ENS 名称 : `vitalik.eth`, (中文(简体) ), `name.base.eth`, (中文(简体) ), `alice.cb.id` + 一个链条的地址, 已核实的主名, 假名, 以及用户应该看到的名称旁边的警告 .**

## 安装

```sh
npm install @anywalletkit/names-ens @anywalletkit/core
# or: pnpm add @anywalletkit/names-ens @anywalletkit/core  ·  yarn add @anywalletkit/names-ens @anywalletkit/core
```

时间: [@ anywalletkit/ names- ens (英语)](https://www.npmjs.com/package/@anywalletkit/names-ens)发表于 [发布工作流程](https://github.com/ultratestbro/anywalletkit/blob/main/RELEASING.md) 与出处.

执行 `NameResolver` 界面从 `@anywalletkit/core`,因此,SNS (英语:`.sol`),TON DNS(英语:`.ton`)和NEAR账户可以坐落在同一个后面 `nameResolvers([...])` 等会.

## 它会做什么

-   **ENSIP-15标准化** (视频) `normalize`,也就是说. `@adraffy/ens-normalize`) (中文(简体) ). 无效的名字和非法的脚本混合物在任何I/O之前被以理由作为消息拒绝.
-   **前进决议** 通过通用解析器:通配符名称(ENSIP-10)和通过CCIP-Read的脱链解析器(`cb.id`, (中文(简体) ), `uni.eth`, Basenames) 工作出盒.
-   **每通电话1个连锁电话(ENSIP-9/11).** `resolve(name, 'eip155:8453')` 读取 Base 记录( 币种) `0x80000000 | 8453`, (中文(简体) ), `bip122:…` 阅读比特币脚本记录, `solana:…` 索拉纳的钥匙 连锁店都没有记录的名字是 `no-address-for-chain`。 。 。 . **它从不掉回Ethereum的地址** 向Base发送关键主网地址 是这个守卫对付的bug.
-   **倒转/ 主名**,包括以硬币类型表示的L2主名(ENSIP-19). 一个主名只有在它解决到同一个地址时才算数.
-   **有远见者** (ENSIP-12):https / ipfs / NFT,返回为URL. 通过您的代理获取它; 解析器从不获取图像 .
-   **警告** 关于每项决议: `confusable` (用拉丁字母的西里尔语外观写成的标签), `mixed-script`, (中文(简体) ), `punycode`。 。 。 .
-   **缓存** 带有 TTL(默认为 5 分钟) , 并绑定.
-   **签名时间检查**数字 : `assertNameUnchanged(resolver, name, chain, address)` 重解和抛出 `changed` 如果地址移动.

## 使用量

```ts
import { ensResolver } from '@anywalletkit/names-ens'
import { assertNameUnchanged, isNameLike, NameError } from '@anywalletkit/core'

const ens = ensResolver({ rpcUrl: 'https://ethereum-rpc.publicnode.com' }) // or { client } (viem PublicClient on mainnet)

if (isNameLike(input) && ens.supports(input)) {
  try {
    const r = await ens.resolve(input, 'eip155:8453')
    // r.address (checksummed), r.name (normalized), r.warnings[] to show
  } catch (e) {
    if (e instanceof NameError) console.log(e.code) // invalid-name | not-found | no-address-for-chain | unsupported | lookup-failed
  }
}

await ens.reverse('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', 'eip155:1') // 'vitalik.eth'
await ens.avatar('vitalik.eth') // 'https://euc.li/vitalik.eth'

// right before signing:
await assertNameUnchanged(ens, 'vitalik.eth', 'eip155:1', addressShownToUser)
```

选项 : `client` 编号 : `rpcUrl` (主网;需要), `ccip` (如何要求网关,下文), `cacheTtlMs`, (中文(简体) ), `ipfsGateway` (指着您的代理), `foreignTlds` (TLD 留给其他解决者;默认) `sol`, (中文(简体) ), `near`, (中文(简体) ), `ton`, (中文(简体) ), `me`) (中文(简体) ).

脱链名称(CCIP-Read,EIP-3668)使设备获取该名称的解析器选择的网关URL. 客户端从 `rpcUrl` 仅询问 https 网关 URL, 其主机按照写法不是私有的 。 (`ensCcipRead`: 无 `http://`,在任意拼写中,没有本地主机 / LAN / 链接- 本地 / CGNAT 地址,拒绝重定向). 主机的解析取决于运行时间 : **节点** (无) `ccip.fetch`),每个网关通过被钉住的运输 `createEnsCcipHandler`在过程中——检查每个 DNS 的回答, 连接被粘住—— 所以一个公共的、 解决到 127.0.0.1 或 局域网地址的外观名称不被问到; 一个网关主机, 其记录混合的公地址和私人地址被拒绝, 以及一个公司拆分范围 DNS 或一个出局代理你通过 `ccip.fetch`在 a 中输入 **浏览器** (和任何其他运行时间)全局获取连接: URL文本被检查,解析地址没有——没有DNS级别隔离; 使用 `ensCcipViaProxy` 这很重要 原生反应:下. **如果你通过自己的 `client`,创建时使用 `ccipRead: ensCcipRead`** (或 `ccipRead: false`),或者viem的默认获取任意URL解析器名称, `http://192.168.1.1/…` 包含。 网关的答案最多只能读到 `ccip.maxResponseBytes` (1个小米B;在读取任何字节之前检查状态和已宣布大小),以及 `ccip.timeoutMs` (10 s) 覆盖每个网关的请求和整个答案.

`avatar` 返回时 `avatar` 当它是公共主机上的 https URL 时的文本记录,或者 `ipfs://` 一通经 `ipfsGateway` (来源, `/ipfs/<cid>` 附加,或以 `/ipfs/`· ; `avatarUrl(record, gateway)` 是同一个过滤器)。 其他东西都回来了 `null`: NFT活字游戏(`eip155:1/erc721:…`;解决一个问题意味着获取其发行人选择的元数据URL),以及 `http://`, (中文(简体) ), `data:`, (中文(简体) ), `ipns://` 财务报告和审定财务报表 `ar://` 这些。 没有什么可以决定的.

### 本地语: 通过您的服务器读取 CCIP

反应原生取来随 任何方向 `redirect: 'error'` 说,所以一个网关的重定向会将设备的请求发送到局域网或回路主机,然后才能检查最终的URL. 在那里, 脱链名称默认关闭: 它们失败了 `lookup-failed`, (中文(简体) ), `reason: 'ccip-proxy-required'`,消息说设置。 安全路径是您服务器上的一条路径 :

```ts
// server (Node): POST /ccip, behind your auth and rate limits
import { createEnsCcipHandler } from '@anywalletkit/names-ens/server'
const ccip = createEnsCcipHandler() // { allowHosts, denyHosts, timeoutMs, maxResponseBytes, maxRequestBytes }
// in the route: const out = await ccip(JSON.parse(rawBody)); reply out.status with JSON out.body

// app (Hermes): the resolver asks gateways through that route
import { ensCcipViaProxy, ensResolver } from '@anywalletkit/names-ens'
const ens = ensResolver({
  rpcUrl: ETHEREUM_RPC,
  ccip: { fetch: ensCcipViaProxy('https://api.example.com/ccip', { headers: { authorization: `Bearer ${token}` } }) },
})
```

`createEnsCcipHandler` 带 `{ url, method, body? }` (怎样) `ensCcipViaProxy` 发送)和返回 `{ status, body }` (单位:千美元)`{ data }` 或者说 `{ error }`) (中文(简体) ). 它只在公共主机上询问https网关;当任何地址是私有的,回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回回 `node:https` (TLS仍然验证主机名),所以第二个 DNS 答案无法移动; 永远不会跟随重定向; 应用超时( 10 s) 和答题上限 ( 1 MiB); 发送 GET, 或 POST 精确 `{ sender, data }`;没有转发呼叫者的信头或饼干. 它不认证或费率限制: 您的路线有. `lookup` 财务报告和审定财务报表 `fetch` 选项替换 DNS 和测试中的连接(与 `fetch`,连接没有被固定)。 引用服务器在 `examples/server` 已经到了 `POST /ccip`。 。 。 .

`ensCcipViaProxy(proxyUrl, { headers, timeoutMs, fetch, allowInsecureProxyUrl })` 需要 https 代理 URL( 仅针对本地主机 `allowInsecureProxyUrl`),使用无节点 API和无 `AbortSignal.timeout`,然后将服务器的拒绝变成查找错误.

没有服务器, `ccip: { allowRedirectFollowingFetch: true }` 直接询问网关:一个重定向网关可以让设备在用户网络上向主机发送一个盲点请求. 与自己的客户: `ccipRead: createEnsCcipRead({ … })`。 。 。 .

## 测试

`pnpm test` ——单位对一个被接住的客户端进行测试,CCIP-Read代理对本地服务器进行被接住的DNS测试,外加兼容性 `namesSuite`。 。 。 . `pnpm verify:live` ——主网通过公共RPC:要害.eth向前/倒/相, `jesse.base.eth` 通过CBIP-Read在Base硬币类型上,名称没有Base记录,未注册和无效.

## 常见问题

### @anywalletkit/names-ens 是什么？

任意钱包的 ENS 名称: valificik\.eth / name\.base\.eth / alic\.cb\.id – 一个链的地址\(ENSIP-9/11多链,通配符\+CCIP-Read\),被验证的主名,异形,外观警告\. 执行核心名称解析器\.

### 如何安装 @anywalletkit/names-ens？

在项目目录运行 npm install @anywalletkit/names-ens，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@anywalletkit/core（0\.8\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @anywalletkit/names-ens 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @anywalletkit/names-ens 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @anywalletkit/names-ens 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @anywalletkit/names-ens 可以商用吗？

@anywalletkit/names-ens 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @anywalletkit/names-ens 的下载量有多少？

根据 npm 官方下载统计，@anywalletkit/names-ens 在 2026/10/06 – 2026/11/04 这 30 天内被下载 2,250 次，日均约 75 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @anywalletkit/names-ens 还在维护吗？

最新版本 0\.5\.3 发布于 2026/11/07（今天）；至今共发布 14 个版本，其中过去 12 个月发布了 14 个；首次发布于 2026/10/25。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

