Перейти к содержимому

Простое руководство по токенам ERC-1155 в Ethereum

Изучите возможности стандарта токенов ERC-1155 в Ethereum, узнайте, как он упрощает управление цифровыми активами, и следуйте пошаговому руководству по созданию...

4 мин чтения
Простое руководство по токенам ERC-1155 в Ethereum

Блокчейн Ethereum кардинально изменил подход к созданию цифровых активов и управлению ими. Среди ключевых достижений особого внимания заслуживает стандарт ERC-1155. Разработанный командой Enjin, ERC-1155 создан для оптимизации и повышения эффективности работы с цифровыми активами в блокчейне: он позволяет создавать взаимозаменяемые, невзаимозаменяемые и частично взаимозаменяемые токены — всё в рамках одного смарт-контракта.

ERC-1155 был разработан для устранения недостатков предыдущих токен-стандартов, таких как ERC-20 и ERC-721. ERC-20 предназначен для взаимозаменяемых токенов (где каждый токен идентичен и взаимозаменяем), а ERC-721 — для невзаимозаменяемых токенов (где каждый токен уникален). Однако оба стандарта имеют ограничения по охвату и эффективности при работе с несколькими типами токенов.

Ключевые преимущества ERC-1155:

  • Пакетные переводы: ERC-1155 поддерживает пакетные переводы, позволяя перемещать несколько типов токенов в рамках одной транзакции. Это существенно снижает затраты на газ и увеличивает скорость транзакций.

  • Единый контракт для нескольких токенов: Стандарт позволяет одному контракту управлять как взаимозаменяемыми, так и невзаимозаменяемыми токенами, упрощая развёртывание и снижая затраты.

  • Проверки безопасной передачи: ERC-1155 гарантирует отправку токенов только на совместимые адреса, повышая безопасность транзакций и предотвращая потери из-за ошибок.

Практические применения ERC-1155:

  • Игры: Позволяет управлять целой экономикой внутриигровых предметов — от расходных материалов до редкого снаряжения — в рамках одного контракта.

  • Цифровое искусство: Даёт художникам возможность беспрепятственно выпускать как ограниченные, так и открытые тиражи работ.

  • Токенизированные активы: Реальные активы можно токенизировать и управлять ими с помощью ERC-1155.

Написание и развёртывание токена ERC-1155

В этом руководстве мы создадим базовый токен ERC-1155 под названием RAD Token. На этом примере мы покажем, как различными активами можно управлять в рамках единого контракта.

  1. Настройте среду разработки: Перед началом убедитесь, что у вас установлены Node.js и npm. Затем настройте проект Hardhat:

mkdir rad-token
cd rad-token
npm init -y
Копировать
  1. Установите Hardhat и контракты OpenZeppelin

npm install --save-dev hardhat 
npm install @openzeppelin/contracts
Копировать
  1. Инициализируйте Hardhat

npx hardhat

При появлении запроса выберите «Create an empty hardhat.config.js».

  1. Напишите контракт RADToken: Создайте новый файл contracts/RADToken.sol и вставьте приведённый ниже код контракта.


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

import "@openzeppelin/contracts/access/Ownable.sol";

import "@openzeppelin/contracts/utils/Strings.sol";

contract RADToken is ERC1155, Ownable {

    constructor(address initialOwner, string memory baseURI) ERC1155(baseURI) Ownable(initialOwner) {

        // Initialize contract with metadata URI

 }

    function mint(address account, uint256 id, uint256 amount, bytes memory data)

        public

        onlyOwner

 {

        _mint(account, id, amount, data);

 }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)

        public

        onlyOwner

 {

        _mintBatch(to, ids, amounts, data);

 }

    function setURI(string memory newuri) public onlyOwner {

        _setURI(newuri);

 }

    function uri(uint256 tokenId) public view override returns (string memory) {

        return string(abi.encodePacked(super.uri(tokenId), Strings.toString(tokenId), ".json"));

 }

    function burn(address account, uint256 id, uint256 amount) public onlyOwner {

        _burn(account, id, amount);

 }

    function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts)

        public

        onlyOwner

 {

        _burnBatch(account, ids, amounts);

 }

}
Копировать
  1. Напишите скрипт развёртывания: Создайте новый файл ignition/modules/RadToken.js для модуля развёртывания Hardhat Ignition и добавьте приведённый ниже код.

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");
module.exports = buildModule("RADTokenModule", (m) => {
  const deployer = m.getAccount(0);
  const baseURI = m.getParameter(
    "baseURI",
"<https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/>"
);
  const radToken = m.contract("RADToken", [deployer, baseURI]);
  return { radToken };
});
Копировать
  1. Напишите тестовые скрипты: Создайте новый файл test/RadToken.js для тестирования контракта и добавьте приведённый ниже код:

const { expect } = require("chai");
const { ethers } = require("hardhat");
const {
  loadFixture,
} = require("@nomicfoundation/hardhat-toolbox/network-helpers");

describe("RADToken", function () {
  async function deployRADTokenFixture() {
    const [owner, addr1, addr2, ...addrs] = await ethers.getSigners();
    const RADToken = await ethers.getContractFactory("RADToken");
    const baseURI =
      "https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/";
    const radToken = await RADToken.deploy(owner.address, baseURI);

    return { radToken, owner, addr1, addr2, addrs };
 }

  describe("Minting", function () {
    it("Should mint a token", async function () {
      const { radToken, addr1 } = await loadFixture(deployRADTokenFixture);
      await radToken.mint(addr1.address, 1, 100, "0x");
      expect(await radToken.balanceOf(addr1.address, 1)).to.equal(100);
 });

    it("Should mint multiple tokens in batch", async function () {
      const { radToken, addr1 } = await loadFixture(deployRADTokenFixture);
      await radToken.mintBatch(addr1.address, [1, 2], [100, 200], "0x");
      expect(await radToken.balanceOf(addr1.address, 1)).to.equal(100);
      expect(await radToken.balanceOf(addr1.address, 2)).to.equal(200);
 });
 });

  describe("URI Management", function () {
    it("Should return correct token URI", async function () {
      const { radToken } = await loadFixture(deployRADTokenFixture);
      expect(await radToken.uri(1)).to.equal(
        "https://gateway.pinata.cloud/ipfs/Qmar8RRAZ5QoVPTzvrRk9PcFSm9YKbkanxmd951nXk2bgM/1.json"
 );
 });

    it("Should set new URI and return correct token URI", async function () {
      const { radToken } = await loadFixture(deployRADTokenFixture);
      const newBaseURI = "https://newbase.uri/";
      await radToken.setURI(newBaseURI);
      expect(await radToken.uri(1)).to.equal("https://newbase.uri/1.json");
 });
 });
});
Копировать
  1. Протестируйте код контракта: Запустите тесты с помощью следующей команды:

npx hardhat test
  1. Разверните контракт RADToken: Скомпилируйте и разверните контракт с помощью следующих команд:

npx hardhat compile 
npx hardhat ignition --network localhost --show-logs ignition/modules/RadToken.js
Копировать

Что дальше?

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

Полезные ресурсы

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

Оцените перевод

Автор статьи: