我目前正在使用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,不幸的是,它还不支持每个网络配置的自定义派生路径,而是硬编码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测试网门户网站生成并资助,像水龙头一样的功能)