В настоящее время я использую 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");
Однако функция toEcdsaPrivateKey Mnemonic, похоже, принимает массив чисел в качестве входных данных для пути вывода, основываясь на своем комментарии 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, который, к сожалению, еще не поддерживает настраиваемые пути деривации для каждой конфигурации сети и вместо этого жестко кодирует путь деривации Ethereum m/44'/60'/0'/0/0. Обратите внимание, что первые 3 сегмента «закалены», а остальные 2 — нет.
Как я могу указать этот путь вывода?
Ах, спасибо @Topaco - двоичное ИЛИ с 0x80000000 похоже на то, что мне нужно!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В последней версии 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();
Значимый бит - это где utils.HDNode.fromMnemonic из EthersJs
используется вместо Mnemonic.toEcdsaPrivateKey из Hedera JS SDK.
Вот более полный пример, где я создаю несколько учетных записей, используя вышеуказанный метод, и финансировать их со счета ED22519 (изначально создано и финансируется порталом Hedera Testnet Portal, который работает как кран).
добавление галочки к этому ответу ... но если кто-нибудь найдет способ сделать это без этого обходного пути, то есть с использованием только Hedera JS SDK, будет рад переключить галочку на более новый ответ!
В документации есть несколько примеров, например. здесь или здесь.