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

How can I use Hedera JS SDK to generate a set of ECDSA key-pairs based on a BIP-39 seed phrase and a custom derivation path?

提问人:bguiz 提问时间:4/13/2023 最后编辑:bguiz 更新时间:4/30/2023 访问量:179

问:

我目前正在使用 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,不幸的是,它尚不支持每个网络配置的自定义派生路径,而是对以太坊派生路径进行硬编码。请注意,前 3 个段是“硬化”的,而其余 2 个则不是。m/44'/60'/0'/0/0

如何指定此派生路径?

javascript ecdsa 助记符 hedera-hashgraph hedera

评论

0赞 Topaco 4/13/2023
文档中有一些示例,例如 此处 或 此处
0赞 bguiz 4/19/2023
啊,谢谢@Topaco - 二进制 OR 看起来像我想要的!0x80000000

答:

5赞 bguiz 4/26/2023 #1

在最新版本 v2.24.1 中, 该类已更新为弃用 toEcdsaPrivateKeyMnemonic

    /**
     * @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在评论中建议的方法, 其中每个硬化段都是二进制 -ed ,其中 是行不通的。 ...因此不可能达到我的预期结果 仅使用 Hedera JS SDK。OR0x80000000

因此,这里有一个结合使用 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 的 where 用于代替 Hedera JS SDK。utils.HDNode.fromMnemonicMnemonic.toEcdsaPrivateKey


下面是一个更完整的例子, 我使用上述方法创建多个帐户, 并从ED22519账户中为其注资 (最初由Hedera测试网门户网站生成并由其资助, 其功能类似于水龙头)。

评论

0赞 bguiz 4/28/2023
在此答案中添加复选标记...但是,如果有人找到一种方法来做到这一点,而没有这个解决方法--即只使用Hedera JS SDK --将很乐意将复选标记切换到更新的答案!