Angular Dapps для Web3 с локальной каской и метамаской

В этом удивительном чтении мы увидим несколько вещей, среди прочего:

  • Среда для локального узла Блокчейна с Hardhat
  • Настройка учетных записей с помощью мнемоники или напрямую с адресами в каске
  • Весь необходимый конфиг для Angular и Web3
  • Пользовательский интерфейс входа
  • Войти с помощью метамаски
  • Показать баланс на нашем счету

Введение

Для создания Dapps существует множество инструментов, фреймворков и библиотек, однако на момент написания статьи я выбираю Hardhat и Angular.

Почему? Каска… Среди прочего

Локальный запуск Solidity

Отладка в первую очередь

Исключительная гибкость

Быстрая разработка

Интеграция машинописного текста

Почему угловой?

  • Потрясающий фреймворк, не совсем модный сейчас (все еще интересно, почему). Есть несколько хороших конкурентов, но это по-прежнему самый полный, позволяющий вам делать то, что делают другие, а также то, что другие не могут.
  • Меньше кода, больше мощности и масштабируемости, а также меньше энтропии в отношении плагинов и сторонних вещей.
  • Я согласен, да, у этого есть большая кривая обучения, но ничего, что вы не можете перепрыгнуть с точки зрения инженерии, я имею в виду что-нибудь о приземлении в космосе. 🤔 Возможно, это заговор, чтобы заставить нас поверить, что это худший выбор… Пока команда Google отвечает за Angular, тратя больше времени на его создание и поддержку, а не на маркетинг, для меня это нормально…

Hardhat, запустите свой собственный узел

Инициировать каску

$mkdir hardhat-tutorial
$cd hardhat-tutorial
$npm init --yes
$npm install --save-dev hardhat
$npx hardhat

Конфигурация сети Metamask для Hardhat

Аккаунты в Hardhat

Существует два способа настройки пользовательских учетных записей в Hardhat:

  • Непосредственное жесткое кодирование аккаунтов

hardhat.config.js

module.exports = {
solidity: "0.8.4",
networks: {
 hardhat: {
   accounts:
   [
    {
      privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
      balance: '1000000000000000000'
    },
    {
      privateKey: '0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0',
      balance: '5000000000000000000'
    }
  ]
...

Обратите внимание, что эфиры находятся в Weis. Перейдите по ссылке для более подробной информации об агрегатах

  • Через Mnemonics a Bip39

Если вы понятия не имеете, о чем я говорю, я поделюсь парой статей, довольно хорошо описывающих эти концепции.





Итак, настройка HD Wallet

hardhat.config.js

module.exports = {
solidity: "0.8.4",
networks: {
 hardhat: {
   accounts:
   {
      mnemonic: "test test test test test test test test test test test junk",
     path: "m/44'/60'/0'/0",
     initialIndex: 0,
     count: 4,
     passphrase: ""
   }
...

Для получения более подробной информации с помощью пользовательского config в каске

Автономная работа для поддержки кошельков и другого программного обеспечения

Импорт учетной записи в Metamask

Угловой

Создать пустой проект

$ng new ng-metamask-login

Сделайте свое приложение Angular -> Dapp

Зависимости

Минимум библиотек, которые нам нужны для взаимодействия с нашей нодой, чтобы сделать логин и веб3

$npm install ethereumjs-wallet bip39 web3 crypto-js --save

Следующим шагом я рассмотрю наиболее распространенные проблемы, которые я обнаружил, чтобы организовать проект Dapp в Angular.

Другие зависимости для пользовательской конфигурации ts/webpack

По сути, потому что нам нужно будет использовать библиотеки узлов для Front, поэтому мы настроим через browserify

$npm install crypto-browserify stream-browserify stream-http https-browserify os-browserify url --save-dev

Нам нужно перенастроить все это с помощью веб-пакета для создания пользовательской конфигурации, которая работает с нашим пакетом.

Разрешение зависимостей в JS будет ключом к интеграции тех библиотек, которые уже компилируются в JS. Немного сбивает с толку, но это потому, что они изначально для Node, поэтому мы должны сделать их совместимыми с нашим проектом ts.

angular.json

"build": {
...
"scripts": [],
"allowedCommonJsDependencies": [
    "bip39",
    "crypto-js",
    "ethereumjs-wallet",
    "web3"
  ]
},
...

Настройте браузер для загрузки библиотек узлов

tsconfig.json

"compilerOptions": {
...
"paths" : {
   "crypto": ["./node_modules/crypto-browserify"],
   "stream": ["./node_modules/stream-browserify"],
   "http": ["./node_modules/stream-http"],
   "https": ["./node_modules/https-browserify"],
   "os": ["./node_modules/os-browserify"],
},
...

Создайте index.d.ts в своем src с оберткой этих библиотек, чтобы ваше приложение не разбилось.

index.d.ts

declare module 'bitcore-mnemonic';
declare module 'crypto-js';

Все еще падает, поверьте, вы можете попробовать… Итак, последняя проблема, которую мы решаем с помощью полифиллов.

polyfills.ts

...
* APPLICATION IMPORTS
*/
(window as any).global = window;
import { Buffer } from 'buffer';
global.Buffer = Buffer;
global.process = {
env: { DEBUG: undefined },
version: '',
nextTick: require(‘next-tick’)
} as any;

Угловое децентрализованное приложение

Наконец, мы можем разработать хорошие функции для нашего Dapp и всего в локальной среде.

Наша цель - войти и показать наш баланс. И, конечно же, есть много способов добиться этого, но мы разделим головоломку на две части:

  • Сервис для взаимодействия с кошельком и web3
  • Компонент, содержащий пользовательский интерфейс входа и логику для пользователя, чтобы использовать наше Dapp.

Примечание. Для простоты в этом посте я не могу рассматривать весь наш код в Angular, пытаясь объяснить все детали. Тем не менее, я делюсь сутью, оставляя все важные функции прокомментированными с тем, что мы сделали на каждом этапе, чтобы вы могли найти это более понятным.

Служба Web3

Сервис для объединения всех функций web3 и создания небольшого ядра всех наших функций.

$ng generate service web3

Затем

web3.service.ts

О пути вы можете узнать в Google и изучить Bip39. В любом случае, немного больше информации



Примечание: см. функцию getInfo | В целях ведения журнала мы отслеживаем некоторую информацию, такую ​​​​как наша версия web3, тип сети и все учетные записи, которые мы настроили в каске.

Примечание: см. функцию getBalance | Будьте осторожны, мы должны перейти из Вайса.

Семена будут ключом для входа в Dapps, поэтому мы сохраняем и удаляем их в локальном хранилище, чтобы упростить регистрацию. Кроме того, мы шифруем и расшифровываем их, чтобы избежать легкого взлома, создавая криптографические -js.

Компонент входа

В нашем шаблоне мы создаем форму, сообщения об ошибках и кнопки включаются или отключаются в зависимости от некоторых условий.

login.component.html

В нашем ТС мы контролируем все взаимодействие с пользователем и платформой

login.component.ts

Результат

Я всегда стараюсь поделиться на Stackblitz или чем-то подобном, хотя на этот раз я не могу разместить каску онлайн и локально, очевидно, она должна быть отправлена ​​​​в тестовую сеть.

Так что на этот раз я оставлю несколько скриншотов Dapp и репозиториев, если вы хотите запускать локально на своем компьютере.

Код

Я делюсь двумя репозиториями github со всем кодом 👨‍💻 Я объяснял ранее. Просто скачайте и следуйте инструкциям (как в ветке feature/login-hardhatlocal).



$npm i

$npm run start



$npm i

$npx hardhat node

Следующие шаги

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

Это самая основная часть, в следующих главах мы расскажем, как разместить наш проект в Tesnet, как обработать транзакцию, кое-что о токенах ERC и более сложных функциях…

Заключение

Я просто делюсь своим опытом в этой новой захватывающей теме, оставляйте свои комментарии, если вы нашли это действительно полезным или видите какие-либо улучшения. Это было бы очень признательно.

По сути, мы все любим масштабируемые проекты, зная, что мы делаем, лучше, если мы можем положиться на терминал для автоматизации задач, а простота должна быть плюсом, поэтому мы фокусируемся на решении, которое нужно решить, а не на решении проблем для решения. Вот почему я выбираю Angular и Hardhat, я думаю, что это приятно.

Очевидно, что некоторые функции предназначены только для обучения, и если вы реализовали настоящую, вы будете больше заботиться о безопасности и так далее и тому подобное.