BTC
ETH
HTX
SOL
BNB
ดูตลาด
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

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

十四君
特邀专栏作者
2022-06-14 03:00
บทความนี้มีประมาณ 3811 คำ การอ่านทั้งหมดใช้เวลาประมาณ 6 นาที
บทความนี้เกี่ยวข้องกับโปรโตคอลมาตรฐาน ERC721 และอธิบายวิธีที่ Mint, safeMint, Transfer และอื่นๆ ใช้การจัดการ
สรุปโดย AI
ขยาย
บทความนี้เกี่ยวข้องกับโปรโตคอลมาตรฐาน ERC721 และอธิบายวิธีที่ Mint, safeMint, Transfer และอื่นๆ ใช้การจัดการ

เชิงนามธรรม

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

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

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

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

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

  • ข้อความ

  • ข้อความ

  • ข้อความ

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

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

  • เชิงวัตถุ

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

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

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

บน 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 ตัดสินความปลอดภัยเป็นหลัก:

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

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

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

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

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

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

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

NFT
ยินดีต้อนรับเข้าร่วมชุมชนทางการของ Odaily
กลุ่มสมาชิก
https://t.me/Odaily_News
กลุ่มสนทนา
https://t.me/Odaily_CryptoPunk
บัญชีทางการ
https://twitter.com/OdailyChina
กลุ่มสนทนา
https://t.me/Odaily_CryptoPunk
ค้นหา
สารบัญบทความ
อันดับบทความร้อน
Daily
Weekly
ดาวน์โหลดแอพ Odaily พลาเน็ตเดลี่
ให้คนบางกลุ่มเข้าใจ Web3.0 ก่อน
IOS
Android