NFT (โทเค็นที่ไม่สามารถทดแทนกันได้) ซึ่งเป็นโทเค็นที่ ไม่สามารถถูกแทนที่ได้ ตามชื่อของมัน เหมาะมากสำหรับใช้เป็นเครื่องมือตรวจสอบตัวตน
ต่อไป ให้เราสำรวจความเป็นไปได้ของการใช้ NFT เป็นใบรับรองการจดทะเบียนผ่านตัวอย่างง่ายๆ
คำนำ
ก่อนที่เราจะเริ่ม ให้ฉันแนะนำเครื่องมือที่เราจะใช้ต่อไป
โทเค็น SPL
เราสามารถเขียนสัญญา Solana ใหม่ได้ตั้งแต่เริ่มต้น แต่เพื่อจุดประสงค์ที่เราต้องการบรรลุในปัจจุบัน เราสามารถใช้การใช้งานทั่วไปของ Solana: Token Program ได้โดยตรง
โปรแกรม Token เป็นส่วนหนึ่งของไลบรารีโปรแกรม Solana (SPL, https://spl.solana.com/) SPL มีการใช้งานโปรแกรมทั่วไปหลายอย่าง รวมถึง Token, Swap และ Memo และมีไลบรารีไคลเอ็นต์และ CLI ที่สมบูรณ์และเครื่องมืออื่นๆ ซึ่งอำนวยความสะดวกให้กับนักพัฒนา Solana อย่างมาก
ซอร์สโค้ดโครงการของ Token Program อยู่ที่: https://github.com/solana-labs/solana-program-library/tree/master/token/program
สนามเด็กเล่นโซลานา
Solpy (https://beta.solpg.io/) จัดเตรียมสภาพแวดล้อมสำหรับการเขียนและปรับใช้สัญญา Solana ทางออนไลน์ และรวมเครื่องมือที่ใช้กันทั่วไปตามค่าเริ่มต้น รวมถึง SPL Token ที่นำมาใช้ในส่วนก่อนหน้า ช่วยให้เราสร้างและจัดการ Token ได้อย่างง่ายดายผ่าน spl-token-cli
โทเค็นการรับรองความถูกต้อง
ในส่วนนี้เราจะสร้าง NFT Token หากผู้ใช้ Mint Token ที่อยู่กระเป๋าสตางค์จะถือว่าได้รับการลงทะเบียนในระบบของเรา มิฉะนั้นผู้ใช้จะได้รับแจ้งให้ลงทะเบียนก่อน
ตอนนี้ เรามาเริ่มกันที่ส่วน On-chain:
สร้างโทเค็น
เราใช้ spl-token เพื่อสร้างโทเค็นใหม่ และส่ง --decimals เพื่อระบุว่าเป็นโทเค็นที่แบ่งแยกไม่ได้ (เช่นเดียวกับ NFT)
บันทึกต่อไปนี้จะถูกส่งออก:
ในหมู่พวกเขา 69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE มักเรียกว่า Mint Address ซึ่งเป็น ID ของ Token ที่เราสร้างขึ้น
ที่อยู่โทเค็นคือ:
https://solscan.io/token/69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE?cluster=devnet
สร้างบัญชีโทเค็น
ต่อไปเราต้องสร้างบัญชี Token สำหรับ Token ที่สร้างในขั้นตอนก่อนหน้า
สะระแหน่
ก่อนที่จะสร้างโทเค็นใหม่ด้วยที่อยู่กระเป๋าเงินอื่น ให้เราลองสร้างหน่วยโทเค็นสำหรับบัญชีโทเค็นที่สร้างขึ้นในขั้นตอนก่อนหน้าก่อน เพียงป้อน:
บันทึกต่อไปนี้จะถูกส่งออก:
อีกทางหนึ่ง:
คุณยังสามารถลองใช้ค่ามินต์อื่น ๆ เช่น 1.9:
เมื่อดูรายละเอียดธุรกรรม คุณจะพบว่าเนื่องจากเราระบุ --decimals เป็น 0 เมื่อสร้าง Token ในขั้นตอนแรก เมื่อดำเนินการ Mint จริง ส่วนทศนิยมจะถูกละทิ้ง ดังนั้นจำนวน Mint จะยังคงเป็น 1 .
คุณยังสามารถลองมอบโทเค็นเหรียญกษาปณ์ไปยังที่อยู่กระเป๋าสตางค์ได้โดยตรง ที่นี่เราใช้ 4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1t เพื่อสาธิต:
มิ้นท์สำหรับที่อยู่กระเป๋าเงิน
เป้าหมายของการดำเนินการ Mint ข้างต้นคือที่อยู่ Token Mint และตามแนวคิดเดิมของเรา Mint ควรมอบให้กับที่อยู่กระเป๋าเงินอื่นที่ไม่ได้เป็นของเรา
ต่อไป มาทำตามขั้นตอนเริ่มต้นด้านบนโดยใช้ที่อยู่กระเป๋าเงินของผู้ใช้ Web3
โทเค็นเราใช้โดยตรง 69yXraTu3FqXZkATg6MiRnWT2qHd4tRzWsfCHHE9j2XE ข้างต้น
ที่อยู่กระเป๋าเงิน: ใช้ 4wztJ4CAH4GbAUopZrVk7nLvoAC3KAF6ttMMWfnBRG1t
แต่เมื่อเราเปลี่ยนพารามิเตอร์โดยตรง เราก็จะได้ผลลัพธ์ที่ไม่คาดคิด:
มีที่อยู่อยู่ แต่ที่อยู่ที่กำหนดโดย Mint ไม่ใช่ที่อยู่กระเป๋าเงินเดิม แต่เป็นบัญชีโทเค็นที่ต้องเชื่อมโยงด้วย
เราจำเป็นต้องดำเนินการตามกระบวนการเดียวกันกับข้างต้น: สร้างบัญชี Token สำหรับที่อยู่กระเป๋าเงิน จากนั้นใช้บัญชี Token ที่สร้างขึ้นเพื่อสร้างหน่วย Token ใหม่
กล่าวอีกนัยหนึ่ง หากเราต้องการสร้างหน่วยโทเค็นสำหรับที่อยู่กระเป๋าสตางค์หนึ่งๆ เราต้องสร้างบัญชีโทเค็นสำหรับที่อยู่กระเป๋าสตางค์นี้ก่อน สำหรับสาเหตุที่เราต้องทำเช่นนี้ เหตุผลหนึ่งก็คือ เราไม่มีอำนาจในการแก้ไขข้อมูลของที่อยู่บางแห่งโดยตรง
ในเอกสารของ Solana บางครั้งคุณอาจเห็นแนวคิดสองประการที่คล้ายกัน: บัญชีโทเค็น และบัญชีโทเค็นที่เกี่ยวข้อง (ATA) เอกสารดูเหมือนว่าทั้งสองจะเกี่ยวข้องกัน แต่ไม่ได้อธิบายสิ่งนี้ซึ่งทำให้สับสนมาก
แต่ถ้าคุณดูเอกสารของ Metaplex คุณจะพบว่าระบุไว้อย่างชัดเจนว่า: “บัญชีโทเค็นที่เกี่ยวข้อง ซึ่งบางครั้งเรียกง่ายๆ ว่าบัญชีโทเค็น”
เราจะไม่เจาะลึกสองสิ่งนี้ในที่นี้ ลองจินตนาการว่าบัญชีโทเค็นเป็นตัวกลางระหว่างโทเค็นและที่อยู่กระเป๋าเงิน
เราใช้คำสั่งต่อไปนี้เพื่อสร้างบัญชีโทเค็นสำหรับที่อยู่กระเป๋าเงิน:
การสร้างซ้ำจะทำให้เกิดข้อผิดพลาด:
นอกจากนี้ยังสามารถเห็นได้ในบันทึกว่าบัญชีโทเค็นที่ได้รับจากบัญชี Mint ที่กำหนดและที่อยู่กระเป๋าเงินถูกกำหนดไว้ (3JocyxV4LX4VbNU248CvNozZphgRW5JTyxn7FPWrF8bx) แต่เนื่องจากมีอยู่แล้ว ข้อความแสดงข้อผิดพลาดจึงถูกพิมพ์ออกมา
รับบัญชีโทเค็น
เราจำเป็นต้องใช้อินเทอร์เฟซ RPC เพื่อดูว่าที่อยู่กระเป๋าเงินบางแห่งมี Mint เป็น NFT ที่เราสร้างขึ้นหรือไม่ โดยเฉพาะ ค้นหาข้อมูลผ่านเมธอด getTokenAccountsByOwner ต่อไปนี้เป็นพารามิเตอร์ที่อินเทอร์เฟซต้องการ:
คุณจะต้องแทนที่ _YOUR_RPC_PROVIDER_ ด้วยที่อยู่ที่ให้ไว้โดยผู้ให้บริการ RPC ที่คุณเลือก
คุณสามารถใช้ที่อยู่ที่ได้รับอย่างเป็นทางการจาก Solana หรือคุณสามารถค้นหาเครือข่าย RPC สาธารณะฟรีได้ที่นี่: https://zan.top/service/public-rpc/solana
หมายเหตุ: ที่อยู่สาธารณะอาจไม่เสถียร หากคุณต้องการบริการ RPC ที่เสถียร ขอแนะนำให้สร้างคีย์ API ของคุณเอง
สำหรับที่อยู่กระเป๋าเงินด้านบน ข้อมูลเฉพาะมีดังนี้:
นอกเหนือจากการกรอกพารามิเตอร์คำขอด้วยตนเองผ่านโค้ดแล้ว คุณยังสามารถใช้เมธอด getParsedTokenAccountsByOwner บนการเชื่อมต่อที่ให้ไว้ใน @solana/web3.js ภายใน เมธอด getParsedTokenAccountsByOwner จริงๆ แล้วจะถูกเรียกผ่านอินเทอร์เฟซ RPC ที่ให้ไว้เมื่อสร้าง การเชื่อมต่อ.
หากเป็นกระเป๋าเงินที่สร้าง Account Token แล้ว มันจะส่งคืน:
ข้อมูลที่ถูกลบซึ่งไม่เป็นประโยชน์สำหรับเราอีกต่อไป
ทำให้สำเร็จ
จากความพยายามข้างต้น เราจะเห็นว่าเราสามารถใช้ความสามารถที่มีอยู่เพื่อให้บรรลุฟังก์ชันที่เราต้องการได้ จากนั้นจึงเริ่มเขียนโค้ดลูกค้า
รหัสต่อไปนี้อยู่ที่https://github.com/gin-lsl/my-sol-token-auth-example
คุณสามารถดูตัวอย่างได้ที่นี่: https://my-sol-token-auth-example.vercel.app/
ฉันจะนำไปใช้โดยสร้างโปรเจ็กต์ Nextjs ง่ายๆ โดยใช้ Ant Design Web3 เพื่อเชื่อมต่อ Wallet:
เริ่มต้นโครงการ Nextjs
ใช้ค่าเริ่มต้นสำหรับตัวเลือกทั้งหมด:
เพื่อเริ่มต้นอย่างรวดเร็ว เราใช้ @ant-design/web3-solana โดยตรงเพื่อเชื่อมต่อกับกระเป๋าเงิน และใช้ @solana/spl-token เพื่อโต้ตอบกับ Token Program
เพิ่มการอ้างอิงที่เกี่ยวข้อง:
เราจำเป็นต้องรวม 3 หน้าไว้ในหน้าแรก สร้าง app/sign-in/page.tsx และ app/sign-on/page.tsx ใช้เพื่อเชื่อมต่อกับกระเป๋าเงินและตรวจสอบว่าผู้ใช้ได้ลงทะเบียนแล้ว (mint NFT หรือไม่) และให้ผู้ใช้ดำเนินการตามขั้นตอนการลงทะเบียน (mint NFT)
หลังจากเปิดหน้าสาธิต สิ่งแรกที่คุณเห็นคือข้อความต้อนรับและลิงก์ไปยังหน้าลงชื่อเข้าใช้:
หลังจากเข้าสู่หน้าคุณต้องลงชื่อเข้าใช้ก่อน:
คลิก ดำเนินการต่อกับ Solana และกระเป๋าเงินจะปรากฏขึ้น
หากคุณยังไม่เคยลงทะเบียนมาก่อน คุณจะได้รับแจ้งให้ลงทะเบียนก่อน:
เนื่องจากในตรรกะของ /api/sign-in บัญชีโทเค็นที่เกี่ยวข้องจะถูกค้นหาตามที่อยู่กระเป๋าเงินที่เชื่อมต่อ เนื่องจากเราไม่เคยใช้มาก่อน จึงไม่สามารถหาข้อมูลได้ ดังนั้นระบบจะคิดว่าที่อยู่กระเป๋าเงินนี้ยังไม่ได้ลงทะเบียน
จากนั้นเราปฏิบัติตามคำแนะนำและไปที่หน้าลงชื่อเข้าใช้ โดยทั่วไปหน้าลงทะเบียนจะคล้ายกับหน้าเข้าสู่ระบบ ยกเว้นว่าตรรกะการประมวลผลบนฝั่งเซิร์ฟเวอร์จะแตกต่างออกไป:
ในความเป็นจริง ตรรกะทั้งสองสามารถนำมารวมกันได้ แต่จะแยกออกจากกันที่นี่เพื่อความสะดวกในการสาธิตเท่านั้น
อย่างไรก็ตาม คลิก “เริ่มต้นด้วย Solana” เพื่อเชื่อมต่อกระเป๋าเงิน จากนั้น หากทุกอย่างเป็นไปด้วยดี คุณจะเห็นข้อความแสดงความสำเร็จ:
เข้าสู่ Solscan แล้วดูว่าเกิดอะไรขึ้น ป้อน https://solscan.io/?cluster=devnet และตรวจสอบที่อยู่กระเป๋าเงินของคุณ หรือคุณสามารถตรวจสอบที่อยู่นี้: 79reVF46NyuuH7PADR3i6RpQ7hmBZgYkiieXNYPM1oLF
มีข้อมูลธุรกรรมชิ้นหนึ่ง:
โปรดทราบว่าในคำแนะนำ คุณจะเห็นว่าคำสั่ง CreateAccount ดำเนินการภายในธุรกรรม คลิกลิงก์เพื่อป้อนรายละเอียด และคุณจะพบว่าสิ่งที่สร้างขึ้นคือ TokenAccount: EXfDYkHw3UQw2VqiSLsRAfLMsxkgqnd3nhxbB4V5HAvA ค่า isOnCurve เป็นเท็จ ซึ่งบ่งชี้ว่าเป็นบัญชีที่เกี่ยวข้องกันโดยไม่มีคีย์ส่วนตัว
กลับไปที่หน้าก่อนหน้า ไปที่ Portfolio -> NFT และคุณจะเห็นการดำเนินการ Mint ที่เราเพิ่งทำในการลงชื่อเข้าใช้ เช่นเดียวกับ Mint NFT:
สรุป
เรามาสรุปกระบวนการทั้งหมดกันดีกว่า เราใช้ spl-token-cli เพื่อสร้าง NFT จากนั้นตรวจสอบว่าที่อยู่กระเป๋าสตางค์มีบัญชี Token และ Mint the Token เพื่อตรวจสอบว่าได้มีการลงทะเบียนบนเว็บไซต์ของเราหรือไม่
เมื่อผู้ใช้ Web3 เชื่อมต่อกับกระเป๋าเงิน เราจะส่งการลงชื่อเข้าใช้ไปยังแบ็กเอนด์โดยอัตโนมัติ สร้างบัญชีโทเค็นภายใน และสร้างหน่วยโทเค็นเป็นข้อมูลรับรองที่ลงทะเบียนของผู้ใช้
ในอนาคตผู้ใช้สามารถใช้ที่อยู่กระเป๋าเงินเดียวกันเพื่อเข้าสู่เว็บไซต์ของเราอีกครั้ง
บทความนี้เขียนโดย gin-lsl จากทีม ZAN (บัญชี X @zan_team )