以太坊:从公钥生成有效地址遇问题,代码生成地址不符求助
问题排查与解决方案
核心问题是你使用的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
相关产品推荐
相关产品推荐

