From 07fed52499f393c71efd3b75964084d17875782e Mon Sep 17 00:00:00 2001 From: fly-1-1 <2673024411@qq.com> Date: Fri, 9 Jan 2026 10:46:36 +0800 Subject: [PATCH 1/2] unify to return compressed public key --- src/hd/ethereum.plugin.ts | 4 ++-- src/hd/tron.plugin.ts | 6 ++---- test/eth.spec.ts | 5 +---- test/hd.spec.ts | 5 +---- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/hd/ethereum.plugin.ts b/src/hd/ethereum.plugin.ts index 2db6049..dfbf3f6 100644 --- a/src/hd/ethereum.plugin.ts +++ b/src/hd/ethereum.plugin.ts @@ -130,10 +130,10 @@ export const plugin: IEthereumPlugin = { if (!plugin.isValidSecret(key)) { return null; } - const publicKey = secp256k1.ProjectivePoint.fromPrivateKey(Buffer.from(stripHexPrefix(key), "hex")).toHex(false); + const publicKey = secp256k1.ProjectivePoint.fromPrivateKey(Buffer.from(stripHexPrefix(key), "hex")).toHex(true); return { privateKey: key, - publicKey: publicKey.substring(2) + publicKey }; } catch { return null; diff --git a/src/hd/tron.plugin.ts b/src/hd/tron.plugin.ts index d53d51c..ecf73ac 100644 --- a/src/hd/tron.plugin.ts +++ b/src/hd/tron.plugin.ts @@ -8,6 +8,7 @@ import { } from "../minify-tron/crypto"; import { hexStr2byteArray } from "../minify-tron/code"; import { hashMessage, signMessage, verifyMessage } from "../minify-tron/message"; +import { secp256k1 } from "@noble/curves/secp256k1.js"; export interface ITronPlugin extends IHDPlugin { checkPrivateKey(privateKey: string): string; @@ -76,10 +77,7 @@ export const plugin: ITronPlugin = { if (!plugin.isValidSecret(key)) { return null; } - const pubBytes = getPubKeyFromPriKey(hexStr2byteArray(key)); - const publicKey = Array.from(pubBytes) - .map((b) => b.toString(16).padStart(2, "0")) - .join(""); + const publicKey = secp256k1.ProjectivePoint.fromPrivateKey(Buffer.from(key, "hex")).toHex(true); return { privateKey: key, publicKey diff --git a/test/eth.spec.ts b/test/eth.spec.ts index 7f828f4..b80ee7d 100644 --- a/test/eth.spec.ts +++ b/test/eth.spec.ts @@ -133,10 +133,7 @@ describe("test eth", function() { expect(keypair).to.not.equal(null); expect(keypair.privateKey.toLowerCase()).to.equal(testSecret.toLowerCase()); expect(keypair.publicKey).to.be.a("string"); - expect(keypair.publicKey.length).to.equal(128); - // 验证公钥能推导出正确地址 - let address = ethWallet.address({ publicKey: keypair.publicKey }); - expect(address.toLowerCase()).to.equal(testAddress.toLowerCase()); + expect(keypair.publicKey.length).to.equal(66); }); it("should return keypair if the private key has 00 prefix", function() { diff --git a/test/hd.spec.ts b/test/hd.spec.ts index 6154cd8..fe116be 100644 --- a/test/hd.spec.ts +++ b/test/hd.spec.ts @@ -530,10 +530,7 @@ describe("HD wallet testcase", function() { let keypair = api.getKeyPairFromPrivateKey(tron_keypairs[0].privateKey); expect(keypair).to.not.equal(null); expect(keypair.privateKey.toLowerCase()).to.equal(tron_keypairs[0].privateKey.substring(2).toLowerCase()); - - // 验证公钥能推导出正确地址 - let address = api.address({ publicKey: keypair.publicKey, privateKey: "" }); - expect(address).to.equal(tron_account[0].address); + expect(keypair.publicKey.toLowerCase()).to.equal(tron_keypairs[0].publicKey.toLowerCase()); // 无效私钥返回 null keypair = api.getKeyPairFromPrivateKey("invalid"); From 99dd75b03e6f6fc0a088c8b3ef8d2db43727d78b Mon Sep 17 00:00:00 2001 From: fly-1-1 <2673024411@qq.com> Date: Fri, 9 Jan 2026 11:07:05 +0800 Subject: [PATCH 2/2] strip eth public key prefix --- src/hd/ethereum.plugin.ts | 2 +- src/hd/tron.plugin.ts | 7 +++++-- test/eth.spec.ts | 2 +- test/hd.spec.ts | 5 ++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hd/ethereum.plugin.ts b/src/hd/ethereum.plugin.ts index dfbf3f6..7de541c 100644 --- a/src/hd/ethereum.plugin.ts +++ b/src/hd/ethereum.plugin.ts @@ -133,7 +133,7 @@ export const plugin: IEthereumPlugin = { const publicKey = secp256k1.ProjectivePoint.fromPrivateKey(Buffer.from(stripHexPrefix(key), "hex")).toHex(true); return { privateKey: key, - publicKey + publicKey: publicKey.substring(2) }; } catch { return null; diff --git a/src/hd/tron.plugin.ts b/src/hd/tron.plugin.ts index ecf73ac..4bc6d23 100644 --- a/src/hd/tron.plugin.ts +++ b/src/hd/tron.plugin.ts @@ -8,7 +8,7 @@ import { } from "../minify-tron/crypto"; import { hexStr2byteArray } from "../minify-tron/code"; import { hashMessage, signMessage, verifyMessage } from "../minify-tron/message"; -import { secp256k1 } from "@noble/curves/secp256k1.js"; + export interface ITronPlugin extends IHDPlugin { checkPrivateKey(privateKey: string): string; @@ -77,7 +77,10 @@ export const plugin: ITronPlugin = { if (!plugin.isValidSecret(key)) { return null; } - const publicKey = secp256k1.ProjectivePoint.fromPrivateKey(Buffer.from(key, "hex")).toHex(true); + const pubBytes = getPubKeyFromPriKey(hexStr2byteArray(key)); + const publicKey = Array.from(pubBytes) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); return { privateKey: key, publicKey diff --git a/test/eth.spec.ts b/test/eth.spec.ts index b80ee7d..ce052d2 100644 --- a/test/eth.spec.ts +++ b/test/eth.spec.ts @@ -133,7 +133,7 @@ describe("test eth", function() { expect(keypair).to.not.equal(null); expect(keypair.privateKey.toLowerCase()).to.equal(testSecret.toLowerCase()); expect(keypair.publicKey).to.be.a("string"); - expect(keypair.publicKey.length).to.equal(66); + expect(keypair.publicKey.length).to.equal(64); }); it("should return keypair if the private key has 00 prefix", function() { diff --git a/test/hd.spec.ts b/test/hd.spec.ts index fe116be..6154cd8 100644 --- a/test/hd.spec.ts +++ b/test/hd.spec.ts @@ -530,7 +530,10 @@ describe("HD wallet testcase", function() { let keypair = api.getKeyPairFromPrivateKey(tron_keypairs[0].privateKey); expect(keypair).to.not.equal(null); expect(keypair.privateKey.toLowerCase()).to.equal(tron_keypairs[0].privateKey.substring(2).toLowerCase()); - expect(keypair.publicKey.toLowerCase()).to.equal(tron_keypairs[0].publicKey.toLowerCase()); + + // 验证公钥能推导出正确地址 + let address = api.address({ publicKey: keypair.publicKey, privateKey: "" }); + expect(address).to.equal(tron_account[0].address); // 无效私钥返回 null keypair = api.getKeyPairFromPrivateKey("invalid");