Chương 3

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Chương 3: Demo tạo NFT Smart Contract

3.1. NFT Smart Contract với Remix-Ethereum IDE


3.1.1. Phân tích code
1. Import thư viện và phiên bản compiler

Hình 1.1: Khai báo thư viện


Phiên bản compiler Solidity là từ 0.8.2 trở lên.
Import các thư viện từ openzeppelin để sử dụng các chức năng chuẩn của
ERC721, ERC721Enumerable, quản lý sở hữu và số lượng.
2. Khai báo Smart Contract MyNFT

Hình 1.2: Smart Contract MyNFT


 contract MyNFT is ERC721, ERC721Enumerable,
Ownable { ... }: Hợp đồng MyNFT kế thừa từ các hợp đồng
ERC721 (cung cấp các chức năng cơ bản của NFT), ERC721Enumerable
(mở rộng cho phép liệt kê các token), và Ownable (cung cấp chức năng
kiểm soát bởi người sở hữu).
 using Counters for Counters.Counter;: Sử dụng thư viện
Counters để quản lý biến _tokenIdCounter, dùng để đếm số lượng
token đã được tạo ra.
 Counters.Counter private _tokenIdCounter;: Biến đếm
số lượng token, được khai báo là private để chỉ có thể truy cập từ bên
trong hợp đồng.
 uint256 public minRate = 0.01 ether;: Biến công khai
xác định mức tối thiểu của ether cần để tạo một token mới (0.01 ether).
 uint public MAX_SUPPLY = 10000;: Hằng số công khai xác
định số lượng tối đa của token có thể được tạo ra (10,000 token).
3. Chức năng SafeMint

Hình 1.3: Chức năng SafeMint


 function safeMint(address to) public payable
{ ... }: Hàm công khai cho phép người dùng tạo mới một token NFT
và chuyển cho địa chỉ to.
 require(totalSupply() < MAX_SUPPLY, "Can't mint
more.");: Điều kiện đảm bảo tổng số lượng token đã tạo
(totalSupply()) phải nhỏ hơn MAX_SUPPLY để không vượt quá
giới hạn.
 require(msg.value >= minRate, "Not enough ether
sent.");: Điều kiện đảm bảo số lượng ether gửi kèm (msg.value)
phải lớn hơn hoặc bằng minRate để đảm bảo đủ chi phí tạo token.
 _safeMint(to, _tokenIdCounter.current());: Gọi hàm
_safeMint từ hợp đồng ERC721 để tạo mới một token và giao cho địa
chỉ to, sử dụng giá trị hiện tại của _tokenIdCounter.
 _tokenIdCounter.increment();: Tăng giá trị
_tokenIdCounter lên để chuẩn bị cho token tiếp theo.
4. Chức năng withdraw

Hình 1.4: Chức năng withdraw


 _beforeTokenTransfer và supportsInterface là các hàm
ghi đè cần thiết từ các giao diện ERC721 và ERC721Enumerable.
 withdraw() public onlyOwner: Hàm cho phép người sở hữu
hợp đồng rút ether ra khỏi hợp đồng, đảm bảo rằng số dư của hợp đồng
không bằng không trước khi chuyển số dư này đến địa chỉ của người sở
hữu.
3.1.2. Compile và Deploy contract trên Remix IDE

Hình 1.5: Deploy contract


NFT sau khi deploy
Sau khi compile, chuyển tiếp đến cửa sổ Deploy.
Chọn môi trường deploy là Remix VM (cancun): Đây là môi trường ảo hóa
của Remix.
Tại MyNFT ta có một số chức năng sau:

Hình 1.6: Các chức năng


Dùng hàm total supply để kiểm tra tổng lượng token đang lưu thông.

Lúc này totalSupply đang là 0.


Tiến hành Mint NFT để tạo ra một token.

Thông báo giao dịch thành công

Số tiền cần trả để mint một NFT (tương đương 5 eth)

Total Supply lúc này là 1.


Số dư còn lại sau khi Mint

Sử dụng chức năng withdraw để hoàn tác giao dịch

3.1.3. Tạo một Simple NFT Minting Website và kết nối với Metamask
 Thẻ script để nhúng thư viện Web3 vào trang web. “Web3.js” là một thư
viện javascript cho phép kết nối với blockchain Ethereum.

 var account = null; và var contract = null;: Khai báo


biến account để lưu địa chỉ ví của người dùng và contract để lưu
đối tượng smart contract.
 window.addEventListener('load', async () =>
{ ... });: Đoạn mã này sử dụng để chạy khi trang web được tải hoàn
toàn. Sử dụng async để cho phép các lời gọi bất đồng bộ.
 if (window.ethereum) { ... }: Kiểm tra nếu trình duyệt hỗ
trợ Ethereum (bao gồm Metamask).
 window.web3 = new Web3(ethereum);: Khởi tạo đối tượng
Web3 với Ethereum provider.
 await ethereum.enable();: Yêu cầu quyền truy cập vào tài
khoản Metamask của người dùng.
Chọn Enviroment là Injected Provider – Metamask để kết nối với Metamask

Hình 1.7: Kết nối với MetaMask


Confirm để kết nối
Tại cửa sổ compiler chọn Copy ABI to clipboard để lấy các hàm, chức năng
của smart contract.
 ADDRESS: Đây là địa chỉ của hợp đồng thông minh trên blockchain
Ethereum muốn tương tác. Biến này được sử dụng để khởi tạo đối tượng
hợp đồng sau này.
 (async () => { ... })(): Đây là một hàm tự gọi ngay lập tức với từ khóa
async, cho phép bạn sử dụng các lời gọi bất đồng bộ trong nó. Mục đích
của nó là khởi tạo môi trường và thiết lập các kết nối cần thiết với
blockchain Ethereum.
 if (window.ethereum): Kiểm tra xem trình duyệt có hỗ trợ Ethereum (ví
dụ như Metamask) hay không.
 await window.ethereum.send('eth_requestAccounts');: Yêu cầu
Metamask cho phép trang web truy cập vào danh sách các tài khoản của
người dùng.
 window.web3 = new Web3(window.ethereum): Khởi tạo đối tượng
Web3 với provider của Metamask.
 var accounts = await web3.eth.getAccounts();: Lấy danh sách các tài
khoản Ethereum được kết nối với Metamask.
 account = accounts[0];: Lấy địa chỉ tài khoản Ethereum đầu tiên từ
danh sách.
 document.getElementById('wallet-address').textContent =
account;: Hiển thị địa chỉ ví của người dùng lên giao diện HTML của
trang web.
 contract = new web3.eth.Contract(ABI, ADDRESS): Khởi tạo một
đối tượng Smart Contract Ethereum. Biến ABI đã được khai báo trước đó
Kiểm tra tên, totalSupply

Hình 1.8: Xem TotalSupply


Click Mint an NFT để tiến hành Mint, nhấn Confirm để xác nhận với
Metamask với phí 0.01 ETH
Hình 1.9: Số dư trước khi giao dịch

Hình 1.10: Số dư sau khi giao dịch


Hình 1.11: Chi tiết giao dịch

TotalSupply sau khi giao dịch đã tăng lên 1


Hình 1.12: Chức năng withdraw

Số dư được hoàn lại sau khi withdraw


Đánh giá:
 Kết quả thu được:
+ Cách NFT hoạt động, các tiêu chuẩn NFT phổ biến, cấu trúc của một
NFT.
+ Tìm hiểu về các ứng dụng thực tế của NFT như trong nghệ thuật số, trò
chơi, ...
+ Mô tả quá trình triển khai một Smart Contract NFT đơn giản bằng ngôn
ngữ lập trình solidity, và thực nghiệm các chức năng của nó.
 Hạn chế: Phần ứng dụng còn đơn giản, chưa có giao diện hoàn chỉnh.
Phải thực thi các chức năng bằng console

You might also like