提问人:bguiz 提问时间:4/13/2023 最后编辑:bguiz 更新时间:4/30/2023 访问量:179
如何使用 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?
问:
我目前正在使用 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");
但是,Mnemonic
的 toEcdsaPrivateKey
函数似乎接受一个数字数组作为派生路径的输入,基于其 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
如何指定此派生路径?
答:
5赞
bguiz
4/26/2023
#1
在最新版本 v2.24.1 中,
该类已更新为弃用 toEcdsaPrivateKey
:Mnemonic
/**
* @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。OR
0x80000000
因此,这里有一个结合使用 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.fromMnemonic
Mnemonic.toEcdsaPrivateKey
下面是一个更完整的例子, 我使用上述方法创建多个帐户, 并从ED22519账户中为其注资 (最初由Hedera测试网门户网站生成并由其资助, 其功能类似于水龙头)。
评论
0赞
bguiz
4/28/2023
在此答案中添加复选标记...但是,如果有人找到一种方法来做到这一点,而没有这个解决方法--即只使用Hedera JS SDK --将很乐意将复选标记切换到更新的答案!
评论
0x80000000