借助TheGraph 查询ENS信息

关于ENS (以太坊域名服务)


ENS 全称是 Ethereum Name Service,它是一个建立在以太坊区块链上的去中心化域名系统。

ENS 在 Web3 领域发挥着重要作用,主要有以下几个方面:

  1. 可读性更好的地址:

    • ENS 允许用户将复杂的以太坊地址(如 0x12345…) 映射为更简单易记的域名。
    • 这极大地提高了用户体验,让区块链的使用更加友好。
  2. 统一的身份标识:

    • ENS 域名可以用作用户在 Web3 生态中的唯一标识。
    • 用户可以将自己的钱包地址、social media账号等信息关联到ENS域名上。
  3. 去中心化的域名系统:

    • ENS 是建立在以太坊区块链之上的,不受任何中心化机构的控制。
    • 域名所有权通过区块链交易来管理,保证了所有权的去中心化。
  4. 支持多种应用场景:

    • ENS 域名可以用于支付、登录、数据存储等各种 Web3 应用场景。
    • 开发者可以在自己的 dApp 中集成 ENS 功能。
  5. 可编程性和可扩展性:

    • 作为一个基础设施,ENS 提供了丰富的API和SDK,方便开发者集成和扩展。
    • 未来 ENS 还可能支持更多类型的域名资源,如数据存储、身份认证等。

总ENS 是 Web3 生态中重要的一环,它在提高用户体验、统一身份标识等方面发挥着关键作用。


ENS(以太坊域名服务)可以认为是web3的DNS…DNS是将域名和IP地址做一个映射,而ENS是把域名和比IP地址更复杂冗长的钱包地址做一个映射


可以在 https://app.ens.domains/ 注册

折算后大概几十块人民币,和普通域名价格差不多


页面信息可以在这里查到: https://app.ens.domains/vitalik.eth


什么是以太坊域名服务 (ENS)?

比较著名的一个批量注册工具的ENS 成交榜,看得出比较好的"靓号"价格不菲…


关于TheGraph


TheGraph 可以说是 Web3 应用开发的基础设施之一,极大地提高了区块链数据的可访问性和可用性。

TheGraph 是一个去中心化的查询协议,在 Web3 领域扮演着非常重要的角色。主要用于索引和查询区块链数据。TheGraph 可以帮助用户做以下几件事:

  1. 索引区块链数据:

    • TheGraph 会收集和处理区块链上产生的各种数据,包括交易记录、合约事件等。
    • 通过定义 GraphQL 查询接口,开发者可以高效地查询和获取所需的数据。
  2. 为 dApp 提供数据查询服务:

    • dApp 开发者可以利用 TheGraph 提供的索引数据,构建出更丰富的用户体验。
    • 不需要自己处理复杂的区块链数据查询逻辑,大大降低了开发难度。
  3. 构建去中心化的数据市场:

    • TheGraph 网络由一群索引者(Indexers)组成,他们负责处理数据并提供查询服务。
    • Indexers可以获得来自 dApp 开发者的查询费用,形成一个去中心化的数据市场。
  4. 提高数据可靠性和安全性:

    • 由于 TheGraph 是建立在区块链之上的,数据查询过程是透明、可验证的。
    • 这大大提高了数据的可靠性和安全性,避免了单点故障问题。

如何使用TheGraph查询ENS信息?


以下是使用Go语言通过The Graph查询ENS信息的代码:

package mainimport ("bytes""encoding/json""fmt""io/ioutil""net/http""time"
)const GraphQLEndpoint = "https://api.thegraph.com/subgraphs/name/ensdomains/ens"type GraphQLRequest struct {Query     string                 `json:"query"`Variables map[string]interface{} `json:"variables"`
}type GraphQLResponse struct {Data struct {Domains []struct {ID              string `json:"id"`Name            string `json:"name"`LabelName       string `json:"labelName"`ResolvedAddress struct {ID string `json:"id"`} `json:"resolvedAddress"`Owner struct {ID string `json:"id"`} `json:"owner"`Resolver struct {Address string `json:"address"`} `json:"resolver"`TTL       string `json:"ttl"`CreatedAt string `json:"createdAt"`} `json:"domains"`} `json:"data"`
}func queryENS(domainName string) (*GraphQLResponse, error) {query := `query ($name: String!) {domains(where: { name: $name }) {idnamelabelNameresolvedAddress { id }owner { id }resolver { address }ttlcreatedAt}}`variables := map[string]interface{}{"name": domainName,}requestBody, err := json.Marshal(GraphQLRequest{Query: query, Variables: variables})if err != nil {return nil, err}resp, err := http.Post(GraphQLEndpoint, "application/json", bytes.NewBuffer(requestBody))if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}var graphQLResponse GraphQLResponseerr = json.Unmarshal(body, &graphQLResponse)if err != nil {return nil, err}return &graphQLResponse, nil
}func main() {domainName := "vitalik.eth"result, err := queryENS(domainName)if err != nil {fmt.Printf("Error querying ENS: %v\n", err)return}fmt.Println()fmt.Println("result.Data.Domains 长度为:", len(result.Data.Domains))if len(result.Data.Domains) > 0 {domain := result.Data.Domains[0]fmt.Printf("Domain Name: %s\n", domain.Name)fmt.Printf("Owner: %s\n", domain.Owner.ID)if domain.ResolvedAddress.ID != "" {fmt.Printf("Resolved Address: %s\n", domain.ResolvedAddress.ID)} else {fmt.Println("Resolved Address: Not set")}createdAt, _ := time.Parse(time.RFC3339, domain.CreatedAt)fmt.Printf("Created At: %s\n", createdAt.Format(time.RFC3339))} else {fmt.Println("Domain not found")}
}

这个Go程序执行以下操作:

  1. 定义了必要的结构体来表示GraphQL请求和响应。

  2. 实现了queryENS函数,该函数构造GraphQL查询,发送HTTP POST请求到The Graph的API端点,并解析响应。

  3. main函数中,我们使用"vitalik.eth"作为示例域名进行查询。

  4. 程序打印出查询结果,包括域名、所有者地址、解析地址(如果设置了的话)和创建时间。


可以查到数据

但请求次数稍微一多,就会限流:

{"message":"Rate-limit on ensdomains/ens community key exceeded. Try again later or go to https://thegraph.com/studio to create your own API key. Find the ensdomains/ens Graph Network Subgraph here: https://thegraph.com/explorer/subgraphs/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH"}

解决方案:

创建自己的 API 密钥:

    1. 如错误消息所示,可以在 https://thegraph.com/studio 创建自己的 API 密钥。这将有更高的查询频率限制 (免费的API key,每个月可以进行10万次查询)
    1. 使用 Graph Network:错误消息提供了 ENS 子图在 Graph Network 上的链接。可以直接使用这个网络版本的子图。

我申请了一个API key,类似 e65d654167ba349f029f0exxxxxxxxxx

根据文档,以及该子图主页的提示,修改代码如下:


package mainimport ("bytes""encoding/json""fmt""io/ioutil""net/http""strconv""time"
)const GraphQLEndpoint = "https://gateway-arbitrum.network.thegraph.com/api/e65d654167ba349f029f0exxxxxxxxxx/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH"type GraphQLRequest struct {Query     string                 `json:"query"`Variables map[string]interface{} `json:"variables"`
}type GraphQLResponse struct {Data struct {Domains []struct {ID              string `json:"id"`Name            string `json:"name"`LabelName       string `json:"labelName"`ResolvedAddress struct {ID string `json:"id"`} `json:"resolvedAddress"`Owner struct {ID string `json:"id"`} `json:"owner"`Resolver struct {Address string `json:"address"`} `json:"resolver"`TTL       string `json:"ttl"`CreatedAt string `json:"createdAt"`} `json:"domains"`} `json:"data"`
}func queryENS(domainName string) (*GraphQLResponse, error) {query := `query ($name: String!) {domains(where: { name: $name }) {idnamelabelNameresolvedAddress { id }owner { id }resolver { address }ttlcreatedAt}}`variables := map[string]interface{}{"name": domainName,}requestBody, err := json.Marshal(GraphQLRequest{Query: query, Variables: variables})if err != nil {return nil, err}resp, err := http.Post(GraphQLEndpoint, "application/json", bytes.NewBuffer(requestBody)) if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}// 打印原始响应fmt.Println("Raw response:", string(body))var graphQLResponse GraphQLResponseerr = json.Unmarshal(body, &graphQLResponse)if err != nil {return nil, err}return &graphQLResponse, nil
}func main() {domainName := "vitalik.eth"result, err := queryENS(domainName)if err != nil {fmt.Printf("Error querying ENS: %v\n", err)return}fmt.Println()fmt.Println("result.Data.Domains 长度为:", len(result.Data.Domains))if len(result.Data.Domains) > 0 {domain := result.Data.Domains[0]fmt.Printf("Domain Name: %s\n", domain.Name)fmt.Printf("Owner: %s\n", domain.Owner.ID)if domain.ResolvedAddress.ID != "" {fmt.Printf("Resolved Address: %s\n", domain.ResolvedAddress.ID)} else {fmt.Println("Resolved Address: Not set")}fmt.Println("domain.CreatedAt is:", domain.CreatedAt)intCreateAt, _ := strconv.Atoi(domain.CreatedAt)createdAt := time.Unix(int64(intCreateAt), 0).Format(time.DateTime)fmt.Printf("Created At: %s\n", createdAt)} else {fmt.Println("Domain not found")}
}

返回值为:

Raw response: {"data":{"domains":[{"createdAt":"1497775154","id":"0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835","labelName":"vitalik","name":"vitalik.eth","owner":{"id":"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"},"resolvedAddress":{"id":"0xd8da6bf26964af9d7eed9e03e53415d37aa96045"},"resolver":{"address":"0x231b0ee14048e9dccd1d247744d114a4eb5e8e63"},"ttl":null}]}}result.Data.Domains 长度为: 1
Domain Name: vitalik.eth
Owner: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
Resolved Address: 0xd8da6bf26964af9d7eed9e03e53415d37aa96045
domain.CreatedAt is: 1497775154
Created At: 2017-06-18 16:39:14

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国车牌检测数据集VOC+YOLO格式2001张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2001 标注数量(xml文件个数):2001 标注数量(txt文件个数):2001 标注…

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。 从广义上…

STM32介绍和资料地址

STM32标准外设软件库 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 支持标准外设库的产品系列:

XMLTomcatHttp协议

XML&Tomcat&Http协议 目录 XML&Tomcat&Http协议 1. xml解析(了解) 1.1 配置文件 1.1.1 配置文件的作用 1.1.2 常见的配置文件类型 1.2 properties文件 1.2.1 文件示例 1.2.2 语法规范 1.3 XML文件 1.3.1 文件示例 1.3.2 概念介绍 1.3.3 XML的基本语…

【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程

文章目录 问题:无法在AMD平台打开Android studio 虚拟机,已解决平台:AMD 5700g系统:win10专业版1、在 amd平台上使用安卓虚拟机需要安装硬件加速器2、关闭win10上的系统服务 问题:无法在AMD平台打开Android studio 虚拟…

LabVIEW电机故障监测系统

电机作为工业生产中的关键设备,其故障会导致生产停滞和经济损失。因此,开发一个能实时监控电机状态并预测潜在故障的系统具有重要意义。通过高效的数据采集和分析技术,提升故障诊断的准确性和及时性。 系统组成 该系统由以下部分组成&#…

vue3 运用高德地图 自定义弹框 为信息窗体 添加 new AMaps.value.InfoWindow 添加事件

效果图 划过散点的时候出现每个三点位置的数据提示 点击具体散点获取展示信息弹框,并为其添加点击事件 注意点: 1 即使是用的vue,也不能使用click为窗体添加点击事件,需要使用onclick, (原因&#xff1a…

TMC2209驱动模式详解

TMC2209驱动模式详解 1.TMC2209封装2.TMC2209引脚定义 1.TMC2209封装 2.TMC2209引脚定义

JavaWeb系列十五: JavaWeb三大组件之过滤器Filter

老韩-JavaWeb三大组件之过滤器Filter 过滤器说明过滤器基本原理过滤器分析和实例url-patternFilter生命周期FilterConfigFilterConfig应用实例过滤器链基本原理分析过滤链实例演示过滤链注意事项 过滤器作业布置 过滤器说明 过滤器说明 Filter 过滤器是JavaWeb三大组件之一(Se…

Android AOSP 编译并烧录到Google Pixel4XL

简介 AOSP(Android Open Source Project)是Android系统的开源版本,任何人都可以下载、编译和修改。手头上有一台Pixel 4XL,尝试编译AOSP并将其烧录到的设备上。 准备工作 在开始之前,您需要确保您的电脑满足以下条件…

实验08 软件设计模式及应用

目录 实验目的实验内容一、能播放各种声音的软件产品Sound.javaDog.javaViolin.javaSimulator.javaApplication.java运行结果 二、简单工厂模式--女娲造人。Human.javaWhiteHuman.javaYellowHuman.javaBlackHuman.javaHumanFactory.javaNvWa.java运行结果 三、工厂方法模式--女…

Python爬虫项目集:豆瓣电影排行榜top250

关于整理日常练习的一些爬虫小练习,可用作学习使用。 爬取项目以学习为主,尽可能使用更多的模块进行练习,而不是最优解。 爬虫概要 示例python 库爬取模块request解析模块BeautifulSoup存储类型list(方便存入数据库&#xff09…

2024年最新 Windows 操作系统安装部署 MongoDB 数据库详细教程(更新中)

MongoDB 概述 MongoDB 是一个基于分布式文件存储的开源数据库系统,由C语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系…

使用mysql的binlog进行数据恢复

1.mysql安装环境 在你本地电脑windows上建一个和生产环境一样的mysql版本 我的是 mysql5.7.43 安装教程可以自行上网搜(这里不做介绍) 可参考: 1.1安装路径 我的mysql安装路径: D:\mysql\mysql-5.7.43-winx64\bin * 1.2my.in…

Docker部署私有仓库(registryHarbor)

简介Docker Hub 官方仓库 在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理…

讲座学习截图——《CAD/CAE/CAM几何引擎-软件概述》(一)

目录 引出CAD/CAE/CAM几何引擎-软件概述 郝建兵CADCAECAM 几何模型内核ACIS 两个老大之一Open CascadeParasolid 两个老大之一Autodesk的内核 总结其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式…

双目相机测距原理

一、普通双目相机测距原理 普通双目相机具有如下特点:左右两个相机位于同一平面(光轴平行),且相机参数(焦距f)一致。其原理图如下: 如图所示,P点为相应的物体位置,CL和C…

【等保】网络安全等级保护(等保2.0PPT)

等保2.0(网络安全等级保护基本要求的第二代标准)的推出和实施,是基于多方面的考虑和需求。以下是实施等保2.0的主要原因: 加强网络安全保护: 随着网络技术的不断发展和网络威胁的不断增加,传统的网络安全保…

2024年广西三支一扶报名详细流程(附报名照处理流程)​

2024年广西将招募1650名高校毕业生到基层从事支农、支医、支教和帮扶乡村振兴工作(简称“三支一扶”)。 招募对象为全日制普通高校应届及择业期内2022年至2024年毕业的全日制普通高校毕业生。 ➡️招募条件。 1.具有全日制大专(含高职高专&am…

B端系统:配置页面如何设计,这可是用户体验的关键的关键。

提升配置页面体验的十大原则 设计B端系统的配置页面时,用户体验确实是非常关键的。以下是一些设计原则和建议,可以帮助提高配置页面的用户体验: 简洁明了:配置页面应该尽量简洁明了,避免过多的复杂选项和信息。使用清…