เวิร์กโฟลว์
ERC1155 _mint ในสัญญาไอเทมเกม: จากแผนงานสู่การทดสอบ
03
ชุดไอเทมเกมเพิ่มฟังก์ชันการสร้างโทเคนให้สัญญาไอเทมเกม
คุณต้องการสัญญาเดียวที่ออกดาบ ยา และกุญแจ โดยแต่ละชนิดมี token id เป็นของตัวเอง และต้องการรู้ว่ามีใครบ้างที่ได้รับอนุญาตให้สร้างโทเคนใหม่ ตัวเอเจนต์จะเขียนโค้ด Solidity รันคำสั่งคอมไพล์และเทสต์ของคุณบนเชนท้องถิ่นหรือเทสต์เน็ตเวิร์ก และแสดงแต่ละขั้นตอนเป็นการ์ดพร้อมผลลัพธ์จริง คู่มือนี้มุ่งเน้นไปที่ฟังก์ชันการสร้างโทเคน เพราะผู้ที่มีสิทธิ์เรียกใช้ฟังก์ชันนี้คือผู้กำหนดจำนวนโทเคนที่มีอยู่ เมื่อสัญญาถูกปรับใช้แล้วจะไม่สามารถแก้ไขได้ ดังนั้นทุกขั้นตอนในคู่มือนี้จึงอยู่บนเชนท้องถิ่นหรือเทสต์เน็ตเวิร์ก ซึ่งเหรียญที่ใช้มีมูลค่าเป็นศูนย์ ผู้เริ่มต้นสามารถทำตามขั้นตอนทั้งสี่ตามลำดับ ส่วนผู้ที่มีประสบการณ์สามารถข้ามไปยังส่วนการสาธิตการทำงานด้านล่างได้ ขั้นตอนทั้งสี่นี้ยังใช้ได้กับชุดตั๋ว โดยแต่ละประเภทตั๋วจะมี id เป็นของตัวเอง และฟังก์ชันการสร้างโทเคนจะเป็นผู้กำหนดจำนวนของแต่ละประเภท
01เปิดโฟลเดอร์โปรเจกต์
เปิด WaveClamp เลือกโฟลเดอร์ที่มีไฟล์ .sol และไฟล์เทสต์ของคุณเป็นโฟลเดอร์ทำงานของแชท แล้วเลือก Ask first เพื่อให้การเปลี่ยนแปลงทุกครั้งปรากฏเป็น diff ที่คุณสามารถยอมรับหรือปฏิเสธได้ เครื่องมือจัดการไฟล์จะทำงานภายในโฟลเดอร์นี้ ดังนั้นควรเก็บโปรเจกต์ไว้ในที่เดียว สร้างโฟลเดอร์ชั่วคราวสำหรับการรันครั้งแรกหากคุณต้องการฝึกฝนเท่านั้น
02อธิบายโครงสร้างสัญญา
ขอให้สร้างสัญญาไอเทมเกมที่มีไอเทมสามประเภท ฟังก์ชันการสร้างโทเคนที่เรียกได้เฉพาะบัญชีเจ้าของ และฟังก์ชันการโอนแบบรวมกลุ่ม แล้วปล่อยให้เอเจนต์สร้างไฟล์ด้วย write_file ตั้งชื่อไฟล์ให้ตรงกับชื่อสัญญา เพื่อให้ขั้นตอนถัดไปสามารถอ้างอิงถึงไฟล์นี้ได้ ขอให้คำขอแรกมีขนาดเล็กรวม เพราะคำขอที่สองสามารถเพิ่มฟังก์ชันการโอนแบบรวมกลุ่มได้หลังจากที่ยอมรับ diff แรกแล้ว
03รันคำสั่งคอมไพล์และเทสต์
บอกให้เอเจนต์รันคำสั่งคอมไพล์และคำสั่งเทสต์ของคุณผ่าน Shell จากนั้นอ่าน exit code และชื่อของเทสต์ที่ล้มเหลวจากการ์ดที่ขยายออก การตัดสินความสำเร็จดูจาก exit code จริง ไม่ใช่จากบทสรุป หากคำสั่งคอมไพล์ล้มเหลว การ์ดจะแสดงข้อความข้อผิดพลาด และเอเจนต์สามารถอ่านข้อความนั้นและเสนอการแก้ไขเป็น diff ใหม่ได้
04อ่านผลลัพธ์
เปิดการ์ดที่ขยายออก อ่าน diff และผลลัพธ์จากคำสั่ง ยอมรับส่วนที่ถูกต้อง ปฏิเสธส่วนที่เหลือ และขอการแก้ไขในทุกจุดที่เทสต์ยังล้มเหลว ทำซ้ำจนกว่าเทสต์จะผ่าน จากนั้นอ่านฟังก์ชันการสร้างโทเคนอีกครั้ง รักษาขนาดของ diff ที่ยอมรับให้เล็กเสมอ เพื่อให้การล้มเหลวในภายหลังชี้ไปที่การเปลี่ยนแปลงเพียงจุดเดียว ไม่ใช่หลายจุด
อินเทอร์เฟซพื้นฐานเพื่อเริ่มต้น
WaveClamp · เขียนอินเทอร์เฟซพื้นฐาน● Ask first
เขียน MultiTokenMinimal.sol ที่มีอีเวนต์หนึ่งตัวและฟังก์ชัน view สองตัว จากนั้นคอมไพล์ไฟล์
- write_file
MultiTokenMinimal.solบันทึกแล้ว - read_file
MultiTokenMinimal.sol14 บรรทัด - grep
balanceOfพบ 1 รายการ - Shell
your compile commandexit 0
MultiTokenMinimal.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IMultiTokenMinimal {
event TransferSingle(address indexed operator,
address indexed from, address indexed to,
uint256 id, uint256 value);
function balanceOf(address account, uint256 id)
external view returns (uint256);
function uri(uint256 id)
external view returns (string memory);
}
อินเทอร์เฟซแบบอ่านอย่างเดียวนี้ประกาศอีเวนต์ TransferSingle และฟังก์ชัน balanceOf กับ uri ตามมาตรฐานมัลติโทเคน สัญญานี้ไม่มีสถานะ ไม่มีตรรกะการสร้างโทเคน และไม่มีคีย์ใดๆ ซึ่งทำให้เป็นไฟล์ขนาดเล็กที่ควรอ่านก่อนเพิ่มตรรกะจริง รันคำสั่งคอมไพล์บนไฟล์นี้ก่อน จากนั้นคอมไพล์ให้สำเร็จ แล้วปล่อยให้เอเจนต์ขยายไฟล์ทีละ diff ที่ผ่านการตรวจสอบแล้ว โดยเริ่มจากฟังก์ชันการสร้างโทเคน ชื่อไฟล์ตรงกับป้ายกำกับตัวอย่าง เพื่อให้คุณสามารถขอให้เอเจนต์เปิดไฟล์นี้ได้ในภายหลัง
การสาธิตการทำงาน: สร้างโทเคน เปรียบเทียบ โอนแบบรวมกลุ่ม และอธิบายโทเคน
เพิ่มฟังก์ชันการสร้างโทเคน
เปิดสัญญาและขอให้เอเจนต์ห่อหุ้มตัวช่วย ERC1155 _mint ไว้ในฟังก์ชัน public ที่เรียกได้เฉพาะบัญชีเจ้าของเท่านั้น เอเจนต์จะใช้ read_file เพื่อดูโค้ดปัจจุบันและใช้ edit_file เพื่อแทรกฟังก์ชัน โดยจะแสดงการเปลี่ยนแปลงเป็น diff การใช้งานโอเพนซอร์สทั่วไปมักเปิดเผยตัวช่วยภายในชื่อ _mint และ _mintBatch ซึ่งตัวช่วยภายในไม่มีฟังก์ชันตรวจสอบการเข้าถึงของตัวเอง จึงทำให้การห่อหุ้มนี้มีความสำคัญ คุณสามารถสร้างโทเคน ERC20 ทีละขั้นตอนด้วยวิธีเดียวกัน แต่ชุดไอเทมเกมจำเป็นต้องใช้ id จึงควรเริ่มจากโครงสร้างมัลติโทเคน จากนั้น Shell จะรันคำสั่งคอมไพล์และคำสั่งเทสต์ของคุณ โดยแต่ละการ์ดจะแสดง exit code จริง ยอมรับ diff ก็ต่อเมื่อคุณได้อ่านเทสต์แล้ว
เปรียบเทียบกับตัวอย่าง ERC-721
เปิดตัวอย่างสัญญา ERC721 จากโปรเจกต์ของคุณเอง หรือขอให้เอเจนต์เขียนด้วย write_file แล้ววางไว้ข้างชุดไอเทมของคุณ เอเจนต์จะใช้ grep เพื่อแสดงรายการฟังก์ชันในทั้งสองไฟล์ และใช้ read_file เพื่อเปรียบเทียบวิธีการเก็บข้อมูลความเป็นเจ้าของ: หนึ่งเจ้าของต่อโทเคนในไฟล์โทเคนเดี่ยว และยอดคงเหลือต่อบัญชีและ id ในไฟล์มัลติโทเคน มาตรฐานสำหรับโปรไฟล์แบบกระจายศูนย์ที่ใช้ soulbound NFT จำเป็นต้องใช้โทเคนที่ไม่สามารถโอนย้ายได้ ซึ่งเป็นการออกแบบที่แตกต่างจากไอเทมที่ผู้เล่นสามารถแลกเปลี่ยนกันได้ ขอให้เอเจนต์สรุปความแตกต่างลงในตารางสั้นๆ คุณอ่านการเปรียบเทียบในแชท ตัดสินใจว่ามาตรฐานใดเหมาะกับออกแบบของคุณ แล้วจึงขอการเปลี่ยนแปลงโค้ด
เพิ่มการโอนแบบรวมกลุ่ม
ผู้เล่นมักเคลื่อนย้ายไอเทมหลายประเภทพร้อมกัน ดังนั้นขอให้เอเจนต์เพิ่ม safeBatchTransferFrom และ balanceOfBatch ให้กับสัญญา เอเจนต์จะใช้ edit_file สำหรับการเปลี่ยนแปลง ใช้ glob เพื่อค้นหาไฟล์เทสต์ และใช้ Shell เพื่อรันคำสั่งเทสต์ของคุณหลังจากแต่ละการแก้ไข ฟังก์ชันแบบรวมกลุ่มสามารถโอนหลาย token id ในธุรกรรมเดียว ซึ่งหมายความว่าเทสต์หนึ่งรายการสามารถตรวจสอบยอดคงเหลือได้หลายรายการ การทำความเข้าใจเรื่องการลงทะเบียนแบบไร้แก๊สผ่าน ERC4337 เป็นหัวข้อแยกต่างหาก จึงควรเก็บไว้นอกสัญญาแรกและทดสอบแยกต่างหาก อ่าน diff ในโหมด Ask first รันเทสต์อีกครั้ง และมองหาอีเวนต์ TransferBatch ในผลลัพธ์ก่อนยอมรับการเปลี่ยนแปลง
ตรวจสอบผู้รับและเมตาดาตา
สัญญาที่รับโทเคนต้องดำเนินการ onERC1155Received และ onERC1155BatchReceived และยอมรับโทเคนเหล่านั้น มิฉะนั้นการโอนแบบปลอดภัยจะถูกปฏิเสธ ขอให้เอเจนต์ใช้ grep เพื่อค้นหาชื่อทั้งสอง และเปิดสัญญาผู้รับด้วย read_file จากนั้นแสดงรายการว่าชื่อใดหายไป ขอให้อีกครั้งหนึ่งใช้ edit_file กับค่า uri(id) เพื่อให้มี {id} ซึ่งไคลเอนต์จะแทนที่ด้วย token id เป็นเลขฐานสิบหกตัวพิมพ์เล็ก ที่เติมศูนย์หน้าให้ยาว 64 ตัวอักษร ใช้ write_file สำหรับไฟล์ JSON หนึ่งไฟล์ต่อ id รันคำสั่งคอมไพล์และคำสั่งเทสต์ของคุณ อ่าน exit code ทั้งสอง และตรวจสอบ diff สุดท้ายก่อนยอมรับ