[Пример проекта Web3] Минималистское введение в Ethers.js + практический пример: реализация запроса и транзакции токена протокола ERC20
[Пример проекта Web3] Минималистское введение в Ethers.js + практический пример: реализация запроса и транзакции токена протокола ERC20

Введение

В экосистеме Ethereum токены ERC20 являются наиболее распространенным стандартом токенов. Токены ERC20 созданы на основе смарт-контрактов и могут передаваться и проверять баланс в сети Ethereum.

В этой статье мы будем использовать библиотеку ethers.js для реализации функционала взаимодействия с контрактами ERC20, включая такие операции, как передача токенов и запрос баланса.

Проспект Науки-ERC20

Токены ERC20 — это токены, соответствующие стандарту Ethereum Request for Comments 20 (ERC20). ERC20 — это стандарт протокола, определяющий ряд правил и функций, которые токены должны реализовывать в блокчейне Ethereum, чтобы обеспечить совместимость и взаимодействие между различными токенами.

Минималистское вводное руководство по Ethers: HelloVitalik (для не новичков)

Обзор учебника

  • Инструменты и среда:мы будем использоватьVScodeкакинструменты разработки,и пройтиnpmУстановитьethersБиблиотека。
  • Онлайн-редактор:Введение в использованиеplaycodeОнлайн подборкаJavaScriptкод。
  • Пример программы:писатьHelloVitalikпрограмма,Проверьте баланс ETH Виталика.

инструменты разработки

VScode (рекомендуется)

Используйте локальныйVScodeразвивать,После установки Node.js,проходитьnpmУстановитьethersБиблиотека:

Язык кода:javascript
копировать
npm install ethers --save

Программа Привет Виталик

импортироватьethersБиблиотека
Язык кода:javascript
копировать
import { ethers } from "ethers";
Подключитесь к сети Ethereum

использоватьProviderдобрый Подключитесь к сети Ethereum:

Язык кода:javascript
копировать
const provider = ethers.getDefaultProvider();
Напишите асинхронную функцию

использоватьasync/awaitграмматика Напишите асинхронную функция, взаимодействуйте с блокчейном:

Язык кода:javascript
копировать
const main = async () => {
    // ...
};
main();
Получить баланс ETH Виталика

использоватьProviderдобрыйизgetBalance()функция ЗапросVitalikизETHбаланс:

Язык кода:javascript
копировать
const balance = await provider.getBalance("vitalik.eth");
Вывод результатов

Полученный баланс конвертируем из wei в ETH и выводим на консоль:

Язык кода:javascript
копировать
console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);

Нетрудно обнаружить, что в нашем коде используются Async и Await. Почему?

Async/Await

Помимо промисов и функций обратного вызова, ethers.js также поддерживает использование ключевых слов async/await для обработки асинхронности.

async/await — это синтаксический сахар, представленный в ES7.,Это позволяет нам писать асинхронный код так же, как мы пишем синхронный код.。использоватьasyncИзменение ключевого словафункция,Вы можете использовать ключевое слово await в теле функции, чтобы дождаться завершения асинхронной операции. Ключевое слово await можно использовать перед объектом Promise или функцией, возвращающей объект Promise.,Это приостановит выполнение функции,До тех пор, пока статус объекта Promise не изменится на разрешенный и не будет возвращен результат.

Почему взаимодействие с Ethereum требует асинхронного программирования?

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

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

Практика разработки Ethereum: взаимодействие с токенами ERC20 с использованием Ethers.js

Экологическая подготовка

Сначала убедитесь, что вы установили среду Node.js и готовы следующие зависимости:

  • ethers:ЭфириумJavaScriptБиблиотека,Для взаимодействия с сетью Эфириум.
  • dotenv:Используется для загрузки переменных средыиз Библиотека。
  • chalk:Используется для добавления цвета к выводу консоли.。

Установите зависимости:

npm install ethers dotenv chalk

Установить переменные среды

При взаимодействии с сетью Ethereum нам необходимо использовать некоторые переменные среды для подключения к узлу Ethereum. По соображениям безопасности мы храним эту конфиденциальную информацию в .env подать и передать dotenv Библиотека загружается в переменные среды.

Создайте новый файл в каталоге проекта. .env,И заполните следующее содержимое:

Язык кода:javascript
копировать
INFURA_API_KEY=<YOUR_INFURA_API_KEY>
PRIVATE_KEY=<YOUR_PRIVATE_KEY>
TOKEN_ADDRESS=<TOKEN_ADDRESS>

Шаг 1. Введение зависимостей и настройка переменных среды

Язык кода:javascript
копировать
const { ethers } = require("ethers");
const dotenv = require("dotenv");
const chalk = require("chalk");

dotenv.config();

Здесь мы представляем необходимые модули,ииспользоватьdotenvБиблиотека Загружено хранится в.envв файлеизпеременные среды。

Шаг 2. Настройте поставщика и кошелек Ethereum.

Язык кода:javascript
копировать
const main = async () => {
    const provider = new ethers.providers.InfuraProvider(
        "mainnet",
        process.env.INFURA_API_KEY
    );

    const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
    console.log(chalk.bold("Connected to Ethereum network!!!"));

Мы использовали Infura в качестве нашего поставщика узлов Ethereum и создали экземпляр кошелька с закрытым ключом в переменной среды.

Шаг 3. Загрузите контракт ERC20.

Язык кода:javascript
копировать
const tokenAddress = process.env.TOKEN_ADDRESS;
const tokenAbi = []; // Это должен быть массив ABI токена ERC20.

const tokenContract = new ethers.Contract(tokenAddress, tokenAbi, wallet);
console.log(chalk.bold(`Loaded ERC20 contract at address ${tokenContract.address}`));

Создайте экземпляр контракта для взаимодействия с конкретным контрактом токена ERC20.

Шаг 4: Проверьте баланс токена

Язык кода:javascript
копировать
const getAddressBalance = async (address) => {
    const balance = await tokenContract.balanceOf(address);
    const decimals = await tokenContract.decimals();
    return balance.div(ethers.BigNumber.from(10).pow(decimals)).toString();
};

const address = "<ADDRESS_TO_QUERY>"; // Адрес Эфириума для проверки баланса
const balance = await getAddressBalance(address);
console.log(chalk.green.bold(`Current token balance: ${balance}`));

Определение асинхронностифункцияgetAddressBalanceПриходить Запрос Укажите адресиз Токенбаланс,и преобразовать его в удобочитаемый формат.

Шаг 5: Передача токенов

Язык кода:javascript
копировать
const transferToken = async (toAddress, amount) => {
    const tx = await tokenContract.transfer(toAddress, amount);
    console.log(
      chalk.green.bold(
        `Transfer of ${amount} tokens to ${toAddress} successful! Transaction hash: ${tx.hash}`
      )
    );
};

const toAddress = "<ADDRESS_TO_TRANSFER>"; // Адрес Эфириума, на который будут переведены токены
const amount = ethers.utils.parseUnits("<AMOUNT>", "<DECIMALS>"); // Количество токенов для перевода
await transferToken(toAddress, amount);

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

Шаг 6. Выполните основную функцию и обработайте ошибки.

Язык кода:javascript
копировать
main().catch((error) => console.error(chalk.foregroundColorNames.bold("Error: "), error));

осуществлятьmainфункция,и выявить любые ошибки, которые могут возникнуть.

Подробное объяснение некоторых методов:

  1. Provider:Providerдаethers.jsсерединаизосновная концепция,Он отвечает за связь с узлами Эфириум. Поставщиком может быть соединение WebSocket или соединение HTTP.,Или любая пользовательская реализация, реализующая требуемый API.
  2. getSigner():Этот метод начинается сProviderПолучите один от объектаSignerПример。SignerПример Представляет человека, у которого есть закрытый ключиз Эфириум Счет,Он способен подписывать транзакции и сообщения.,Это позволяет вам отправлять транзакции от имени этой учетной записи.
  3. contractAddress:этотда Смарт-контракты уже в разработке Эфириумв Интернетеизадрес。
  4. abi:ABIПредставляет двоичный интерфейс приложения.(Application Binary Interface), который представляет собой описание интерфейса смарт-контракта и определяет методы и события контракта.
  5. new ethers.Contract():этотда Создайте смарт-контракт представленияиз Примеризметод。Вам необходимо указать адрес контракта、ABIиSignerобъект,Таким образом, вы можете вызывать методы контракта и взаимодействовать с ними.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose