เชิงนามธรรม
ชื่อเรื่องรอง
บทความนี้เกี่ยวข้องกับโปรโตคอลมาตรฐาน ERC721 อธิบายวิธีที่ Mint, safeMint, Transfer และอื่นๆ ใช้การจัดการสินทรัพย์ และทำความเข้าใจการออกแบบความปลอดภัยและองค์ประกอบต้นทุนของการโยงข้อมูล Ethereum โดยการตีความโค้ด
เค้าร่างไดเร็กทอรี
เค้าร่างไดเร็กทอรี
1. สิ่งที่เรียกว่าสินทรัพย์ NFT คืออะไร?
ข้อความ
ข้อความ
ข้อความ
5. พื้นที่เก็บข้อมูลบน Ethereum แพงแค่ไหน?
ชื่อเรื่องรอง
เชิงวัตถุ
การวิจัยและพัฒนา - อ่านได้โดยไม่มีอุปสรรค เข้าใจการออกแบบสัญญาที่ประณีต
ไม่ใช่ RD - อาจไม่เข้าใจรหัสที่ระบุไว้ แต่สามารถเข้าใจแนวคิดการออกแบบของโปรโตคอลมาตรฐาน
ชื่อระดับแรก
บน opensea คุณจะเห็นว่า NFT แต่ละรายการมีหมายเลขเฉพาะ
ตัวอย่างเช่น หมายเลข 4132 ในซีรีส์ azuki ในคอลัมน์รายละเอียดของหน้า คุณสามารถดูที่อยู่สัญญา หมายเลข ID เครือข่ายสาธารณะที่มีการปรับใช้ และข้อมูลอื่นๆ ในขณะที่คอลัมน์คุณสมบัติเป็นการตั้งค่าที่มีแอตทริบิวต์ต่างๆ และความหายากที่สอดคล้องกัน (ไม่ใช่ Azuki เอง แต่คำนวณโดยการรวม Opensea)
ชื่อเรื่องรอง
และเมื่อเราย้อนกลับไปดูซอร์สโค้ด (ใช้โค้ด openzepplin ของไลบรารีมาตรฐาน ERC721 ที่นี่) เราจะพบว่าโปรแกรมบันทึกตัวแปรประเภทพจนานุกรมทั่วโลกสองตัว และบันทึก ID ที่สอดคล้องปัจจุบันทั้งหมดของแต่ละ ID ใน _owners โดยการแมปแอดเดรสกับ ตัวเลข หรือบันทึกจำนวน NFT ทั้งหมดที่มีโดยเจ้าของปัจจุบันด้วย _balances
และเนื่องจาก ERC721 ช่วยให้ตัวแปร _owners มี ID ที่สอดคล้องกับที่อยู่อย่างสร้างสรรค์ จึงจัดการที่อยู่และยอดคงเหลือด้วย ERC20 เท่านั้น _balances จึงแยกแยะความแตกต่างระหว่าง FT (ความเป็นเนื้อเดียวกัน) และ NFT (ความไม่เป็นเนื้อเดียวกัน)
ชื่อระดับแรก
2.1 มิ้นท์ทำงานอย่างไรเมื่อ NFT ของ Netflix ลืมความปลอดภัยทางธุรกิจของ web2
Mint หมายถึงการคัดเลือกนักแสดงซึ่งเป็นกระบวนการสร้างของแต่ละ NFT เช่น Love Death Machine NFT ก่อนหน้า
เมื่อ NFT ของ Netflix ลืมความปลอดภัยทางธุรกิจของ web2
โรงกษาปณ์ได้รับใบรับรองทรัพย์สินของ NFT
ดังที่เห็นได้จากซอร์สโค้ด Mint ตัดสินความปลอดภัยเป็นหลัก:
การตัดสินที่ 2: ตรวจสอบให้แน่ใจว่าไม่มี NFTID ที่ดำเนินการโดยการแลกเปลี่ยนนี้
รหัสสุดท้ายทำอะไรได้บ้าง:
การดำเนินการ 1: เพิ่ม 1 ให้กับจำนวน _balances ทั้งหมดที่ถือโดยที่อยู่ที่โอน
การตัดสินที่ 1: ตรวจสอบให้แน่ใจว่าที่อยู่การโอนเข้าไม่ใช่ 0x00 (ไม่สามารถโอนที่อยู่หลุมดำออกได้ และการโอนเข้าจะส่งผลให้ทรัพย์สินสูญหาย)
การดำเนินการ 2: แก้ไขเจ้าของ NFTID ที่สอดคล้องกันไปยังที่อยู่ที่ถ่ายโอน
การดำเนินการ 3: เมื่อธุรกรรมเสร็จสมบูรณ์ เหตุการณ์ที่ส่งจะถูกส่งไป ทำให้ off-chain สามารถตรวจสอบข้อมูลของธุรกรรมนี้ได้
มี _beforeTokenTransfer และ _afterTokenTransfer ตรงกลาง ซึ่งเป็นฟังก์ชันเสมือน ตามมาตรฐาน ฝั่งโครงการจะใช้ฟังก์ชันเหล่านี้เพื่อเพิ่มรหัสลอจิกเฉพาะโดยไม่ต้องแก้ไขโปรโตคอลมาตรฐาน
2.2 ทำไม safeMint ถึงปลอดภัยกว่า
safeMint หมายถึง การหล่อที่ปลอดภัย จากการใช้โค้ด จะเห็นได้ว่ามันเรียก MInt เองเช่นกัน แต่เพิ่มการตัดสินของ _checkOnERC721Received ซึ่งเป็นของมาตรฐาน ERC165 ซึ่งเทียบเท่ากับการตัดสินอีกฝ่ายหลังจากการดำเนินการถ่ายโอน เสร็จสิ้น ไม่ว่าที่อยู่จะเป็นที่อยู่ของหลุมดำ (นั่นคือ ที่อยู่ที่ไม่สามารถเริ่มต้นการทำธุรกรรม NFT ได้) เพื่อป้องกันเมื่ออ็อบเจกต์การถ่ายโอนเป็นที่อยู่ของสัญญาและสัญญาไม่มีฟังก์ชันการถ่ายโอนที่ตั้งไว้ล่วงหน้า ส่งผลให้ ในทรัพย์สินที่ไม่สามารถโอนออกไปได้ทำให้เกิดการสูญเสียอย่างถาวรhttps://eips.ethereum.org/EIPS/eip-165
2.3 ERC165 ป้องกันการถ่ายโอนทรัพย์สินเข้าสู่หลุมดำได้อย่างไร?
ความตั้งใจดั้งเดิมของการออกแบบสามารถเห็นได้:
เป็นข้อเสนอเพื่อสร้างมาตรฐานของอินเทอร์เฟซของสัญญา ในไวยากรณ์การเขียนโปรแกรม interface หมายถึงส่วนต่อประสาน ฟังก์ชันที่กำหนดไว้ในนั้นไม่สามารถดำเนินการได้ และใส่เฉพาะพารามิเตอร์ที่เกี่ยวข้องของชื่อฟังก์ชันเท่านั้น เมื่อโปรแกรมมีความซับซ้อน เทียบเท่ากับไดเร็กทอรีและบอกผู้อื่นโดยทั่วไปว่าฉันมีฟังก์ชันอะไร
อย่างไรก็ตาม วิธีการเขียนอินเทอร์เฟซมีข้อดีและข้อเสียของตัวเอง ชื่อกำหนด ประเภทพารามิเตอร์และแม้ว่าจะมีอยู่ก็แตกต่างกัน
ดังนั้น ในที่สุด ข้อเสนอนี้จึงกลายเป็นมาตรฐาน ERC165 ซึ่งเป็นมาตรฐานกฎการระบุตัวตนของอินเทอร์เฟซ
ขั้นตอนการใช้งานคือ:
ขั้นตอนที่ 1 ตรวจสอบว่ามีฟังก์ชัน supportInterface หรือไม่ และเป็นไปตามมาตรฐาน 165
(ปล.: ให้สัญญามีฟังก์ชันการรับและถ่ายโอน NFT ซึ่งสามารถรับรู้ได้โดยการแนะนำแพ็คเกจส่วนขยาย IERC721Receiver.sol)
ข้อความ
การออกแบบโปรโตคอลมาตรฐานมีวิธีการถ่ายโอนสองวิธี ได้แก่ การถ่ายโอนและการถ่ายโอนจาก ซึ่งใช้ในสองสถานการณ์:
โอน โอน: ผู้ใช้เรียกให้โอน NFTID ที่กระเป๋าเงินถืออยู่โดยส่งข้อความนี้ไปยังที่อยู่ที่ระบุ
เปรียบเทียบกับ:
โอนจาก โอนจาก: เรียกโดยองค์กรหนึ่ง ผู้ใช้จำเป็นต้องอนุญาตที่อยู่หนึ่งก่อน เพื่อให้มีสิทธิ์ในการโอน
เปรียบเทียบกับ:
การโอนเป็นธุรกรรมเงินสด จ่ายด้วยเงินจากกระเป๋าของคุณเอง
TransferFrom คือการสแกนรหัสเพื่อหักเงินและร้านค้าจะใช้สำหรับการหักขึ้นอยู่กับว่าผู้ใช้เปิดอำนาจหัก ณ ที่จ่ายจำนวนน้อยหรือไม่
ต่อไป มาดูโค้ดกัน ซึ่งอาจมีรายละเอียดที่คาดไม่ถึง
3.1 การถ่ายโอนทำงานอย่างไร
เขาจะตรวจสอบว่าบุคคลจากธุรกรรมปัจจุบันเป็นเจ้าของ NFTID นี้หรือไม่ และจำกัดไม่ให้โอน NFT ไปยังที่อยู่ 0x00 ถัดไป รีเฟรชยอดคงเหลือของที่อยู่ต้นทางสำหรับโอนออกและไปยังที่อยู่สำหรับโอนเข้า แก้ไขตัวแปรส่วนกลาง _balances และรีเซ็ต _owners เพื่อเปลี่ยนที่อยู่ของเจ้าของ NFTID นี้เป็น to
นี่คือรายละเอียดการป้องกัน ขั้นแรกให้ดำเนินการ _approve(address(0), tokenId); เพื่อล้างประวัติการอนุญาต หากไม่มีขั้นตอนดังกล่าว การโอนสินทรัพย์จะเสร็จสมบูรณ์ แต่การอนุญาตการโอนของ NFTID นั้นยังคงอยู่ คิดว่า อย่างระมัดระวัง:
3.2 วิธีการทำงานของ TransferFrom
ลักษณะของการทำธุรกรรมที่นี่เรียกว่า _safeTransfer ดังนั้นตรรกะหลักของมันคือส่วนที่จำเป็น
รายละเอียดที่สำคัญที่นี่คือ: _msgSender() นี่เป็นวิธีการใน Context.sol ไลบรารีมาตรฐานของ openzepplin
อันที่จริง มันคือการรับที่อยู่ผู้ส่งของธุรกรรมปัจจุบัน แต่ที่นี่ใช้เวอร์ชันห่อหุ้มแทนการใช้ msg.sender โดยตรง
ดังนั้นสัญญาบางอย่างที่อยู่ตรงกลางคล้ายกับห้องสมุดจำเป็นต้องพิจารณาสถานการณ์นี้เป็นพิเศษ
ส่วนที่เหลือของคำพิพากษาคือการพิจารณาว่ามีบันทึกการอนุญาตหรือไม่ ซึ่งง่ายต่อการเข้าใจและจะไม่ทำซ้ำ
ชื่อระดับแรก
4. ข้อมูลอื่น ๆ ที่สามารถเก็บไว้ในห่วงโซ่?
หลังจากอ่านลิงก์การทำธุรกรรมนักเรียนใหม่หลายคนรู้สึกประหลาดใจจริง ๆ ปรากฎว่า NFT ที่ฉันซื้อมีเพียง ID เดียวที่มีที่อยู่ระบุแหล่งที่มาซึ่งชี้มาที่ฉัน ถึงกระนั้นข้อมูลหายากอยู่ที่ไหน? ภาพ NFT ของฉันอยู่ที่ไหน
นี่คือส่วนขยายข้อมูลเมตา IERC721Metadata.sol ที่เกี่ยวข้องกับ ERC721
คุณสามารถใส่อะไรก็ได้ที่คุณต้องการ แต่ฝ่ายโปรเจ็กต์มักจะเก็บเฉพาะที่อยู่ ID+IPFS พื้นฐานที่สุดบนเชน
เราสามารถดูข้อมูลโครงการบางส่วนผ่านวิธีการสอน Etherscan ก่อนหน้านี้ได้หรือไม่
ที่อยู่ในสัญญาของ Azuki คือ: 0xed5af388653567af2f388e6224dc7c4b3241c544
สำหรับโครงการ Metaverse ที่เกิดขึ้นใหม่เมื่อเร็วๆ นี้ Metaverse land sandbox และ **Decentraland รวมถึง **Axie Infinity ที่ลุกเป็นไฟของปีที่แล้ว ข้อมูลเมตาพื้นฐานที่จัดเก็บไว้ในเชนคือ ID+URL เท่านั้น
พวกเช่นมิเรอร์ได้รับการออกแบบมาเป็นพิเศษสำหรับต้นทุนที่ต่ำและการจัดเก็บที่สูง บล็อกมักจะเริ่มต้นที่ 30M ซึ่งประมาณ 1,000 เท่าของ Ethereum
ชื่อระดับแรก
5. พื้นที่เก็บข้อมูลบน Ethereum แพงแค่ไหน?
นี่คือจุดที่บทความนี้ยากขึ้นเล็กน้อย มาวิเคราะห์องค์ประกอบต้นทุนและการแปลงจำนวนเงินของที่เก็บข้อมูลแบบออนไลน์จากซอร์สโค้ด
การสร้างต้นทุนจะมีสองด้านตามกระบวนการดำเนินการ
เมื่อผู้ใช้เริ่มต้นธุรกรรม ข้อมูลที่จะเขียนบนเชนจะถูกส่งผ่านเป็นพารามิเตอร์ และขนาดของข้อมูลคือต้นทุน
ธุรกรรมดำเนินการตามรหัสสัญญา และ EVM จะคำนวณต้นทุนก๊าซที่ใช้ตามการปรับเปลี่ยนและการใช้งาน
5.1 ค่าใช้จ่ายในการเริ่มต้นการทำธุรกรรม
เราสามารถตรวจสอบ Ethereum Yellow Paper ซึ่งมีคำจำกัดความที่ชัดเจนของก๊าซที่ใช้ตามขนาดข้อมูลธุรกรรม
คุณสามารถดูราคาของพารามิเตอร์ที่แนบมากับการแลกเปลี่ยน:
การทำธุรกรรมแต่ละครั้งมี 21,000 GAS ที่ต้องจ่าย
จ่าย 68 GAS สำหรับแต่ละข้อมูลหรือรหัสของธุรกรรมที่ไม่เป็นศูนย์
จ่าย 4 GAS สำหรับแต่ละข้อมูลหรือรหัสศูนย์ไบต์ของการทำธุรกรรม
ดังนั้น หากคุณลงทะเบียนข้อมูลแอตทริบิวต์ NFT บางอย่างใน Mint ส่วนข้อมูลของธุรกรรมจะแปลงอักขระ เช่น abc เป็นเลขฐานสิบหกสองตัว และอักขระแต่ละตัวเป็นไบนารีแปดบิต ซึ่งเท่ากับหนึ่งไบต์ ดังนั้นจึงสามารถประมาณเท่ากับการหารความยาวของข้อมูลด้วย 2 เป็นจำนวนไบต์
และข้อมูลขนาด 1kb หากเป็นข้อมูลข้อความที่ไม่ใช่ศูนย์ที่มีเนื้อหาข้อมูลทั้งหมด จะเทียบเท่ากับการเพิ่มปริมาณการใช้ก๊าซ 68*1000=6.8W ตามราคาก๊าซ 20gwei และราคา 2,000 eth ที่แลกเปลี่ยนเป็นดอลลาร์สหรัฐ สามารถประมาณได้ว่าข้อมูลทุกๆ 1kb ในห่วงโซ่จะต้อง:
20*(21000+68000)*1e9/1e18 * 2000 = 3.5 เหรียญสหรัฐ
func gasSStore(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64)(uint64, error)
5.2 ค่าใช้จ่ายในการจัดเก็บตามสัญญา
เนื่องจากมีลอจิกที่เก็บไว้ในสัญญาอัจฉริยะหลังจากการทำธุรกรรมเริ่มต้นขึ้น มาวิเคราะห์ปริมาณการใช้เฉพาะจากซอร์สโค้ดของ Ethereum go (EIP1283) โค้ดนี้อยู่ในฟังก์ชันโดยเฉพาะ ซึ่งยาวเกินกว่าจะใช้ได้:
ในอดีต การประมาณปริมาณการใช้ก๊าซได้ผ่านการทำซ้ำหลายครั้ง หากไม่ได้เปิดใช้งาน Petersburg หรือ Constantinople การคำนวณจะไม่ดำเนินการตามตรรกะต่อไปนี้
การคำนวณปริมาณการใช้ก๊าซขึ้นอยู่กับการจัดการข้อมูล 3 ประเภท (เพิ่ม ลบ แก้ไข)
จากแอดเดรสที่มีค่าเป็นศูนย์เป็นค่าที่ไม่ใช่ศูนย์ (ค่าใหม่) ช่องจัดเก็บแต่ละช่องใช้ก๊าซ 2W
จากที่อยู่ที่มีค่าไม่เป็นศูนย์ไปจนถึงที่อยู่ที่มีค่าเป็นศูนย์ (DELETE) ช่องจัดเก็บแต่ละช่องต้องใช้ก๊าซ 5K แต่จะมีผลตอบแทนเป็นผลตอบแทนของก๊าซ 1.5W
จากที่ไม่ใช่ศูนย์ถึงไม่เป็นศูนย์ (เปลี่ยน) ช่องจัดเก็บแต่ละช่องใช้ก๊าซ 200
โปรดทราบว่าช่องเก็บข้อมูลแต่ละช่องด้านบนนับเป็น 32 ไบต์ และพื้นที่เก็บข้อมูล 1kb คือช่องเก็บข้อมูล 32 ช่อง กระบวนการของ Mint คือการเพิ่มที่เก็บข้อมูลใหม่ ดังนั้นหากมีการจัดเก็บข้อมูลเพิ่มเติม 1kb บนเชน ค่าใช้จ่ายจะเป็น 64Wgas และจำนวนการแปลงคือ:
EIP-5058 สามารถป้องกันไม่ให้โปรเจกต์ NFT หนีไปพร้อมกับบัคเก็ตได้หรือไม่?
EIP-5058 สามารถป้องกันไม่ให้โปรเจกต์ NFT หนีไปพร้อมกับบัคเก็ตได้หรือไม่?