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

以太坊:从公钥生成有效地址遇问题,代码生成地址不符求助

问题排查与解决方案

核心问题是你使用的secp256k1.getPublicKey默认返回了压缩格式的公钥,而以太坊地址生成要求基于非压缩格式的公钥计算,这就是和在线工具结果不一致的原因。

具体修正步骤

修改公钥生成代码,传入第二个参数false来获取非压缩格式的公钥:

const publicKey = secp256k1.getPublicKey(privateKey, false);

完整修正后的代码

const { secp256k1 } = require("ethereum-cryptography/secp256k1");
const { keccak256 } = require("ethereum-cryptography/keccak");
const { toHex } = require("ethereum-cryptography/utils");

const privateKey = secp256k1.utils.randomPrivateKey();
console.log('private key :  ', toHex(privateKey));

// 传入false获取非压缩公钥
const publicKey = secp256k1.getPublicKey(privateKey, false);
console.log('public key  :', toHex(publicKey));

const address = keccak256(publicKey.slice(1)).slice(-20);
console.log('address     :', '0x' + toHex(address));

原理说明

  • 压缩公钥仅包含x坐标和一个奇偶标识位(开头为02或03),长度为33字节
  • 非压缩公钥包含完整的x和y坐标,开头为04,长度为65字节
  • 以太坊规范明确要求使用非压缩公钥的04前缀之后的部分(即x+y坐标)进行Keccak-256哈希,再取最后20字节作为地址

修正后生成的地址就会和在线工具的结果一致了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:02:40