ผู้เขียน: 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 และการนำไปปฏิบัติ อย่างไรก็ตาม เช่นเดียวกับเทคโนโลยีใหม่ๆ ควรใช้ด้วยความระมัดระวังและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเพื่อความปลอดภัยและประสิทธิภาพของสัญญา
ความคิดเห็นทั้งหมด