以太坊为何仍基于未压缩公钥生成地址?
从公钥生成以太坊地址的疑问
之前在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
相关产品推荐
相关产品推荐

