Ethereum'da ERC-1155 Token'larına Basit Bir Rehber

Ethereum'un ERC-1155 token standardının çok yönlülüğünü keşfedin, dijital varlık yönetimini nasıl kolaylaştırdığını öğrenin ve adım adım oluşturma kılavuzunu takip edin...

4 dk okuma
Ethereum'da ERC-1155 Token'larına Basit Bir Rehber

Ethereum'un blok zinciri, dijital varlıkların oluşturulması ve yönetilmesi konusunda köklü bir dönüşüm gerçekleştirmiştir. Bu gelişmeler arasında ERC-1155 standardı, dikkat çekici bir yenilik olarak öne çıkmaktadır. Enjin ekibi tarafından hayata geçirilen ERC-1155, tek bir akıllı sözleşme çerçevesinde fungible, non-fungible ve semi-fungible token'ların oluşturulmasına olanak tanıyarak blok zinciri genelinde dijital varlıkların verimliliğini artırmayı ve süreçleri kolaylaştırmayı hedeflemektedir.

ERC-1155, ERC-20 ve ERC-721 gibi önceki token standartlarındaki verimsizlikleri gidermek amacıyla geliştirilmiştir. ERC-20 fungible token'lar için (her token birbirinin aynısı ve birbirleriyle değiştirilebilir), ERC-721 ise non-fungible token'lar için (her token benzersizdir) uygun olsa da bu standartlar, birden fazla token türünü yönetme konusunda kapsam ve verimlilik açısından sınırlılıklar barındırmaktadır.

ERC-1155'in başlıca avantajlarından bazıları şunlardır:

  • Toplu Transferler: ERC-1155, toplu transferleri destekleyerek birden fazla token türünün tek bir işlemde taşınmasına imkân tanır. Bu sayede gas maliyetleri önemli ölçüde düşer ve işlem hızı artar.

  • Birden Fazla Token için Tek Sözleşme: Bu standart, tek bir sözleşmenin hem fungible hem de non-fungible token'ları yönetmesini sağlayarak dağıtım sürecini basitleştirir ve maliyetleri azaltır.

  • Güvenli Transfer Kontrolleri: ERC-1155, token'ların yalnızca uyumlu adreslere gönderilmesini güvence altına alarak işlem güvenliğini artırır ve hatalardan kaynaklanan kayıpların önüne geçer.

ERC-1155'in pratik kullanım alanlarından bazıları şunlardır:

  • Oyun: Tüketilebilir eşyalardan nadir ekipmanlara kadar oyun içi ekonominin tamamının tek bir sözleşme altında yönetilmesine olanak tanır.

  • Dijital Sanat: Sanatçıların hem sınırlı hem de açık baskı eserlerini sorunsuz biçimde yayımlamasını mümkün kılar.

  • Tokenize Edilmiş Varlıklar: Gerçek dünya varlıkları ERC-1155 kullanılarak tokenize edilip yönetilebilir.

ERC-1155 token yazma ve dağıtma

Bu eğitimde RAD Token adında temel bir ERC-1155 token oluşturacağız. Bu örnek, farklı varlıkların tek bir sözleşme çerçevesinde nasıl yönetilebileceğini gösterecektir.

  1. Geliştirme ortamınızı kurun: Başlamadan önce Node.js ve npm'in yüklü olduğundan emin olun. Ardından Hardhat projenizi oluşturun:

mkdir rad-token
cd rad-token
npm init -y
Kopyala
  1. Hardhat ve OpenZeppelin sözleşmelerini yükleyin

npm install --save-dev hardhat 
npm install @openzeppelin/contracts
Kopyala
  1. Hardhat'i başlatın

npx hardhat

İstendiğinde "Create an empty hardhat.config.js" seçeneğini belirleyin.

  1. RADToken sözleşmesini yazın: contracts/RADToken.sol adında yeni bir dosya oluşturun ve aşağıdaki sözleşme kodunu yapıştırın.


// 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);

 }

}
Kopyala
  1. Dağıtım betiğini yazın: Hardhat Ignition dağıtım modülü için ignition/modules/RadToken.js adında yeni bir dosya oluşturun ve aşağıdaki kodu ekleyin.

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 };
});
Kopyala
  1. Test betiklerini yazın: Sözleşmeyi test etmek için test/RadToken.js adında yeni bir dosya oluşturun ve aşağıdaki kodu ekleyin:

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");
 });
 });
});
Kopyala
  1. Sözleşme kodunu test edin: Aşağıdaki komutla testleri çalıştırın:

npx hardhat test
  1. RADToken sözleşmesini dağıtın: Aşağıdaki komutlarla sözleşmeyi derleyin ve dağıtın:

npx hardhat compile 
npx hardhat ignition --network localhost --show-logs ignition/modules/RadToken.js
Kopyala

Sırada ne var?

ERC-1155, Ethereum'un token standartları arasında önemli bir ilerlemeyi temsil etmekte; önceki standartlara kıyasla daha fazla esneklik, verimlilik ve kullanım kolaylığı sunmaktadır. RAD Token örneği, birden fazla token türünün tek bir sözleşme altında ne denli kolaylıkla yönetilebildiğini ortaya koyarak yeni nesil merkeziyetsiz uygulamaların önünü açmaktadır.

Faydalı kaynaklar

Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.

Çeviriyi değerlendir