Chào mọi người, tiếp tục trong series blockchain sẽ là phần tiếp theo của việc triển khai một NFT.
“Mint NFT” là hành động xuất bản một phiên bản duy nhất của mã thông báo ERC-721 của bạn trên blockchain. Sử dụng hợp đồng thông minh từ Phần 1 (Cách viết và triển khai NFT) của hướng dẫn NFT này. Khi kết thúc hướng dẫn này, bạn sẽ có thể kiếm được bao nhiêu NFT của bạn mong muốn!
Những kiến thức bạn nên xem để hiểu rõ bài viết này:
– Blockchain là gì?
– Cách viết và triển khai NFT – phần 1
OK, bắt đầu thôi!
Cài đặt web3
Nếu bạn làm theo hướng dẫn đầu tiên về cách tạo hợp đồng thông minh NFT thì bạn đã có kinh nghiệm sử dụng Ethers.js. Web3 tương tự như Ethers, vì nó là một thư viện được sử dụng để giúp việc tạo yêu cầu tới chuỗi khối Ethereum dễ dàng hơn. Trong hướng dẫn này, mình sẽ sử dụng Alchemy Web3, đây là thư viện Web3 nâng cao cung cấp tính năng thử lại tự động và hỗ trợ WebSocket mạnh mẽ.
Trong thư mục chính dự án của bạn chạy:
npm install @alch/alchemy-web3
Tạo một file mint-nft.js
Trong thư mục scripts của bạn, hãy tạo tệp mint-nft.js và thêm các dòng mã sau:
require("dotenv").config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)
Lấy contract ABI
Contract ABI (Giao diện nhị phân ứng dụng) là giao diện để tương tác với hợp đồng thông minh. Hardhat tự động tạo ABI cho chúng tôi và lưu nó vào tệp MyNFT.json. Để sử dụng điều này, chúng tôi cần phân tích nội dung bằng cách thêm các dòng mã sau vào tệp mint-nft.js của chúng tôi:
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
Cấu hình metadata cho NFT bằng IPFS
Nếu bạn nhớ hướng dẫn triển khai NFT ở Phần 1, hàm hợp đồng thông minh mintNFT của mình nhận tham số tokenURI sẽ phân giải thành tài liệu JSON mô tả siêu dữ liệu của NFT— đây thực sự là thứ mang NFT vào cuộc sống, cho phép nó có các thuộc tính có thể định cấu hình, chẳng hạn như như tên, mô tả, hình ảnh và các thuộc tính khác.
Hệ thống tệp liên hành tinh (IPFS) là một giao thức phi tập trung và mạng ngang hàng để lưu trữ và chia sẻ dữ liệu trong hệ thống tệp phân tán. (Interplanetary File System (IPFS) is a decentralized protocol and peer-to-peer network for storing and sharing data in a distributed file system.)
Mình sẽ sử dụng Pinata, một bộ công cụ và API IPFS tiện lợi, để lưu trữ nội dung và siêu dữ liệu NFT của mình nhằm đảm bảo NFT của chúng tôi thực sự được phân cấp. Nếu bạn chưa có tài khoản Pinata, hãy đăng ký tài khoản miễn phí tại đây và hoàn tất các bước để xác minh email của bạn.
Sau khi bạn đã tạo tài khoản:
- Điều hướng đến trang “Files” và nhấp vào nút “Add files” màu xanh lam ở trên cùng bên phải của trang.
- Tải hình ảnh lên Pinata — đây sẽ là nội dung hình ảnh cho NFT của bạn. Hãy thoải mái đặt tên tài sản bất cứ điều gì bạn muốn
Sau khi tải lên, bạn sẽ thấy thông tin tệp trong bảng trên trang “Files”. Bạn cũng sẽ thấy cột CID. Bạn có thể sao chép CID bằng cách nhấp vào nút sao chép bên cạnh. Bạn có thể xem nội dung tải lên của mình tại: https://gateway.pinata.cloud/ipfs/<CID>.
Bây giờ, mình sẽ muốn tải thêm một tài liệu lên Pinata. Nhưng trước khi làm điều đó, chúng ta cần tạo ra nó!
Trong thư mục gốc của bạn, tạo một tệp mới có tên nft-metadata.json và thêm mã json sau:
{
"description": "Đây là mô tả NFT của tora-tech",
"image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb", // CID hình ảnh bạn vừa thêm vào
"name": "NFT tor-tech"
}
Bạn có thể loại bỏ hoặc thêm vào phần thuộc tính. Quan trọng nhất, hãy đảm bảo trường hình ảnh trỏ đến vị trí của hình ảnh IPFS của bạn (CID mà bạn đã tải lên ở file đầu tiên)
Sau khi bạn chỉnh sửa xong tệp JSON, hãy lưu nó và tải nó lên Pinata, làm theo các bước tương tự như mình đã làm để tải hình ảnh lên.
Tạo một instances cho hợp đồng
Bây giờ, để tương tác với hợp đồng, mình cần tạo một phiên bản của nó trong mã của mình. Để làm như vậy, chúng tôi sẽ cần địa chỉ hợp đồng mà chúng tôi có thể lấy từ quá trình triển khai (phần 1).
Tiếp theo, mình sẽ sử dụng phương thức hợp đồng Web3 để tạo hợp đồng bằng cách sử dụng ABI và địa chỉ. Trong tệp mint-nft.js của bạn, hãy thêm thông tin sau:
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" // address contract trong phần 1
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
Cập nhật lại file .env
Bây giờ, để tạo và gửi giao dịch đến chuỗi Ethereum, chúng tôi sẽ sử dụng địa chỉ tài khoản ethereum công khai của bạn để lấy tài khoản nonce (sẽ giải thích bên dưới).
Thêm khóa công khai vào tệp .env của bạn — nếu bạn đã hoàn thành phần 1 của hướng dẫn, tệp .env của chúng ta bây giờ sẽ trông như thế này:
API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-private-account-address"
PUBLIC_KEY = "your-public-account-address"
Tạo và đăng ký transaction để mint nft
Trước tiên, hãy xác định một hàm có tên mintNFT(tokenData) và tạo giao dịch bằng cách thực hiện như sau:
Lấy PRIVATE_KEY và PUBLIC_KEY của bạn từ tệp .env.
Tiếp theo sẽ cần tìm ra tài khoản nonce. Thông số nonce được sử dụng để theo dõi số lượng giao dịch được gửi từ địa chỉ của bạn — thông số mà mình cần vì mục đích bảo mật và ngăn chặn các cuộc tấn công lặp lại. Để biết số lượng giao dịch được gửi từ địa chỉ của bạn, chúng tôi sử dụng getTransactionCount.
Cuối cùng, chúng tôi sẽ thiết lập giao dịch của mình với thông tin sau:
- ‘from’: PUBLIC_KEY – Nguồn gốc giao dịch của chúng tôi là địa chỉ công khai.
- ‘to’: ContractAddress — Hợp đồng mà chúng ta muốn tương tác và gửi giao dịch
- ‘nonce’: nonce — Tài khoản nonce có số lượng giao dịch được gửi từ địa chỉ
- ‘gas’: EstimateGas — Lượng gas ước tính cần thiết để hoàn thành giao dịch
- ‘data’: nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() — Tính toán muốn thực hiện trong giao dịch này — trong trường hợp này là đúc NFT
Code của bạn sẽ trông giống như thế này:
require("dotenv").config()
const API_URL = process.env.API_URL
const PUBLIC_KEY = process.env.PUBLIC_KEY
const PRIVATE_KEY = process.env.PRIVATE_KEY
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
//the transaction
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
nonce: nonce,
gas: 500000,
data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
}
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
signPromise
.then((signedTx) => {
web3.eth.sendSignedTransaction(
signedTx.rawTransaction,
function (err, hash) {
if (!err) {
console.log(
"The hash of your transaction is: ",
hash,
"\nCheck Alchemy's Mempool to view the status of your transaction!"
)
} else {
console.log(
"Something went wrong when submitting your transaction:",
err
)
}
}
)
})
.catch((err) => {
console.log("Promise failed:", err)
})
}
mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") // CID của file json mà bạn upload trên pinata
Bây giờ, hãy chạy node scripts/mint-nft.js để triển khai NFT của bạn. Sau vài giây, bạn sẽ thấy phản hồi như thế này trong terminal của mình:
The hash of your transaction is: 0xxxxxxxxxxxxxxxxxxxxxxxe1e8
Check Alchemy's Mempool to view the status of your transaction!
Đến đây bạn đã tạo được một NFT trên blockchain Ethereum rồi đó, copy địa chỉ transaction đó và tìm kiếm trên https://sepolia.etherscan.io/
OK, đến đây là bạn đã thực hiện xong việc mint một NFT rồi nhé, bài viết sau mình sẽ hướng dẫn các bạn cách show NFT này ở trên ví metamask