使用ethers.js v6获取ENS个人资料全部文本记录的问题
最优实现方案:精准筛选ENS文本记录
你当前的问题在于只通过事件签名和合约地址筛选日志,会返回所有用户的文本记录变更,数据量自然过大。最优方案是利用ENS文本事件的topic结构,直接精准筛选目标ENS名称的相关日志,无需绕路查询交易。
核心原理
ENS PublicResolver的文本相关事件(如TextChanged)的topic结构固定:
- 第一个topic:事件签名哈希
- 第二个topic:目标ENS名称的node哈希(通过
namehash计算) - 第三个topic:文本记录的键哈希
通过指定第二个topic为目标ENS的node哈希,就能只返回该ENS的文本记录变更日志,彻底过滤无关数据。
实现步骤与代码示例
- 计算目标ENS的node哈希
const ethers = require("ethers"); const provider = new ethers.JsonRpcProvider("your-rpc-url"); // 替换为你要查询的ENS名称 const targetEnsName = "example.eth"; const nodeHash = ethers.utils.namehash(targetEnsName);
- 修改日志查询逻辑,添加node哈希筛选
const publicResolverContractAddress = '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63'; // 文本相关事件签名哈希 const eventTopics = [ '0x448bc014f1536726cf8d54ff3d6481ed3cbc683c2591ca204274009afa09b1a1', '0xc0e482f545380f3c76a14db8d5717d205abfdc508449ed2befe6d5427a9d45cd', '0x36c0d6cc28ff7763f02401a2d40c3a72c4dfdd8a6b812dfa978274306592721e' ]; // 精准筛选目标ENS的日志 let logs = await provider.getLogs({ address: publicResolverContractAddress, fromBlock: '0x1024592', toBlock: '0x107D3F5', topics: [eventTopics, nodeHash] });
为什么不建议查询交易?
- ethers.js无直接API:确实没有
getTransactions()这类按发起者查询交易的函数,需要遍历区块逐个检查交易发起地址,效率极低。 - 易遗漏记录:ENS文本记录的修改交易发起者不一定是ENS所有者(比如授权第三方修改),按发起者筛选会漏掉这类合法记录。
内容的提问来源于stack exchange,提问作者Paul M
相关产品推荐
相关产品推荐

