การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

avatar
十四君
2ปี ที่แล้ว
ประมาณ 7632คำ,ใช้เวลาอ่านบทความฉบับเต็มประมาณ 10นาที
บทความนี้เกี่ยวข้องกับโปรโตคอลมาตรฐาน ERC721 และอธิบายวิธีที่ Mint, safeMint, Transfer และอื่นๆ ใช้การจัดการ

เชิงนามธรรม

ชื่อเรื่องรอง

บทความนี้เกี่ยวข้องกับโปรโตคอลมาตรฐาน ERC721 อธิบายวิธีที่ Mint, safeMint, Transfer และอื่นๆ ใช้การจัดการสินทรัพย์ และทำความเข้าใจการออกแบบความปลอดภัยและองค์ประกอบต้นทุนของการโยงข้อมูล Ethereum โดยการตีความโค้ด

เค้าร่างไดเร็กทอรี

  • เค้าร่างไดเร็กทอรี

  • 1. สิ่งที่เรียกว่าสินทรัพย์ NFT คืออะไร?

  • ข้อความ

  • ข้อความ

  • ข้อความ

5. พื้นที่เก็บข้อมูลบน Ethereum แพงแค่ไหน?

  • ชื่อเรื่องรอง

  • เชิงวัตถุ

  • การวิจัยและพัฒนา - อ่านได้โดยไม่มีอุปสรรค เข้าใจการออกแบบสัญญาที่ประณีต

ไม่ใช่ RD - อาจไม่เข้าใจรหัสที่ระบุไว้ แต่สามารถเข้าใจแนวคิดการออกแบบของโปรโตคอลมาตรฐาน

ชื่อระดับแรก

บน opensea คุณจะเห็นว่า NFT แต่ละรายการมีหมายเลขเฉพาะ

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

ตัวอย่างเช่น หมายเลข 4132 ในซีรีส์ azuki ในคอลัมน์รายละเอียดของหน้า คุณสามารถดูที่อยู่สัญญา หมายเลข ID เครือข่ายสาธารณะที่มีการปรับใช้ และข้อมูลอื่นๆ ในขณะที่คอลัมน์คุณสมบัติเป็นการตั้งค่าที่มีแอตทริบิวต์ต่างๆ และความหายากที่สอดคล้องกัน (ไม่ใช่ Azuki เอง แต่คำนวณโดยการรวม Opensea)

ชื่อเรื่องรอง

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

และเมื่อเราย้อนกลับไปดูซอร์สโค้ด (ใช้โค้ด 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 ตัดสินความปลอดภัยเป็นหลัก:

  • การตัดสินที่ 1: ตรวจสอบให้แน่ใจว่าที่อยู่การโอนเข้าไม่ใช่ 0x00 (ไม่สามารถโอนที่อยู่หลุมดำออกได้ และการโอนเข้าจะส่งผลให้ทรัพย์สินสูญหาย)

  • การตัดสินที่ 2: ตรวจสอบให้แน่ใจว่าไม่มี NFTID ที่ดำเนินการโดยการแลกเปลี่ยนนี้

  • รหัสสุดท้ายทำอะไรได้บ้าง:

  • การดำเนินการ 1: เพิ่ม 1 ให้กับจำนวน _balances ทั้งหมดที่ถือโดยที่อยู่ที่โอน

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

การดำเนินการ 2: แก้ไขเจ้าของ NFTID ที่สอดคล้องกันไปยังที่อยู่ที่ถ่ายโอน

การดำเนินการ 3: เมื่อธุรกรรมเสร็จสมบูรณ์ เหตุการณ์ที่ส่งจะถูกส่งไป ทำให้ off-chain สามารถตรวจสอบข้อมูลของธุรกรรมนี้ได้

มี _beforeTokenTransfer และ _afterTokenTransfer ตรงกลาง ซึ่งเป็นฟังก์ชันเสมือน ตามมาตรฐาน ฝั่งโครงการจะใช้ฟังก์ชันเหล่านี้เพื่อเพิ่มรหัสลอจิกเฉพาะโดยไม่ต้องแก้ไขโปรโตคอลมาตรฐาน

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

2.2 ทำไม safeMint ถึงปลอดภัยกว่า

safeMint หมายถึง การหล่อที่ปลอดภัย จากการใช้โค้ด จะเห็นได้ว่ามันเรียก MInt เองเช่นกัน แต่เพิ่มการตัดสินของ _checkOnERC721Received ซึ่งเป็นของมาตรฐาน ERC165 ซึ่งเทียบเท่ากับการตัดสินอีกฝ่ายหลังจากการดำเนินการถ่ายโอน เสร็จสิ้น ไม่ว่าที่อยู่จะเป็นที่อยู่ของหลุมดำ (นั่นคือ ที่อยู่ที่ไม่สามารถเริ่มต้นการทำธุรกรรม NFT ได้) เพื่อป้องกันเมื่ออ็อบเจกต์การถ่ายโอนเป็นที่อยู่ของสัญญาและสัญญาไม่มีฟังก์ชันการถ่ายโอนที่ตั้งไว้ล่วงหน้า ส่งผลให้ ในทรัพย์สินที่ไม่สามารถโอนออกไปได้ทำให้เกิดการสูญเสียอย่างถาวรhttps://eips.ethereum.org/EIPS/eip-165

2.3 ERC165 ป้องกันการถ่ายโอนทรัพย์สินเข้าสู่หลุมดำได้อย่างไร?

ความตั้งใจดั้งเดิมของการออกแบบสามารถเห็นได้:

เป็นข้อเสนอเพื่อสร้างมาตรฐานของอินเทอร์เฟซของสัญญา ในไวยากรณ์การเขียนโปรแกรม interface หมายถึงส่วนต่อประสาน ฟังก์ชันที่กำหนดไว้ในนั้นไม่สามารถดำเนินการได้ และใส่เฉพาะพารามิเตอร์ที่เกี่ยวข้องของชื่อฟังก์ชันเท่านั้น เมื่อโปรแกรมมีความซับซ้อน เทียบเท่ากับไดเร็กทอรีและบอกผู้อื่นโดยทั่วไปว่าฉันมีฟังก์ชันอะไร

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

อย่างไรก็ตาม วิธีการเขียนอินเทอร์เฟซมีข้อดีและข้อเสียของตัวเอง ชื่อกำหนด ประเภทพารามิเตอร์และแม้ว่าจะมีอยู่ก็แตกต่างกัน

ดังนั้น ในที่สุด ข้อเสนอนี้จึงกลายเป็นมาตรฐาน ERC165 ซึ่งเป็นมาตรฐานกฎการระบุตัวตนของอินเทอร์เฟซ

ขั้นตอนการใช้งานคือ:

ขั้นตอนที่ 1 ตรวจสอบว่ามีฟังก์ชัน supportInterface หรือไม่ และเป็นไปตามมาตรฐาน 165

(ปล.: ให้สัญญามีฟังก์ชันการรับและถ่ายโอน NFT ซึ่งสามารถรับรู้ได้โดยการแนะนำแพ็คเกจส่วนขยาย IERC721Receiver.sol)

ข้อความ

  • การออกแบบโปรโตคอลมาตรฐานมีวิธีการถ่ายโอนสองวิธี ได้แก่ การถ่ายโอนและการถ่ายโอนจาก ซึ่งใช้ในสองสถานการณ์:

  • โอน โอน: ผู้ใช้เรียกให้โอน NFTID ที่กระเป๋าเงินถืออยู่โดยส่งข้อความนี้ไปยังที่อยู่ที่ระบุ

เปรียบเทียบกับ:

  • โอนจาก โอนจาก: เรียกโดยองค์กรหนึ่ง ผู้ใช้จำเป็นต้องอนุญาตที่อยู่หนึ่งก่อน เพื่อให้มีสิทธิ์ในการโอน

  • เปรียบเทียบกับ:

การโอนเป็นธุรกรรมเงินสด จ่ายด้วยเงินจากกระเป๋าของคุณเอง

TransferFrom คือการสแกนรหัสเพื่อหักเงินและร้านค้าจะใช้สำหรับการหักขึ้นอยู่กับว่าผู้ใช้เปิดอำนาจหัก ณ ที่จ่ายจำนวนน้อยหรือไม่

ต่อไป มาดูโค้ดกัน ซึ่งอาจมีรายละเอียดที่คาดไม่ถึง

3.1 การถ่ายโอนทำงานอย่างไร

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

เขาจะตรวจสอบว่าบุคคลจากธุรกรรมปัจจุบันเป็นเจ้าของ NFTID นี้หรือไม่ และจำกัดไม่ให้โอน NFT ไปยังที่อยู่ 0x00 ถัดไป รีเฟรชยอดคงเหลือของที่อยู่ต้นทางสำหรับโอนออกและไปยังที่อยู่สำหรับโอนเข้า แก้ไขตัวแปรส่วนกลาง _balances และรีเซ็ต _owners เพื่อเปลี่ยนที่อยู่ของเจ้าของ NFTID นี้เป็น to

นี่คือรายละเอียดการป้องกัน ขั้นแรกให้ดำเนินการ _approve(address(0), tokenId); เพื่อล้างประวัติการอนุญาต หากไม่มีขั้นตอนดังกล่าว การโอนสินทรัพย์จะเสร็จสมบูรณ์ แต่การอนุญาตการโอนของ NFTID นั้นยังคงอยู่ คิดว่า อย่างระมัดระวัง:

3.2 วิธีการทำงานของ TransferFrom

ลักษณะของการทำธุรกรรมที่นี่เรียกว่า _safeTransfer ดังนั้นตรรกะหลักของมันคือส่วนที่จำเป็น

รายละเอียดที่สำคัญที่นี่คือ: _msgSender() นี่เป็นวิธีการใน Context.sol ไลบรารีมาตรฐานของ openzepplin

อันที่จริง มันคือการรับที่อยู่ผู้ส่งของธุรกรรมปัจจุบัน แต่ที่นี่ใช้เวอร์ชันห่อหุ้มแทนการใช้ msg.sender โดยตรง

ดังนั้นสัญญาบางอย่างที่อยู่ตรงกลางคล้ายกับห้องสมุดจำเป็นต้องพิจารณาสถานการณ์นี้เป็นพิเศษ

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

ส่วนที่เหลือของคำพิพากษาคือการพิจารณาว่ามีบันทึกการอนุญาตหรือไม่ ซึ่งง่ายต่อการเข้าใจและจะไม่ทำซ้ำ

ชื่อระดับแรก

4. ข้อมูลอื่น ๆ ที่สามารถเก็บไว้ในห่วงโซ่?

หลังจากอ่านลิงก์การทำธุรกรรมนักเรียนใหม่หลายคนรู้สึกประหลาดใจจริง ๆ ปรากฎว่า NFT ที่ฉันซื้อมีเพียง ID เดียวที่มีที่อยู่ระบุแหล่งที่มาซึ่งชี้มาที่ฉัน ถึงกระนั้นข้อมูลหายากอยู่ที่ไหน? ภาพ NFT ของฉันอยู่ที่ไหน

นี่คือส่วนขยายข้อมูลเมตา IERC721Metadata.sol ที่เกี่ยวข้องกับ ERC721

คุณสามารถใส่อะไรก็ได้ที่คุณต้องการ แต่ฝ่ายโปรเจ็กต์มักจะเก็บเฉพาะที่อยู่ ID+IPFS พื้นฐานที่สุดบนเชน

เราสามารถดูข้อมูลโครงการบางส่วนผ่านวิธีการสอน Etherscan ก่อนหน้านี้ได้หรือไม่

ที่อยู่ในสัญญาของ Azuki คือ: 0xed5af388653567af2f388e6224dc7c4b3241c544

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

สำหรับโครงการ Metaverse ที่เกิดขึ้นใหม่เมื่อเร็วๆ นี้ Metaverse land sandbox และ **Decentraland รวมถึง **Axie Infinity ที่ลุกเป็นไฟของปีที่แล้ว ข้อมูลเมตาพื้นฐานที่จัดเก็บไว้ในเชนคือ ID+URL เท่านั้น

พวกเช่นมิเรอร์ได้รับการออกแบบมาเป็นพิเศษสำหรับต้นทุนที่ต่ำและการจัดเก็บที่สูง บล็อกมักจะเริ่มต้นที่ 30M ซึ่งประมาณ 1,000 เท่าของ Ethereum

ชื่อระดับแรก

5. พื้นที่เก็บข้อมูลบน Ethereum แพงแค่ไหน?

  • นี่คือจุดที่บทความนี้ยากขึ้นเล็กน้อย มาวิเคราะห์องค์ประกอบต้นทุนและการแปลงจำนวนเงินของที่เก็บข้อมูลแบบออนไลน์จากซอร์สโค้ด

  • การสร้างต้นทุนจะมีสองด้านตามกระบวนการดำเนินการ

เมื่อผู้ใช้เริ่มต้นธุรกรรม ข้อมูลที่จะเขียนบนเชนจะถูกส่งผ่านเป็นพารามิเตอร์ และขนาดของข้อมูลคือต้นทุน

ธุรกรรมดำเนินการตามรหัสสัญญา และ EVM จะคำนวณต้นทุนก๊าซที่ใช้ตามการปรับเปลี่ยนและการใช้งาน

การตีความซอร์สโค้ด: NFT ที่คุณซื้อคืออะไรกันแน่

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 หนีไปพร้อมกับบัคเก็ตได้หรือไม่?

เรากำลังดูอะไรเมื่อเราดู Etherscan?

เมื่อ NFT ของ Netflix ลืมความปลอดภัยทางธุรกิจของ web2

บทความต้นฉบับ, ผู้เขียน:十四君。พิมพ์ซ้ำ/ความร่วมมือด้านเนื้อหา/ค้นหารายงาน กรุณาติดต่อ report@odaily.email;การละเมิดการพิมพ์ซ้ำกฎหมายต้องถูกตรวจสอบ

ODAILY เตือนขอให้ผู้อ่านส่วนใหญ่สร้างแนวคิดสกุลเงินที่ถูกต้องและแนวคิดการลงทุนมอง blockchain อย่างมีเหตุผลและปรับปรุงการรับรู้ความเสี่ยงอย่างจริงจัง สำหรับเบาะแสการกระทำความผิดที่พบสามารถแจ้งเบาะแสไปยังหน่วยงานที่เกี่ยวข้องในเชิงรุก

การอ่านแนะนำ
ตัวเลือกของบรรณาธิการ