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

以太坊为何仍基于未压缩公钥生成地址?

从公钥生成以太坊地址的疑问

之前在Stack Overflow提问关于从公钥生成以太坊地址的问题时,得到了准确的解答:

(以太坊地址)必须基于未压缩公钥(格式为0x04|x|y)生成。需要移除开头的标记字节,对剩余的32字节x坐标和32字节y坐标生成Keccak-256哈希,取其最后20字节即为地址。

以下是验证用的代码:

const { secp256k1 } = require("ethereum-cryptography/secp256k1");
const { keccak256 } = require("ethereum-cryptography/keccak");
const { toHex } = require("ethereum-cryptography/utils");
const { encode: checksum } = require('eip55');

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     :', checksum('0x' + toHex(address)));

但现在压缩公钥已经成为默认且更受青睐的格式,为什么以太坊仍坚持基于未压缩公钥生成地址? 这类困惑在相关文档中普遍存在,却没有明确答案:

……若将压缩公钥转换为承诺,会生成与未压缩公钥不同的承诺,进而得到不同地址。这很容易引发混淆,因为单个私钥可以生成两种格式(压缩、未压缩)的公钥,对应两个不同的地址,但私钥本身是完全相同的。

内容的提问来源于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 08:32:39