借助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,一经查实,立即删除!

相关文章

数据分析-------面试相关

数据分析面试到底在面什么 在寻找合适的数据分析师时,一般招聘方的目标是确保候选人的专业技能和工作经验与岗位要求紧密对应。 关键在于两个方面:岗位的具体需求和数据分析师的职业素质。 首先,招聘方要确保应聘者的专业背景和技能与职位需求相匹配。…

解决微信小程序中input框被禁用后,电脑端小程序点击事件无效,手机端开发者工作和手机端正常

问题&#xff1a;input框被禁用后&#xff0c;电脑端小程序点击事件无效&#xff0c;手机端开发者工作和手机端正常。 解决方法&#xff1a;使用view包裹input标签&#xff0c;在view添加点击事件&#xff0c;input添加css:pointer-events:none; // 禁止鼠标事件 <view bin…

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

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

Java 中的 Optional 类及其在避免空指针异常中的作用?如何使用它们来过滤重复元素?

在Java编程的世界里&#xff0c;NullPointerException&#xff08;空指针异常&#xff09;恐怕是每个开发者都不陌生的“老朋友”。它通常发生在尝试访问或操作一个为null的对象的成员时&#xff0c;这不仅会导致程序崩溃&#xff0c;还可能隐藏了代码中的逻辑错误。为了优雅地…

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

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

【TensorFlow深度学习】完整项目案例:从零搭建自然语言问答系统

完整项目案例:从零搭建自然语言问答系统 完整项目案例:从零搭建自然语言问答系统1. 项目概览2. 技术栈与环境准备3. 数据准备4. 模型选择与加载5. 数据预处理6. 模型预测7. 性能优化与评估8. 部署与应用结语完整项目案例:从零搭建自然语言问答系统 随着人工智能技术的飞速发…

用python打印——九九乘法表2

for i in range(1, 10):for j in range(1, i 1):print(f"{j} * {i} {j * i}\t", end)j 1print()外层的 for 循环从 1 到 9 遍历 i。对于每个 i&#xff0c;内层的 for 循环从 1 到 i 遍历 j。在每次循环中&#xff0c;打印出 j 乘以 i 的结果&#xff0c;并以制表…

数据安全和数据加密

数据安全 数据安全是信息技术领域的一个核心议题&#xff0c;涉及到保护数字资料免受未经授权的访问和攻击。它主要包含三个关键方面&#xff1a;可用性、完整性和机密性&#xff0c;这三个要素共同构成了所谓的“信息安全三原则”。 可用性 可用性意味着授权用户能够及时地…

STM32介绍和资料地址

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

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 虚拟机处理过程

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

前端 CSS 经典:鼠标位置信息

前言&#xff1a;当监听鼠标事件时&#xff0c;需要了解鼠标属性所代表的位置信息 dom.addEventListener("click", (e) > {e.pageX;e.clientX;e.offsetX;e.movementX; }); 1. pageX 表示鼠标距离整个页面左边缘的距离&#xff0c;就算有滚动条&#xff0c;最左…

数据结构与算法-【算法专项】Hash算法-1(散列表+散列函数+Hash冲突解决办法)

数据结构与算法-Hash算法-1 1 前置2 散列表3 散列函数4 Hash冲突4.1 开放寻址&#xff1a;4.2 链路地址 在这里插入图片描述 1 前置 给你N&#xff08;1<N<10&#xff09;个自然数,每个数的范围为&#xff08;1~100&#xff09;。现在让你以最快的速度判断某一个数是否…

怎样选择合适的O型密封圈?

O型密封圈在机械和工业应用中起到至关重要的密封作用。选择合适的O型密封圈不仅能提高设备的运行效率&#xff0c;还能延长其使用寿命。本文将从多个角度详细介绍如何选择适合不同应用场景的O型密封圈。 1、识别操作条件 温度范围&#xff1a;不同材料的O型密封圈在不同温度下…

LabVIEW电机故障监测系统

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

分布式系统_跨域问题

跨域&#xff1a;域名不一致就是跨域&#xff0c;主要包括&#xff1a; 域名不同&#xff1a; www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com 域名相同&#xff0c;端口不同&#xff1a;localhost:8080和localhost:8081 跨域问题&#xff1a;浏览器禁止…

Eureka区域感知路由:优化微服务架构的地理感知负载均衡

Eureka是Netflix开源的服务发现框架&#xff0c;它是Spring Cloud体系中的核心组件之一。在构建分布式系统和微服务架构时&#xff0c;服务发现是确保不同服务实例能够相互通信的关键机制。Eureka区域感知路由&#xff08;Zone-Aware Routing&#xff09;是Eureka中一个重要的特…

目标跟踪——KCF源码用python实现

from numpy.fft import fft2, ifft2, fftshift import cv2 import numpy as npclass HOG:def __init__(self, winSize):""":param winSize: 检测窗口的大小"""self.winSize winSizeself.blockSize (8, 8)self.blockStride (4, 4)self.cellSiz…

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

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

TMC2209驱动模式详解

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