Người dùng đã xem qua vài bài viết trước đây chắc hẳn biết rằng, đối với các Token theo giao thức ERC-20, chúng ta có thể giao dịch thông qua DEX đại diện là Uniswap, đạt được sự Phi tập trung. Vậy đối với giao thức ERC-721, tức là NFT, chúng ta có thể thực hiện giao dịch Phi tập trung như thế nào?
Hiện nay, một số sàn giao dịch NFT phổ biến sử dụng hình thức đặt lệnh để giao dịch, giống như việc đưa từng món hàng lên kệ siêu thị, người mua thấy giá hợp lý thì có thể mang sản phẩm về nhà.
Bài viết này sẽ thông qua việc viết hợp đồng thông minh và một trang giao diện đơn giản, thực hiện giao dịch NFT phi tập trung. Lưu ý bài viết này chỉ dùng cho mục đích học tập, không thể sử dụng thực tế trong môi trường sản xuất.
NFT (Non-Fungible Token)
NFT cũng chính là Token không đồng nhất, tức là mỗi Token đều là không đồng nhất, khác nhau, nó tuân theo giao thức ERC-721. Nói chung, mỗi NFT trong ví sẽ hiển thị những hình ảnh khác nhau, và mỗi nhóm NFT sẽ có một ID độc nhất để phân biệt.
Do đặc tính của NFT, nó không thể thiết lập giá theo đường cong giá giống như ERC-20 - vì mỗi Token đều khác nhau. Do đó, hình thức giao dịch phổ biến hiện nay là thông qua hình thức sổ lệnh.
Giao dịch sổ lệnh
Chế độ sổ lệnh đơn giản mà nói là giá của hàng hóa được thiết lập bởi con người, khác với cách tính giá thông qua đường cong giá như Uniswap. Sổ lệnh thường sẽ được chia thành hai chế độ giao dịch, một là lệnh định giá, tức là người bán thiết lập một mức giá mà họ muốn bán, nếu có người mua cảm thấy giá hợp lý, họ có thể tiến hành mua. Chế độ thứ hai là lệnh mua, tức là người mua phát hành một lệnh mua dựa trên nhu cầu của mình, khi người bán cảm thấy giá hợp lý, họ có thể tiến hành bán.
Thông thường, giá của đơn mua sẽ thấp hơn giá của đơn định giá. Bài viết này chỉ giới thiệu phương thức định giá thứ nhất.
Chức năng của NFT DEX
Một DEX NFT nên bao gồm những chức năng cơ bản sau:
Đưa hàng hóa lên kệ: Đưa một NFT lên kệ theo giá đã định.
Mua sản phẩm: Thực hiện mua dựa trên giá định giá của NFT
Phí giao dịch DEX: Phí giao dịch được thu theo tỷ lệ dựa trên giá giao dịch.
lên kệ hàng hóa
Để niêm yết sản phẩm, cần thực hiện những việc sau:
Giao diện người dùng: Người dùng chọn NFT của mình và thiết lập một mức giá, nhấp vào đăng bán.
Giao thức: Người dùng cần thiết lập quyền cho hợp đồng, có thể điều khiển NFT của người dùng.
Vậy là hàng hóa đã được niêm yết hoàn tất. Trong hợp đồng, cần duy trì một bản đồ giá hàng hóa của người dùng, phần dữ liệu này thường có thể được thực hiện trong dịch vụ tập trung, nhằm giảm bớt gánh nặng cho hợp đồng, nhưng trong bài viết này, phần dữ liệu bản đồ này sẽ được duy trì trong hợp đồng.
Mua hàng
Khi mua hàng, sẽ xảy ra một số điều sau đây:
Frontend: Người dùng chọn một NFT muốn mua, nhấp vào mua.
Hợp đồng: Gọi hợp đồng, chuyển tiền của người dùng đến người bán NFT và chuyển NFT đến người mua.
Triển khai một DEX NFT
Trong chương này, chúng ta sẽ bắt đầu từ con số không để triển khai một DEX NFT, đây là địa chỉ DEX mà tác giả đã triển khai nft-dex-frontend.vercel.app.
1. Tạo một NFT
Để phục vụ cho việc thử nghiệm, tốt nhất là chúng ta có thể có một NFT của riêng mình. Chúng ta có thể nhanh chóng xây dựng một NFT theo giao thức ERC-721 thông qua Remix, nó cung cấp các mẫu tương ứng.
Chúng tôi có thể dễ dàng triển khai một NFT theo mẫu. Tất nhiên, bạn cũng có thể bỏ qua bước này và sử dụng NFT mà chúng tôi đã chuẩn bị sẵn.
2. Viết hợp đồng
Phương pháp hợp đồng của chúng tôi nên bao gồm một số phương pháp sau:
2.1. Người bán niêm yết NFT
Người bán cần chỉ định NFT muốn bán và giá tương ứng. Khi niêm yết, người dùng cần ký hợp đồng ủy quyền NFT, để hợp đồng thông minh của chúng tôi có quyền thao tác với NFT này, như vậy khi có người mua, giao dịch này có thể tự động hoàn thành.
Vì vậy, quy trình nên như sau: 1. Người dùng chọn NFT của mình; 2. Đặt giá, ở đây có thể định giá bằng stablecoin USDT, USDC hoặc ETH; 3. Ủy quyền NFT cho hợp đồng.
Sau đó, bạn có thể gọi phương thức niêm yết của hợp đồng, phương thức này cần thực hiện những việc sau:
Kiểm tra quyền sở hữu của NFT
Thêm hồ sơ niêm yết
Sự kiện kích hoạt niêm yết
2.2. Người mua mua NFT
Người mua khi mua NFT chỉ cần chọn NFT mà mình muốn và thanh toán bằng Token tương ứng. Ở cấp độ hợp đồng sẽ thực hiện các bước sau: 1. Đọc dữ liệu NFT tương ứng từ "listings"; 2. Tính phí giao dịch dựa trên giá NFT và trừ phần này từ giá giao dịch; 3. Chuyển NFT cho người mua; 4. Kích hoạt sự kiện mua.
2.3. Huỷ bỏ niêm yết
Tất nhiên, người bán có thể cảm thấy giá không hợp lý và sẽ chọn hủy niêm yết. Có thể thấy rằng chúng tôi đã giữ lại một trường isActive ở nơi lưu trữ thông tin niêm yết, để chỉ ra xem sản phẩm đó có hợp lệ hay không, vì vậy khi hủy niêm yết, chúng tôi chỉ cần đặt trường này là false.
2.4. Phí rút tiền
DEX có thể thu phí giao dịch trong mỗi giao dịch, phí này có thể được lưu vào hợp đồng hoặc chuyển vào một địa chỉ của riêng bạn, bài viết này chọn phương thức lưu vào hợp đồng.
Đến đây, các chức năng cơ bản của hợp đồng của chúng tôi đã hoàn thiện.
3. Phát triển giao diện DEX
Trước khi bắt đầu, chúng ta cần chuẩn bị một số công cụ, bao gồm các công cụ sau:
Ant Design Web3:dùng để kết nối ví và hiển thị thẻ NFT.
Wagmi: Dùng để tương tác với ví.
Nextjs + Vercel:Triển khai dự án của chúng tôi.
Ứng dụng front-end của chúng tôi nên bao gồm ba trang, Mint, Buy và Portfolio, Mint là để người dùng có thể Mint NFT của chúng tôi, chỉ dành cho mục đích trình diễn, Buy là chợ DEX của chúng tôi, người dùng có thể mua NFT của chúng tôi ở đó, trong Portfolio, người dùng có thể thực hiện các thao tác niêm yết và gỡ niêm yết NFT.
3.1. Kết nối ví
Kết nối ví của người dùng, sử dụng Ant Design Web3 để thực hiện
Quá trình kết nối ví của người dùng rất đơn giản, chỉ cần sử dụng thành phần kết nối do Ant Design Web3 cung cấp.
Đầu tiên, chúng tôi bọc một Provider vào lớp ngoài của dự án, như vậy trong mã phía sau chúng tôi có thể sử dụng khả năng của Ant Design Web3. Ngoài ra, vì chúng tôi cần kết nối với chuỗi thử nghiệm sepolia, để tiết kiệm thời gian, nên sử dụng một số dịch vụ nút để cải thiện tốc độ truy vấn dữ liệu, tôi đang sử dụng endpoint của ZAN, nó rất phù hợp để sử dụng trong môi trường Châu Á-Thái Bình Dương, nhanh chóng và giá cả rất hợp lý, hỗ trợ nhiều chuỗi.
Sau đó, đặt một nút kết nối ở nơi cần kết nối ví:
Như vậy là đã xong, rất đơn giản.
3.2. Mint
Mint một NFT, nhận Token thử nghiệm có thể đến
Trên trang Mint, chúng ta có thể Mint NFT dùng thử. Mint là một thao tác viết hợp đồng, ở đây chúng ta sẽ sử dụng phương thức useWriteContract trong wagmi. Chúng ta cần chỉ định địa chỉ hợp đồng, ABI của hợp đồng và các tham số của hợp đồng.
Sau đó, chỉ cần xác nhận trong ví là có thể Mint thành công.
3.3. Danh mục
Quản lý NFT của người dùng
Tại đây cần hiển thị tất cả NFT của người dùng. Chúng tôi có thể sử dụng một số API NFT để lấy, ở đây sử dụng API của opensea, vì không có nhiều API NFT hỗ trợ chuỗi thử nghiệm sepolia.
Sau khi có được danh sách NFT của người dùng, cần xác định xem liệu chúng đã được niêm yết hay chưa, những NFT chưa niêm yết sẽ hỗ trợ niêm yết, còn những NFT đã niêm yết sẽ hỗ trợ gỡ niêm yết. Cách xác định là thông qua phương thức « getSellerListings » trong hợp đồng DEX để lấy những NFT mà người dùng đã niêm yết, sau đó dựa vào trường « isAlive » của những NFT này để xác định xem chúng có đang được niêm yết hay không.
Khi niêm yết, cần gọi phương thức hợp đồng "listNFT", và khi hủy, cần gọi phương thức "cancelListing". Trước khi niêm yết, cần gọi thêm phương thức ủy quyền NFT, ủy quyền NFT cho hợp đồng, như vậy sau khi giao dịch thành công, NFT này có thể tự động chuyển cho người mua.
3.4. Mua
Trong Buy có thể mua NFT
Đầu tiên, chúng ta cần hiển thị các NFT đã được niêm yết. Tương tự như việc hiển thị NFT đã có của người dùng trong Portfolio, điểm khác ở đây là một cái là toàn cầu, không còn là của một người dùng nào cả, cái kia chỉ cần hiển thị các NFT có isAlive.
Sử dụng phương thức 「 purchaseNFT 」 khi mua, khi gọi phương thức này, cần sử dụng ETH để thanh toán giá.
Giá trị này ở đây chính là ETH mà người mua cần thanh toán.
Một trang front-end DEX chứa tất cả các khả năng cơ bản như vậy đã hoàn thành, chúng ta có thể triển khai nó trên vercel.
Bài viết này được viết bởi ZAN Team (Tài khoản X @zan_team) của Yeezo (Tài khoản X @GaoYeezo 75065).
Nội dung chỉ mang tính chất tham khảo, không phải là lời chào mời hay đề nghị. Không cung cấp tư vấn về đầu tư, thuế hoặc pháp lý. Xem Tuyên bố miễn trừ trách nhiệm để biết thêm thông tin về rủi ro.
Web3 Người mới series: Từ con số không để hiện thực hóa một NFT DEX
Người dùng đã xem qua vài bài viết trước đây chắc hẳn biết rằng, đối với các Token theo giao thức ERC-20, chúng ta có thể giao dịch thông qua DEX đại diện là Uniswap, đạt được sự Phi tập trung. Vậy đối với giao thức ERC-721, tức là NFT, chúng ta có thể thực hiện giao dịch Phi tập trung như thế nào?
Hiện nay, một số sàn giao dịch NFT phổ biến sử dụng hình thức đặt lệnh để giao dịch, giống như việc đưa từng món hàng lên kệ siêu thị, người mua thấy giá hợp lý thì có thể mang sản phẩm về nhà.
Bài viết này sẽ thông qua việc viết hợp đồng thông minh và một trang giao diện đơn giản, thực hiện giao dịch NFT phi tập trung. Lưu ý bài viết này chỉ dùng cho mục đích học tập, không thể sử dụng thực tế trong môi trường sản xuất.
NFT (Non-Fungible Token)
NFT cũng chính là Token không đồng nhất, tức là mỗi Token đều là không đồng nhất, khác nhau, nó tuân theo giao thức ERC-721. Nói chung, mỗi NFT trong ví sẽ hiển thị những hình ảnh khác nhau, và mỗi nhóm NFT sẽ có một ID độc nhất để phân biệt.
Do đặc tính của NFT, nó không thể thiết lập giá theo đường cong giá giống như ERC-20 - vì mỗi Token đều khác nhau. Do đó, hình thức giao dịch phổ biến hiện nay là thông qua hình thức sổ lệnh.
Giao dịch sổ lệnh
Chế độ sổ lệnh đơn giản mà nói là giá của hàng hóa được thiết lập bởi con người, khác với cách tính giá thông qua đường cong giá như Uniswap. Sổ lệnh thường sẽ được chia thành hai chế độ giao dịch, một là lệnh định giá, tức là người bán thiết lập một mức giá mà họ muốn bán, nếu có người mua cảm thấy giá hợp lý, họ có thể tiến hành mua. Chế độ thứ hai là lệnh mua, tức là người mua phát hành một lệnh mua dựa trên nhu cầu của mình, khi người bán cảm thấy giá hợp lý, họ có thể tiến hành bán.
Thông thường, giá của đơn mua sẽ thấp hơn giá của đơn định giá. Bài viết này chỉ giới thiệu phương thức định giá thứ nhất.
Chức năng của NFT DEX
Một DEX NFT nên bao gồm những chức năng cơ bản sau:
lên kệ hàng hóa
Để niêm yết sản phẩm, cần thực hiện những việc sau:
Vậy là hàng hóa đã được niêm yết hoàn tất. Trong hợp đồng, cần duy trì một bản đồ giá hàng hóa của người dùng, phần dữ liệu này thường có thể được thực hiện trong dịch vụ tập trung, nhằm giảm bớt gánh nặng cho hợp đồng, nhưng trong bài viết này, phần dữ liệu bản đồ này sẽ được duy trì trong hợp đồng.
Mua hàng
Khi mua hàng, sẽ xảy ra một số điều sau đây:
Triển khai một DEX NFT
Trong chương này, chúng ta sẽ bắt đầu từ con số không để triển khai một DEX NFT, đây là địa chỉ DEX mà tác giả đã triển khai nft-dex-frontend.vercel.app.
1. Tạo một NFT
Để phục vụ cho việc thử nghiệm, tốt nhất là chúng ta có thể có một NFT của riêng mình. Chúng ta có thể nhanh chóng xây dựng một NFT theo giao thức ERC-721 thông qua Remix, nó cung cấp các mẫu tương ứng.
Chúng tôi có thể dễ dàng triển khai một NFT theo mẫu. Tất nhiên, bạn cũng có thể bỏ qua bước này và sử dụng NFT mà chúng tôi đã chuẩn bị sẵn.
2. Viết hợp đồng
Phương pháp hợp đồng của chúng tôi nên bao gồm một số phương pháp sau:
2.1. Người bán niêm yết NFT
Người bán cần chỉ định NFT muốn bán và giá tương ứng. Khi niêm yết, người dùng cần ký hợp đồng ủy quyền NFT, để hợp đồng thông minh của chúng tôi có quyền thao tác với NFT này, như vậy khi có người mua, giao dịch này có thể tự động hoàn thành.
Vì vậy, quy trình nên như sau: 1. Người dùng chọn NFT của mình; 2. Đặt giá, ở đây có thể định giá bằng stablecoin USDT, USDC hoặc ETH; 3. Ủy quyền NFT cho hợp đồng.
Sau đó, bạn có thể gọi phương thức niêm yết của hợp đồng, phương thức này cần thực hiện những việc sau:
2.2. Người mua mua NFT
Người mua khi mua NFT chỉ cần chọn NFT mà mình muốn và thanh toán bằng Token tương ứng. Ở cấp độ hợp đồng sẽ thực hiện các bước sau: 1. Đọc dữ liệu NFT tương ứng từ "listings"; 2. Tính phí giao dịch dựa trên giá NFT và trừ phần này từ giá giao dịch; 3. Chuyển NFT cho người mua; 4. Kích hoạt sự kiện mua.
2.3. Huỷ bỏ niêm yết
Tất nhiên, người bán có thể cảm thấy giá không hợp lý và sẽ chọn hủy niêm yết. Có thể thấy rằng chúng tôi đã giữ lại một trường isActive ở nơi lưu trữ thông tin niêm yết, để chỉ ra xem sản phẩm đó có hợp lệ hay không, vì vậy khi hủy niêm yết, chúng tôi chỉ cần đặt trường này là false.
2.4. Phí rút tiền
DEX có thể thu phí giao dịch trong mỗi giao dịch, phí này có thể được lưu vào hợp đồng hoặc chuyển vào một địa chỉ của riêng bạn, bài viết này chọn phương thức lưu vào hợp đồng.
Đến đây, các chức năng cơ bản của hợp đồng của chúng tôi đã hoàn thiện.
3. Phát triển giao diện DEX
Trước khi bắt đầu, chúng ta cần chuẩn bị một số công cụ, bao gồm các công cụ sau:
Ứng dụng front-end của chúng tôi nên bao gồm ba trang, Mint, Buy và Portfolio, Mint là để người dùng có thể Mint NFT của chúng tôi, chỉ dành cho mục đích trình diễn, Buy là chợ DEX của chúng tôi, người dùng có thể mua NFT của chúng tôi ở đó, trong Portfolio, người dùng có thể thực hiện các thao tác niêm yết và gỡ niêm yết NFT.
3.1. Kết nối ví
Quá trình kết nối ví của người dùng rất đơn giản, chỉ cần sử dụng thành phần kết nối do Ant Design Web3 cung cấp.
Đầu tiên, chúng tôi bọc một Provider vào lớp ngoài của dự án, như vậy trong mã phía sau chúng tôi có thể sử dụng khả năng của Ant Design Web3. Ngoài ra, vì chúng tôi cần kết nối với chuỗi thử nghiệm sepolia, để tiết kiệm thời gian, nên sử dụng một số dịch vụ nút để cải thiện tốc độ truy vấn dữ liệu, tôi đang sử dụng endpoint của ZAN, nó rất phù hợp để sử dụng trong môi trường Châu Á-Thái Bình Dương, nhanh chóng và giá cả rất hợp lý, hỗ trợ nhiều chuỗi.
Sau đó, đặt một nút kết nối ở nơi cần kết nối ví:
3.2. Mint
Trên trang Mint, chúng ta có thể Mint NFT dùng thử. Mint là một thao tác viết hợp đồng, ở đây chúng ta sẽ sử dụng phương thức useWriteContract trong wagmi. Chúng ta cần chỉ định địa chỉ hợp đồng, ABI của hợp đồng và các tham số của hợp đồng.
Sau đó, chỉ cần xác nhận trong ví là có thể Mint thành công.
3.3. Danh mục
Tại đây cần hiển thị tất cả NFT của người dùng. Chúng tôi có thể sử dụng một số API NFT để lấy, ở đây sử dụng API của opensea, vì không có nhiều API NFT hỗ trợ chuỗi thử nghiệm sepolia.
Sau khi có được danh sách NFT của người dùng, cần xác định xem liệu chúng đã được niêm yết hay chưa, những NFT chưa niêm yết sẽ hỗ trợ niêm yết, còn những NFT đã niêm yết sẽ hỗ trợ gỡ niêm yết. Cách xác định là thông qua phương thức « getSellerListings » trong hợp đồng DEX để lấy những NFT mà người dùng đã niêm yết, sau đó dựa vào trường « isAlive » của những NFT này để xác định xem chúng có đang được niêm yết hay không.
Khi niêm yết, cần gọi phương thức hợp đồng "listNFT", và khi hủy, cần gọi phương thức "cancelListing". Trước khi niêm yết, cần gọi thêm phương thức ủy quyền NFT, ủy quyền NFT cho hợp đồng, như vậy sau khi giao dịch thành công, NFT này có thể tự động chuyển cho người mua.
3.4. Mua
Đầu tiên, chúng ta cần hiển thị các NFT đã được niêm yết. Tương tự như việc hiển thị NFT đã có của người dùng trong Portfolio, điểm khác ở đây là một cái là toàn cầu, không còn là của một người dùng nào cả, cái kia chỉ cần hiển thị các NFT có isAlive.
Sử dụng phương thức 「 purchaseNFT 」 khi mua, khi gọi phương thức này, cần sử dụng ETH để thanh toán giá.
Giá trị này ở đây chính là ETH mà người mua cần thanh toán.
Một trang front-end DEX chứa tất cả các khả năng cơ bản như vậy đã hoàn thành, chúng ta có thể triển khai nó trên vercel.
Bài viết này được viết bởi ZAN Team (Tài khoản X @zan_team) của Yeezo (Tài khoản X @GaoYeezo 75065).