Professional Documents
Culture Documents
Lab3 Lập trình NFT
Lab3 Lập trình NFT
3
Lab
PHỤC VỤ MỤC ĐÍCH GIÁO DỤC
FOR EDUCATIONAL PURPOSE ONLY
Tháng 3/2023
Lưu hành nội bộ
<Nghiêm cấm đăng tải trên internet dưới mọi hình thức>
2
A. TỔNG QUAN
1. Mục tiêu
§ Non-fungible token, viết tắt là NFT, là một trong những ứng dụng phổ biến của hợp
đồng thông minh trong năm qua. Một cách rất tổng quan, , hầu hết các NFT là một
phần của blockchain Ethereum. Các hợp đồng thông minh của Ethereum lưu trữ
thông tin bổ sung giúp chúng hoạt động khác với, ví dụ, một đồng tiền ETH. NFT thực
sự có thể là bất cứ thứ gì kỹ thuật số (chẳng hạn như bản vẽ, âm nhạc), nhưng nhiều
sự phấn khích hiện tại xoay quanh việc sử dụng công nghệ để bán nghệ thuật kỹ
thuật số.
§ Trong bài thực hành này, chúng ta sẽ xây dựng một hợp đồng thông minh riêng của
chúng ta và phát hành một NFT. Chúng ta sẽ có thể xem NFT trong một sàn giao dịch
NFT có tên OpenSea, và có thể chuyển nó cho bạn bè của mình.
o Hiểu về ví tiền điện tử.
o Học cách viết, biên dịch và triển khai một hợp đồng thông minh.
o Hiểu về NFT và hợp đồng ERC-721
o Tạo một NFT và giao dịch nó trên OpenSea.
3
§ Sau khi cài đặt, hãy tạo một ví trong MetaMask.
§ Sau khi cài đặt, chúng ta sẽ thấy thông tin như hình bên dưới trong trình duyệt của
mình (bên cạnh thanh địa chỉ):
§ Số dưới " Account 1" là địa chỉ mạng chính Ethereum được tạo ra bởi ví của của
chúng ta.
§ Q1. Chụp ảnh màn hình cho ví MetaMask của bạn và ghi lại địa chỉ ví.
§ Q2. Private key của ví được lưu trữ an toàn trong ví và nó sẽ không được hiển thị
trên màn hình. Private key liên quan đến địa chỉ ví như thế nào?
§ Q3. Hiện tại không có tiền trong địa chỉ mạng chính Ethereum của mình. Đề xuất ba
cách có thể để nhận được ETH.
c) Test Network.
§ Nhấn nút "Ethereum Mainnet" Chuyển sang "Sepolia" hoặc một số mạng thử nghiệm
và sao chép địa chỉ của bạn.
§ Show/hide test network
§ Bật “Show test network”. Chuyển sang "Sepolia" hoặc một số mạng thử nghiệm khác
và sao chép địa chỉ.
4
§ Lấy một số ETH cho địa chỉ mạng thử nghiệm của từ https://sepoliafaucet.com/
hoặc bất kỳ trang web nào khác mà chúng ta có thể tìm thấy ETH. Sẽ cần ít nhất 0,02
ETH để hoàn thành bài tập này.
§ Q4. Tại sao chúng ta cần sử dụng một mạng thử nghiệm để thử nghiệm hợp đồng
thông minh trong phòng thí nghiệm này, thay vì sử dụng mạng chính Ethereum?
5
cấp các mục sưu tập, chìa khóa truy cập, vé xổ số, ghế có số cho các buổi hòa nhạc và
các trận thể thao, v.v.
§ ERC-721 giới thiệu một tiêu chuẩn cho NFT, nói cách khác, loại Token này là duy
nhất và có thể có giá trị khác với một Token khác từ cùng một Hợp đồng thông minh,
có thể do tuổi tác, tính hiếm hoặc thậm chí là một cái gì đó khác như hình ảnh của
nó. Tất cả các NFT đều có một biến uint256 được gọi là tokenId, vì vậy đối với bất
kỳ Hợp đồng ERC-721 nào, cặp địa chỉ hợp đồng, uint256 tokenId phải là duy nhất
toàn cầu.
§ Trong bài tập này, chúng ta sẽ tạo một token NFT của riêng mình bằng cách sử dụng
hợp đồng thông minh ERC-721.
a) Remix IDE.
§ Remix là một IDE (Integrated Development Environment - Môi trường phát triển
tích hợp) được cung cấp chính thức bởi Ethereum. Nó có thể truy cập tại
https://remix.ethereum.org
b) Chuẩn bị môi trường.
§ Chuẩn bị máy ảo để cài đặt thư viện và lưu trữ
§ Cài đặt NodeJS và npm
o sudo apt install nodejs
o sudo apt install npm
c) OpenZeppelin.
§ OpenZeppelin là kho mã nguồn mở cho các hợp đồng thông minh với nhiều mẫu hợp
đồng thông minh, bao gồm cả hợp đồng thông minh ERC-721. Bằng cách sử dụng
mẫu ERC-721 của OpenZeppelin, chúng ta chỉ cần mở rộng các hàm cụ thể của riêng
mình.
§ Cài đặt OpenZeppelin bằng cách:
o cd /home/(your VM name)/
o npm init -y sudo npm
o npm install @openzeppelin/contracts
6
d) Remixd.
§ Vì Remix là một môi trường phát triển tích hợp trực tuyến cần thực hiện một số thay
đổi để kết nối nó với lưu trữ cục bộ (trong trường hợp cần lưu trữ tệp và cập nhật
sau này).
§ Cần cài đặt một tiện ích bổ sung có tên "remixd". Để cài đặt Remixd, hãy thực hiện
các bước sau:
o sudo npm install -g @remix-project/remixd
o remixd -v
o cd /home/(tên VM của bạn)/
o mkdir mynft
o sudo remixd -s /home/(tên VM của bạn)/ -u https://remix.ethereum.org/
§ Sau khi thực hiện các bước này thì đã cài đặt thành công Remixd và liên kết thư mục
"mynft" để sử dụng cùng với Remix IDE.
e) Creating metadata file with IPFS.
§ Chúng ta sẽ tải lên một hình ảnh và siêu dữ liệu cho token NFT của mình trong IPFS.
§ Vẽ hoặc tải xuống biểu tượng nhỏ của riêng mình cho NFT sẽ sử dụng sau này.
§ Tạo một thư mục trong giao diện người dùng IPFS và đặt tệp jpg ở đó. Sao chép địa
chỉ ipfs cho hình ảnh.
§ Q5. Tìm hiểu sử dụng https://ipfs.io/ để tạo một nơi lưu trữ hình ảnh?
f) Writing Smart Contract.
§ Mở IDE Remix trong Firefox: https://remix.ethereum.org/
§ Trong nút "Workspaces", chuyển sang "localhost". Thư mục này sẽ chứa
node_modules được cài đặt bởi OpenZeppelin
§ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4;
7
§ import
"../node_modules/@openzeppelin/contracts/token/ERC721/presets/ERC721PresetMinterPaus
erAutoId.sol";
§ contract comp3320 is ERC721PresetMinterPauserAutoId {
§ constructor()
§ ERC721PresetMinterPauserAutoId(" ", " ","https://ipfs.io/ipfs/<your ipfs
address>/")
§ {}
§ // This allows the minter to update the tokenURI after it's been minted. // To
disable this, delete this function.
§ function setTokenURI(uint256 tokenId, string memory tokenURI) public {
§ require(hasRole(MINTER_ROLE, _msgSender()), "web3 CLI: must have minter role to
update tokenURI");
§ setTokenURI(tokenId, tokenURI); }
§ }
§ Đoạn mã trên được xây dựng dựa trên hợp đồng ERC-721 của OpenZeppelin. Chúng
ta chỉ cần đặt tên, mã token và URI siêu dữ liệu token NFT của mình bằng cách truyền
tham số vào hàm ERC721PresetMinterPauserAutoId.
§ Q6. Sự khác biệt chính giữa hợp đồng ERC-721 và hợp đồng tiêu chuẩn ERC-20 là
gì?
8
§ Khi việc biên dịch hoàn tất, hợp đồng đã sẵn sàng để triển khai. Chuyển sang bảng
Deploy. Vào thời điểm này, chúng ta cần chọn [Injected …] trong Environment ở góc
trên bên trái, và MetaMask sẽ bật lên để kết nối.
§ Sau khi deploy hoàn tất, Remix sẽ hiển thị Hash Giao dịch tương ứng. Giao dịch
tương ứng có thể được xem trên https://sepolia.etherscan.io/, và địa chỉ hợp đồng
thông minh ERC721 mà chúng ta tạo cũng có thể được xem trong đó.
4. Minting an NFT
§ Sau khi hợp đồng được triển khai, bước tiếp theo là Mint NFT.
§ Quay lại Remix, xem hợp đồng thông minh mà chúng ta vừa phát hành đã tồn tại
trong Deployed Contracts.
§ Sau khi nhấp vào nó, có thể thấy rằng nó có chức năng mint. Bây giờ chúng ta có thể
gọi hàm này để Mint NFT.
9
§ Nhập địa chỉ Sepolia của vào " address to" sau hàm "mint", và địa chỉ này sẽ trở thành
chủ sở hữu của NFT mới tạo.
§ Q6. Có gì thay đổi trong metamask không, tại sao?
10
§ Nhập địa chỉ Sepolia của vào " address to" sau hàm "mint", và địa chỉ này sẽ trở thành
chủ sở hữu của NFT mới tạo.
§ Q6. Có gì thay đổi trong metamask không, tại sao?
11
§ Khi việc biên dịch hoàn tất, hợp đồng đã sẵn sàng để triển khai. Chuyển sang bảng
Deploy. Vào thời điểm này, chúng ta cần chọn [Injected …] trong Environment ở góc
trên bên trái, và MetaMask sẽ bật lên để kết nối.
12
§ Sau khi deploy hoàn tất, Remix sẽ hiển thị Hash Giao dịch tương ứng. Giao dịch
tương ứng có thể được xem trên https://sepolia.etherscan.io/, và địa chỉ hợp đồng
thông minh ERC721 mà chúng ta tạo cũng có thể được xem trong đó.
§ Sau khi truy cập, đăng ký tài khoản với địa chỉ MetaMask chúng ta có thể xem NFT
vừa mint ở đó. MetaMask sẽ tự động bật lên khi đăng ký tài khoản.
13
§ Hình ảnh và các thuộc tính khác tương ứng với NFT được xác định bởi Siêu dữ liệu
của NFT. Để NFT hiển thị hình ảnh và các thuộc tính khác trên OpenSea, Siêu dữ liệu
của NFT cần được chỉ định.
§ Theo tiêu chuẩn Siêu dữ liệu ERC-721 trên OpenSea, OpenSea sẽ gọi hàm tokenURI
trong hợp đồng thông minh của chúng ta và truyền vào tokenID, và hàm này cần trả
về một URL HTTP hoặc IPFS, URL này phải trả về dữ liệu theo định dạng JSON, và
JSON này xác định các thuộc tính khác nhau của NFT của chúng ta.
14
§ Lấy ví dụ hợp đồng thông minh mà chúng ta đã viết ở trên, lưu ý rằng chúng ta có
đoạn code sau trong constructor:
§ ERC721PresetMinterPauserAutoId("<describe yourself here>",
§ "<your name>", "https://ipfs.io/ipfs/<your ipfs folder
§ address>/")
§ Base URI của NFT của chúng ta là https://ipfs.io/ipfs/<địa_chỉ_thư_mục_ipfs>/. Khi
bạn gọi hàm tokenURI(), hợp đồng của chúng ta sẽ trả về
https://ipfs.io/ipfs/<địa_chỉ_thư_mục_ipfs>/<tokenID>. Nếu Siêu dữ liệu này được
thiết lập, NFT được mint sẽ có các thuộc tính như hình ảnh. Nhấp vào NFT vừa tạo.
Chúng ta sẽ thấy điều gì đó tương tự như sau:
§ Reload lại và đợi 5 10p để thấy biểu tượng được hiển thị
15
§ Q7. Trao đổi NFT trong MetaMask với bạn cùng lớp. Sau đó, gửi mã thông báo NFT
cho người được trao đổi trên OpenSea. Chụp ảnh màn hình của giao dịch.
HẾT
Chúc các bạn hoàn thành tốt!