Как я делал кошелек EOS
Для эфира я пользуюсь метамаском. Нормальное решение, не хуже и не лучше любого другого. Но мне такой формат нравится.
Когда зашла речь о кошельке для EOS, то тут прямым аналогом выглядел Scatter. И я его поставил. А он у меня не заработал. Я менял identity, ключи, ноды. Не работает и все тут. Нода с которой он работает заблокирована Роскомнадзором. Ни одного приличного прокси, через который можно работать я не нашел. Плюнул и поставил EOS Voter. Не смотря на название, это тоже кошелек. Он умеет голосовать, стекать и анстекать токены и делать переводы. И все.
Для начала, может и хватит, но вот создать аккаунт, например, уже отдельная задача, ради которой нужно писать код. А код-то я уменю писать, вот какое счастливое совпадение.
Поэтому я решил написать свой кошелек. Про блэкджек и шлюх всем уже надоело? Тогда не буду об этом говорить.
Для самых нетерпеливых. Установить кошелек можно тут:
Owl EOS Wallet
Но это подойдет только для Хрома. Если будут желающие пользоваться, портирую на Файрфокс.
Отталкиваться решил от того же Метамаска и библиотеки eosjs. Забрался в гугл и он мне рассказал, что для того, чтобы сделать расширение, нужно всего лишь пара файлов - манифест в формате json и html. Ну и туда еще добавлились js и css файл. Ну да это ищется на раз-два.
Так же мне понадобились библиотеки для связи с EOS, работе с ключами и криптографией. Все это можно посмотреть вот тут в репозитории: https://github.com/HomeRobot/owleos Я сразу один раз попрошу прощения за свой английский и не буду к этому больше возвращаться.
Написано все на чистом JS без лишних библиотек и фреймворков.
Архитектуры там особой нет, описывать много не буду. Каркас это html файл с div контейнерами. В зависимости от действий пользователя там открываются те или иные закладки, показываются те или иные формы ввода и т.п. Этим я вас утомлять не буду. Постараюсь рассказать о специфике.
Точка входа это
document.addEventListener('DOMContentLoaded'
Тут мы описываем реакцию на все остальные события - нажатия кнопок, ссылок, выбор элементов.
Регистрация
Тут все просто. Мы берем у пользователя приватный ключ и пароль. Шифруем ключ паролем и кладем в localStorage. Потом, когда пользователю нужно что-то подписать, мы запрашиваем у него пароль, извлекаем ключ, подписываем и пароль с ключом забываем.
При регистрации у нас получается вот какая цепочка:
Проверяем валидность ключа:
eosjs_ecc.isValidPrivate(key)
Формируем из него публичный ключ:
let public_key = eosjs_ecc.privateToPublic(key)
Извлекаем аккаунт, привязаный к ключу:
Eoswallet.eos.getKeyAccounts(public_key)
Формируем профиль пользователя, куда добавляем его аккаунт, публичный ключ и зашифрованный приватный ключ. Сохраняем в localStorage. Это надежное хранилище, никто извне не имеет к нему доступа, только наше приложение.
Так как аккаунтов у нас может быть несколько, то я сразу сделал систему мультиаккаунтов, поэтому добавляю в localStorage так же информацию, что у нас появился ноывый аккаунт. При запуске расширения, мы эту информацию прочитаем и добавим в выпадающий список, чтобы пользователь мог выбрать аккаунт.
На сегодня пока все. Если интересно как там все устроено, то я готов сделать серию статей. Жду отклика.