如何使用Hedera JS SDK生成一组基于BIP-39种子短语和自定义派生路径的ECDSA密钥对?



我目前正在使用Hedera JS SDK直接使用私钥作为输入生成单个ECDSA密钥对,如下所示:

const privateKey = PrivateKey.fromStringECDSA(process.env.TARGET_HEX_PRIVATE_KEY);

相反,我想做这样的事情,我使用一个BIP-39种子短语和一个派生路径作为输入:

const mnemonic = Mnemonic.fromString(process.env.TARGET_SEED_PHRASE);
const privateKey = await mnemonic.toEcdsaPrivateKey('', "m/44'/60'/0'/0/0");

然而,MnemonictoEcdsaPrivateKey函数似乎接受一组数字作为推导路径的输入,根据其JsDoc@param注释,复制如下:

/**
* Recover an ECDSA private key from this mnemonic phrase, with an
* optional passphrase.
*
* @param {string} [passphrase]
* @param {number[]} [path]
* @returns {Promise<PrivateKey>}
*/
async toEcdsaPrivateKey(passphrase = "", path) {
return CACHE.privateKeyConstructor(
await this._mnemonic.toEcdsaPrivateKey(passphrase, path)
);
}

在我的用例中,我想使用MetaMask,不幸的是,它还不支持每个网络配置的自定义派生路径,而是硬编码m/44'/60'/0'/0/0的以太坊派生路径。请注意,前3段是"硬化"的,而其余2段不是。

我如何指定这个派生路径?

在最新版本v2.24.1中,Mnemonic类已更新为弃用toEcdsaPrivateKey:

/**
* @deprecated - Use `toStandardEd25519PrivateKey()` or `toStandardECDSAsecp256k1PrivateKey()` instead
* Recover an ECDSA private key from this mnemonic phrase, with an
* optional passphrase.
* @param {string} [passphrase]
* @param {number[]} [path]
* @returns {Promise<PrivateKey>}
*/

…所以使用@Topaco在评论中建议的方法,其中每个硬化段是二进制OR-ed与0x80000000,不会起作用的。…因此不可能达到我想要的结果只使用Hedera JS SDK。

这里有一个解决方法结合使用EthersJs使用Hedera JS SDK来实现预期的结果:

import { PrivateKey } from "@hashgraph/sdk";
import { utils as ethersUtils } from "ethers";
// init a hierarchically deterministic wallet's node using a seed phrase
const hdNodeRoot = ethersUtils.HDNode.fromMnemonic(process.env.TARGET_SEED_PHRASE);
// apply the derivation path, `accountIdx` starts at `0`
const hdNodeX = hdNodeRoot.derivePath(`m/44'/60'/0'/0/${accountIdx}`);
// convert from ethersjs private key to hedera js sdk private key
const privateKeyX = PrivateKey.fromStringECDSA(hdNodeX.privateKey);
// extract the `0x...` address from the private key
const addressX = privateKeyX.publicKey.toEvmAddress();

有效位是来自EthersJs的utils.HDNode.fromMnemonic是用来代替Hedera JS SDK中的Mnemonic.toEcdsaPrivateKey的。


这里有一个更完整的例子,其中我使用上述方法创建多个帐户,并从ED22519账户为他们提供资金(最初由Hedera测试网门户网站生成并资助,像水龙头一样的功能)

相关内容

  • 没有找到相关文章

最新更新