Bir NFT Nasıl Basılır (NFT Eğitim Serisi Bölüm 2/3)
Beeple(opens in a new tab): 69 Milyon ABD Doları3LAU(opens in a new tab): 11 Milyon ABD Doları Grimes(opens in a new tab): 6 Milyon ABD Doları
Hepsi, Alchemy'nin güçlü API'sini kullanarak NFT'lerini bastı. Bu öğreticide, aynısını <10 dakikada nasıl yapacağınızı size öğreteceğiz.
“NFT basımı”, blok zincirinde ERC-721 token'ınızın benzersiz bir örneğini yayınlama eylemidir. NFT eğitim serisinin 1. Bölümündeki akıllı sözleşmemizi kullanarak Web3 becerilerimizi geliştirelim ve bir NFT basalım. Bu eğitimin sonunda, keyfinizin (ve cüzdanınızın) istediği kadar NFT basabileceksiniz!
Başlayalım!
Adım 1: Web3'ü yükleme
NFT akıllı sözleşmenizi oluşturmaya ilişkin ilk öğreticiyi izlediyseniz, zaten Ethers.js kullanma deneyiminiz vardır. Web3, Ethereum blok zincirine istek oluşturmayı kolaylaştırmak için kullanılan bir kütüphane olduğu için Ethers'a benzer. Bu öğreticide, otomatik yeniden denemeler ve güçlü WebSocket desteği sunan gelişmiş bir Web3 kütüphanesi olan Alchemy Web3(opens in a new tab)'ü kullanacağız.
Projenizin ana dizininde şunu çalıştırın:
1npm install @alch/alchemy-web3
Adım 2: Bir mint-nft.js
dosyası oluşturma
Komut dosyaları dizininizin içinde bir mint-nft.js
dosyası oluşturun ve aşağıdaki kod satırlarını ekleyin:
1require("dotenv").config()2const API_URL = process.env.API_URL3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")4const web3 = createAlchemyWeb3(API_URL)Kopyala
Adım 3: Sözleşme ABI'nizi alın
Sözleşme ABI'miz (Uygulama İkili Arayüzü), akıllı sözleşmemizle etkileşim kurmak için kullanılan arayüzdür. Sözleşme ABI'lerı hakkında daha fazlasını buradan(opens in a new tab) öğrenebilirsiniz. Hardhat bizim için otomatik olarak bir ABI oluşturur ve bunu MyNFT.json
dosyasına kaydeder. Bunu kullanmak için mint-nft.js
dosyamıza aşağıdaki kod satırlarını ekleyerek içeriği ayrıştırmamız gerekir:
1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")Kopyala
ABI'yi görmek istiyorsanız onu konsolunuza yazdırabilirsiniz:
1console.log(JSON.stringify(contract.abi))Kopyala
mint-nft.js
dosyasını çalıştırmak ve ABI'nizin konsola yazdırıldığını görmek için terminalinize gidin ve şunu çalıştırın:
1node scripts/mint-nft.jsKopyala
Adım 4: IPFS kullanarak NFT'niz için meta verileri yapılandırın
Bölüm 1'deki eğitimimizden hatırlarsanız, mintNFT
akıllı sözleşme işlevimiz, NFT'nin meta verilerini tanımlayan bir JSON belgesine çözümlenmesi gereken bir tokenURI parametresi alır - bu gerçekten NFT'yi hayata geçiren şeydir ve bir ad, açıklama, resim ve diğer nitelikler gibi yapılandırılabilir özelliklere sahip olmasını sağlar.
Gezegenler Arası Dosya Sistemi (IPFS), dağıtılmış bir dosya sisteminde veri depolamak ve paylaşmak için merkeziyetsiz bir protokol ve eşler arası ağdır.
Uygun bir IPFS API'si ve araç takımı olan Pinata'yı, NFT'mizin gerçekten merkeziyetsiz olmasını sağlamak için, NFT varlığımızı ve meta verilerimizi depolamak için kullanacağız. Pinata hesabınız yoksa buradan(opens in a new tab) ücretsiz bir hesap açın ve e-postanızı doğrulamak için adımları tamamlayın.
Bir hesap oluşturduğunuzda:
"Files" (Dosyalar) sayfasına gidin ve sayfanın sol üst köşesindeki mavi "Upload" (Yükle) düğmesine tıklayın.
Pinata'ya bir görüntü yükleyin; bu görüntü, NFT'nizin görüntü varlığı olacaktır. Varlığa istediğiniz adı verin
Yükledikten sonra, dosya bilgilerini "Dosyalar" sayfasındaki tabloda göreceksiniz. Ayrıca bir CID sütunu göreceksiniz. Yanındaki kopyala düğmesine tıklayarak CID'yi kopyalayabilirsiniz. Yüklemenizi
https://gateway.pinata.cloud/ipfs/<CID>
adresinde görebilirsiniz. Örnek olarak IPFS üzerinde kullandığımız resmi burada(opens in a new tab) bulabilirsiniz.
Görsel olarak daha iyi öğrenenler için yukarıdaki adımlar burada özetlenmiştir:
Şimdi Pinata'ya bir belge daha yüklememiz gerekecek. Ama bunu yapmadan önce, onu yaratmamız gerekiyor!
Kök dizininizde nft-metadata.json
adında yeni bir dosya oluşturun ve aşağıdaki json kodunu ekleyin:
1{2 "attributes": [3 {4 "trait_type": "Breed",5 "value": "Maltipoo"6 },7 {8 "trait_type": "Eye color",9 "value": "Mocha"10 }11 ],12 "description": "The world's most adorable and sensitive pup.",13 "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",14 "name": "Ramses"15}Tümünü gösterKopyala
json'daki veriyi değiştirmekten çekinmeyin. Nitelikler bölümündekileri kaldırabilir veya buraya ekleme yapabilirsiniz. En önemlisi, görüntü alanının IPFS görüntünüzün konumunu gösterdiğinden emin olun: Aksi takdirde NFT'niz (çok sevimli!) bir köpeğin fotoğrafını içerecektir.
JSON dosyasını düzenlemeyi tamamladıktan sonra kaydedin ve resmi yüklemek için kullandığımız adımları izleyerek Pinata'ya yükleyin.
Adım 5: Sözleşmenizin bir örneğini oluşturun
Şimdi, sözleşmemizle etkileşime geçmek için, kodumuzda onun bir örneğini oluşturmalıyız. Bunu yapmak için dağıtımdan veya Etherscan(opens in a new tab)'den sözleşmeyi dağıtmak amacıyla kullandığınız adresi arayarak alabileceğimiz sözleşme adresimize ihtiyacımız olacak.
Yukarıdaki örnekte, sözleşme adresimiz 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778'dir.
Daha sonra, ABI ve adresi kullanarak sözleşmemizi oluşturmak için Web3 sözleşme yöntemini(opens in a new tab) kullanacağız. mint-nft.js
dosyanıza aşağıdakini ekleyin:
1const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"23const nftContract = new web3.eth.Contract(contract.abi, contractAddress)Kopyala
Adım 6: .env
dosyasını güncelleme
Şimdi, Ethereum zincirine işlemler oluşturmak ve göndermek amacıyla, hesap nonce değeri almak için genel Ethereum hesap adresinizi kullanacağız (aşağıda açıklanacaktır).
Açık anahtarınızı .env
dosyanıza ekleyin; öğreticinin 1. bölümünü tamamladıysanız, .env
dosyamız artık aşağıdaki gibi görünmelidir:
1API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"2PRIVATE_KEY = "your-private-account-address"3PUBLIC_KEY = "your-public-account-address"Kopyala
Adım 7: İşleminizi oluşturma
İlk olarak, mintNFT(tokenData)
isimli bir fonksiyon tanımlayalım ve sıradakileri yaparak işlemimizi oluşturalım:
PRIVATE_KEY ve PUBLIC_KEY anahtarlarınızı
.env
dosyasından alın.Sonrasında, hesap nonce değerini bulmamız gerekecek. Nonce değeri detayı, adresinizden gönderilen işlem sayısını takip etmek için kullanılır: Buna, güvenlik amaçlarından dolayı ve tekrar saldırılarını(opens in a new tab) engellemek için ihtiyacımız vardır. Adresinizden gönderilmiş işlem sayısını almak için, getTransactionCount(opens in a new tab) kullanırız.
Son olarak, işlemimizi aşağıdaki bilgilerle ayarlayacağız:
'from': PUBLIC_KEY
— İşleminizin kaynağı, açık adresimizdir'to': ContractAddress
— Etkileşimde bulunmak ve işlemi göndermek istediğimiz sözleşme'nonce': nonce
— Adresimizden gönderilen işlem sayısını içeren hesap nonce değeri'gas': trialGas
— İşlemi tamamlamak için gereken tahmini gaz'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()
— Bu işlemde gerçekleştirmek istediğimiz hesaplama: Bu durumda bir NFT basımıdır
mint-nft.js
dosyanız artık bu şekilde görünmelidir:
1 require('dotenv').config();2 const API_URL = process.env.API_URL;3 const PUBLIC_KEY = process.env.PUBLIC_KEY;4 const PRIVATE_KEY = process.env.PRIVATE_KEY;56 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");7 const web3 = createAlchemyWeb3(API_URL);89 const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");10 const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";11 const nftContract = new web3.eth.Contract(contract.abi, contractAddress);1213 async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce1516 //the transaction17 const tx = {18 'from': PUBLIC_KEY,19 'to': contractAddress,20 'nonce': nonce,21 'gas': 500000,22 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()23 };24 }Tümünü gösterKopyala
Adım 8: İşlemi imzalama
Artık işlemimizi oluşturduğumuza göre, göndermek için imzalamamız gerekiyor. Özel anahtarımızı burada kullanacağız.
web3.eth.sendSignedTransaction
bize, işlemimizin kazıldığından ve ağdan düşmediğinden emin olmak için kullanabileceğimiz işlem hash değeri verecektir. İşlem imzalama bölümünde, işlemimizin başarılı olup olmadığını anlamamız için bazı hata kontrolleri eklediğimizi göreceksiniz.
1require("dotenv").config()2const API_URL = process.env.API_URL3const PUBLIC_KEY = process.env.PUBLIC_KEY4const PRIVATE_KEY = process.env.PRIVATE_KEY56const { createAlchemyWeb3 } = require("@alch/alchemy-web3")7const web3 = createAlchemyWeb3(API_URL)89const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce1516 //the transaction17 const tx = {18 from: PUBLIC_KEY,19 to: contractAddress,20 nonce: nonce,21 gas: 500000,22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),23 }2425 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)26 signPromise27 .then((signedTx) => {28 web3.eth.sendSignedTransaction(29 signedTx.rawTransaction,30 function (err, hash) {31 if (!err) {32 console.log(33 "The hash of your transaction is: ",34 hash,35 "\nCheck Alchemy's Mempool to view the status of your transaction!"36 )37 } else {38 console.log(39 "Something went wrong when submitting your transaction:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log(" Promise failed:", err)48 })49}Tümünü gösterKopyala
Adım 9: mintNFT
'yi çağırma ve mint-nft.js
düğümünü çalıştırma
Pinata'ya yüklediğiniz metadata.json
'ı hatırlıyor musunuz? Pinata'dan karma kodunu alın ve aşağıdakileri mintNFT
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
işlevine parametre olarak aktarın
Karma kodunu şu şekilde alırsınız:
Pinata'da nft meta veri hash kodunuzu nasıl alırsınız
Kopyaladığınız hash kodunun metadata.json'unuza yönlendirdiğini
https://gateway.pinata.cloud/ipfs/<metadata-hash-code>
sayfasını ayrı bir pencereye iki kez kontrol edin. Sayfa aşağıdaki ekran görüntüsüne benzer görünmelidir:
Sayfanız json meta verilerini göstermelidir
Sonuç olarak kodunuz şöyle görünmelidir:
1require("dotenv").config()2const API_URL = process.env.API_URL3const PUBLIC_KEY = process.env.PUBLIC_KEY4const PRIVATE_KEY = process.env.PRIVATE_KEY56const { createAlchemyWeb3 } = require("@alch/alchemy-web3")7const web3 = createAlchemyWeb3(API_URL)89const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)1213async function mintNFT(tokenURI) {14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce1516 //the transaction17 const tx = {18 from: PUBLIC_KEY,19 to: contractAddress,20 nonce: nonce,21 gas: 500000,22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),23 }2425 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)26 signPromise27 .then((signedTx) => {28 web3.eth.sendSignedTransaction(29 signedTx.rawTransaction,30 function (err, hash) {31 if (!err) {32 console.log(33 "The hash of your transaction is: ",34 hash,35 "\nCheck Alchemy's Mempool to view the status of your transaction!"36 )37 } else {38 console.log(39 "Something went wrong when submitting your transaction:",40 err41 )42 }43 }44 )45 })46 .catch((err) => {47 console.log("Promise failed:", err)48 })49}5051mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")Tümünü gösterKopyala
Şimdi, NFT'nizi dağıtmak için node scripts/mint-nft.js
komutunu çalıştırın. Birkaç saniye sonra terminalinizde şöyle bir yanıt görmelisiniz:
1The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e823Check Alchemy's Mempool to view the status of your transaction!
Sonrasında, işleminizin durumunu (beklemede, kazılmış veya ağdan düşürülmüş) görmek için Alchemy bellek havuzunuzu(opens in a new tab) ziyaret edin. İşleminiz düştüyse, Sepolia Etherscan(opens in a new tab)'i kontrol etmek ve işlem karmanızı aramak da faydalı olur.
Etherscan'da NFT işlem hash değerinizi görüntüleyin
İşte bu kadar! Ethereum blok zincirinde bir NFT ile dağıtım VE basım yaptınız
mint-nft.js
kullanarak canınızın (ve cüzdanınızın) istediği kadar NFT basabilirsiniz! NFT'nin meta verilerini açıklayan yeni bir tokenURI'yi ilettiğinizden emin olun (aksi takdirde, sonuç olarak farklı kimliklere sahip bir sürü özdeş NFT oluşturursunuz).
Büyük ihtimalle cüzdanınızda NFT'nizi gösterebilmek istersiniz: Bu nedenle 3. Bölüm: NFT'nizi Cüzdanınızda Nasıl Görüntüleyebilirsiniz kısmına göz atmayı unutmayın!
Son düzenleme: @pettinarip(opens in a new tab), 23 Kasım 2023