Как создать приложение Web 3.0 с использованием React, Solidity, Ethers.js, Hardhat и Metamask

Как создать приложение Web 3.0 с использованием React, Solidity, Ethers.js, Hardhat и Metamask

9 апреля 2022 г.

Лучший способ улучшить свои навыки Web 3.0 — использовать их для создания проектов кодирования. Но создание их с нуля и добавление различных библиотек может быть сложной задачей. Вот почему в этой статье мы создадим простое приложение с полным стеком, используя React, Hardhat, Solidity, Ethers.js и Metamask, которое можно использовать в качестве шаблона для наших будущих проектов.


Настройка Git


Git — это технология управления исходным кодом, используемая DevOps. Это бесплатная система контроля версий с открытым исходным кодом, которая используется для эффективного управления небольшими и очень большими проектами. В этом проекте мы будем использовать Git для отслеживания всех изменений в проекте.


Создание репозитория Git


Первым шагом будет создание репозитория git. В этой статье я буду использовать GitHub, но вы также можете использовать аналогичные сервисы, такие как GitLab или Bitbucket.


Перейдите на сайт GitHub и нажмите кнопку Создать новый репозиторий. Введите имя вашего проекта, выберите видимость (общедоступный или частный) и нажмите кнопку «Создать репозиторий».


GitHub


Добавление Git в проект


Теперь, когда мы создали репозиторий git, мы можем добавить git в наш проект. Создайте новую папку на своем компьютере и откройте ее на терминале.


Теперь вернитесь в свой браузер и скопируйте код, который предоставляется по умолчанию в репозитории вашего проекта на GitHub.


Он должен выглядеть примерно так, как показано ниже.


``` ударить


echo "# dapp-шаблон" >> README.md


git инициировать


git добавить README.md


git commit -m "первая фиксация"


ветка git -M главная


git удаленное добавление источника https://github.com/suhailkakar/dapp-boilerplate.git


git push -u происхождение основной


Вставьте его в свой терминал, и все, вы успешно добавили git в свой проект.


Настройка интерфейса с помощью React


Для начала мы можем использовать команду ниже, чтобы создать простое приложение для реагирования.


``` ударить


npx создать-реагировать-приложение ./


После завершения ваша структура папок должна выглядеть так.


├── README.md


├── README.old.md


├── package-lock.json


├── package.json


├── общедоступный


│ ├── favicon.ico


│ ├── index.html


│ ├── logo192.png


│ ├── logo512.png


│ ├── manifest.json


│ └── robots.txt


└── источник


├── App.css


├── App.js


├── App.test.js


├── index.css


├── index.js


├── logo.svg


├── отчетWebVitals.js


└── setupTests.js


Теперь, когда наше реагирующее приложение создано, мы можем установить некоторые пакеты, такие как ethers.js, chai и hardhat.


Запустите приведенную ниже команду, чтобы установить эти пакеты с помощью пряжи.


пряжа добавить эфиры каска @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers


На этом пока все, вернемся к нашему приложению для настройки ethers.js.


Настройка среды разработки Ethereum в Hardhat


Далее нам нужно настроить среду разработки Ethereum, мы можем просто использовать для этого Hardhat.


Откройте терминал и выполните приведенную ниже команду.


``` ударить


npx каска


После завершения вы должны увидеть ниже новые файлы/папки, сгенерированные в каталоге вашего проекта.


  • test: эта папка содержит тестовый скрипт, написанный на Chai, и используется для тестирования нашего смарт-контракта.

  • hardhat.config.js: этот файл содержит конфигурацию Hardhat.

  • scripts: эта папка содержит пример сценария для развертывания смарт-контракта.

  • contracts: это папка, содержащая файлы, в которых мы пишем код нашего смарт-контракта.

Изменение конфигурации каски


Теперь нам нужно внести некоторые изменения в наш файл конфигурации Hardhat. Откройте hardhat.config.js в редакторе кода и обновите объект module.exports до приведенного ниже кода.


```javascript


модуль.экспорт = {


плотность: "0.8.4",


сети:{


каска: {


идентификатор цепочки: 1337,


пути: {


артефакты: "./src/artifacts"


В приведенном выше коде мы добавили chainId как 1337. Это из-за проблемы с конфигурацией метамаски. Мы также добавили путь к нашим артефактам, которые являются скомпилированной версией наших контрактов.


Смарт-контракты в Solidity


Далее у нас есть смарт-контракты. Смарт-контракт — это децентрализованная программа, которая реагирует на события, выполняя бизнес-логику. Они часто пишутся в Solidity.


Взгляните на файл Greeter.sol, который находится в папке с контрактами.


```соль


//SPDX-идентификатор лицензии: нелицензия


прочность прагмы ^0,8,0;


импортировать "каска/console.sol";


контракт


строковое приватное приветствие;


конструктор (строковая память _greeting) {


console.log("Развертывание приветствия с приветствием:", _greeting);


приветствие = _приветствие;


Функция приветствия () возвращает публичное представление (строковая память) {


ответное приветствие;


функция setGreeting (строковая память _greeting) public {


console.log("Изменение приветствия с '%s' на '%s'", приветствие, _greeting);


приветствие = _приветствие;


Разобьем файл на строки и пройдемся по каждой из них.


```соль


//SPDX-идентификатор лицензии: нелицензия


прочность прагмы ^0,8,0;


В двух строках выше у нас есть лицензия и версия Solidity, которую мы используем для этого смарт-контракта.


Далее у нас есть контракт Greeter, содержащий код нашего смарт-контракта.


```соль


контракт


В строке ниже мы объявляем приватную строку, которая хранится в блокчейне.


```соль


строковое приватное приветствие;


И, наконец, функции внутри нашего контракта используются для установки значения приветствия в блокчейне и его извлечения.


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


Компиляция наших смарт-контрактов с помощью Hardhat


Теперь, когда у вас есть хорошие знания о примерах смарт-контрактов, давайте приступим к их компиляции.


Вы можете скомпилировать его с помощью команды ниже:


``` ударить


Компиляция в каске npx


Как только вы запустите команду, вы должны увидеть новый файл в папке src под названием artifacts.


Артефакты содержат скомпилированную версию нашего смарт-контракта в формате JSON. Этот файл JSON содержит массив с именем abi. ABI или Application Binary Interface — это то, что нам нужно для подключения нашего клиента (приложения React) к нашему скомпилированному смарт-контракту.


Развертывание смарт-контракта на локальном блокчейне


Теперь мы можем развернуть наш смарт-контракт на локальном блокчейне с помощью Hardhat. Для этого нам нужна локальная сеть. Чтобы запустить локальную сеть, запустите приведенный ниже код в своем терминале.


``` ударить


узел каски npx


Эта команда также создает 20 тестовых учетных записей и адресов, которые можно использовать для развертывания и тестирования наших смарт-контрактов.


Не закрывайте этот терминал, так как он нужен нам для развертывания нашего смарт-контракта


Теперь просто переименуйте sample-script.js в deploy.js в папке scripts. Затем запустите приведенный ниже код, чтобы развернуть смарт-контракт в локальной сети.


``` ударить


Запуск скриптов npx hardhat/deploy.js --network localhost


Если это было успешно, вы должны увидеть вывод, аналогичный приведенному ниже коду.


❯ npx hardhat run scripts/deploy.js --network localhost


Приветствие развернуто по адресу: 0x5FbDB2315678afecb367f032d93F642f64180aa3.


Вы также можете проверить журналы с терминала, который вы открыли ранее.


``` ударить


Развертывание контракта: встречающий


Адрес контракта: 0x5fbdb2315678afecb367f032d93f642f64180aa3


Транзакция: 0x6d6833f7bd9ee1523fa8763120271f11b344d7d1df6ec301275277a33bc697ba


От: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266


Стоимость: 0 ЭТН


Используемый газ: 497026 из 497026


Блок №1: 0x42c4d55bf844eba09393c9e3c0f26ca1a7c8de685d21219926c45389d044c316


консоль.лог:


Развертывание Greeter с приветствием: Привет, Hardhat!


В приведенных выше журналах у нас есть адрес контракта, используемый газ и адрес того, кто развернул смарт-контракт.


Следующим шагом будет подключение Metamask к нашему локальному узлу блокчейна Hardhat.


Подключение Metamask к узлу блокчейна Hardhat


Загрузите и установите расширение Metamask в свой браузер и завершите процесс регистрации. После завершения нажмите на сети и выберите Localhost 8545.


Нажмите на сети и выберите Localhost 8545


После этого нажмите на изображение аватара в Metmask и выберите «Импортировать учетную запись».


Нажмите на изображение аватара в Metmask и выберите «Импортировать учетную запись»


Скопируйте любой закрытый ключ из учетной записи, которая была зарегистрирована в вашем терминале, и импортируйте его в Metamask.


![Скопируйте любой закрытый ключ из учетной записи, которая была зарегистрирована в вашем терминале, и импортируйте его в Metamask]


Вот и все, мы подключили наш локальный блокчейн к Metamask.


Подключение внешнего интерфейса к смарт-контракту с помощью Metamask


Теперь мы можем приступить к подключению интерфейса нашего приложения со смарт-контрактом.


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


``` ударить


запуск нпм


Теперь мы можем начать с разрешения пользователям подключаться к Metamask в вашем приложении для реагирования.


Подключиться к метамаске


Замените код в вашем app.js на приведенный ниже код.


```jsx


импортировать React, {useEffect} из «реагировать»;


функция экспорта по умолчанию App() {


const connectWallet = асинхронный () => {


пытаться {


const {эфириум} = окно;


если (! Эфириум) {


alert("Пожалуйста, установите MetaMask!");


возврат;


const account = await ethereum.request({


метод: "eth_requestAccounts",


console.log("Подключено", аккаунты[0]);


} поймать (ошибка) {


console.log(ошибка);


использоватьЭффект(() => {


подключить кошелек();


вернуть

;


В приведенном выше коде у нас есть useEffect, который вызывает функцию connectWallet каждый раз, когда загружается приложение. И используя Ethereum из объекта окна, мы подключаемся к нашему приложению с помощью Metamask.


Сохраните файл и перезагрузите приложение. Вы должны увидеть всплывающее окно MetaMask с просьбой подключить Wallet.


image.png


Получение приветствия от смарт-контракта


Теперь, когда мы подключили Metamask, мы можем работать над получением приветствий из контракта.


Но перед этим нам нужно импортировать ABI и ether.js в наш файл app.js.


После получения учетной записи вы можете вызвать новую функцию, и вот код для нее.


```jsx


const fetchGreetings = async () => {


let contractAddress = "ВАШ_КОНТРАКТ_АДРЕС";


const {эфириум} = окно;


если (! Эфириум) {


alert("Пожалуйста, установите MetaMask!");


вернуть;


const provider = new ethers.providers.Web3Provider(ethereum);


const signer = provider.getSigner();


const контракт = новые эфиры.Контракт(


адрес договора,


Greeter.abi,


провайдер


константное приветствие = ожидание contract.greet();


console.log(приветствие);


В приведенном выше коде мы проверяем, установлен ли Metamask, а затем получаем его провайдера, а с помощью ether.js мы читаем контракт и получаем приветствия.


Наконец, вот как должен выглядеть ваш app.js.


```jsx


импортировать React, {useEffect} из «реагировать»;


импортировать Greeter из "./artifacts/contracts/Greeter.sol/Greeter.json";


импортировать {эфиры} из "эфиров";


функция экспорта по умолчанию App() {


const connectWallet = асинхронный () => {


пытаться {


const {эфириум} = окно;


если (! Эфириум) {


alert("Пожалуйста, установите MetaMask!");


возврат;


const account = await ethereum.request({


метод: "eth_requestAccounts",


console.log("Подключено", аккаунты[0]);


получитьПриветствия();


} поймать (ошибка) {


console.log(ошибка);


const fetchGreetings = async () => {


let contractAddress = "ВАШ_КОНТРАКТ_АДРЕС";


const {эфириум} = окно;


если (! Эфириум) {


alert("Пожалуйста, установите MetaMask!");


возврат;


const provider = new ethers.providers.Web3Provider(ethereum);


const signer = provider.getSigner();


const контракт = новые эфиры.Контракт(


адрес договора,


Greeter.abi,


провайдер


константное приветствие = ожидание contract.greet();


console.log(приветствие);


использоватьЭффект(() => {


подключить кошелек();


вернуть

;


Процесс отправки приветствия также аналогичен, вам просто нужно вызвать эту функцию с помощью ether.js.


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


Заключение: настройте и создайте свое первое приложение Web 3.0


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


Давайте подключимся в [Twitter] (https://twitter.com/suhailkakar) и [LinkedIn] (https://linkedin.com/in/suhailkakar/).


👋 Спасибо за прочтение, увидимся в следующий раз.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE