NFT (mã thông báo không thể thay thế), là mã thông báo “không thể thay thế” như tên gọi của nó, rất phù hợp để sử dụng làm công cụ xác thực danh tính.
Tiếp theo, chúng ta hãy khám phá tính khả thi của việc sử dụng NFT làm chứng chỉ đăng ký thông qua một ví dụ đơn giản.
Lời nói đầu
Trước khi bắt đầu, hãy để tôi giới thiệu các công cụ chúng tôi sẽ sử dụng tiếp theo.
Mã thông báo SPL
Chúng tôi có thể viết hợp đồng Solana mới từ đầu, nhưng với mục đích hiện tại chúng tôi muốn đạt được, chúng tôi có thể trực tiếp sử dụng cách triển khai chung do Solana: Chương trình mã thông báo cung cấp.
Chương trình mã thông báo là một phần của Thư viện chương trình Solana (SPL, https://spl.solana.com/). SPL cung cấp nhiều cách triển khai chương trình phổ biến bao gồm Mã thông báo, Hoán đổi và Bản ghi nhớ, đồng thời cung cấp thư viện khách hàng hoàn chỉnh, CLI và các công cụ khác. , điều này tạo điều kiện thuận lợi rất nhiều cho các nhà phát triển Solana.
Mã nguồn dự án của Chương trình Token được đặt tại: https://github.com/solana-labs/solana-program-library/tree/master/token/program
Sân chơi Solana
Solpy (https://beta.solpg.io/) cung cấp môi trường để viết và triển khai các hợp đồng Solana trực tuyến và bao gồm một số công cụ thường được sử dụng theo mặc định, bao gồm SPL Token được giới thiệu trong phần trước. Nó cho phép chúng ta dễ dàng tạo và quản lý Token thông qua spl-token-cli.
Mã thông báo xác thực
Trong phần này, chúng tôi sẽ tạo Mã thông báo NFT. Nếu người dùng Mint Token thì địa chỉ ví được coi là đã được đăng ký trong hệ thống của chúng tôi, nếu không người dùng sẽ được nhắc đăng ký trước.
Bây giờ, hãy bắt đầu với phần Trên chuỗi:
Tạo mã thông báo
Chúng tôi sử dụng spl-token để tạo mã thông báo mới và chuyển --decimals để xác định rằng đó là Mã thông báo không thể phân chia (giống như NFT)
Nhật ký sau đây sẽ được xuất ra:
Trong số đó, 69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE thường được gọi là Mint address, cũng chính là ID của Token chúng ta đã tạo.
Địa chỉ mã thông báo là:
https://solscan.io/token/69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE?cluster=devnet
Tạo tài khoản mã thông báo
Tiếp theo chúng ta cần tạo Tài khoản Token cho Token đã tạo ở bước trước.
cây bạc hà
Trước khi đúc Token mới với các địa chỉ ví khác, trước tiên chúng ta hãy thử đúc một đơn vị Token cho Tài khoản Token đã tạo ở bước trước. Chỉ cần nhập:
Nhật ký sau đây sẽ được xuất ra:
Ngoài ra:
Bạn cũng có thể thử các giá trị khác cho mint, chẳng hạn như 1.9:
Nhìn vào chi tiết giao dịch, bạn sẽ thấy rằng do chúng tôi đã chỉ định --decimals là 0 khi tạo Token ở bước đầu tiên nên khi mint thực sự được thực thi, phần thập phân sẽ bị loại bỏ nên số lượng mint vẫn sẽ là 1 .
Bạn cũng có thể thử cung cấp mã thông báo mint trực tiếp đến một địa chỉ ví. Ở đây chúng tôi sử dụng 4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1t để chứng minh:
mint cho địa chỉ ví
Mục tiêu của hoạt động đúc tiền ở trên là Địa chỉ Token Mint và theo ý tưởng ban đầu của chúng tôi, Mint nên được trao cho các địa chỉ ví khác không thuộc về chúng tôi.
Tiếp theo, hãy hoàn thành các bước đúc kết ở trên bằng cách sử dụng địa chỉ ví của người dùng Web3.
Token chúng tôi trực tiếp sử dụng 69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE ở trên
Địa chỉ ví: Sử dụng 4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1t
Nhưng khi chúng ta chỉ thay thế trực tiếp các tham số thì sẽ nhận được kết quả không như mong đợi:
Địa chỉ tồn tại, nhưng địa chỉ mà Mint yêu cầu không phải là địa chỉ ví ban đầu mà là Tài khoản Token cần được liên kết với nó.
Chúng ta cần thực hiện quy trình tương tự như trên: tạo Tài khoản Token cho địa chỉ ví, sau đó sử dụng Tài khoản Token đã tạo để đúc đơn vị Token mới.
Nói cách khác, nếu chúng ta muốn đúc một đơn vị Token cho một địa chỉ ví nhất định thì trước tiên chúng ta phải tạo Tài khoản Token cho địa chỉ ví này. Về lý do tại sao chúng tôi cần làm điều này, một trong những lý do là chúng tôi không có thẩm quyền trực tiếp sửa đổi dữ liệu của một địa chỉ nhất định.
Trong tài liệu của Solana, đôi khi bạn thấy 2 khái niệm tương tự nhau: Tài khoản Token và Tài khoản Token Liên kết (ATA). Tài liệu có vẻ như cả hai có liên quan với nhau nhưng nó không giải thích điều này, điều này rất khó hiểu.
Nhưng nếu bạn xem tài liệu của Metaplex, bạn sẽ thấy rằng nó nêu rõ: “Tài khoản mã thông báo được liên kết, đôi khi được gọi đơn giản là tài khoản mã thông báo”.
Chúng ta sẽ không đi sâu vào hai vấn đề này ở đây, chỉ hãy tưởng tượng rằng tài khoản token là trung gian giữa token và địa chỉ ví.
Chúng tôi sử dụng lệnh sau để tạo Tài khoản Token cho địa chỉ ví:
Việc tạo lặp đi lặp lại sẽ dẫn đến lỗi:
Cũng có thể thấy trong nhật ký rằng Tài khoản mã thông báo lấy từ Tài khoản Mint và địa chỉ ví đã xác định đã được xác định (3JocyxV4LX4VbNU248CvNozZphgRW5JTyxn7FPWrF8bx), nhưng vì nó đã tồn tại nên thông báo lỗi được in.
Nhận tài khoản mã thông báo
Chúng tôi cần sử dụng giao diện RPC để biết liệu một địa chỉ ví nhất định có Mint NFT mà chúng tôi đã tạo hay không. Cụ thể là truy vấn dữ liệu thông qua phương thức getTokenAccountsByOwner. Sau đây là các tham số được yêu cầu bởi giao diện:
Bạn sẽ cần thay thế _YOUR_RPC_PROVIDER_ bằng địa chỉ do nhà cung cấp RPC mà bạn chọn cung cấp.
Bạn có thể sử dụng địa chỉ do Solana cung cấp chính thức hoặc bạn có thể tìm thấy mạng RPC công cộng miễn phí tại đây: https://zan.top/service/public-rpc/solana
Lưu ý: Địa chỉ công cộng có thể không ổn định. Nếu bạn cần dịch vụ RPC ổn định, bạn nên tạo Khóa API của riêng mình.
Đối với địa chỉ ví ở trên, thông tin cụ thể như sau:
Ngoài việc điền thủ công các tham số yêu cầu thông qua mã, bạn cũng có thể sử dụng phương thức getParsedTokenAccountsByOwner trên Kết nối được cung cấp trong @solana/web3.js. Trong nội bộ, phương thức getParsedTokenAccountsByOwner thực sự được gọi thông qua giao diện RPC được cung cấp khi tạo. Sự liên quan.
Nếu là ví đã tạo Account Token thì sẽ trả về:
Đã xóa dữ liệu không còn hữu ích cho chúng tôi
hoàn thành
Qua những nỗ lực trên, chúng ta có thể thấy rằng chúng ta có thể sử dụng những khả năng hiện có để đạt được những chức năng mà chúng ta mong muốn. Sau đó, bắt đầu viết mã máy khách.
Các mã sau có tại https://github.com/gin-lsl/my-sol-token-auth-example
Bạn có thể xem trước tại đây: https://my-sol-token-auth-example.vercel.app/
Mình sẽ triển khai nó bằng cách tạo một dự án Nextjs đơn giản sử dụng Ant Design Web3 để Connect Wallet:
Khởi tạo dự án Nextjs
Sử dụng giá trị mặc định cho tất cả các tùy chọn:
Để bắt đầu nhanh chóng, chúng tôi trực tiếp sử dụng @ant-design/web3-solana để kết nối với ví và @solana/spl-token để tương tác với Chương trình Token.
Thêm các phụ thuộc có liên quan:
Chúng tôi cần bao gồm 3 trang trên trang chủ, tạo app/sign-in/page.tsx và app/sign-on/page.tsx. Chúng được sử dụng tương ứng để kết nối với ví và kiểm tra xem người dùng đã đăng ký (đúc NFT hay chưa) và cho phép người dùng thực hiện quy trình đăng ký (đúc NFT).
Sau khi mở trang demo, điều đầu tiên bạn nhìn thấy là thông báo chào mừng và liên kết đến trang Đăng nhập:
Sau khi vào trang, bạn cần đăng nhập trước:
Nhấp vào Tiếp tục với Solana và ví sẽ được gợi lên
Nếu bạn chưa đăng ký trước, bạn sẽ được nhắc đăng ký trước:
Điều này là do theo logic của /api/sign-in, Tài khoản Token được liên kết sẽ được tìm kiếm dựa trên địa chỉ ví được kết nối. Do chúng ta chưa từng sử dụng nên đương nhiên không tìm thấy dữ liệu nên hệ thống sẽ cho rằng địa chỉ ví này chưa được đăng ký.
Sau đó, chúng ta làm theo lời nhắc và đến trang Đăng nhập nhìn chung tương tự như trang đăng nhập, ngoại trừ logic xử lý ở phía máy chủ là khác nhau:
Trên thực tế, hai logic này có thể được kết hợp nhưng chúng được tách ra ở đây chỉ để thuận tiện cho việc trình diễn.
Dù sao đi nữa, hãy nhấp vào “Bắt đầu với Solana” để kết nối ví. Sau đó, nếu mọi việc suôn sẻ, bạn sẽ thấy thông báo thành công:
Hãy vào Solscan và xem chuyện gì đang xảy ra. Nhập https://solscan.io/?cluster=devnet và kiểm tra địa chỉ ví của bạn. Ngoài ra, bạn cũng có thể kiểm tra địa chỉ này: 79reVF46NyuuH7PADR3i6RpQ7hmBZgYkiieXNYPM1oLF
Có một phần dữ liệu giao dịch:
Lưu ý rằng trong Hướng dẫn, bạn có thể thấy lệnh CreateAccount được thực thi bên trong giao dịch. Nhấp vào liên kết để nhập chi tiết và bạn sẽ thấy rằng thứ nó tạo ra là TokenAccount: EXfDYkHw3UQw2VqiSLsRAfLMsxkgqnd3nhxbB4V5HAvA. Giá trị isOnCurve là Sai, cho biết rằng đó là tài khoản được liên kết không có khóa riêng.
Quay lại trang trước, đi tới Danh mục đầu tư -> NFT và bạn có thể thấy hoạt động Mint mà chúng tôi vừa thực hiện bên trong quá trình đăng nhập, cũng như Mint NFT:
Tóm tắt
Hãy tóm tắt toàn bộ quá trình. Chúng tôi sử dụng spl-token-cli để tạo NFT, sau đó kiểm tra xem địa chỉ ví có Tài khoản mã thông báo và Đúc mã thông báo hay không để xác định xem nó đã được đăng ký trên trang web của chúng tôi hay chưa.
Khi người dùng Web3 kết nối với ví, chúng tôi sẽ tự động gửi thông tin đăng nhập vào chương trình phụ trợ, tạo Tài khoản mã thông báo nội bộ và đúc đơn vị Mã thông báo làm thông tin xác thực đã đăng ký của người dùng.
Trong tương lai, người dùng có thể sử dụng cùng một địa chỉ ví để đăng nhập lại vào trang web của chúng tôi.
Bài viết này được viết bởi gin-lsl của ZAN Team (tài khoản X @zan_team ).