bitcoin
Bitcoin (BTC) $ 66,260.75 1.14%
ethereum
Ethereum (ETH) $ 3,543.84 0.91%
bnb
BNB (BNB) $ 608.84 0.31%
solana
Solana (SOL) $ 144.33 2.75%
xrp
XRP (XRP) $ 0.479655 0.18%
cardano
Cardano (ADA) $ 0.410689 2.90%
dogecoin
Dogecoin (DOGE) $ 0.136663 4.06%

İlk NFT 2.0’ımızı Üretelim

NFT

NFT rüzgarı esmeye devam ederken gündeme Soulbound NFT’ler geldi. Buna kimi zaman NFT 2.0 dense de henüz bu tartışmalı bir konu. Biz yine de biraz da dikkatinizi çekmek için bu ibareyi kullanalım.

NFT konusunda bir şey dikkatinizi çekmiştir. Mesele kripto paranın çok ötesinde. İnsanlar NFT ile dijital kimliklerinin bir parçasını oluşturuyorlar. Bazen mutluluk bazen ego satın alıyorlar. Bu durum Vitalik Buterin’in de dikkatinden kaçmamış olacak ki bir yazı kaleme alıp Devredilemez NFT’leri yani Soulbound NFT’leri duyurdu. Her gün yeni bir şey çıkıyor dediğinizi duyar gibiyim. Doğrudur, 11 yıllık bir teknolojinin 402 kere “vefat” haberi çıkınca bir hayli çok canlı oluyor. Her gün de yeni bir doğum yapıyor.

Soulbound yani devredilemez NFT’lerin neden ortaya çıktığı nerelerde kullanılabileceği ayrı bir konu. Bunla ilgili yakında bir yazı gelecek. Ondan önce, gelin teknik olarak nasıl üretildiğine göz atalım.

Hadi başlayalım.

İlk olarak bir ERC721 kontratına ihtiyacımız var. Amerikayı baştan keşfetmeye gerek yok. https://wizard.openzeppelin.com/ adresine giriyoruz. Üst taraftan ERC721’i seçip aşağıdaki şekilde Mintable, Auto Increment Ids, URI Storage kısımlarını aktif yapıyoruz.

İlk NFT 2.0'ımızı Üretelim

Sağ üst köşeden Open in Remix diyoruz ve kodumuz aşağıdaki şekilde oluşuyor:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";contract SoulBoundTest is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;Counters.Counter private _tokenIdCounter;constructor() ERC721("SoulBoundTest", "SBT") {}function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }// The following functions are overrides required by Solidity.function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }}

Harika. Şimdi ise ikame edilemez jetonlarımızı devredilemez yapalım. Bunun için bizim bir fonksiyona ihtiyacımız var. Bizim kullandığımız Open Zeppelin kütüphanesi içinde _beforeTokenTransfer fonksiyonu var.

function _beforeTokenTransfer(
address from, 
address to, 
uint256 tokenId
) internal override virtual {
require(from == address(0), "Err: Token transfer edilemez.");   
super._beforeTokenTransfer(from, to, tokenId);  
}

Bu fonksiyonu kontratın içine giriyoruz. Kodumuzun son hali şu şekilde oluyor.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";
contract SoulBoundTest is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("SoulBoundTest", "SBT") {}
function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
function _beforeTokenTransfer(
address from, 
address to, 
uint256 tokenId
) internal override virtual {
require(from == address(0), "Err: Token transfer edilemez.");   
super._beforeTokenTransfer(from, to, tokenId);  
}
}

Bu kod her çalıştığında, require ifadesi ile tokenın gönderilip gönderilemeyeceği kontrol ediliyor ve bir tür bloklama yapılıyor. Şimdi kontratımızı ağa yayalım. Metamask kullanıyoruz ve Moonbeam ağı üzerinden bağlantımızı yapıyoruz.

1 uUUWE2vrNrVnUvQsAhp8DQ

Deploy tuşuna bastık ve kontratımızı yayınladık. Buradan kontrol edebilirsiniz.

Şimdi bu kontratı kullanarak Souldbound NFT üretme kısmına geçelim. İstersek explorer üzerinden kontratı doğrulayarak devam edebiliriz fakat biz daha pratik olduğu için Remix üzerinden işlemi yapacağız.

1 bj8VsxT3oGFd9 dVNkATg 1

Bizim iki parametreye ihtiyacımız var. Bunlardan ilki to ve ikincisi URI adresi. Aşağıda görüldüğü şekilde safeMint fonksiyonuna bunları girerek ağa göndereceğiz.

1 AWvD9HNXTvC 7msv0Jb9Qw

To kısmına adres gelecek, biliyoruz. URI kısmı için de dosyalarımızı yüklediğimiz bir IPFS bulutu lazım. Bunun için Pinata platformunu kullanıyoruz. Pinata NFT’leri saklamak için bir platform.

İlk olarak https://gateway.pinata.cloud/ipfs adresine giriş yaparak medya dosyamızı yüklüyoruz.

Buradaki CID kısmı bizim için önemli.

1 QxYARetRlfPLHlmfiOvBzQ

Bu adresi de alıp aşağıdaki şekilde bir JSON dosyası oluşturuyoruz. Detayları değiştirebiliriz.

{
    "attributes" : [ {
      "trait_type" : "NFT",
      "value" : "Soulbound"
    }, {
      "trait_type" : "Asset",
      "value" : "Non-transferable Badge"
    }, {
        "trait_type" : "Badge",
        "value" : "Minting First Soulbound Token"
      }, {
        "trait_type" : "Type",
        "value" : "Demo"
      }   ],
    "description" : "This is a demo soulbound token mint",
    "image" : "https://gateway.pinata.cloud/ipfs/QmZASW365tuDTjuJuQs36os8tku6vVPcvvV1BjtqPMNg59",
    "name" : "Soulbound Token"
}

CID kısmı JSON dosyamızda linkin sonuna geldi. Şimdi bu JSON dosyasını bir klasör içinde IPFS’e yükleyelim. Klasöre girince aşağıdaki şekilde JSON dosyamızı görebiliyoruz.

1 TXkqo8N VVfvGK zWnU2Mg

Aşağıdaki adresini kopyalıyoruz. Bu bizim URI adresimiz oluyor.

https://gateway.pinata.cloud/ipfs/QmdgmWoscdfiCbjdm4QYMsrwkmSzmPJ2PLgYK9cWKnLmRx/soulbond.json

1 5C MT5brvO i3C2j2TwqJw
1 05a53f2SeOiq52kyEcw ig

İşte bu kadar devredilemez NFT’mizi ürettik. Buradan kontrol edebilirsiniz.

Taşınamaz NFT’mize NFT Marketplace üzerinden buradan bakabiliriz.

Bu makale yatırım tavsiyesi veya önerisi içermemektedir. Her yatırım ve alım satım hareketi risk içerir ve okuyucular karar verirken kendi araştırmalarını yapmalıdır.

btchaber bh logo

Buğra Ayan

Buğra Ayan 1989 yılında Erzurum’da doğmuştur. Lisans eğitimini Karadeniz Teknik Üniversitesi Elektrik Elektronik Mühendisliği bölümünde, yüksek lisans eğitimini Gazi Üniversitesi Bilişim Ensitütüsü’nde tamamlamış ve doktora çalışmasına Gazi Üniversitesi Bilişim Enstitüsü’nde devam etmektedir. Evli olan Ayan’ın Bilge ve Gökalp isimli iki çocuğu bulunmaktadır.

Blokzincirin ve kripto paraların, geleceği nasıl değiştireceğini bugünden öğrenin.
Bağlantıyı kopyala