จัดทำขึ้นเพื่อการศึกษาเท่านั้น ไม่ใช่คำแนะนำการลงทุน การลงทุนอาจทำให้สูญเสียเงินลงทุนได้
คำตอบโดยตรง
ERC-1155 คือมาตรฐานมัลติโทเค็นของ Ethereum สัญญาเดียวสามารถดูแลโทเค็นได้หลายประเภท และ token ID แต่ละรายการอาจแทนยอดคงเหลือที่ทดแทนกันได้ ไอเท็มที่ทดแทนกันไม่ได้ หรือโครงสร้างอุปทานแบบอื่นที่ผู้พัฒนาเลือกใช้ ดังนั้น คีย์ของสินทรัพย์จึงเป็น contract address + token ID ไม่ใช่เพียง ID โทเค็น
มาตรฐานนี้กำหนดการสอบถามยอดคงเหลือแบบรายการเดียวและแบบชุด การโอนอย่างปลอดภัยแบบรายการเดียวและแบบชุด การอนุมัติผู้ดำเนินการแบบครอบคลุม callback ของผู้รับ event การโอน และพฤติกรรม URI ของเมทาดาทาแบบไม่บังคับ แต่ไม่ได้กำหนดว่าใครมีสิทธิ์สร้างโทเค็น อุปทานมีเพดานหรือไม่ เมทาดาทาคงอยู่ถาวรหรือไม่ โทเค็นให้สิทธิทางกฎหมายใด หรือโทเค็นมีมูลค่าเท่าใด คุณสมบัติเหล่านี้ต้องตรวจสอบจากสัญญาที่ใช้งานจริง บทบาทต่าง ๆ และการพึ่งพาภายนอกของสัญญานั้น
วิธีการทำงาน
- ระบุยอดคงเหลือ
balanceOf(account, id)จะแสดงจำนวนของ ID หนึ่งที่บัญชีถืออยู่ ส่วนbalanceOfBatch(accounts, ids)จะสอบถามคู่บัญชีและ ID ที่ตรงกัน สัญญาสองฉบับอาจใช้ ID1กับสินทรัพย์ที่ไม่เกี่ยวข้องกัน ดังนั้น ตัวตนที่ครบถ้วนจึงยังต้องประกอบด้วยเครือข่าย ที่อยู่สัญญา และ ID - อนุญาตผู้เรียกใช้ ผู้ถือสามารถโอนยอดคงเหลือของตนเองหรือเรียก
setApprovalForAll(operator, true)การอนุมัตินี้ครอบคลุม ERC-1155 ทุก ID ที่ผู้ถือเป็นเจ้าของในสัญญานั้น และisApprovedForAll(owner, operator)ใช้ตรวจสอบสถานะ ERC-1155 ไม่มีการอนุมัติแบบเนทีฟที่จำกัดไว้เฉพาะ ID เดียวหรือจำนวนหนึ่ง - ดำเนินการโอนแบบรายการเดียวหรือแบบชุด
safeTransferFromใช้ย้ายหนึ่ง ID และหนึ่งจำนวน ส่วนsafeBatchTransferFromใช้ย้ายอาร์เรย์คู่ขนานidsและvaluesซึ่งต้องมีความยาวและลำดับตรงกัน การรวมเป็นชุดอาจลดค่าใช้จ่ายซ้ำซ้อนของธุรกรรม แต่ไม่ได้รับประกันว่าจะถูกกว่าในทุกการนำไปใช้หรือทุกภาระงาน - ตรวจสอบสัญญาผู้รับ หลังจากอัปเดตยอดคงเหลือและปล่อย event ที่เกี่ยวข้องแล้ว การโอนที่เป็นไปตามมาตรฐานไปยังสัญญาจะเรียก
onERC1155ReceivedหรือonERC1155BatchReceivedหากไม่รองรับ callback ส่งค่าตอบกลับผิด หรือปฏิเสธ โดยทั่วไปการโอนจะถูกย้อนกลับ การตรวจสอบผู้รับช่วยลดโอกาสที่สินทรัพย์จะติดค้างโดยไม่ตั้งใจ แต่ไม่ได้ยืนยันว่าสัญญาผู้รับน่าเชื่อถือหรือมีช่องทางถอนสินทรัพย์ - สร้างสถานะย้อนหลังจาก event การสร้าง การโอน และการเผาทุกครั้งต้องปรากฏใน
TransferSingleหรือTransferBatchการสร้างใช้ที่อยู่ศูนย์เป็นfromส่วนการเผาใช้เป็นtoผู้จัดทำดัชนีสามารถคำนวณยอดคงเหลือและอุปทานสุทธิที่สร้างต่อ ID จาก log เหล่านี้ได้ แต่ต้องประมวลผลประวัติทั้งหมด การปรับโครงสร้างเครือข่าย และการย้ายสัญญาอย่างถูกต้อง - เรียกดูเมทาดาทา ส่วนขยาย URI แบบไม่บังคับอาจส่งคืนเทมเพลตร่วมที่มี
{id}ไคลเอนต์จะแทนที่ด้วย ID โทเค็นฐานสิบหกที่ใช้อักษรตัวพิมพ์เล็กและเติมเลขศูนย์ด้านหน้าให้ครบ 64 อักขระ โดยไม่มีคำนำหน้า0xอย่างไรก็ตาม เมทาดาทายังอาจเปลี่ยนแปลง สูญหาย หรือทำให้เข้าใจผิดได้ เว้นแต่การนำไปใช้และการรับประกันด้านพื้นที่จัดเก็บจะระบุไว้เป็นอย่างอื่น
ตัวอย่างคำนวณ
สัญญาเกมกำหนด ID 1 ให้เหรียญทอง ID 7 ให้บัตรผ่าน และ ID 42 ให้ดาบที่มีชิ้นเดียว Alice ถือ balanceOf(Alice, 1) = 500, balanceOf(Alice, 7) = 3 และ balanceOf(Alice, 42) = 1
- Alice เรียก
safeBatchTransferFromโดยกำหนดids = [1, 7, 42]และvalues = [120, 1, 1]หากผ่านการตรวจสอบ ยอดคงเหลือใหม่ของเธอคือ500 - 120 = 380,3 - 1 = 2และ1 - 1 = 0ส่วนผู้รับจะได้รับจำนวนที่ตรงกัน - สัญญาปล่อย
TransferBatchหากผู้รับเป็นสัญญา สัญญานั้นต้องยอมรับชุดรายการผ่านonERC1155BatchReceivedมิฉะนั้น ธุรกรรมทั้งหมดจะถูกย้อนกลับและการเปลี่ยนแปลงยอดคงเหลือทั้งสามรายการจะไม่เกิดขึ้น - ID
42ทำหน้าที่เหมือนโทเค็นที่ทดแทนกันไม่ได้ เพราะตรรกะการออกและการโอนรักษาอุปทานไว้ที่1เท่านั้น ERC-1155 ไม่ได้บังคับกฎนี้ สัญญาเดียวกันอาจสร้าง ID1เพิ่มในภายหลังได้ตามการควบคุมสิทธิ์ของตนเอง
ความเสี่ยงและการควบคุม
- อำนาจของผู้ดำเนินการครอบคลุมกว้าง ผู้ดำเนินการที่ประสงค์ร้ายหรือถูกเจาะระบบและได้รับอนุมัติผ่าน
setApprovalForAllอาจย้ายทุก ID ที่ผู้ถือเป็นเจ้าของในสัญญานั้น ตรวจสอบที่อยู่ผู้ดำเนินการและสัญญา ใช้กระเป๋าแยกเมื่อเหมาะสม และเพิกถอนการอนุมัติที่ไม่จำเป็นแล้ว - อำนาจในการสร้าง ระงับ และอัปเกรด สิ่งเหล่านี้เป็นคุณสมบัติของการนำไปใช้ ไม่ใช่การรับประกันจากมาตรฐาน ควรตรวจสอบผู้ถือบทบาท ผู้ดูแล proxy timelock ส่วนขยายอุปทาน และดูว่าการอัปเกรดสามารถเปลี่ยนยอดคงเหลือหรือกฎการโอนได้หรือไม่
- เมทาดาทาไม่ตรงกับสินทรัพย์ URI หรือไฟล์ JSON ที่โฮสต์ไว้อาจเปลี่ยนไป แม้ ID บนเชนจะคงเดิม ตรวจสอบแฮชของเนื้อหา ความคงทนของพื้นที่จัดเก็บ คำมั่นของผู้ออก และสิทธิที่แสดงอยู่นอกสัญญาโทเค็น
- ข้อผิดพลาดในการเชื่อมต่อระบบ กระเป๋าและผู้จัดทำดัชนีอาจจับคู่อาร์เรย์ชุดผิด พลาด event ในอดีต จัดการการปรับโครงสร้างเครือข่ายไม่ถูกต้อง หรือสับสน ID เดียวกันระหว่างสัญญาและเครือข่าย ควรกระทบยอดการเรียกสัญญา log และยอดคงเหลือสุดท้าย
- ความเสี่ยงจากผู้รับและ reentrancy callback ของผู้รับจะเรียกใช้โค้ดภายนอกระหว่างขั้นตอนการโอน การนำไปใช้และโปรโตคอลที่เชื่อมต่อกันต้องจัดลำดับสถานะและมีการป้องกัน reentrancy ที่เหมาะสม การรองรับ callback เพียงอย่างเดียวไม่ถือเป็นการตรวจสอบความปลอดภัย
- ความเสี่ยงด้านต้นทุนและสภาพคล่อง การโอนเป็นชุดยังคงใช้ gas และจะถูกย้อนกลับทั้งชุดหากเงื่อนไขที่จำเป็นข้อใดข้อหนึ่งล้มเหลว ERC-1155 ไม่ครอบคลุมสภาพคล่องของตลาด การกำหนดราคา ค่าลิขสิทธิ์ การเชื่อมข้ามเครือข่าย การไถ่ถอน หรือการบังคับใช้สิทธินอกเชน
ความเข้าใจผิดที่พบบ่อย
- “ทุก ID คือ NFT” ID หนึ่งอาจมีจำนวนเท่าใดก็ได้ การทดแทนกันไม่ได้ขึ้นอยู่กับอุปทานและความหมายที่การนำไปใช้กำหนด
- “หนึ่งสัญญาหมายถึงหนึ่งคอลเลกชัน” สัญญาหนึ่งอาจมีโทเค็นหลายประเภทที่ไม่เกี่ยวข้องกัน และ ID ตัวเลขเดียวกันในอีกสัญญาหนึ่งหมายถึงสินทรัพย์คนละรายการ
- “การโอนอย่างปลอดภัยหมายความว่าสินทรัพย์ปลอดภัย” callback ตรวจสอบความเข้ากันได้ของผู้รับ ไม่ได้ตรวจสอบคุณภาพของสัญญา ราคา เมทาดาทา หรือความสามารถในการเรียกคืนสินทรัพย์
- “การรวมเป็นชุดช่วยประหยัด gas เสมอ” การรวมเป็นชุดมักลดค่าใช้จ่ายซ้ำซ้อนได้ แต่ผลจริงขึ้นอยู่กับการนำไปใช้ จำนวน ID การเปลี่ยนแปลงพื้นที่จัดเก็บ calldata และรูปแบบค่าธรรมเนียมของเครือข่าย