Если вы создали DAAP на Ethereum, скорее всего, вы должны были использовать Web3.js для создания внешнего интерфейса JavaScript. Ethers.js - это легкая библиотека JavaScript, которую можно использовать как альтернативу Web3.js. В этом посте / руководстве я покажу, как вы можете использовать Ethers.js для создания простого DAPP. Я надеюсь, что это поможет вам оценить и начать использовать Ethers.js для вашего следующего проекта.

Ethers.js имеет много преимуществ перед web3.js. Я хотел бы сосредоточиться на одной основной функции, а именно на управлении состоянием и ключами в ethers.js. Web3 предполагает, что к приложению подключен локальный узел. Предполагается, что этот узел хранит ключи, подписывает транзакции, а также взаимодействует с блокчейном Ethereum и читает его. На самом деле это не так, большинство пользователей не запускают geth локально. Metamask эффективно эмулирует эту среду через приложение браузера, поэтому большинство приложений web3 требуют, чтобы Metamask сохранял ключи, подписывал транзакции и взаимодействовал с основной сетью Ethereum.

Ethers.js использует другой подход, который дает разработчикам большую гибкость. Ethers.js разделяет «узел» на две отдельные роли:

  1. «кошелек», в котором хранятся ключи и подписывается транзакция, и
  2. «поставщик», который выполняет анонимное подключение к сети Ethereum, проверяет состояние и отправляет транзакции.

Компиляция и развертывание смарт-контракта

В нашем руководстве мы будем взаимодействовать со смарт-контрактом ERC20. На вашем устройстве должны быть установлены nodejs и npm.

  1. Создайте папку с именем ethers-template и создайте другую папку с именем контракты внутри ethers-template.
mkdir ethers-template && cd ethers-template && mkdir contracts

2. Запустите команду npm init, чтобы создать файл package.json, в котором будут храниться зависимости проекта:

npm init -y

3. Создайте файл config.json для хранения всей конфигурации вашего проекта.

private_key: этот закрытый ключ будет использоваться для развертывания смарт-контракта в указанной сети.

сеть: ethers.js поддерживает следующую сеть

«Homestead» (основная сеть)
«rinkeby»
«ropsten»
«kovan»
«goerli»

ERC20: строка «0x0b0Ce2d3f67b4482BD830Ac24ECa5E8d022Fd32f» является необязательной. Если вы хотите взаимодействовать с развернутым смарт-контрактом, вы можете написать здесь адрес.

Имя, символ, десятичные дроби относятся к параметрам ERC20.

4. Установите ethers.js с помощью npm.

npm install --save ethers

5. Для составления договора установите fs-extra и solc

npm install [email protected] [email protected] --save

6. Сохраните приведенный ниже код как erc20.sol в папке контрактов.

7. Теперь для того, чтобы скомпилировать приведенный выше код, вам понадобится solc. Создайте новый файл compile.js и вставьте приведенный ниже код.

node compile.js

Приведенный выше код прочитает все смарт-контракты в каталоге контрактов и сохранит abi и байт-код как файл json. Весь файл json будет сохранен в каталоге сборки. После компиляции мы получаем следующую структуру.

+ethers-template
    +compile.js
    +contracts
        -erc20.sol
    +build
        -ERC.json
        -SafeMath.json
   -package.json

8. Создайте новый файл с именем deploy.json и вставьте приведенный ниже код.

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

Примечание:
1. Сеть по умолчанию в приведенном выше коде - это тестовая сеть kovan.
2. У вас должен быть эфир этой сети, чтобы оплачивать транзакционные сборы за развертывание.
3. Контракт будет развернут с закрытого ключа, указанного в config.json.

Команда для развертывания

node deploy.js <contract_name>

В нашем случае команда будет

node deploy.js ERC20

Вывод для приведенного выше кода будет:

Loaded wallet 0xC8e1F3B9a0CdFceF9fFd2343B943989A22517b26
Deploying ERC20 in kovan...
deployed at 0x77Bb3546f5ee356E4026BaA96b7DDf22141bd77B
Waiting for the contract to get mined...
Contract deployed

Вы получите копию адреса контракта и сохраните этот адрес, который будет полезен для взаимодействия с развернутым смарт-контрактом. Этот адрес также будет сохранен / обновлен в config.json.

Взаимодействие со смарт-контрактом

  1. В этом руководстве мы используем ES6 для написания кода, а для преобразования ES6 в ES5 мы будем использовать веб-пакет с загрузчиком babel.
    Установка зависимостей разработчика:
npm i webpack webpack-cli @babel/core @babel/plugin-proposal-object-rest-spread @babel/preset-env babel-loader babel-polyfill -D

2. Создайте новый файл app.js и вставьте приведенный ниже код. Конвертированный ES5-код ​​этого файла будет храниться в dist / bundle.js.

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

const provider = ethers.getDefaultProvider(config['network']);

Для взаимодействия со смарт-контрактом вам потребуются две вещи:
1. Адрес смарт-контракта и
2. ABI.
В приведенном выше app.js мы импортируем адрес из файла конфигурации, а abi - из сборки.

//import the json of the contract which you want to interact
const erc_json = require('./build/ERC20.json'); 
const config = require('./config.json');
const address = config["ERC20"];
const abi = erc_json.abi;

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

const wallet = new ethers.Wallet(config['private_key'] , provider);

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

erc20 = new ethers.Contract( address , abi , wallet );

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

erc20.functions.function_name_in_smart_contract(parameters);

Например: в ERC20 у нас есть функция с именем transfer, которая принимает адрес и сумму в качестве параметра. Код ниже вызывает функцию передачи. Кошелек подпишет эту транзакцию и опубликует ее в указанной сети.

erc20.functions.transfer(address, "1000000000000000000");

ПРИМЕЧАНИЕ. Каждый раз, когда вы совершаете транзакцию, у вас должен быть эфир в вашем кошельке для оплаты сборов за газ.

3. В package.json добавьте строки ниже в объект скрипта.

“deploy”: “node compile.js && node deploy.js ERC20”, 
“build”: “webpack — mode production”,

После добавления вышеперечисленных строк package.json будет выглядеть так:

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

npm run deploy

Это автоматически изменит адрес и ABI в файлах конфигурации и сборки.
Во время взаимодействия вам не нужно изменять какой-либо адрес или abi, он будет обновлен автоматически.

Если вы внесете какие-либо изменения в app.js, вам придется скомпилировать его с помощью

npm run build

Это создаст (или обновит) файл dist / bundle.js.

4. Создайте новый файл с именем index.html. Эта страница включает только текстовый ввод, который принимает адрес и отправляет 1 токен на введенный адрес. Хэш транзакции добавляется под вводом текста, а статус текущей транзакции также можно увидеть в разделе статуса.

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

папка сборки создается после запуска

node complie.js

Папка dist создается после запуска

npm run build

Актуальную версию сайта можно найти в https://saurav.tech/ethers-template/

Резюме

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

git clone https://github.com/SauravKanchan/ethers-template.git
cd ethers-template
npm i
npm run deploy
npm run build

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик