Bir NFT Nasıl Yazılır ve Dağıtılır (NFT Öğretici Serisi Bölüm 1/3)
NFT'lerin blokzinciri geniş kitlelere tanıtmasıyla, Ethereum blokzinciri üzerinde kendi NFT sözleşmenizi (ERC-721 Jetonu) yayımlayarak bu konudaki heyecanı kendiniz anlamanız için harika bir fırsat doğdu!
Alchemy; Makersplace (son zamanlarda Christie's'de 69 Milyon ABD Doları değerinde rekor bir dijital sanat eseri satışı gerçekleştirdi), Dapper Labs (NBA Top Shot ve Crypto Kitties'in yaratıcıları), OpenSea (dünyanın en büyük NFT pazarı), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable ve daha fazlası gibi NFT alanındaki büyük isimleri desteklemekten büyük bir gurur duyuyor.
Bu öğreticide, MetaMask (opens in a new tab), Solidity (opens in a new tab), Hardhat (opens in a new tab), Pinata (opens in a new tab) ve Alchemy (opens in a new tab) kullanarak Sepolia test ağında bir ERC-721 akıllı sözleşmesi oluşturma ve dağıtma adımlarını inceleyeceğiz (bunların ne anlama geldiğini henüz anlamıyorsanız endişelenmeyin, açıklayacağız!).
Bu öğreticinin 2. Bölümünde, bir NFT'yi basmak için akıllı sözleşmemizi nasıl kullanabileceğimizi inceleyeceğiz ve 3. Bölümde NFT'nizi MetaMask üzerinde nasıl görüntüleyeceğinizi açıklayacağız.
Ve elbette, herhangi bir noktada sorularınız olursa, Alchemy Discord (opens in a new tab)'dan bize ulaşmaktan veya Alchemy'nin NFT API belgelerini (opens in a new tab) ziyaret etmekten çekinmeyin!
Adım 1: Ethereum ağına bağlanın
Ethereum blok zincirine istek göndermenin birçok yolu vardır, ancak işleri kolaylaştırmak için, kendi düğümlerimizi çalıştırmak zorunda kalmadan Ethereum zinciri ile iletişim kurmamızı sağlayan bir blok zinciri geliştirici platformu ve API'si olan Alchemy (opens in a new tab)'de ücretsiz bir hesap kullanacağız.
Bu eğitimde, akıllı sözleşme dağıtımımızda perde arkasında neler olup bittiğini anlamak için Alchemy'nin izleme ve analitik geliştirici araçlarından da yararlanacağız. Henüz bir Alchemy hesabınız yoksa, buradan (opens in a new tab) ücretsiz kaydolabilirsiniz.
Adım 2: Uygulamanızı (ve API anahtarınızı) oluşturun
Bir Alchemy hesabı oluşturduktan sonra, bir uygulama yaratarak bir API anahtarı oluşturabilirsiniz. Bu, Sepolia test ağına istekte bulunmamıza izin verecektir. Test ağları hakkında daha fazla bilgi edinmek isterseniz bu kılavuza (opens in a new tab) göz atın.
- İmlecinizi gezinme çubuğundaki "Apps"in (Uygulamalar) üzerine gelip "Create App"e (Uygulama Oluştur) tıklayarak Alchemy Gösterge Panelinizdeki "Create App" sayfasına gidin
- Uygulamanıza bir ad verin (biz, "İlk NFT'm!"i seçtik), kısa bir açıklama yazın, Zincir için "Ethereum"', ağınız için "Sepolia" seçimi yapın. Birleşim sonrasında diğer test ağları kullanımdan kaldırılmıştır.
- "Create app"e (Uygulama oluştur) tıklamanız yeterlidir! Uygulamanız aşağıdaki tabloda görünmelidir.
Adım 3: Bir Ethereum hesabı oluşturun (adres)
İşlem göndermek ve almak için bir Ethereum hesabına ihtiyacımız var. Bu öğretici için, Ethereum hesap adresinizi yönetmek için kullanılan tarayıcıda sanal bir cüzdan olan MetaMask'ı kullanacağız. Ethereum'daki işlemlerin nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız, Ethereum Vakfı'nın bu sayfasına göz atın.
MetaMask'ı buradan (opens in a new tab) ücretsiz indirip bir hesap oluşturabilirsiniz. Bir hesap oluştururken, ya da bir hesabınız çoktan varsa, sağ üstten Sepolia Test Ağına geçtiğinizden emin olun (bu sayede gerçek parayla denemeler yapmayız).
Adım 4: Bir Musluktan ether ekleyin
Akıllı sözleşmemizi test ağına dağıtmak için biraz sahte ETH'ye ihtiyacımız olacak. ETH almak için Alchemy tarafından barındırılan Sepolia Musluğuna (opens in a new tab) gidin, oturum açın, hesap adresinizi girin ve “Bana ETH Gönder”e tıklayın. Kısa bir süre sonra Metamask hesabınızda ETH'yi görmelisiniz!
Adım 5: Bakiyenizi kontrol edin
Bakiyemizin mevcut olup olmadığını iki kez kontrol etmek için Alchemy'nin Composer aracını (opens in a new tab) kullanarak bir eth_getBalance (opens in a new tab) isteği yapalım. Bu, cüzdanımızdaki ETH miktarını döndürür. MetaMask hesap adresinizi girdikten ve "Send Request"e tıkladıktan sonra aşağıdaki gibi bir yanıt görmelisiniz:
1`{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}`Not: Bu sonuç ETH değil, wei cinsindendir. Wei, ether'ın en küçük birimi olarak kullanılır. Wei'den ETH'ye dönüştürme 1 eth = 1018 wei şeklindedir. Yani 0xde0b6b3a7640000'ı ondalık sayıya dönüştürürsek 1*1018 wei elde ederiz, bu da 1 ETH'ye eşittir.
Vay be! Tüm sahte paramız yerli yerinde.
Adım 6: Projemizi başlatın
Öncelikle projemiz için bir klasör oluşturmamız gerekecek. Komut satırınıza gidin ve şunu yazın:
1mkdir my-nft2cd my-nftArtık proje klasörümüzün içinde olduğumuza göre, projeyi başlatmak için npm init kullanacağız. Eğer npm zaten kurulu değilse, bu talimatları (opens in a new tab) takip edin (Node.js (opens in a new tab)'e de ihtiyacımız olacak, bu yüzden onu da indirin!).
1npm initKurulum sorularına nasıl cevap verdiğiniz çok önemli değil; referans olması için nasıl yaptığımızı aşağıda açıkladık:
1 package name: (my-nft)2 version: (1.0.0)3 description: İlk NFT'm!4 entry point: (index.js)5 test command:6 git repository:7 keywords:8 author:9 license: (ISC)10 About to write to /Users/thesuperb1/Desktop/my-nft/package.json:1112 {13 "name": "my-nft",14 "version": "1.0.0",15 "description": "İlk NFT'm!",16 "main": "index.js",17 "scripts": {18 "test": "echo \"Error: no test specified\" && exit 1"19 },20 "author": "",21 "license": "ISC"22 }Tümünü gösterpackage.json'ı onaylayın ve artık hazırız!
Adım 7: Hardhat (opens in a new tab)'i Kurun
Hardhat, Ethereum yazılımınızı derlemek, dağıtmak, test etmek ve hatalarını ayıklamak için bir geliştirme ortamıdır. Bu geliştiricilere canlı zincirde dağıtmadan önce akıllı sözleşmelerini ve merkeziyetsiz uygulamalarını geliştirirken yardımcı olur.
my-nft projemizin içinde şunu yürütün:
1npm install --save-dev hardhatKurulum talimatları (opens in a new tab) hakkında daha fazla ayrıntı için bu sayfaya göz atın.
Adım 8: Hardhat projesi oluşturun
Proje klasörümüzün içinde şunu yürütün:
1npx hardhatDaha sonra bir karşılama mesajı ve ne yapmak istediğinizi seçme seçeneği görmelisiniz. "create an empty hardhat.config.js"yi (boş bir hardhat.config.js oluştur) seçin:
1888 888 888 888 8882888 888 888 888 8883888 888 888 888 88848888888888 8888b. 888d888 .d88888 88888b. 8888b. 8888885888 888 "88b 888P" d88" 888 888 "88b "88b 8886888 888 .d888888 888 888 888 888 888 .d888888 8887888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.8888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y8889👷 Hardhat v2.0.11 sürümüne hoş geldiniz 👷10? Ne yapmak istersiniz? …11Örnek bir proje oluşturun12❯ Boş bir hardhat.config.js oluşturun13ÇıkışTümünü gösterBu, bizim için bir hardhat.config.js dosyası oluşturacak ve burada projemiz için tüm ayarları belirteceğiz (adım 13'te).
Adım 9: Proje klasörleri ekleyin
Projemizi düzenli tutmak için iki yeni klasör oluşturacağız. Komut satırınızda projenizin kök dizinine gidin ve şunu yazın:
1mkdir contracts2mkdir scripts-
contracts/, NFT akıllı sözleşme kodumuzu tutacağımız yerdir
-
scripts/, akıllı sözleşmemizle dağıtmak ve etkileşim kurmak için komut dosyalarını tutacağımız yerdir
Adım 10: Sözleşmemizi yazın
Artık ortamımız hazır olduğuna göre, daha heyecan verici şeylere geçelim: akıllı sözleşme kodumuzu yazmak!
my-nft projesini tercih ettiğiniz bir düzenleyicide açın (biz VSCode (opens in a new tab)'u tercih ediyoruz). Akıllı sözleşmeler, MyNFT.sol akıllı sözleşmemizi yazmak için kullanacağımız Solidity adlı bir dilde yazılır.
-
contractsklasörüne gidin veMyNFT.soladında yeni bir dosya oluşturun. -
Aşağıda, OpenZeppelin (opens in a new tab) kütüphanesinin ERC-721 uygulamasını temel alan NFT akıllı sözleşme kodumuz bulunmaktadır. Aşağıdaki içeriği kopyalayıp MyNFT.sol dosyanıza yapıştırın.
1//Sözleşme [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)'i temel almıştır.2// SPDX-License-Identifier: MIT3pragma solidity ^0.8.0;45import "@openzeppelin/contracts/token/ERC721/ERC721.sol";6import "@openzeppelin/contracts/utils/Counters.sol";7import "@openzeppelin/contracts/access/Ownable.sol";8import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";910contract MyNFT is ERC721URIStorage, Ownable {11 using Counters for Counters.Counter;12 Counters.Counter private _tokenIds;1314 constructor() ERC721("MyNFT", "NFT") {}1516 function mintNFT(address recipient, string memory tokenURI)17 public onlyOwner18 returns (uint256)19 {20 _tokenIds.increment();2122 uint256 newItemId = _tokenIds.current();23 _mint(recipient, newItemId);24 _setTokenURI(newItemId, tokenURI);2526 return newItemId;27 }28}Tümünü göster -
OpenZeppelin sözleşme kütüphanesinden sınıfları miras aldığımız için, komut satırınızda
npm install @openzeppelin/contracts^4.0.0komutunu çalıştırarak kütüphaneyi klasörümüze kurun.
Peki, bu kod tam olarak ne yapar? Satır satır inceleyelim.
Akıllı sözleşmemizin en üstünde, üç OpenZeppelin (opens in a new tab) akıllı sözleşme sınıfını içe aktarıyoruz:
-
@openzeppelin/contracts/token/ERC721/ERC721.sol, NFT akıllı sözleşmemizin devralacağı ERC-721 standardının uygulamasını içerir. (Geçerli bir NFT olması için akıllı sözleşmenizin ERC-721 standardının tüm yöntemlerini uygulaması gerekir.) Miras alınan ERC-721 fonksiyonları hakkında daha fazla bilgi edinmek için buradaki (opens in a new tab) arayüz tanımına göz atın.
-
@openzeppelin/contracts/utils/Counters.sol, yalnızca bir artırılabilen veya azaltılabilen sayaçlar sağlar. Akıllı sözleşmemiz, basılan toplam NFT sayısını takip etmek ve yeni NFT'mizde benzersiz kimliği belirlemek için bir sayaç kullanır. (Akıllı bir sözleşme kullanılarak basılan her NFT'ye benzersiz bir kimlik atanmalıdır: Burada benzersiz kimliğimiz yalnızca mevcut toplam NFT sayısı tarafından belirlenir. Örneğin, akıllı sözleşmemizle bastığımız ilk NFT'nin kimliği "1", ikinci NFT'mizin kimliği "2" vb. olacaktır.)
-
@openzeppelin/contracts/access/Ownable.sol, akıllı sözleşmemizde erişim kontrolü (opens in a new tab) kurar, böylece yalnızca akıllı sözleşmenin sahibi (yani siz) NFT basabilir. (Erişim kontrolünün dahil edilmesinin tamamen bir tercih olduğunu unutmayın. Herhangi birinin akıllı sözleşmenizi kullanarak bir NFT basabilmesini istiyorsanız, 10. satırdaki Ownable ve 17. satırdaki onlyOwner kelimelerini kaldırın.)
İçe aktarma ifadelerimizden sonra, şaşırtıcı derecede kısa olan özel NFT akıllı sözleşmemiz var: Yalnızca bir sayaç, bir oluşturucu ve tek bir fonksiyon içeriyor! Bu, miras aldığımız OpenZeppelin sözleşmeleri sayesindedir. Bu sözleşmeler, bir NFT oluşturmak için ihtiyaç duyduğumuz yöntemlerin çoğunu uygular; örneğin NFT'nin sahibini döndüren ownerOf ve NFT'nin sahipliğini bir hesaptan diğerine aktaran transferFrom.
ERC-721 oluşturucumuzda, "MyNFT" ve "NFT" olmak üzere 2 dize geçirdiğimizi göreceksiniz. İlk değişken akıllı sözleşmenin adı, ikincisi ise sembolüdür. Bu değişkenlerin her birine dilediğiniz gibi isim verebilirsiniz!
Son olarak, bir NFT basmamızı sağlayan mintNFT(address recipient, string memory tokenURI) fonksiyonumuz var! Bu fonksiyonun iki değişken aldığını fark edeceksiniz:
-
address recipient, yeni bastığınız NFT'yi alacak adresi belirtir. -
string memory tokenURI, NFT'nin meta verilerini tanımlayan bir JSON belgesine çözümlenmesi gereken bir dizedir. Bir NFT'nin meta verileri, onu gerçekten hayata geçiren şeydir ve bir ad, açıklama, görüntü ve diğer nitelikler gibi yapılandırılabilir özelliklere sahip olmasını sağlar. Bu öğreticinin 2. bölümünde, bu meta verilerin nasıl yapılandırılacağını açıklayacağız.
mintNFT, devralınan ERC-721 kitaplığından bazı yöntemleri çağırır ve nihayetinde yeni basılmış NFT'nin kimliğini temsil eden bir sayı döndürür.
Adım 11: MetaMask ve Alchemy'yi projenize bağlayın
Artık bir MetaMask cüzdanı ile Alchemy hesabı oluşturduğumuza ve akıllı sözleşmemizi yazdığımıza göre, üçünü birbirine bağlamanın zamanı geldi.
Sanal cüzdanınızdan gönderilen her işlem, benzersiz özel anahtarınızı kullanan bir imza gerektirir. Programımıza bu izni sağlamak için özel anahtarımızı (ve Alchemy API anahtarımızı) bir ortam dosyasında güvenle saklayabiliriz.
İşlem gönderme hakkında daha fazla bilgi edinmek için, web3 kullanarak işlem göndermeyle ilgili bu öğreticiye göz atın.
İlk önce dotenv paketini proje dizininize kurun:
1npm install dotenv --saveArdından, projemizin kök dizininde bir .env dosyası oluşturun ve MetaMask özel anahtarınızı ve HTTP Alchemy API URL'nizi buna ekleyin.
-
MetaMask'ten özel anahtarınızı dışa aktarmak için bu talimatları (opens in a new tab) izleyin.
-
HTTP Alchemy API URL'sini almak ve panonuza kopyalamak için aşağıya göz atın
.env dosyanız şimdi şöyle görünmelidir:
1API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"2PRIVATE_KEY="your-metamask-private-key"Bunları kodumuza gerçekten bağlamak için adım 13'te hardhat.config.js dosyamızda bu değişkenlere başvuracağız.
.env'yi girmeyin! Sırlarınızın başkası tarafından ele geçirilmesi riski taşıdığından lütfen .env dosyanızı başkalarına asla göstermeyin veya başkalarıyla asla paylaşmayın. Versiyon kontrolü kullanıyorsanız .env'nizi bir gitignore (opens in a new tab) dosyasına ekleyin.Adım 12: Ethers.js Kurun
Ethers.js, standart JSON-RPC yöntemlerini daha kullanıcı dostu yöntemlerle sarmalayarak Ethereum ile etkileşim kurmayı ve istek göndermeyi kolaylaştıran bir kütüphanedir.
Hardhat, ek araçlar ve genişletilmiş işlevsellik için Eklentileri (opens in a new tab) entegre etmeyi çok kolaylaştırır. Sözleşme dağıtımı için Ethers eklentisinden (opens in a new tab) yararlanacağız (Ethers.js (opens in a new tab) çok temiz sözleşme dağıtım yöntemlerine sahiptir).
Proje klasörünüzde şunu yazın:
1npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0Bir sonraki adımda hardhat.config.js'mizde de ether'lere ihtiyacımız olacak.
Adım 13: hardhat.config.js'yi güncelleyin
Şimdiye kadar birkaç bağımlılık ve eklenti ekledik, şimdi projemizin bunların hepsini tanıması için hardhat.config.js'yi güncellememiz gerekiyor.
Hardhat.config.js dosyanızı şöyle görünecek şekilde güncelleyin:
1 /**2 * @type import('hardhat/config').HardhatUserConfig3 */4 require('dotenv').config();5 require("@nomiclabs/hardhat-ethers");6 const { API_URL, PRIVATE_KEY } = process.env;7 module.exports = {8 solidity: "0.8.1",9 defaultNetwork: "sepolia",10 networks: {11 hardhat: {},12 sepolia: {13 url: API_URL,14 accounts: [`0x${PRIVATE_KEY}`]15 }16 },17 }Tümünü gösterAdım 14: Sözleşmemizi derleyin
Şimdiye kadar yaptığımız her şeyin çalıştığından emin olmak için sözleşmemizi derleyelim. Derleme görevi, yerleşik hardhat görevlerden biridir.
Komut satırından şunu yürütün:
1npx hardhat compileKaynak dosyada verilmeyen SPDX lisans tanımlayıcısı hakkında bir uyarı alabilirsiniz, ancak bunun için endişelenmenize gerek yok, geri kalan her şey düzgün olacaktır! Sorun yaşarsanız Alchemy Discord (opens in a new tab) üzerinden her zaman mesaj atabilirsiniz.
Adım 15: Dağıtım betiğimizi yazın
Artık sözleşmemiz yazıldığına ve yapılandırma dosyamız kullanıma hazır olduğuna göre, sözleşme dağıtım komut dosyanızı yazmanın zamanı geldi.
scripts/ klasörüne gidin ve deploy.js adında yeni bir dosya oluşturup aşağıdaki içeriği ekleyin:
1async function main() {2 const MyNFT = await ethers.getContractFactory("MyNFT")34 // Dağıtımı başlat, bir sözleşme nesnesine dönüşecek bir promise döndürür5 const myNFT = await MyNFT.deploy()6 await myNFT.deployed()7 console.log("Sözleşme şu adrese dağıtıldı:", myNFT.address)8}910main()11 .then(() => process.exit(0))12 .catch((error) => {13 console.error(error)14 process.exit(1)15 })Tümünü gösterHardhat, Sözleşmeler öğreticisinde (opens in a new tab) bu kod satırlarının her birinin ne işe yaradığını harika bir şekilde açıklıyor, biz de buraya onların açıklamalarını aldık.
1const MyNFT = await ethers.getContractFactory("MyNFT");Ethers.js'deki ContractFactory, yeni akıllı sözleşmeleri dağıtmak için kullanılan bir soyutlamadır, bu nedenle MyNFT burada, NFT sözleşmemizin örnekleri için bir fabrikadır. Hardhat-ethers eklentisini kullanırken ContractFactory ve Sözleşme örnekleri, varsayılan olarak ilk imzalayana bağlanır.
1const myNFT = await MyNFT.deploy();Bir ContractFactory üzerinde deploy() öğesinin çağrılması, dağıtımı başlatır ve bir çözümlendiğinde Sözleşme oluşturacak bir Söz döndürür. Bu, akıllı sözleşme fonksiyonlarımızın her biri için bir yöntemi olan nesnedir.
Adım 16: Sözleşmemizi dağıtın
Sonunda akıllı sözleşmemizi uygulamaya hazırız! Proje dizininizin kök dizinine geri dönün ve komut satırında şunu çalıştırın:
1npx hardhat --network sepolia run scripts/deploy.jsDaha sonra şöyle bir şey görmelisiniz:
1Sözleşme şu adrese dağıtıldı: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650Sepolia etherscan (opens in a new tab) adresine gidip sözleşme adresimizi aratırsak, başarıyla dağıtıldığını görebilmeliyiz. Bu işlem biraz zaman alabileceğinden dolayı hemen göremezseniz lütfen biraz bekleyin. İşlem şunun gibi gözükecektir:
From adresi MetaMask hesap adresinizle eşleşmeli ve To adresinde “Sözleşme Oluşturma” yazmalıdır. İşleme tıklarsak, Alıcı alanında sözleşme adresimizi görürüz:
Evet! NFT akıllı sözleşmenizi Ethereum (test ağı) zincirinde dağıttınız!
Perde arkasında neler olduğunu anlamak için Alchemy gösterge panelimizdeki (opens in a new tab) Explorer sekmesine gidelim. Birden fazla Alchemy uygulamanız varsa, uygulamaya göre filtreleme yaptığınızdan ve "MyNFT"yi seçtiğinizden emin olun.
Burada, .deploy() fonksiyonunu çağırdığımızda Hardhat/Ethers'in bizim için arka planda yaptığı birkaç JSON-RPC çağrısı göreceksiniz. Burada değinilmesi gereken iki önemli olanı şunlardır: akıllı sözleşmemizi Sepolia zincirine yazma isteği olan eth_sendRawTransaction ve karma değeri verildiğinde işlemimiz hakkındaki bilgileri okuma isteği olan eth_getTransactionByHash (işlem gönderirken tipik bir model). İşlem gönderme hakkında daha fazla bilgi edinmek için Web3 kullanarak işlem gönderme hakkındaki bu öğreticiye göz atın.
Bu öğreticinin 1. Bölümü bu kadardı. 2. Bölüm'de, bir NFT basarak akıllı sözleşmemizle gerçekten etkileşime gireceğiz ve 3. Bölüm'de, NFT'nizi Ethereum cüzdanınızda nasıl görüntüleyeceğinizi göstereceğiz!
Sayfanın son güncellenmesi: 5 Aralık 2025






