คำว่า “มิ้นต์” ชวนให้นึกถึงเรื่องราวโรแมนติกมากมาย ฟังดูเหมือนการประทับเหรียญ การกดทำเหรียญที่ระลึก หรือการมอบชีวิตสร้างสรรค์ให้ไฟล์หนึ่งไฟล์ แต่ในระดับออนเชน ความหมายแคบกว่านั้น และเมื่อเข้าใจแล้วก็จะเห็นว่ามีประโยชน์กว่า การมิ้นต์คือการเรียกใช้ฟังก์ชัน สัญญาอัจฉริยะเขียนแถวใหม่หนึ่งแถวลงในแมปปิงเพื่อระบุว่า “โทเคน #N เป็นของแอดเดรส X” สร้างรายการบันทึก แล้วธุรกรรมก็สิ้นสุดลง เท่านั้นเอง ส่วนที่เหลือทั้งหมด ไม่ว่าจะเป็นงานศิลป์ การประมูล หรือบทบาทใน Discord ล้วนเป็นโครงประกอบรอบการเปลี่ยนแปลงสถานะเพียงครั้งเดียวนั้น
บทความนี้เป็นตอนที่ 3 ของซีรีส์พื้นฐานเกี่ยวกับ NFT หากคุณยังไม่ได้อ่าน NFT คืออะไรกันแน่ หรือ ข้อมูลเมตาและรูปภาพอยู่ที่ไหนกันแน่ เนื้อหาเหล่านั้นจะช่วยให้เข้าใจคำศัพท์ที่ใช้ต่อจากนี้ บทความนี้เน้นช่วงเวลาที่สร้าง NFT โดยตรง ทั้งค่าใช้จ่าย วิธีการทำงาน และเหตุผลที่รูปแบบซึ่งเรียกว่า “การมิ้นต์แบบขี้เกียจ” ค่อย ๆ เปลี่ยนโฉมเศรษฐกิจของครีเอเตอร์
การมิ้นต์ในระดับโปรโตคอลคืออะไร
มาตรฐาน ERC-721 กล่าวถึงประเด็นนี้ไว้อย่างกระชับมาก ข้อกำหนดระบุว่า “การสร้าง NFT (‘การมิ้นต์’) และการทำลาย NFT (‘การเบิร์น’) ไม่ได้รวมอยู่ในข้อกำหนด” กล่าวอีกอย่างคือ มาตรฐานไม่ได้บอกวิธีสร้างโทเคน แต่บอกเพียงว่าเมื่อโทเคนมีอยู่แล้วจะต้องมีลักษณะอย่างไร
ธรรมเนียมนี้ซ่อนอยู่ในอีเวนต์ Transfer ซึ่ง “จะถูกส่งออกเมื่อมีการสร้าง NFT (from == 0) และทำลาย NFT (to == 0)” แอดเดรสศูนย์ 0x0000000000000000000000000000000000000000 เป็นเครื่องหมายที่สื่อความหมายนี้ อีเวนต์ Transfer ที่ผู้ส่งเป็นแอดเดรสศูนย์หมายความว่า “โทเคนนี้ไม่เคยมีอยู่มาก่อน และตอนนี้มีอยู่แล้ว” บล็อกเอ็กซ์พลอเรอร์เห็นรายการบันทึกนี้และแสดงผลเป็น “มิ้นต์”
ในทางปฏิบัติ สัญญา NFT ที่ใช้งานจริงแทบทั้งหมดนำการทำงานของ OpenZeppelin มาใช้ซ้ำ แทนที่จะเขียนขึ้นเอง โดยมีฟังก์ชันภายในสองรายการที่ทำงานนี้ _mint “มิ้นต์ tokenId และโอนไปยัง to” โดยเขียนช่องข้อมูลความเป็นเจ้าของ เพิ่มตัวนับยอดคงเหลือ และส่งออกอีเวนต์ ส่วน _safeMint ทำทั้งหมดนี้พร้อมตรวจสอบการยอมรับ to เพิ่มเติม หาก to อ้างถึงสัญญาอัจฉริยะ สัญญานั้นต้องติดตั้ง IERC721Receiver.onERC721Received เพื่อยืนยันว่าสัญญารู้วิธีถือครอง NFT จริง ข้อกำหนดสองข้อที่ใช้กับ _mint เสมอคือ tokenId ต้องยังไม่มีอยู่ และ to ต้องไม่ใช่แอดเดรสศูนย์ (แอดเดรสศูนย์สงวนไว้สำหรับปลายทางการเบิร์น)
ความแตกต่างระหว่าง _mint กับ _safeMint มีความสำคัญ เพราะการใช้ _mint ธรรมดาโอนไปยังสัญญาที่ไม่ได้ติดตั้งอินเทอร์เฟซผู้รับ จะทำให้โทเคนติดอยู่ที่นั่นอย่างถาวร เอกสารของ OpenZeppelin เองเตือนว่า “ไม่แนะนำให้ใช้เมธอดนี้ โปรดใช้ ERC721._safeMint เมื่อทำได้”
ตลาดหลักกับตลาดรอง
การมิ้นต์คือเหตุการณ์ในตลาดหลัก เป็นครั้งแรกที่โทเคนปรากฏบนบล็อกเชน และธุรกรรมที่สร้างโทเคนมักเป็นธุรกรรมเดียวกับที่โอนโทเคนให้ผู้ซื้อรายแรก รายรับจากการขายนั้นตกเป็นของครีเอเตอร์หรือคลังของสัญญา
ธุรกรรมทั้งหมดหลังจากนั้นอยู่ในตลาดรอง เมื่อผู้สะสมขายโทเคนให้ผู้สะสมอีกราย จะไม่มีการสร้างช่องข้อมูลใหม่ สัญญาเพียงเปลี่ยนแถว tokenId → owner ที่มีอยู่แล้วให้ชี้ไปยังแอดเดรสใหม่ โทเคนยังคงอยู่ที่เดิม มีเพียงตัวชี้ที่เปลี่ยนไป
นี่คือจุดที่ค่าลิขสิทธิ์ ERC-2981 เข้ามาเกี่ยวข้อง มาตรฐานค่าลิขสิทธิ์เปิดให้สัญญาระบุว่า “เมื่อขายต่อ โปรดส่ง X% ไปยังแอดเดรสนี้” และมาร์เก็ตเพลสที่รองรับมาตรฐานก็จะทำตาม ค่าลิขสิทธิ์บังคับใช้โดยมาร์เก็ตเพลส ไม่ใช่โดยโปรโตคอล บล็อกเชนเองไม่ได้ป้องกันการโอนระหว่างบุคคลที่หลีกเลี่ยงการจ่ายค่าลิขสิทธิ์ การเข้าใจความแตกต่างระหว่างตลาดหลักกับตลาดรองยังช่วยอธิบายรูปแบบที่พบเป็นประจำได้ด้วย นั่นคือสงครามแย่งค่าก๊าซในวันมิ้นต์ของคอลเลกชันยอดนิยม (เพราะทุกคนพยายามแย่งโทเคนในตลาดหลักที่มีจำกัดพร้อมกัน) เทียบกับการขายต่อในอีกหลายเดือนให้หลังที่มีค่าธรรมเนียมต่ำและเงียบสงบ (เพราะไม่ได้เขียนข้อมูลใหม่ลงในพื้นที่จัดเก็บ เพียงเปลี่ยนผู้ถือครองเท่านั้น)
โครงสร้างค่าก๊าซของการมิ้นต์
การมิ้นต์มีค่าใช้จ่าย เพราะการเขียนข้อมูลลงในพื้นที่จัดเก็บของบล็อกเชนมีค่าใช้จ่าย การทำความเข้าใจ ว่าธุรกรรมบนบล็อกเชนทำงานอย่างไร จะช่วยให้เห็นภาพ และ เหตุใดค่าก๊าซจึงมีมูลค่าเป็นเงินจริง จะช่วยอธิบายบริบททางเศรษฐกิจ สรุปสั้น ๆ สำหรับการมิ้นต์มีดังนี้
- ธุรกรรม Ethereum ทุกครั้งเริ่มต้นด้วยค่าก๊าซพื้นฐาน 21,000 หน่วย เพียงเพื่อให้ธุรกรรมเกิดขึ้น
SSTORE_SET_GASใช้ 20,000 หน่วยก๊าซสำหรับเปลี่ยนช่องข้อมูลในพื้นที่จัดเก็บจากศูนย์เป็นค่าที่ไม่ใช่ศูนย์ นี่คือรายการค่าใช้จ่ายที่ใหญ่ที่สุดรายการเดียวในการมิ้นต์- ทุกช่องข้อมูลใหม่ในพื้นที่จัดเก็บที่การมิ้นต์แตะต้อง ไม่ว่าจะเป็นแมปปิง
tokenId → ownerตัวนับยอดคงเหลือแยกตามแอดเดรส หรือบางครั้งคือ URI ของแต่ละโทเคน ใช้ก๊าซเพิ่มอีก 20,000 หน่วย - Calldata (อาร์กิวเมนต์ของฟังก์ชันที่คุณส่งไป) ใช้ 16 หน่วยก๊าซต่อไบต์ที่ไม่ใช่ศูนย์ภายใต้ EIP-2028 (ลดลงจาก 68) และ 4 หน่วยก๊าซต่อไบต์ศูนย์
- อีเวนต์
Transferเองเพิ่มค่าก๊าซอีกหลายพันหน่วยสำหรับหัวข้อที่จัดทำดัชนี
เมื่อรวมทั้งหมดแล้ว การมิ้นต์ ERC-721 ทั่วไปใช้ก๊าซประมาณ 50,000 ถึง 150,000 หน่วย ขึ้นอยู่กับจำนวนช่องข้อมูลในพื้นที่จัดเก็บที่สัญญาแตะต้อง และมีการทำธุรกรรมเป็นชุดหรือไม่ แม้จะเรียกว่า “มิ้นต์ฟรี” แต่ก็ไม่ได้ฟรีจริง ผู้สร้างเพียงไม่เรียกเก็บราคามิ้นต์เพิ่มจากค่าก๊าซ ผู้ซื้อยังคงเป็นผู้จ่ายให้เครือข่าย
การมิ้นต์แบบขี้เกียจ — มิ้นต์โดยไม่จ่ายค่าก๊าซจนกว่าจะโอนครั้งแรก
หากพิจารณาสิ่งที่กล่าวมาให้ดี จะเห็นความไม่มีประสิทธิภาพอย่างหนึ่ง ผู้สร้างจ่ายค่าก๊าซล่วงหน้าเพื่อนำโทเคน 10,000 รายการขึ้นบล็อกเชน แต่ผู้สร้างส่วนใหญ่ไม่รู้เลยว่าจะขายได้จริงกี่รายการ การจ่ายค่ามิ้นต์สำหรับโทเคนที่ไม่มีใครซื้อจึงเป็นการขาดทุนล้วน ๆ การมิ้นต์แบบขี้เกียจเปลี่ยนจังหวะเวลา โดยรอให้มีผู้ซื้อก่อนจึงค่อยมิ้นต์ และให้ผู้ซื้อเป็นผู้จ่ายค่าก๊าซ
กลไกนี้อาศัย EIP-712 ซึ่งเอกสาร Ethereum อธิบายว่าเป็น “มาตรฐานสำหรับแฮชและลงลายมือชื่อข้อมูลที่มีโครงสร้างและกำหนดชนิด แทนการใช้สตริงไบต์เพียงอย่างเดียว” ในทางปฏิบัติ กลไกนี้ช่วยให้ผู้สร้างลงลายมือชื่อในข้อความนอกบล็อกเชนที่มีโครงสร้าง เช่น เวาเชอร์ที่มี ID โทเคน URI ข้อมูลเมตา ราคา และกฎการมีสิทธิ์ ซึ่งสัญญาอัจฉริยะสามารถตรวจสอบความถูกต้องด้วยวิธีเข้ารหัสในภายหลังได้ กระเป๋าเงินจะแสดงฟิลด์ต่าง ๆ เป็นข้อความที่อ่านเข้าใจได้ แทนที่จะแสดงเป็นชุดเลขฐานสิบหก ซึ่งช่วยเพิ่มความปลอดภัยและเป็นเหตุผลที่ทำให้ EIP-712 กลายเป็นมาตรฐานหลักของอุตสาหกรรม
เมื่อผู้ซื้อตัดสินใจซื้อ ก็จะเรียกใช้ฟังก์ชัน redeem บนสัญญามิ้นต์ แล้วส่งเวาเชอร์พร้อมลายมือชื่อของผู้สร้างไปด้วย สัญญาจะตรวจสอบลายมือชื่อ เรียกใช้ _safeMint ในธุรกรรมเดียวกัน และส่งราคาขายให้ผู้สร้าง ผู้ซื้อจ่ายค่าก๊าซ ส่วนผู้สร้างไม่ต้องจ่ายค่าโทเคนคงเหลือที่ขายไม่ออก OpenSea ทำให้รูปแบบนี้เป็นที่รู้จักในหมู่ผู้สร้างผลงานออกใหม่ในอดีต ส่วน Rarible, Zora และแพลตฟอร์มมิ้นต์อิสระอีกหลายแห่งก็ใช้รูปแบบดัดแปลง (Seaport ซึ่งเป็นโปรโตคอลรุ่นใหม่ของ OpenSea ใช้สำหรับซื้อขาย ไม่ใช่กลไกพื้นฐานของการมิ้นต์แบบขี้เกียจ แต่ใช้รูปแบบคำสั่งซื้อที่ลงลายมือชื่อด้วย EIP-712 คล้ายกัน)
รูปแบบการมิ้นต์ที่พบบ่อย
เมื่อเข้าใจกลไกแล้ว รูปแบบการขายก็เป็นเพียงนโยบายที่วางซ้อนบน _safeMint เท่านั้น
- ราคาคงที่: โทเคนทุกรายการมีราคาเท่ากันเป็นจำนวน ETH คงที่
- การประมูลแบบดัตช์: ราคาเริ่มต้นสูงและค่อย ๆ ลดลงตามกำหนด จนกว่าจะขายหมด
- Allowlist / whitelist: แอดเดรสที่ได้รับอนุมัติล่วงหน้า ซึ่งมักพิสูจน์สิทธิ์ด้วย Merkle proof แทนการเก็บรายชื่อขนาดใหญ่ไว้บนบล็อกเชน จะได้รับสิทธิ์มิ้นต์ก่อน โดยปกติจะได้ส่วนลด
- มิ้นต์ฟรี: ผู้ซื้อจ่ายเฉพาะค่าก๊าซ ส่วนรายได้ของผู้สร้างขึ้นอยู่กับค่าลิขสิทธิ์จากการขายต่อ
- เปิดเผยข้อมูลหลังมิ้นต์: ในตอนแรกโทเคนทุกรายการจะชี้ไปยังรูปภาพตัวอย่าง และผู้สร้างจะเปลี่ยนสถานะเพื่อเปิดเผยข้อมูลเมตาจริงเมื่อการมิ้นต์สิ้นสุดลง วิธีนี้ช่วยป้องกันการฉวยซื้อโทเคนหายากระหว่างการมิ้นต์
- มิ้นต์แบบขี้เกียจ: ไม่มีโทเคนอยู่บนบล็อกเชนจนกว่าจะมีผู้ซื้อ โดย “คอลเลกชัน” จะเป็นรายชื่อเวาเชอร์ที่ลงลายมือชื่อไว้บนเซิร์ฟเวอร์ของผู้สร้าง
เบื้องหลังยังคงเป็นการเรียกใช้ _mint แบบเดียวกัน ต่างกันที่กฎว่ามิ้นต์เมื่อใด ใครเป็นผู้มิ้นต์ และราคาเท่าใด
อะไรอาจผิดพลาดได้
การมิ้นต์เป็นหนึ่งในขั้นตอนที่ผู้ใช้ใหม่มักพบข้อผิดพลาดได้ง่าย เนื่องจากต้องทำแข่งกับเวลาและเกิดขึ้นต่อสาธารณะ
- ธุรกรรมที่ล้มเหลวยังคงเสียค่าก๊าซ หากการมิ้นต์ของคุณถูกย้อนกลับ ไม่ว่าจะเพราะขายหมดแล้ว คุณไม่มีชื่ออยู่ใน allowlist หรือสัญญาเกิดข้อผิดพลาด เครือข่ายก็ยังเรียกเก็บค่าก๊าซสำหรับงานที่ดำเนินการไปก่อนการย้อนกลับ
- การแซงหน้าธุรกรรม ในช่วงเปิดขาย NFT ยอดนิยม บอตจะเฝ้าดู mempool และจ่ายค่าธรรมเนียมลำดับความสำคัญสูงขึ้นเพื่อแทรกคิวก่อนผู้ซื้อทั่วไป คุณกด “ยืนยัน” แต่สินค้าอาจขายหมดไปแล้ว และธุรกรรมของคุณถูกบันทึกลงบล็อกในภายหลังเมื่อคิวว่างเปล่า
- การมิ้นต์ที่ค้างอยู่ หากคุณตั้งราคาก๊าซต่ำเกินไปเมื่อเทียบกับความต้องการของเครือข่าย ธุรกรรมจะค้างอยู่ใน mempool โดยยังไม่ได้รับการบันทึกลงบล็อก กระเป๋าเงินส่วนใหญ่ให้คุณเร่งธุรกรรมได้ (แทนที่ด้วยธุรกรรมเวอร์ชันที่มีค่าธรรมเนียมสูงกว่า) หรือยกเลิกได้ (แทนที่ด้วยการโอนมูลค่าเป็นศูนย์ให้ตัวคุณเอง โดยใช้ nonce เดิม)
- การนำลายเซ็นกลับมาใช้ซ้ำในการมิ้นต์แบบขี้เกียจ สัญญา voucher ที่เขียนไม่ดีอาจเปิดให้ใช้ลายเซ็นเดิมแลก voucher ได้สองครั้ง สัญญาที่เขียนดีจะติดตาม voucher ที่ใช้ไปแล้วด้วย nonce หรือ mapping และปฏิเสธการใช้ซ้ำ
- ส่งไปยังผู้รับผิดรายกับ
_mintหากสัญญาใช้_mintแบบธรรมดาแทน_safeMintและผู้ซื้อมิ้นต์ไปยังกระเป๋าเงินสัญญาอัจฉริยะที่ไม่ได้ติดตั้งอินเทอร์เฟซตัวรับ ERC-721 โทเคนจะติดค้างอยู่ในกระเป๋านั้น นี่คือเหตุผลที่ OpenZeppelin ไม่แนะนำให้ใช้_mintโดยตรงในกระบวนการที่เปิดให้บุคคลทั่วไปใช้งานอย่างชัดเจน
กรณีเหล่านี้ไม่ใช่เรื่องแปลก แต่เป็นสิ่งที่พบได้ทั่วไปในการมิ้นต์บนเครือข่ายสาธารณะ และคุณจะสังเกตเห็นได้ง่ายขึ้นเมื่อได้เห็นการเปลี่ยนแปลงสถานะเบื้องหลัง
ประเด็นสำคัญ
- การมิ้นต์คือการเรียกใช้ฟังก์ชันเฉพาะ ซึ่งเพิ่มรายการใหม่หนึ่งรายการลงใน mapping ความเป็นเจ้าของ และปล่อยเหตุการณ์
Transferจากที่อยู่ศูนย์ ส่วนงานศิลปะและการประมูลเป็นเพียงองค์ประกอบประกอบการขาย _safeMintของ OpenZeppelin เป็นตัวเลือกมาตรฐานสำหรับใช้งานจริง เพราะป้องกันไม่ให้โทเคนติดค้างในสัญญาที่ไม่สามารถถือโทเคนได้ ควรเลือกใช้แทน_mint- การมิ้นต์ในตลาดหลักจะเขียนข้อมูลใหม่ลงในพื้นที่จัดเก็บ (มีค่าใช้จ่ายสูง) ส่วนการโอนในตลาดรองเพียงเปลี่ยนการอ้างอิงเจ้าของ (ถูกกว่ามาก) นี่คือเหตุผลที่วันมิ้นต์มักเกิดสงครามค่าก๊าซ แต่การขายต่อโดยทั่วไปไม่เป็นเช่นนั้น
- การมิ้นต์แบบขี้เกียจใช้ voucher ที่ลงนามด้วย EIP-712 เพื่อเลื่อนการเขียนข้อมูลบนเชนไปจนถึงผู้ซื้อรายแรก ผู้สร้างจึงไม่ต้องจ่ายอะไรสำหรับสินค้าคงเหลือที่ขายไม่ออก ส่วนผู้ซื้อจ่ายค่าก๊าซที่ต้องจ่ายอยู่แล้ว
- การมิ้นต์ที่ล้มเหลวยังคงเสียค่าก๊าซ ธุรกรรมมิ้นต์ที่ค้างสามารถแทนที่ได้ และการแซงหน้าธุรกรรมเป็นลักษณะของ mempool สาธารณะ ไม่ใช่ข้อบกพร่อง ควรเตรียมงบประมาณให้เหมาะสมและอย่ามิ้นต์ด้วยความตื่นตระหนก



