В экосистеме Ethereum токены ERC20 являются наиболее распространенным стандартом токенов. Токены ERC20 созданы на основе смарт-контрактов и могут передаваться и проверять баланс в сети Ethereum.
В этой статье мы будем использовать библиотеку ethers.js для реализации функционала взаимодействия с контрактами ERC20, включая такие операции, как передача токенов и запрос баланса.
Токены ERC20 — это токены, соответствующие стандарту Ethereum Request for Comments 20 (ERC20). ERC20 — это стандарт протокола, определяющий ряд правил и функций, которые токены должны реализовывать в блокчейне Ethereum, чтобы обеспечить совместимость и взаимодействие между различными токенами.
VScode
какинструменты разработки,и пройтиnpm
Установитьethers
Библиотека。playcode
Онлайн подборкаJavaScriptкод。HelloVitalik
программа,Проверьте баланс ETH Виталика.Используйте локальныйVScode
развивать,После установки Node.js,проходитьnpmУстановитьethers
Библиотека:
npm install ethers --save
ethers
Библиотекаimport { ethers } from "ethers";
использоватьProvider
добрый Подключитесь к сети Ethereum:
const provider = ethers.getDefaultProvider();
использоватьasync/await
грамматика Напишите асинхронную функция, взаимодействуйте с блокчейном:
const main = async () => {
// ...
};
main();
использоватьProvider
добрыйизgetBalance()
функция ЗапросVitalikизETHбаланс:
const balance = await provider.getBalance("vitalik.eth");
Полученный баланс конвертируем из wei в ETH и выводим на консоль:
console.log(`ETH Balance of vitalik: ${ethers.formatEther(balance)} ETH`);
Нетрудно обнаружить, что в нашем коде используются Async и Await. Почему?
Помимо промисов и функций обратного вызова, ethers.js также поддерживает использование ключевых слов async/await для обработки асинхронности.
async/await — это синтаксический сахар, представленный в ES7.,Это позволяет нам писать асинхронный код так же, как мы пишем синхронный код.。использоватьasyncИзменение ключевого словафункция,Вы можете использовать ключевое слово await в теле функции, чтобы дождаться завершения асинхронной операции. Ключевое слово await можно использовать перед объектом Promise или функцией, возвращающей объект Promise.,Это приостановит выполнение функции,До тех пор, пока статус объекта Promise не изменится на разрешенный и не будет возвращен результат.
Ethereum — это распределенная сеть, которая включает в себя сложные факторы, такие как сетевое взаимодействие и механизмы консенсуса. При взаимодействии с Ethereum нам нужно дождаться подтверждения транзакций, результатов исполнения смарт-контракта и т. д. Эти операции требуют времени, на них могут влиять задержки в сети и другие факторы. Если используется модель синхронного программирования, основной поток будет заблокирован и не сможет выполнять другие задачи, что приведет к ухудшению пользовательского опыта.
Модель асинхронного программирования повышает оперативность и эффективность программы за счет делегирования долго выполняющихся задач фоновой обработке, позволяя основному потоку продолжать выполнение других задач. ethers.js использует такие механизмы, как обещания и функции обратного вызова, для обработки асинхронного характера взаимодействий Ethereum.
Сначала убедитесь, что вы установили среду Node.js и готовы следующие зависимости:
ethers
:ЭфириумJavaScriptБиблиотека,Для взаимодействия с сетью Эфириум.dotenv
:Используется для загрузки переменных средыиз Библиотека。chalk
:Используется для добавления цвета к выводу консоли.。Установите зависимости:
npm install ethers dotenv chalk
При взаимодействии с сетью Ethereum нам необходимо использовать некоторые переменные среды для подключения к узлу Ethereum. По соображениям безопасности мы храним эту конфиденциальную информацию в .env
подать и передать dotenv
Библиотека загружается в переменные среды.
Создайте новый файл в каталоге проекта. .env
,И заполните следующее содержимое:
INFURA_API_KEY=<YOUR_INFURA_API_KEY>
PRIVATE_KEY=<YOUR_PRIVATE_KEY>
TOKEN_ADDRESS=<TOKEN_ADDRESS>
const { ethers } = require("ethers");
const dotenv = require("dotenv");
const chalk = require("chalk");
dotenv.config();
Здесь мы представляем необходимые модули,ииспользоватьdotenv
Библиотека Загружено хранится в.env
в файлеизпеременные среды。
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 и создали экземпляр кошелька с закрытым ключом в переменной среды.
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.
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
Приходить Запрос Укажите адресиз Токенбаланс,и преобразовать его в удобочитаемый формат.
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
для выполнения передачи токенов,И вывести информацию о том, что транзакция прошла успешно.
main().catch((error) => console.error(chalk.foregroundColorNames.bold("Error: "), error));
осуществлятьmain
функция,и выявить любые ошибки, которые могут возникнуть.
Signer
Пример。Signer
Пример Представляет человека, у которого есть закрытый ключиз Эфириум Счет,Он способен подписывать транзакции и сообщения.,Это позволяет вам отправлять транзакции от имени этой учетной записи.Signer
объект,Таким образом, вы можете вызывать методы контракта и взаимодействовать с ними.