@ anywalletkit/ names- ens (英语)
在任何钱包套件上所建钱包的 ENS 名称 : vitalik.eth, (中文(简体) ), name.base.eth, (中文(简体) ), alice.cb.id + 一个链条的地址, 已核实的主名, 假名, 以及用户应该看到的名称旁边的警告 .
安装
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 (英语)发表于 发布工作流程 与出处.
执行 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如果地址移动.
使用量
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',消息说设置。 安全路径是您服务器上的一条路径 :
// 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记录,未注册和无效.