Ana içeriğe geç

Bir NFT Nasıl Basılır (NFT Eğitim Serisi Bölüm 2/3)

ERC-721
alchemy
solidity
akıllı kontratlar
Acemi
Sumi Mudgil
22 Nisan 2021
7 dakikalık okuma

Beeple (opens in a new tab): 69 Milyon Dolar 3LAU (opens in a new tab): 11 Milyon Dolar Grimes (opens in a new tab): 6 Milyon Dolar

Hepsi, Alchemy'nin güçlü API'sini kullanarak NFT'lerini bastı. Bu öğreticide, aynısını <10 dakika içinde nasıl yapacağınızı öğreteceğiz.

“Bir NFT basmak”, ERC-721 jetonunuzun benzersiz bir örneğini blokzincirde yayınlama eylemidir. Bu NFT öğretici serisinin 1. Bölümündeki akıllı sözleşmemizi kullanarak Web3 becerilerimizi sergileyelim ve bir NFT basalım. Bu öğreticinin sonunda, gönlünüzün (ve cüzdanınızın) çektiği kadar NFT basabileceksiniz!

Hadi başlayalım!

Adım 1: Web3'ü yükleyin

NFT akıllı sözleşmenizi oluşturmayla ilgili ilk öğreticiyi takip ettiyseniz Ethers.js kullanma konusunda zaten deneyiminiz vardır. Web3, Ethereum blokzincirine 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 sağlam 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şturun

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_URL
3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
4const web3 = createAlchemyWeb3(API_URL)

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 kurma arayüzüdür. Sözleşme ABI'leri hakkında daha fazla bilgiyi buradan (opens in a new tab) edinebilirsiniz. Hardhat bizim için otomatik olarak bir ABI oluşturur ve bunu MyNFT.json dosyasına kaydeder. Bunu kullanabilmek için mint-nft.js dosyamıza aşağıdaki kod satırlarını ekleyerek içeriği ayrıştırmamız gerekecek:

1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")

ABI'yi görmek isterseniz konsolunuza yazdırabilirsiniz:

1console.log(JSON.stringify(contract.abi))

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.js

Adım 4: IPFS kullanarak NFT'nizin meta verilerini yapılandırın

  1. Bölüm'deki öğreticimizden hatırlayacağınız üzere, mintNFT akıllı sözleşme fonksiyonumuz, NFT'nin meta verilerini açıklayan bir JSON belgesine çözümlenmesi gereken bir tokenURI parametresi alır. Bu meta veriler, NFT'yi gerçekten hayata geçiren, ad, açıklama, resim ve diğer nitelikler gibi yapılandırılabilir özelliklere sahip olmasını sağlayan şeydir.

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.

NFT varlığımızı ve meta verilerimizi depolamak ve NFT'mizin gerçekten merkeziyetsiz olmasını sağlamak için kullanışlı bir IPFS API ve araç takımı olan Pinata'yı kullanacağız. Pinata hesabınız yoksa buradan (opens in a new tab) ücretsiz bir hesap için kaydolun ve e-postanızı doğrulamak için adımları tamamlayın.

Bir hesap oluşturduktan sonra:

  • "Dosyalar" sayfasına gidin ve sayfanın sol üst köşesindeki mavi "Yükle" düğmesine tıklayın.

  • Pinata'ya bir resim yükleyin — bu, NFT'nizin resim varlığı olacaktır. Varlığa dilediğiniz adı verebilirsiniz

  • Yükleme yaptıktan sonra, "Dosyalar" sayfasındaki tabloda dosya bilgilerini göreceksiniz. Ayrıca bir CID sütunu da göreceksiniz. Yanındaki kopyalama düğmesine tıklayarak CID'yi kopyalayabilirsiniz. Yüklemenizi şu adresten görüntüleyebilirsiniz: https://gateway.pinata.cloud/ipfs/<CID>. Örneğin, IPFS'de kullandığımız görseli burada (opens in a new tab) bulabilirsiniz.

Görsel öğrenenler için yukarıdaki adımlar burada özetlenmiştir:

Resminizi Pinata'ya nasıl yüklersiniz

Şimdi Pinata'ya bir belge daha yükleyeceğiz. Ama bunu yapmadan önce onu oluşturmamı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": "Cins",
5 "value": "Maltipoo"
6 },
7 {
8 "trait_type": "Göz Rengi",
9 "value": "Mocha"
10 }
11 ],
12 "description": "Dünyanın en sevimli ve hassas köpeği.",
13 "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
14 "name": "Ramses"
15}
Tümünü göster

json'daki verileri değiştirmekten çekinmeyin. Nitelikler bölümüne ekleme veya çıkarma yapabilirsiniz. En önemlisi, resim alanının IPFS resminizin konumunu gösterdiğinden emin olun — aksi takdirde NFT'niz (çok sevimli!) bir fotoğraf içerecektir köpek.

JSON dosyasını düzenlemeyi bitirdikten sonra, kaydedin ve resmi yüklemek için yaptığımız adımların aynısını izleyerek Pinata'ya yükleyin.

nft-metadata.json dosyanızı Pinata'ya nasıl yüklersiniz

Adım 5: Sözleşmenizin bir örneğini oluşturun

Şimdi, sözleşmemizle etkileşim kurmak için kodumuzda onun bir örneğini oluşturmamız gerekiyor. Bunu yapmak için, sözleşmeyi dağıtmak için kullandığınız adresi arayarak dağıtımdan veya Blockscout (opens in a new tab) üzerinden alabileceğimiz sözleşme adresimize ihtiyacımız olacak.

Sözleşme adresinizi Etherscan'de görüntüleyin

Yukarıdaki örnekte sözleşme adresimiz 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778'dir.

Ardından, 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ğıdakileri ekleyin:

1const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
2
3const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

Adım 6: .env dosyasını güncelleyin

Şimdi, Ethereum zincirine işlem oluşturmak ve göndermek için, hesap nonce'unu (aşağıda açıklanacaktır) almak üzere halka açık Ethereum hesap adresinizi kullanacağız.

Açık anahtarınızı .env dosyanıza ekleyin — öğreticinin 1. bölümünü tamamladıysanız, .env dosyanız şimdi şöyle 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"

Adım 7: İşleminizi oluşturun

Öncelikle, mintNFT(tokenData) adında bir fonksiyon tanımlayalım ve aşağıdakileri yaparak işlemimizi oluşturalım:

  1. .env dosyasından PRIVATE_KEY ve PUBLIC_KEY değerlerinizi alın.

  2. Sırada, hesap nonce'unu bulmamız gerekiyor. Nonce belirtimi, adresinizden gönderilen işlem sayısını takip etmek için kullanılır. Buna güvenlik amacıyla ve tekrar saldırılarını (opens in a new tab) önlemek için ihtiyacımız vardır. Adresinizden gönderilen işlem sayısını almak için getTransactionCount (opens in a new tab) kullanırız.

  3. Son olarak işlemimizi aşağıdaki bilgilerle ayarlayacağız:

  • 'from': PUBLIC_KEY — İşlemimizin kaynağı, halka 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'u

  • 'gas': estimatedGas — İşlemi tamamlamak için gereken tahmini gaz

  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() — Bu işlemde gerçekleştirmek istediğimiz hesaplama, ki bu durumda bir NFT basmaktır

mint-nft.js dosyanız şimdi şöyle 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;
5
6 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
7 const web3 = createAlchemyWeb3(API_URL);
8
9 const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
10 const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
11 const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
12
13 async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //en son nonce'u al
15
16 //işlem
17 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öster

Adım 8: İşlemi imzalayın

İşlemimizi oluşturduğumuza göre, göndermek için imzalamamız gerekiyor. İşte burada özel anahtarımızı kullanacağız.

web3.eth.sendSignedTransaction, bize işlem hash değerini verir. Bunu, işlemimizin mine edildiğinden ve ağ tarafından düşürülmediğinden emin olmak için kullanabiliriz. İşlem imzalama bölümünde, işlemimizin başarılı olup olmadığını bilmemiz için bazı hata denetimleri eklediğimizi fark edeceksiniz.

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //en son nonce'u al
15
16 //işlem
17 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
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .then((signedTx) => {
28 web3.eth.sendSignedTransaction(
29 signedTx.rawTransaction,
30 function (err, hash) {
31 if (!err) {
32 console.log(
33 "İşleminizin hash değeri: ",
34 hash,
35 "\nİşleminizin durumunu görüntülemek için Alchemy'nin Mempool'unu kontrol edin!"
36 )
37 } else {
38 console.log(
39 "İşleminizi gönderirken bir şeyler ters gitti:",
40 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log(" Promise başarısız oldu:", err)
48 })
49}
Tümünü göster

Adım 9: mintNFT'yi çağırın ve node mint-nft.js'yi çalıştırın

Pinata'ya yüklediğiniz metadata.json'ı hatırlıyor musunuz? Pinata'dan hash kodunu alın ve mintNFT fonksiyonuna parametre olarak şunu geçin: https://gateway.pinata.cloud/ipfs/<metadata-hash-code>

Hash kodu şu şekilde alınır:

Pinata'da NFT meta veri hash kodunuzu nasıl alırsınızPinata'da NFT meta veri hash kodunuzu nasıl alırsınız

https://gateway.pinata.cloud/ipfs/<metadata-hash-code> adresini ayrı bir pencerede yükleyerek kopyaladığınız hash kodunun metadata.json dosyanıza bağlandığını iki kez kontrol edin. Sayfa aşağıdaki ekran görüntüsüne benzer görünmelidir:

Sayfanız json meta verilerini görüntülemelidirSayfanız json meta verilerini görüntülemelidir

Sonuç olarak, kodunuz şuna benzer görünmelidir:

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //en son nonce'u al
15
16 //işlem
17 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
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .then((signedTx) => {
28 web3.eth.sendSignedTransaction(
29 signedTx.rawTransaction,
30 function (err, hash) {
31 if (!err) {
32 console.log(
33 "İşleminizin hash değeri: ",
34 hash,
35 "\nİşleminizin durumunu görüntülemek için Alchemy'nin Mempool'unu kontrol edin!"
36 )
37 } else {
38 console.log(
39 "İşleminizi gönderirken bir şeyler ters gitti:",
40 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log("Promise başarısız oldu:", err)
48 })
49}
50
51mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
Tümünü göster

Şimdi, NFT'nizi dağıtmak için node scripts/mint-nft.js komutunu çalıştırın. Birkaç saniye sonra, terminalinizde şuna benzer bir yanıt görmelisiniz:

1İşleminizin hash değeri: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
2
3İşleminizin durumunu görüntülemek için Alchemy'nin Mempool'unu kontrol edin!

Ardından, işleminizin durumunu (beklemede, mine edilmiş veya ağdan düşürülmüş) görmek için Alchemy mempool'unuzu (opens in a new tab) ziyaret edin. İşleminiz düşürüldüyse, Blockscout (opens in a new tab)'u kontrol etmek ve işlem hash değerinizi aramak da yararlıdır.

NFT işlem hash değerinizi Etherscan'de görüntüleyinNFT işlem hash değerinizi Etherscan'de görüntüleyin

İşte bu kadar! Artık Ethereum blokzincirinde bir NFT'yi dağıttınız VE bastınız

mint-nft.js kullanarak gönlünüzün (ve cüzdanınızın) çektiği kadar NFT basabilirsiniz! NFT'nin meta verilerini açıklayan yeni bir tokenURI girdiğinizden emin olun (aksi takdirde, farklı kimliklere sahip bir sürü aynı NFT'yi oluşturmuş olursunuz).

Muhtemelen NFT'nizi cüzdanınızda sergileyebilmek istersiniz — bu yüzden Bölüm 3: NFT'nizi Cüzdanınızda Nasıl Görüntülersiniz bölümüne göz atmayı unutmayın!

Sayfanın son güncellenmesi: 23 Şubat 2026

Bu rehber yararlı oldu mu?