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 ERC-721 akıllı sözleşmesi oluşturma ve dağıtma adımlarını inceleyeceğiz (ne olduğunu anlamıyorsanız üzülmeyin, 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 sorunuz 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 olanAlchemy(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 oluşturarak bir API anahtarı oluşturabilirsiniz. Bu, Sepolia test ağına istekte bulunmamıza izin verecektir. Eğer test ağları hakkında daha fazlasını öğrenmeye meraklıysanız bu rehbere(opens in a new tab) göz atın.
- Gezinme çubuğundaki "Uygulamalar"ın üzerine gelip "Uygulama Oluştur"a tıklayarak Simya Panonuzdaki "Uygulama Oluştur" 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.
- "Uygulama oluştur"u tıklayın, işte bu kadar! 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 eğitim için, Ethereum hesap adresinizi yönetmek için kullanılan tarayıcı üstü bir sanal cüzdan olan MetaMask'i 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.
Buradan(opens in a new tab) ücretsiz olarak bir MetaMask hesabı indirebilir ve 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 alabilmek için Alchemy tarafından barındırılan Sepolia Musluğuna(opens in a new tab) gidin, hesabınızın adresini girin, sonra da "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 yerinde olduğundan emin olmak için Alchemy düzenleyici arayıcını(opens in a new tab) kullanarak bir eth_getBalance(opens in a new tab) talebi oluşturalı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 biçimindedir. 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-nft
Artık proje klasörümüzün içinde olduğumuza göre, projeyi başlatmak için npm init kullanacağız. Hâlihazırda npm kurulu değilse, bu talimatları izleyin(opens in a new tab) (Node.js(opens in a new tab)'ye de ihtiyacımız olacak, onu da indirin!).
1npm init
Kurulum 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:
1package name: (my-nft)2version: (1.0.0)3description: My first NFT!4entry point: (index.js)5test command:6git repository:7keywords:8author:9license: (ISC)10About to write to /Users/thesuperb1/Desktop/my-nft/package.json:1112{13 "name": "my-nft",14 "version": "1.0.0",15 "description": "My first NFT!",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öster
package.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 hardhat
Kurulum 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 hardhat
Daha 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 Hoşgeldin 👷10? Ne yapmak istersin? …11Create a sample project12❯ Create an empty hardhat.config.js13QuitTümünü göster
Bu, 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!
Favori düzenleyicinizde my-nft projesini 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.
contracts
klasörüne gidin ve MyNFT.sol adlı yeni bir dosya oluşturunAşağıda, OpenZeppelin(opens in a new tab) kütüphanesinin ERC-721 uygulamasını temel aldığımız NFT akıllı sözleşme kodumuz yer almaktadır. Aşağıdaki içeriği kopyalayıp MyNFT.sol dosyanıza yapıştırın.
1//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)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österKopyalaSınıfları OpenZeppelin sözleşme kütüphanesinden aldığımız için, kütüphaneyi klasörümüze kurmak için komut satırınızda
npm install @openzeppelin/contracts
komutunu yürütün.
Peki, bu kod tam olarak ne yapar? Satır satır inceleyelim.
Akıllı sözleşmemizin en üstüne, üç tane OpenZeppelin(opens in a new tab) akıllı sözleşme sınıfını içe aktararak ekliyoruz:
@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.) Devralınan ERC-721 fonksiyonları hakkında daha fazla bilgi edinmek için buradaki(opens in a new tab) arayüz tanımına bakı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 sadece akıllı sözleşmenin sahibinin (sizin) NFT basabilmesi için erişim kontrolü(opens in a new tab) kurulumu yapar. (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, NFT'nin sahibini döndüren ownerOf
ve transferFrom
gibi bir NFT oluşturmak için ihtiyaç duyduğumuz yöntemlerin çoğunu uygulayan devralınan, NFT'nin sahipliğini bir hesaptan diğerine aktaran OpenZeppelin sözleşmelerimiz sayesindedir.
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:
recipient
, yeni basılmış NFT'nizi alacak adresi belirtirstring 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'i 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 bakın.
İlk önce dotenv paketini proje dizininize kurun:
1npm install dotenv --save
Ardından projemizin kök dizininde bir .env
dosyası oluşturun ve buna Metamask özel anahtarınızı ve HTTP Alchemy API URL'nizi ekleyin.
Özel anahtarınızı MetaMask'ten almak için şu talimatları(opens in a new tab) takip edin
HTTP Alchemy API URL'sini almak ve panonuza kopyalamak için aşağıya göz atın
.env
artık şö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.
Adım 12: Ethers.js'yi kurun
Ethers.js, standart JSON-RPC yöntemlerini daha kullanıcı dostu yöntemlerle birleştirerek Ethereum'la etkileşimde bulunmayı ve Ethereum'a istek göndermeyi kolaylaştıran bir kütüphanedir.
Hardhat, ek araçlar ve genişletilmiş işlevsellik için Eklentiler(opens in a new tab)'i 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)'nin bazı aşırı temiz sözleşme dağıtım yöntemleri vardır).
Proje klasörünüzde şunu yazın:
1npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0
Bir 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*/4require('dotenv').config();5require("@nomiclabs/hardhat-ethers");6const { API_URL, PRIVATE_KEY } = process.env;7module.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öster
Adı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 compile
Kaynak 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! Düzgün değilse, istediğiniz zaman Alchemy discord(opens in a new tab)'da mesaj gönderebilirsiniz.
Adım 15: Dağıtım komut dosyamızı 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 aşağıdaki içerikleri ekleyerek deploy.js
adlı yeni bir dosya oluşturun:
1async function main() {2 const MyNFT = await ethers.getContractFactory("MyNFT")34 // Start deployment, returning a promise that resolves to a contract object5 const myNFT = await MyNFT.deploy()6 await myNFT.deployed()7 console.log("Contract deployed to address:", 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österKopyala
Hardhat, bu kod satırlarının her birinin ne işe yaradığını Sözleşme öğreticisinde(opens in a new tab) harika bir şekilde açıklıyor, Hardhat açıklamalarını buraya aktardı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.js
Daha sonra şöyle bir şey görmelisiniz:
1Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650
Sepolia etherscan(opens in a new tab)'e gidip sözleşme adresimizi aratığımızda, başarıyla dağıtıldığını görebiliriz. Bu işlem biraz zaman alabileceğinden dolayı hemen göremezseniz lütfen biraz bekleyin. İşlem şunun gibi gözükecektir:
Gönderici adresi, MetaMask hesap adresinizle eşleşmelidir ve Alıcı adresinde "Sözleşme Oluşturma" yazacaktı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 panelimizde(opens in a new tab) Explorer (Gezgin) 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 belirtilmesi gereken iki önemli şey, akıllı sözleşmemizi Ropsten zincirine yazma isteği olan eth_sendRawTransaction ve hash değerine göre işlemimiz hakkındaki bilgileri okuma isteği olan (işlem gönderirken sık kullanılan bir şablon) eth_getTransactionByHash öğeleridir. İşlem gönderme hakkında daha fazla bilgi edinmek için web3 kullanarak işlem göndermeyle ilgili bu öğreticiye göz atın.
Bu öğreticinin 1. Bölümü bu kadardı. 2. Bölümde, bir NFT'yi basarak akıllı sözleşmemizle gerçekten etkileşime geçeceğiz ve 3. Bölümde, Ethereum cüzdanınızda NFT'nizi nasıl görüntüleyeceğinizi göstereceğiz!
Son düzenleme: @UNOFFICIALbgd(opens in a new tab), 16 Ağustos 2024