Cointime

Download App
iOS & Android

ทำความเข้าใจ ERC-6551 จากมุมมองโค้ด: NFT กลายเป็นกระเป๋าเงินได้อย่างไร

ผู้เขียน: Javier Calderon เรียบเรียง: Cointime.com 237

การแนะนำ

ยินดีต้อนรับสู่โลกของ Non-Fungible Tokens (NFTs) ซึ่งเป็นสินทรัพย์ดิจิทัลที่ไม่เหมือนใครซึ่งกำลังสร้างคลื่นในพื้นที่บล็อกเชน ด้วยการเพิ่มขึ้นของ NFT เรามองเห็นความเป็นไปได้ที่ขยายออกไปอย่างมากมายที่สามารถทำได้บนเครือข่ายบล็อกเชน หนึ่งในการพัฒนาที่น่าตื่นเต้นคือแนวคิดของ NFT ในฐานะกระเป๋าเงินหรือบัญชี ซึ่งเป็นแนวคิดอันทรงพลังที่จะเปิดโฮสต์ของกรณีการใช้งานและแอปพลิเคชันใหม่ๆ

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

หลักการทำงาน

คู่มือนี้อธิบายกระบวนการแปลง NFT เป็นกระเป๋าเงินหรือบัญชีโดยใช้ข้อเสนอ ERC-6551 ขั้นแรก เราจะสรุปหลักการพื้นฐานเบื้องหลัง ERC-6551 ซึ่งมีอินเทอร์เฟซมาตรฐานและรีจีสทรีแบบไม่ต้องอนุญาตสำหรับการสร้างบัญชีโทเค็นที่ถูกผูกมัด จากนั้น เราจะหารือเกี่ยวกับการใช้ฟังก์ชันเฉพาะในเชิงลึก รวมถึง createAccount และบัญชีใน Registry และอินเทอร์เฟซ IERC6551Account

จากนั้นเราได้สำรวจวิธีนำ IERC6551Account ไปใช้ใน Solidity โดยสร้างสัญญาอัจฉริยะที่ใช้ NFT เป็นกระเป๋าเงิน สัญญานี้มีความสามารถในการรับ ถือ และส่งโทเค็น ERC-20 ซึ่งทำหน้าที่เป็นกระเป๋าเงินแยกต่างหากสำหรับแต่ละ NFT เรายังได้แชร์ตัวอย่างสัญญาอัจฉริยะแบบง่ายที่ใช้ฟังก์ชันนี้ ซึ่งควรเป็นจุดเริ่มต้นที่ดีแก่คุณ

โปรดทราบว่าโค้ดที่เราแชร์มีไว้เพื่อจุดประสงค์ในการอธิบายเท่านั้น และการตรวจสอบและทดสอบโค้ดอย่างละเอียดเป็นสิ่งสำคัญหากคุณวางแผนที่จะนำฟีเจอร์นี้ไปใช้ในเวอร์ชันที่ใช้งานจริง

ความสามารถในการเปลี่ยน NFT เป็นกระเป๋าเงินหรือบัญชีเปิดโอกาสใหม่ๆ ในโลกบล็อกเชน สร้างเอกลักษณ์ทางดิจิทัลที่ไม่เหมือนใครสำหรับ NFT ซึ่งสามารถเป็นเจ้าของและจัดการสินทรัพย์ในเครือข่ายได้ ไม่ว่าจะเป็นการทำให้อวตารเป็นดิจิทัลเพื่อสะสมเนื้อหาของเกม งานศิลป์เพื่อรักษาค่าลิขสิทธิ์ หรือบัตรสะสมคะแนนเพื่อบันทึกการโต้ตอบ สถานการณ์การใช้งานที่เป็นไปได้นั้นน่าสนใจมาก

ดำเนินการ

เทคโนโลยีบล็อกเชนได้ปฏิวัติวิธีที่เราเข้าใจความเป็นเจ้าของสินทรัพย์และการทำธุรกรรม หนึ่งในนั้นคือ Non-Fungible Tokens (NFTs) — สินทรัพย์เฉพาะที่แสดงบนบล็อกเชนซึ่งได้รับความสนใจอย่างมาก อย่างไรก็ตาม แม้จะมีความแตกต่างของสินทรัพย์เหล่านี้ แต่ NFT แบบดั้งเดิมก็มีข้อจำกัดที่สำคัญ: พวกเขาไม่สามารถเป็นเจ้าของสินทรัพย์หรือโต้ตอบกับแอปพลิเคชันได้อย่างอิสระ ดังนั้นการเกิดขึ้นของ ERC-6551 ซึ่งเป็นวิธีการใหม่ในการเปลี่ยน NFT ให้เป็นกระเป๋าเงินหรือบัญชีโดยให้บัญชีเฉพาะของพวกเขา บทความนี้เจาะลึกวิธีนำ ERC-6551 ไปใช้ แสดงวิธีทำให้ NFT มีความยืดหยุ่นมากขึ้น และให้ข้อมูลโค้ดและแนวทางปฏิบัติที่ดีที่สุด

ทำความเข้าใจกับ ERC-6551

ทำความเข้าใจกับ ERC-6551

Ethereum Improvement Proposal (EIP) ERC-6551 เป็นมาตรฐานที่เพิ่งเปิดตัวซึ่งขยายความสามารถของ ERC-721 non-fungible tokens (NFTs) โดยจะกำหนดแต่ละ NFT ให้เป็นบัญชีสัญญาอัจฉริยะที่กำหนดขึ้นได้และไม่ซ้ำกัน ทำให้ NFT สามารถเป็นเจ้าของสินทรัพย์และโต้ตอบกับแอปพลิเคชันโดยไม่ต้องเปลี่ยนแปลงสัญญาอัจฉริยะหรือโครงสร้างพื้นฐาน ERC-721 ที่มีอยู่

ระบบ ERC-6551 ประกอบด้วยองค์ประกอบหลัก 2 ส่วน ได้แก่ รีจีสทรีแบบไม่มีสิทธิ์สำหรับการปรับใช้บัญชีที่เชื่อมโยงกับโทเค็น และอินเทอร์เฟซมาตรฐานสำหรับการนำบัญชีที่เชื่อมโยงกับโทเค็นไปใช้ การลงทะเบียนทำได้โดยการปรับใช้แต่ละบัญชีโทเค็นที่ถูกผูกมัดเป็นสัญญาพร็อกซีขั้นต่ำ ERC-1167 ต่อท้ายข้อมูลคงที่ที่ไม่เปลี่ยนรูปแบบกับรหัสไบต์ ที่อยู่ของแต่ละบัญชีกำหนดขึ้นได้และได้มาจากการรวมกันของที่อยู่การใช้งาน, ที่อยู่สัญญาโทเค็น, ID โทเค็น, ID สาย EIP-155 และค่าเกลือทางเลือก

วิธีการติดตั้ง ERC-6551

ERC-6551 ดำเนินการผ่านสัญญาการลงทะเบียนที่ไม่ได้รับอนุญาต เปลี่ยนไม่ได้ และไม่มีเจ้าของ รีจิสทรีทำหน้าที่เป็นจุดเริ่มต้นเดียวสำหรับโครงการที่ต้องการใช้โทเค็นผูกบัญชี สัญญาการลงทะเบียนมีสองหน้าที่:

1. createAccount : ปรับใช้และผูกบัญชีโทเค็นสำหรับโทเค็น ERC-721 ตามที่อยู่การใช้งาน

2. บัญชี : ฟังก์ชันอ่านอย่างเดียวที่คำนวณที่อยู่บัญชีของโทเค็นที่ผูกกับโทเค็น ERC-721 ตามที่อยู่การใช้งาน

ต่อไปนี้คืออินเทอร์เฟซของสัญญาการลงทะเบียน:

ฟังก์ชันการสร้างบัญชีสามารถใช้เพื่อปรับใช้บัญชีโทเค็นที่ถูกผูกมัดใหม่ได้ หากสร้างบัญชีแล้ว ระบบจะส่งคืนที่อยู่บัญชีโดยไม่ต้องเรียกใช้ฟังก์ชัน create2 หาก initData ไม่เป็นโมฆะและยังไม่ได้สร้างบัญชี ระบบจะเรียก initData ที่ให้มาหลังการสร้าง ฟังก์ชันบัญชีส่งคืนที่อยู่บัญชีโทเค็นที่ผูกไว้จากการคำนวณ

สร้างบัญชีโทเค็นผูกมัด

เพื่อพัฒนาสัญญาอัจฉริยะเพิ่มเติม เราสามารถเริ่มต้นด้วยการขยายฟังก์ชันการทำงานที่ดำเนินการโดย IERC6551Account

ก่อนอื่น มาเพิ่มฟังก์ชันเพื่อจัดการโทเค็น ERC-20 ที่ NFT อาจได้รับ เราจะเพิ่มฟังก์ชันที่อนุญาตให้ NFT อนุมัติที่อยู่อื่นเพื่อใช้โทเค็น ERC-20 ตามจำนวนที่กำหนด:

อินเทอร์เฟซ IERC20 {

ฟังก์ชั่น อนุมัติ (ผู้ใช้จ่ายที่อยู่, จำนวนเงิน uint256) ผลตอบแทนภายนอก (บูล);

}

สัญญา MyERC6551บัญชีคือ IERC6551บัญชี {

// รหัสสัญญาอื่นๆ...

ฟังก์ชันอนุมัติ ERC20 (ที่อยู่ tokenAddress, ที่อยู่ที่ใช้จ่าย, จำนวนเงิน uint256) ภายนอกเท่านั้นเจ้าของ {

โทเค็น IERC20 = IERC20(โทเค็นแอดเดรส);

โทเค็น อนุมัติ (อะไรต่อมิอะไร, จำนวนเงิน);

}

โทเค็น IERC20 = IERC20(โทเค็นแอดเดรส);

โทเค็น อนุมัติ (อะไรต่อมิอะไร, จำนวนเงิน);

}

}

ในส่วนนี้ onlyOwner เป็นตัวปรับแต่งที่ช่วยให้มั่นใจว่าเฉพาะเจ้าของ NFT เท่านั้นที่สามารถเรียกใช้ฟังก์ชันได้ IERC20 เป็นอินเทอร์เฟซที่เรียบง่ายสำหรับการโต้ตอบกับโทเค็น ERC-20

ต่อไป เรามาเพิ่มความสามารถสำหรับ NFT ของเราในการโต้ตอบกับโปรโตคอล DeFi สมมุติฐาน เช่น แพลตฟอร์มการให้ยืม เพื่อความง่าย เราจะเพิ่มฟังก์ชันที่ช่วยให้ NFT สามารถฝากโทเค็น ERC-20 จำนวนหนึ่งลงในแพลตฟอร์มได้:

อินเทอร์เฟซ ILendingPlatform {

ฝากฟังก์ชั่น (ที่อยู่ tokenAddress, จำนวนเงิน uint256) ภายนอก;

}

สัญญา MyERC6551บัญชีคือ IERC6551บัญชี {

// รหัสสัญญาอื่นๆ...

ฟังก์ชัน depositToLendingPlatform (ที่อยู่ platformAddress, ที่อยู่ tokenAddress, uint256 จำนวน) ภายนอก onlyOwner {

// โอนโทเค็นตามจำนวนที่ระบุไปยังสัญญานี้

โทเค็น IERC20 = IERC20(โทเค็นแอดเดรส);

ต้องการ (โทเค็น. โอนจาก (ผู้ส่ง msg, ที่อยู่ (นี้), จำนวนเงิน), "การถ่ายโอนโทเค็นล้มเหลว");

// อนุมัติแพลตฟอร์มการให้ยืมเพื่อใช้โทเค็น

โทเค็น อนุมัติ (platformAddress, จำนวนเงิน);

// ฝากโทเค็นไปยังแพลตฟอร์มการให้ยืม

แพลตฟอร์ม ILendingPlatform = ILendingPlatform(ที่อยู่ของแพลตฟอร์ม);

แพลตฟอร์ม เงินฝาก (โทเค็นแอดเดรส, จำนวนเงิน);

}

}

ในข้อมูลโค้ดนี้ ILendingPlatform เป็นอินเทอร์เฟซที่เรียบง่ายสำหรับการโต้ตอบกับแพลตฟอร์มการให้ยืมสมมุติ ก่อนอื่น เราจะโอนโทเค็นตามจำนวนที่กำหนดจากเจ้าของ NFT ไปยังสัญญา จากนั้นจึงอนุมัติแพลตฟอร์มการให้ยืมเพื่อใช้โทเค็นเหล่านั้น และสุดท้ายฝากโทเค็นลงในแพลตฟอร์มการให้ยืม

นี่เป็นเพียงตัวอย่างบางส่วนที่สามารถทำได้โดยใช้ ERC-6551 ความเป็นไปได้แทบไม่มีขีดจำกัด ขึ้นอยู่กับความต้องการเฉพาะของโครงการของคุณ ตรวจสอบให้แน่ใจว่าได้ทดสอบคุณสมบัติใหม่อย่างละเอียดก่อนที่จะปรับใช้กับ mainnet เพื่อให้แน่ใจว่าทำงานได้ตามที่คาดไว้และไม่มีช่องโหว่ด้านความปลอดภัย

แปลง NFT เป็นกระเป๋าเงิน

หากต้องการสร้างสัญญาอัจฉริยะสำหรับ NFT เพื่อทำหน้าที่เป็นกระเป๋าเงินหรือบัญชี คุณต้องปรับใช้สัญญา ERC-721 ก่อน สัญญานี้จะจัดการการผลิตและการโอน NFT

ต่อไป คุณจะใช้สัญญาบัญชี IERC6551 ที่โต้ตอบกับสัญญา ERC-721 สัญญานี้มีความสามารถในการรับ ถือ และส่งโทเค็น ERC-20 ซึ่งทำหน้าที่เป็นกระเป๋าเงินแยกต่างหากสำหรับแต่ละ NFT

ต่อไป คุณจะใช้สัญญาบัญชี IERC6551 ที่โต้ตอบกับสัญญา ERC-721 สัญญานี้มีความสามารถในการรับ ถือ และส่งโทเค็น ERC-20 ซึ่งทำหน้าที่เป็นกระเป๋าเงินแยกต่างหากสำหรับแต่ละ NFT

ด้านล่างนี้คือตัวอย่างง่ายๆ ของสัญญา IERC6551Account:

ความแข็งแรงของปรากมา ^0.8.0;

นำเข้า "@openzeppelin/contracts/token/ERC721/ERC721.sol";

นำเข้า "@openzeppelin/contracts/token/ERC20/IERC20.sol";

นำเข้า "@openzeppelin/contracts/security/ReentrancyGuard.sol";

นำเข้า "@openzeppelin/contracts/access/Ownable.sol";

สัญญา NFTWallet คือ ERC721, ReentrancyGuard, เป็นเจ้าของได้ {

การทำแผนที่ (uint256 => ที่อยู่) _wallets ส่วนตัว;

ตัวสร้าง (ชื่อหน่วยความจำสตริง สัญลักษณ์หน่วยความจำสตริง) ERC721 (ชื่อ สัญลักษณ์) {}

ฟังก์ชั่น walletOfToken (uint256 tokenId) มุมมองสาธารณะส่งคืน (ที่อยู่) {

ส่งคืน _wallets [tokenId];

}

มิ้นต์ฟังก์ชัน (ที่อยู่ถึง) สาธารณะเท่านั้นเจ้าของ {

uint256 newTokenId = totalSupply() + 1;

_mint(ถึง, newTokenId);

_wallets[newTokenId] = ถึง;

}

ฟังก์ชัน TransferERC20 (โทเค็น uint256, โทเค็นที่อยู่, ที่อยู่ถึง, จำนวน uint256) สาธารณะ nonReentrant {

ต้องการ (_wallets [tokenId] == msg.sender, "โอนได้เฉพาะเจ้าของกระเป๋าเงินเท่านั้น");

IERC20(โทเค็น).โอนจาก(ที่อยู่(นี้), ถึง, จำนวนเงิน);

}

ฟังก์ชัน ฝากERC20 (โทเค็น uint256, โทเค็นที่อยู่, จำนวนเงิน uint256) สาธารณะ nonReentrant {

ต้องการ (_wallets [tokenId] == msg.sender, "เฉพาะเจ้าของกระเป๋าเงินเท่านั้นที่สามารถฝากได้");

IERC20(โทเค็น).โอนจาก(msg.sender, ที่อยู่(นี้), จำนวนเงิน);

IERC20(โทเค็น).โอนจาก(msg.sender, ที่อยู่(นี้), จำนวนเงิน);

}

ฟังก์ชัน balanceOfERC20 (uint256 tokenId, โทเค็นที่อยู่) ส่งคืนมุมมองสาธารณะ (uint256) {

ต้องการ (_wallets [tokenId] == msg.sender || เจ้าของ (tokenId) == msg.sender, "ไม่ใช่เจ้าของกระเป๋าเงิน");

ส่งคืน IERC20 (โทเค็น) ยอดคงเหลือ (ที่อยู่ (นี้));

}

}

ในสัญญานี้ แต่ละ NFT (ระบุโดย tokenId) จะเชื่อมโยงกับที่อยู่กระเป๋าเงิน (_wallets[tokenId]) ฟังก์ชัน mint จะสร้าง NFT ใหม่และตั้งค่าที่อยู่กระเป๋าเงินเป็นที่อยู่ที่ระบุ ฟังก์ชัน TransferERC20 ช่วยให้เจ้าของ NFT สามารถโอนโทเค็น ERC-20 จากกระเป๋าเงินที่เชื่อมโยงกับ NFT ไปยังที่อยู่อื่นได้ ฟังก์ชัน depositERC20 ช่วยให้เจ้าของ NFT สามารถฝากโทเค็น ERC-20 จากที่อยู่ส่วนตัวไปยังกระเป๋าเงินที่เชื่อมโยงกับ NFT ฟังก์ชัน balanceOfERC20 ช่วยให้เจ้าของ NFT ตรวจสอบยอดคงเหลือของโทเค็น ERC-20 ในกระเป๋าเงินที่เกี่ยวข้องกับ NFT

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

สุดท้ายนี้ โปรดจำไว้ว่าการใช้สัญญาอัจฉริยะเหล่านี้จริง ๆ แล้วจะต้องใช้ ETH เพื่อชำระค่าน้ำมัน ปริมาณก๊าซที่ต้องใช้ขึ้นอยู่กับความซับซ้อนของสัญญาและราคาก๊าซปัจจุบันบนเครือข่าย Ethereum

ปฏิบัติที่ดีที่สุด

เมื่อใช้ ERC-6551 สิ่งสำคัญคือต้องปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเพื่อความปลอดภัยและประสิทธิภาพ:

1. รับรองความเข้ากันได้ : มาตรฐาน ERC-6551 ได้รับการออกแบบให้เข้ากันได้กับโทเค็น ERC-721 ที่มีอยู่ รับประกันความเข้ากันได้เสมอโดยการทดสอบกับสัญญา ERC-721 ที่มีอยู่

2. ความปลอดภัย : เช่นเดียวกับสัญญาอัจฉริยะใดๆ ความปลอดภัยมีความสำคัญสูงสุด ตรวจสอบให้แน่ใจว่าการใช้งานของคุณปลอดภัยและทนทานต่อเวกเตอร์โจมตีทั่วไป พิจารณาดำเนินการตรวจสอบความปลอดภัยก่อนปรับใช้ ให้เจ้าของควบคุมโทเค็น ERC-721 และบัญชีที่เกี่ยวข้องก่อนเสมอ

3. ประสิทธิภาพของแก๊ส : ตรวจสอบให้แน่ใจว่าการใช้งานของคุณมีการใช้แก๊สอย่างมีประสิทธิภาพ โปรดจำไว้ว่าทุกการดำเนินการบน Ethereum blockchain ต้องใช้ก๊าซ และสัญญาที่ไม่มีประสิทธิภาพสามารถนำไปสู่ค่าใช้จ่ายที่สูงโดยไม่จำเป็น

4. ใช้ที่อยู่ที่ถูกต้อง : เมื่อสร้างบัญชีโทเค็นที่ถูกผูกมัด โปรดตรวจสอบให้แน่ใจว่าได้ใช้ที่อยู่การใช้งาน รหัสลูกโซ่ ที่อยู่สัญญาโทเค็น และรหัสโทเค็นที่ถูกต้อง การใช้ที่อยู่ไม่ถูกต้องหรือใช้งานไม่ได้อาจส่งผลให้เกิดพฤติกรรมที่ไม่คาดคิดหรือสูญเสียการควบคุมบัญชี

5. ใช้เกลือ : เกลือทางเลือกในฟังก์ชันการสร้างบัญชีช่วยให้คุณสร้างที่อยู่เฉพาะสำหรับบัญชีโทเค็นที่ถูกผูกมัดแต่ละบัญชี แม้ว่าพารามิเตอร์อื่นๆ จะเหมือนกันก็ตาม การใช้คุณสมบัตินี้สามารถเพิ่มความเป็นเอกลักษณ์และความปลอดภัยให้กับแต่ละบัญชี

สรุปแล้ว

ERC-6551 เป็นการพัฒนาที่น่าตื่นเต้นสำหรับระบบนิเวศของ Ethereum ซึ่งขยายขีดความสามารถโดยการจัดหาบัญชีเฉพาะสำหรับโทเค็น ERC-721 การพัฒนานี้เปิดโอกาสใหม่ๆ รวมถึง NFT ที่เป็นเจ้าของสินทรัพย์และการโต้ตอบกับแอปพลิเคชันโดยอิสระ คู่มือนี้นำเสนอภาพรวมของ ERC-6551 และการนำไปปฏิบัติ อย่างไรก็ตาม เช่นเดียวกับเทคโนโลยีใหม่ๆ ควรใช้ด้วยความระมัดระวังและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเพื่อความปลอดภัยและประสิทธิภาพของสัญญา

ความคิดเห็น

ความคิดเห็นทั้งหมด

Recommended for you

ต้องอ่านทุกวัน