Я начал разработку мобильного кошелька для Nano некоторое время назад в качестве побочного проекта и не смог найти библиотеку Javascript, которая могла бы помочь мне создавать кошельки Nano или подписывать блоки локально на устройстве пользователя, чтобы ключи пользователей не были скомпрометированы отправка на внутренний сервер. Итак, я начал изучать криптографию, и после нескольких поздних вечеров и летних каникул у меня наконец-то появилась работающая генерация кошелька, вывод ключей и реализация подписи блоков. Теперь решил поделиться.

Библиотека называется nanocurrency-web и находится на Github и в репозитории npm. Он включает генерацию мнемонических фраз и вывод ключей на основе стандарта BIP39/44, определенного в Документации Nano, и работает вместе с реализацией Nano Ledger. Вы можете получить столько учетных записей, сколько позволяет стандарт BIP, с одной и той же мнемонической фразой и начальным числом.

Вы также можете подписывать репрезентативные блоки отправки, получения и изменения с помощью закрытого ключа пользователя. Библиотека создает действительные входные данные, готовые к публикации в блокчейне, с помощью команды RPC процесса Nano Node.

В библиотеке есть автоматизированные тесты, проверяющие реализацию, написанную с помощью Chai.

Как создать кошелек Nano?

Стандарт BIP39/44 (Bitcoin Improvement Proposal) определен в Репозитории Биткойн. Он определяет создание кошельков на основе мнемонических фраз, семян и вывода ключей.

Мнемоническая фраза представляет собой набор из 12–24 слов. Эти слова взяты из стандартизированного списка из 2048 слов. Мнемоническая фраза представляет собой сгенерированную для нее начальную энтропию. Каждое слово имеет индекс в списке слов. Этот номер индекса преобразуется в двоичное представление 11 бит. Последнее слово выводится из хэша SHA256 начальной энтропии.

Семя получено из мнемонической фразы и необязательного пароля. Если указан пароль, слова нельзя использовать без пароля для получения доступа к активам. Мнемоническая фраза хешируется с помощью функции получения ключа на основе пароля PBKDF2 с использованием SHA512 в качестве хэша и кодируется в шестнадцатеричную строку.

Семя используется для получения закрытых ключей. Стандарт BIP44 определяет защищенные пути для различных криптовалют. Путь Nano равен 44/165/i, где i = индекс закрытого ключа. Ключи выводятся рекурсивно на основе жесткого пути и суммы цепочки и постоянного смещения с помощью функции CKDpriv((k par, c par), i) → (k i, c i). Производный ключ на каждой итерации хэшируется с помощью HMACSHA512 и делится пополам. Левая половина — это закрытый ключ, а правая половина — это цепочка, которую можно продолжить для получения другого ключа.

Закрытый ключ используется для генерации пары ключей, при этом он является закрытым ключом и генерирует открытый ключ со схемой подписи открытого ключа EdDSA ed25519, модифицированной для использования алгоритма хеширования blake2b вместо SHA512.

Затем открытый ключ кодируется в адрес Nano, и вот он у нас есть.

Первоначально опубликовано на https://miro.metsanheimo.fi 13 октября 2019 г.