Как я могу использовать Hedera JS SDK для создания набора пар ключей ECDSA на основе исходной фразы BIP-39 и пользовательского пути получения?

В настоящее время я использую 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 13.04.2023 12:15

Ах, спасибо @Topaco - двоичное ИЛИ с 0x80000000 похоже на то, что мне нужно!

bguiz 19.04.2023 02:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В последней версии 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, будет рад переключить галочку на более новый ответ!

bguiz 28.04.2023 03:43

Другие вопросы по теме