如何将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
相关产品推荐
相关产品推荐

