Ana içeriğe geç

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

NFT'lerERC-721AlchemySolidityakıllı sözleşmeler
Yeni başlayan
✍️Sumi Mudgil
📆22 Nisan 2021
⏱️7 dakikalık okuma

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. Bu NFT eğitim serisinin 1. Bölümünde hazırladığımız akıllı sözleşmemizi kullanarak web3 becerilerimizi gösterelim 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'ü kurun

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 eğitimde, 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
2

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)
5
📋 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 gerekecek:

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

ABI'yi görmek istiyorsanız onu konsolunuza yazdırabilirsiniz:

1console.log(JSON.stringify(contract.abi))
2
📋 Kopyala

Mint-nft.js'yi çalıştırmak ve ABI'nizin konsola yazdırıldığını görmek için terminalinize gidin ve şunu yürütün

1node scripts/mint-nft.js
2
📋 Kopyala

Adım 4: IPFS kullanarak NFT'niz için meta verileri yapılandırın

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

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 resim yükleyin: Bu, NFT'niz için resim varlığı olacaktır. Varlığa istediğiniz adı verin

  • Yükledikten sonra, Dosyalar sayfasındaki tabloda dosya bilgilerini 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}
16
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 bitirdikten sonra, görüntüyü yüklemek için yaptığımız adımları izleyerek kaydedin ve 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)dan sözleşmeyi dağıtmak için 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 (opens in a new tab)

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

Sonrasında ise ABI ve adresi kullanarak sözleşmemizi oluşturmak için web3 sözleşme metodunu(opens in a new tab) kullanacağız. mint-nft.js dosyanızda, şunu ekleyin:

1const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
2
3const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
4
📋 Kopyala

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

Ş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).

Genel anahtarınızı .env dosyanıza ekleyin: Öğreticinin 1. bölümünü tamamladıysanız, .env dosyamız şimdi şöyle görünmelidir:

1API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key"
2PRIVATE_KEY = "your-private-account-address"
3PUBLIC_KEY = "your-public-account-address"
4
📋 Kopyala

Adım 7: İşleminizi oluşturun

İ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 ş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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED";
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 }
25
Tümünü göster
📋 Kopyala

Adım 8: İşlemi imzalayın

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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
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
Tümünü göster
📋 Kopyala

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

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

Hash 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östermelidir (opens in a new tab) Sayfanı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 = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
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")
52
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: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00
2
3Check Alchemy's Mempool to view the status of your transaction!
4

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, Ropsten Etherscan(opens in a new tab)'i kontrol etmek ve işlem hash değerinizi aramak da faydalı olur.

Etherscan'da NFT işlem hash değerinizi görüntüleyin (opens in a new tab) 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 🤑

Keyfinizin (ve cüzdanınızın) istediği kadar NFT'yi mint-nft.js'yi kullanarak 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: , Invalid DateTime

Bu sayfa yararlı oldu mu?