Почему мы создали еще один криптовалютный кошелек
![Featured Image](/_astro/wallet_technical_m_29GINb.webp)
Здравствуйте, я - Томас, главный технический директор здесь, на Morpher. В этом посте я хочу немного рассказать о том, как настроены компоненты кошелька и почему мы создали кошелек в первую очередь. Это довольно техническая статья, поэтому если вы разработчик, то эта статья для вас.
Почему еще один кошелек?! 🤔
Цель Morpher - сделать торговлю с использованием технологии Blockchain доступной для масс. Существующие реализации кошельков все очень очень безопасны, но не очень удобны для пользователей. Они также очень часто неудобны для работы разработчиков. Мы считаем, что удобство не должно ставить под угрозу безопасность.
Мы начали Morpher с тремя различными кошельками: MetaMask, Portis и Fortmatic. Интеграция с кошельками обычно работает так: Кошелек внедряет полный объект web3 на веб-сайт и заботится о подключении к узлу, а также предоставляет keystore для подписи транзакций. Таким образом, вам необходимо подключиться к правильному узлу, а затем иметь средства для подписи транзакций, которые отправляются через соединение кошелька с узлом. Это два компонента: коннектор Http/WebSocket и keystore, оба в одном "кошельке", который заботится о подписи и отправке.
Иметь оба компонента во внешних компонентах дает очень мало контроля разработчику. Например, с MetaMask вы не можете напрямую влиять на то, к какой сети подключаться - пользователю нужно это сделать. Кроме некоторых небольших усовершенствований в новых вызовах RPC, позволяющих разработчикам автоматически добавлять новую сеть, все, что вы можете сделать, это слушать и наблюдать, к какой сети подключен пользователь, и информировать их с помощью модального окна или какого-либо оповещения, что пользователь подключен к неверной сети.
MetaMask
Представьте, что вы – пользователь, который никогда не имел дела с блокчейном.
Теперь вам нужно настроить MetaMask перед тем, как начать использовать платформу. Вам нужно загрузить браузерный плагин, о котором вы никогда не слышали, у которого голова лисы следует за указателем мыши. Затем вам нужно ввести надежный пароль – и бог вас храни, если вы его потеряете. Затем вас просят запомнить фразу восстановления. На этом этапе вы не представляете, что такое фраза восстановления, но это звучит так, как будто вы только что начали стажировку в ЦРУ.
Если вы до сих пор не отказались, вас встречает всплывающее окно для ввода сетевых данных и изменения чего-то, что звучит очень пугающе для обычного пользователя. Теперь вы попали на боковую цепь Morpher 🎉 (как и мы, вероятно, ваш DApp также работает на сети второго уровня).
Чтобы завершить всё это, вам дается один ETH для подписи транзакций нашей боковой цепи. Это как тестовый ETH нашей POA боковой цепи и, по сути, безценный. Тем не менее MetaMask говорит вам, что вы богаты. Однако неудивительно обнаружить, что ваше новое состояние на самом деле не состояние вовсе, и те $3,000 на вашем счете – не настоящие. Но на этом этапе все это уже детали, потому что большинство пользователей уже отказались от загрузки MetaMask.
Они пришли сюда, чтобы торговать, а не становиться экспертами блокчейна.
Portis и Fortmatic
Вот идут хостинговые кошельки. Давайте пока сосредоточимся на Fortmatic (или Magic?).
Он также дает доступ к полному объекту web3 на веб-сайте. Это означает, что он выполняет две функции: подключение к сети и предоставление хранилища ключей.
Он утверждает, что не является кастодиальным. Для шифрования используется AWS KMS. Но по сути, он является посредником в процессе восстановления и хранит ваши ключи в их собственной инфраструктуре 🤷♂️.
Он позволяет немного настраивать всплывающие окна. Но если Fortmatic решит, что сегодня каждому нужно двухфакторную аутентификацию, так и будет. Вы ничего не сможете сделать. Если завтра Fortmatic решит, что вам нужно снова подтвердить свой адрес электронной почты, так и будет. Если Fortmatic решит, что экспортирование вашего закрытого ключа означает удаление учетной записи, ну, вы ничего не сможете сделать. Если Fortmatic решит, что больше не будет подключаться к вашей сети layer-2, все, что вы сможете сделать, это молиться всемогущим богам блокчейна. И Fortmatic не решил разрешить разработчикам или пользователям отключать экранные подтверждения транзакций вообще (и эти всплывающие окна не слишком хороши на мобильных устройствах). Но с этим можно сделать только ограниченное количество вещей.
Недостаточно зависеть от поставщиков услуг третьих лиц в мире, вам нужно иметь кучу денег. Ценообразование основано на регистрации пользователей. Вы на крючке с того момента, когда ваш DApp становится популярным, даже если вы еще не монетизировали этих пользователей.
Представляем кошелек Morpher
Теперь обратите внимание на это:
Вы - пользователь, который приходит на Morpher. Вы привыкли к потокам регистрации веб-2.0. Вы хотите зарегистрироваться для торговли. Вы хотите открыть длинную позицию на Tesla. Вы не хотите беспокоиться о (и нет никакой причины знать о) всплывающих окнах подписи, фразах-семенах или приватных ключах. Вы можете делать все эти крутые криптодела, но в первую очередь вы здесь, чтобы торговать, а не учиться, как работает крипто, экспортировать фразы-семена или узнавать, почему лучше использовать PBKDF2 вместо SHA256 для шифрования вещей.
Или вы, как и мы: вы разработчик. Вы хотите предоставить своим пользователям плавный опыт. Вы хотите иметь некастодиальное решение и полный контроль над тем, как это выглядит и ощущается, не жертвуя слишком много безопасности.
Именно поэтому мы создали кошелек Morpher. Но как он работает?
Технический обзор
После этого эзотерического введения в то, почему мы создали кошелек, я уверен, что вы также заинтересованы в полном техническом обзоре. В конце концов, мы - разработчики. Итак, давайте начнем!
Morpher Wallet использует 3 компонента.
- Компонент Backend, написанный на NodeJS/Express, который никогда не видит незашифрованный приватный ключ или фразу восстановления. Это в основном хранилище и извлечение для зашифрованных ключей.
- Компонент Frontend, который действует как хранилище ключей и интерфейс.
- И SDK, который создает объект web3 и передает его на веб-сайт. Он подключает кошелек как iFrame и обеспечивает безопасную связь между iFrame, а также работу с вещами типа web3.eth.signTransaction.
Давайте разберем это по шагам и посмотрим, что происходит, например, при регистрации, прежде чем погрузиться в общение между iFrame и родительским элементом.
Регистрация и передача данных без хранения
Когда пользователь регистрируется, Frontend генерирует фразу восстановления с использованием bip39.
На данном этапе все это происходит на Frontend - Backend простаивает, только сообщая Frontend, если пользователь с таким электронным адресом уже существует.
Затем Frontend хеширует пароль пользователя, использует этот хеш для шифрования фразы восстановления с использованием AES-GCM 256 бит с 10000 SHA-256 итераций PBKDF2. Довольно стандартно для отрасли на данный момент.
После этого мы сохраняем зашифрованное хранилище ключей на Backend.
Мы также сохраняем зашифрованное хранилище ключей в localStorage, поэтому пользователю просто нужно будет ввести пароль в следующий раз, когда он откроет браузер, но это другая история и чисто для удобства. Это не подвергает опасности факт того, что все нехранимо и зашифровано.
Вход в систему
Итак, пользователь зарегистрирован, но откуда берутся данные, чтобы получить волшебный приватный ключ? Он хранится на Backend, но зашифрован. Помимо всех обычных лучших практик веба для предотвращения DDoS-атак и т. д., ключ также расшифровывается только на стороне клиента.
Это работает следующим образом:
- Пользователь вводит адрес электронной почты и пароль.
- (Необязательно) Пользователь проходит процесс двухфакторной аутентификации.
- Frontend запрашивает Backend найти запись в базе данных для этого адреса электронной почты.
- Backend возвращает зашифрованную фразу восстановления.
- Frontend пытается расшифровать фразу восстановления с хешированным паролем на стороне клиента.
Отсюда создается хранилище ключей web3.eth.accounts в Morpher Wallet из теперь расшифрованной фразы восстановления и хранится в памяти в браузере для дальнейшего использования.
Подписание транзакции
Хранилище ключей в Morpher Wallet на самом деле является самым важным компонентом, который сам по себе не подключается к узлу. Архитектура построена таким образом, что кошелек встроен как iFrame на другой веб-сайт.
Если обратить внимание на хранилище Vuex, вы найдете все необходимые функции, когда кошелек встроен.
Фактическое подписание выполняется библиотекой web3, а затем передается обратно родительскому фрейму, который встраивает кошелек, который является пользовательским HookedWalletProvider.
Затем это перенаправляется на узел через обычный процесс web3, отправляя подписанную транзакцию.
Вывод
В двух словах, вот как это все работает изнутри. Очевидно, здесь гораздо больше, чем просто регистрация, вход и подписание транзакций. Но для быстрого введения, этого, вероятно, достаточно.
Самая важная часть для нас - это иметь полный контроль над пользовательским интерфейсом и его поведением. Мы намеренно хотели сделать процесс обучения пользователя простым, но предоставить достаточно возможностей для пользователя, чтобы блокировать свой кошелек по мере необходимости.
Черт возьми, вы даже можете взять, экспортировать фразу для восстановления, импортировать в MetaMask и войти в Morpher снова. Так всё стандартизировано.
Если вас заинтересовало больше, есть полный документ аудита, который более подробно рассказывает о том, как работает шифрование, дешифрование и поток данных.
Если вы хотите интегрировать решение кошелька на свой собственный веб-сайт или DApp, дайте нам знать! Мы планируем полностью открыть это для других разработчиков.
Как принять участие и узнать больше:
- Заполните Форму запроса SDK
- Исследуйте MorpherWallet на Github
- Посетите Страницу кошелька
- Попробуйте Кошелек Morpher в вашем браузере
![Morpher Trading Platform](/blog/morpher-banner-1.webp?resize=1024%2C700&ssl=1)
Отказ от ответственности: Все инвестиции связаны с риском, и прошлые результаты ценных бумаг, отраслей, секторов, рынков, финансовых продуктов, торговых стратегий или индивидуальной торговли не гарантируют будущих результатов или доходов. Инвесторы несут полную ответственность за любые инвестиционные решения, которые они принимают. Такие решения должны основываться исключительно на оценке их финансового положения, инвестиционных целей, толерантности к риску и потребностей в ликвидности. Этот пост не является инвестиционным советом.
![Blog Cta Image](/blog/desktop_cta.png)
Универсальная торговая платформа
Сотни рынков в одном месте - Apple, Bitcoin, золото, часы, NFT, кроссовки и многое другое.
![Blog Cta Image](/blog/desktop_cta.png)
Универсальная торговая платформа
Сотни рынков в одном месте - Apple, Bitcoin, золото, часы, NFT, кроссовки и многое другое.