Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

Đại học Quốc gia thành phố Hồ Chí Minh

Trường Đại học Công nghệ Thông tin

3
Lab
PHỤC VỤ MỤC ĐÍCH GIÁO DỤC
FOR EDUCATIONAL PURPOSE ONLY

Lập trình NFT trên Ethereum


Thực hành môn Blockchain

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>

Mọi góp ý về tài liệu, vui lòng gửi về email inseclab@uit.edu.vn


Lab 3: Lập trình NFT trên Ethereum

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.

2. Thời gian thực hành


§ Thực hành tại lớp: 5 tiết tại phòng thực hành.
§ Hoàn thành báo cáo kết quả thực hành: tối đa 13 ngày.

B. CHUẨN BỊ MÔI TRƯỜNG


1. Ví điện tử metamask.io
C. THỰC HÀNH
1. Cài đặt Ví Kỹ thuật số cho Tiền điện tử - MetaMask
a) Sơ lược:
§ Ví tiền điện tử là nơi bạn có thể lưu trữ tiền điện tử của mình một cách an toàn. Có
nhiều loại ví tiền điện tử khác nhau, nhưng phổ biến nhất là ví lưu trữ, ví phi lưu ký
và ví phần cứng (hosted wallets, non-custodial wallets, and hardware wallets).
Trong phòng thí nghiệm này, chúng ta sẽ sử dụng "ví phi lưu ký" không dựa vào bên
thứ ba - hoặc "người lưu ký" - để giữ an toàn tiền điện tử của bạn. Chúng ta sẽ sử
dụng một ví phổ biến có tên "MetaMask".
b) MetaMask
§ Tải xuống ứng dụng ví kỹ thuật số có tên “MetaMask” tại https://metamask.io
§ Nhấn nút tải xuống và chọn “Cài đặt MetaMask cho Firefox”.

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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?

2. Viết một hợp đồng thông minh cho NFT


§ Một Non-Fungible Token (NFT) được sử dụng để xác định một cách duy nhất một
cái gì đó hoặc một ai đó. Loại Token này hoàn hảo để sử dụng trên các nền tảng cung

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên 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

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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;

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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ì?

3. Compiling and Deploying a Smart Contract for NFT

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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.

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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?

5. Xem NFT trong openSEA


§ OpenSea (https://opensea.io) là sàn giao dịch NFT phổ biến. Nhưng bây giờ chúng
ta đang phát hành NFT trên mạng thử nghiệm, vì vậy chúng ta sử dụng URL sau thay
thế: https://testnets.opensea.io/
§
§ .
§ .

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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?

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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.

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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.

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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.

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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ị

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn
Lab 3: Lập trình NFT trên Ethereum

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.

D. YÊU CẦU & ĐÁNH GIÁ


§ Sinh viên tìm hiểu và thực hành theo hướng dẫn, thực hiện theo nhóm đã đăng ký.
§ Nộp báo cáo kết quả gồm Code, CSDL được export và chi tiết những việc (Report)
mà nhóm đã thực hiện, quan sát thấy và kèm ảnh chụp màn hình kết quả (nếu có);
giải thích cho quan sát (nếu có).
§ Báo cáo:
o File .PDF. Tập trung vào nội dung, không mô tả lý thuyết.
o Đặt tên theo định dạng: [Mã lớp]-LabX_MSSV1.
o Ví dụ: [NT219.K11.ANTN.1]-Lab1_1852xxxx-.
o Nếu báo cáo có nhiều file, nén tất cả file vào file .ZIP với cùng tên file báo cáo.
o Nộp file báo cáo trên theo thời gian đã thống nhất tại courses.uit.edu.vn.
Bài sao chép, trễ, … sẽ được xử lý tùy mức độ vi phạm.

HẾT
Chúc các bạn hoàn thành tốt!

PHÒNG THÍ NGHIỆM THỰC HÀNH BLOCKCHAIN


AN TOÀN THÔNG TIN inseclab@uit.edu.vn

You might also like