Ana içeriğe geç

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

ERC-721alchemykatılıkakıllı sözleşmeler
Gelişmiş
✍️Sumi Mudgil
📆 22 Nisan 2021
⏱️7 dakikalık okuma minute read

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.jsdosyası 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_URL
3const { 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.js
📋 Kopyala

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:

Sürücünüzü Pinata'ya nasıl yüklersiniz

Ş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öster
📋 Kopyala

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.

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

Etherscan'da sözleşme adresinizi görüntüleyin

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"
2
3const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
📋 Kopyala

Adım 6: .envdosyası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:

  1. PRIVATE_KEY ve PUBLIC_KEY anahtarlarınızı .env dosyasından alın.

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

  3. 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;
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'); //get latest nonce
15
16 //the transaction
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
📋 Kopyala

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_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") //get latest nonce
15
16 //the transaction
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 "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 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log(" Promise failed:", err)
48 })
49}
Tümünü göster
📋 Kopyala

Adım 9: mintNFT'yi çağırma ve mint-nft.jsdüğü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ızPinata'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östermelidirSayfanız json meta verilerini göstermelidir

Sonuç olarak kodunuz şöyle 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") //get latest nonce
15
16 //the transaction
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 "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 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log("Promise failed:", err)
48 })
49}
50
51mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
Tümünü göster
📋 Kopyala

Ş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: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
2
3Check 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üleyinEtherscan'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: @kaanmetu(opens in a new tab), Invalid DateTime

Bu rehber yararlı oldu mu?