You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ENS反向记录合约中的Solidity函数转换为JavaScript?

将ENS反向记录合约的Solidity函数转换为JavaScript

原Solidity函数说明

需要转换的两个函数来自ENS反向记录合约,功能如下:

  • sha3HexAddress:将以太坊地址转换为小写十六进制字符串后,计算其Keccak256哈希
  • node:结合固定的ADDR_REVERSE_NODE值与sha3HexAddress的结果,计算ENS反向记录对应的节点哈希

JavaScript实现(基于ethers.js)

const { ethers } = require("ethers");

// ENS反向记录合约中固定的ADDR_REVERSE_NODE值
const ADDR_REVERSE_NODE = "0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2";

/**
 * 对应Solidity的sha3HexAddress函数
 * @param {string} addr 以太坊地址(支持带/不带0x前缀)
 * @returns {string} Keccak256哈希结果(带0x前缀)
 */
function sha3HexAddress(addr) {
    // 标准化地址:转小写、去除0x前缀
    const normalizedAddr = ethers.getAddress(addr).toLowerCase().slice(2);
    // 将十六进制字符串转为字节数组
    const addrBytes = ethers.getBytes(`0x${normalizedAddr}`);
    // 计算Keccak256哈希
    return ethers.keccak256(addrBytes);
}

/**
 * 对应Solidity的node函数
 * @param {string} addr 以太坊地址
 * @returns {string} ENS反向记录节点的Keccak256哈希
 */
function node(addr) {
    // 转换固定节点值为字节数组
    const reverseNodeBytes = ethers.getBytes(ADDR_REVERSE_NODE);
    // 转换地址哈希结果为字节数组
    const hashedAddrBytes = ethers.getBytes(sha3HexAddress(addr));
    // 拼接两个字节数组
    const combinedBytes = ethers.concat([reverseNodeBytes, hashedAddrBytes]);
    // 计算最终节点哈希
    return ethers.keccak256(combinedBytes);
}

// 示例调用
// const testAddress = "0x1234567890abcdef1234567890abcdef12345678";
// console.log("地址哈希结果:", sha3HexAddress(testAddress));
// console.log("反向节点哈希结果:", node(testAddress));

实现说明

原Solidity中sha3HexAddress的汇编逻辑,本质是把地址的每一位十六进制字符转换为对应的小写ASCII码,再对整个40字符的字符串计算Keccak256。JavaScript实现通过标准化地址格式、转换为字节数组后哈希,完全还原了原逻辑的结果。

内容的提问来源于stack exchange,提问作者Siwei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:25:23