Cointime

扫码下载App
iOS & Android

从代码角度理解ERC-6551:NFT究竟是如何成为钱包的?

作者:Javier Calderon 编译:Cointime.com 237

引言

欢迎来到非同质化代币(NFT)的世界,这是一种独特的数字资产,在区块链领域引起了轰动。随着NFT的崛起,我们看到在区块链网络上可以实现的可能性大大扩展。其中一个令人兴奋的发展是将NFT作为钱包或账户的概念,这是一个强大的想法,开启了大量新的用例和应用程序。

ERC-721是Ethereum上的NFT标准,虽然它为社区服务得很好,但其局限性促使出现了新的扩展和概念。其中之一就是ERC-6551,它提出了“绑定代币账户”的概念。本文草案介绍了这个提案,旨在为每个ERC-721代币创建其自己的智能合约账户,使NFT能够拥有资产并与应用程序进行交互,而无需改变现有的ERC-721智能合约或基础设施。

工作原理

本指南介绍了使用ERC-6551提案将NFT转化为钱包或账户的过程。我们首先概述了ERC-6551背后的基本原则,它提供了一个标准接口和一个无权限的注册表来创建绑定代币账户。然后,我们深入探讨了具体的函数实现,包括Registry中的createAccount和account,以及IERC6551Account接口。

然后,我们探讨了如何在Solidity中实现IERC6551Account,创建一个将NFT作为钱包的智能合约。这个合约具有接收、持有和发送ERC-20代币的能力,从本质上来说,它为每个NFT充当独立的钱包。我们还分享了一个实施此功能的简化示例智能合约,这应该为您提供一个良好的起点。

请记住,我们分享的代码仅用于说明目的,如果您计划在生产环境中实施此功能,务必对代码进行审计和全面测试。

将NFT转化为钱包或账户的能力在区块链世界中开启了新的可能性。它为NFT打造了一个独特的数字身份,能够在链上拥有和管理资产。无论是数字化形象积累游戏资产,艺术品保留其版税,还是会员卡记录互动,潜在的应用场景都非常有趣。

实施

区块链技术已经彻底改变了我们对资产所有权和交易的理解方式。其中之一就是非同质化代币(NFT)——在区块链上表示的独特资产,它们引起了极大的关注。然而,尽管这些资产具有个体性,传统的NFT却存在一个重要限制:它们无法独立拥有资产或与应用程序进行交互。因此,出现了ERC-6551,这是一种新颖的方法,通过为NFT提供其独特的账户,将NFT转化为钱包或账户。本文深入探讨了ERC-6551的实施方式,展示了它如何使NFT更加灵活,并提供了代码片段和最佳实践。

理解ERC-6551

Ethereum改进提案(EIP)ERC-6551是最近引入的标准,它扩展了ERC-721非同质化代币(NFT)的功能。它为每个NFT分配了一个独特的、确定性的智能合约账户,使得NFT能够拥有资产并与应用程序进行交互,而无需对现有的ERC-721智能合约或基础设施进行更改。

ERC-6551系统由两个主要组件组成:一个用于部署绑定代币账户的无权限注册表,以及一个用于实现绑定代币账户的标准接口。注册表通过将每个绑定代币账户部署为ERC-1167最小代理合约,并向字节码附加不可变的常量数据来完成。每个账户的地址是确定性的,并且由实现地址、代币合约地址、代币ID、EIP-155链ID和可选盐值的唯一组合导出。

如何实现ERC-6551

ERC-6551通过一个注册表合约来实现,该合约具有无权限、不可变和无所有者的特点。注册表作为希望使用绑定代币账户的项目的单一入口。注册表合约有两个函数:

1、createAccount:根据实现地址为一个ERC-721代币部署绑定代币账户。

2、account:一个只读函数,根据实现地址计算一个ERC-721代币的绑定代币账户地址。

下面是注册表合约的接口:

创建账户功能可用于部署新的绑定代币账户。如果该账户已经创建,它将返回账户地址而无需调用create2函数。如果initData不为空且该账户尚未创建,则在创建后调用提供的initData。account函数返回一个计算得到的绑定代币账户地址。

建立绑定代币账户

为了进一步开发智能合约,我们可以通过扩展IERC6551Account实现的功能来开始。

首先,让我们添加处理可能由NFT接收的ERC-20代币的功能。我们将添加一个函数,允许NFT批准另一个地址花费特定ERC-20代币的一定数量:

interface IERC20 {

    function approve(address spender, uint256 amount) external returns (bool);

}

contract MyERC6551Account is IERC6551Account {

    // Other contract code...

    function approveERC20(address tokenAddress, address spender, uint256 amount) external onlyOwner {

        IERC20 token = IERC20(tokenAddress);

        token.approve(spender, amount);

    }

}

在这里,onlyOwner是一个修饰符,确保只有NFT的所有者可以调用该函数。IERC20是与ERC-20代币交互的简化接口。

接下来,让我们为我们的NFT添加与假设的DeFi协议(如借贷平台)进行交互的能力。为了简单起见,我们将添加一个函数,允许NFT将一定数量的ERC-20代币存入该平台:

interface ILendingPlatform {

    function deposit(address tokenAddress, uint256 amount) external;

}

contract MyERC6551Account is IERC6551Account {

    // Other contract code...

    function depositToLendingPlatform(address platformAddress, address tokenAddress, uint256 amount) external onlyOwner {

        // Transfer the specified amount of tokens to this contract

        IERC20 token = IERC20(tokenAddress);

        require(token.transferFrom(msg.sender, address(this), amount), "Token transfer failed");

        // Approve the lending platform to spend the tokens

        token.approve(platformAddress, amount);

        // Deposit the tokens to the lending platform

        ILendingPlatform platform = ILendingPlatform(platformAddress);

        platform.deposit(tokenAddress, amount);

    }

}

在这段代码片段中,ILendingPlatform是与假设的借贷平台交互的简化接口。我们首先从NFT所有者向该合约转移指定数量的代币,然后批准借贷平台使用这些代币,并最后将代币存入借贷平台。

这只是使用ERC-6551可以实现的一些示例。可能性实际上是无限的,取决于您项目的特定需求。在部署到主网之前,请务必对任何新功能进行彻底测试,以确保其按预期工作并没有安全漏洞。

将NFT转化为钱包

要创建一个智能合约,使NFT充当钱包或账户,您首先需要部署一个ERC-721合约。该合约将处理NFT的铸造和转让。

接下来,您将实现一个与ERC-721合约交互的IERC6551Account合约。这个合约具有接收、持有和发送ERC-20代币的能力,从本质上来说,它为每个NFT充当独立的钱包。

以下是IERC6551Account合约的简化示例:

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

import "@openzeppelin/contracts/access/Ownable.sol";

contract NFTWallet is ERC721, ReentrancyGuard, Ownable {

    mapping(uint256 => address) private _wallets;

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {}

    function walletOfToken(uint256 tokenId) public view returns (address) {

        return _wallets[tokenId];

    }

    function mint(address to) public onlyOwner {

        uint256 newTokenId = totalSupply() + 1;

        _mint(to, newTokenId);

        _wallets[newTokenId] = to;

    }

    function transferERC20(uint256 tokenId, address token, address to, uint256 amount) public nonReentrant {

        require(_wallets[tokenId] == msg.sender, "Only wallet owner can transfer");

        IERC20(token).transferFrom(address(this), to, amount);

    }

    function depositERC20(uint256 tokenId, address token, uint256 amount) public nonReentrant {

        require(_wallets[tokenId] == msg.sender, "Only wallet owner can deposit");

        IERC20(token).transferFrom(msg.sender, address(this), amount);

    }

    function balanceOfERC20(uint256 tokenId, address token) public view returns (uint256) {

        require(_wallets[tokenId] == msg.sender || ownerOf(tokenId) == msg.sender, "Not wallet owner");

        return IERC20(token).balanceOf(address(this));

    }

}

在该合约中,每个NFT(通过其tokenId进行标识)与一个钱包地址(_wallets[tokenId])相关联。mint函数铸造一个新的NFT并将其钱包地址设置为提供的地址。transferERC20函数允许NFT所有者将ERC-20代币从与NFT关联的钱包转移到另一个地址。depositERC20函数允许NFT所有者将ERC-20代币从他们个人地址存入与NFT关联的钱包。balanceOfERC20函数允许NFT所有者检查与NFT关联的钱包中ERC-20代币的余额。

请注意,为了清晰起见,该合约经过简化,没有包含ERC-6551标准的完整功能。这段代码可能不是完全安全或优化的,在投入生产环境之前应进行彻底的测试和审计。

最后,请记住,实际部署这些智能合约将需要ETH支付Gas费用。所需Gas量取决于合约的复杂性和以太坊网络上当前的Gas价格。

最佳实践

在实施ERC-6551时,遵循最佳实践以确保安全性和效率非常重要:

1、确保兼容性:ERC-6551标准旨在与现有的ERC-721代币向后兼容。始终通过与现有ERC-721合约进行测试来确保兼容性。

2、安全性:与任何智能合约一样,安全性至关重要。确保您的实现是安全的,并且对常见攻击向量具有抵抗力。考虑在部署之前进行安全审计。始终将所有者对其ERC-721代币及其关联账户的控制放在首位。

3、Gas效率:确保您的实现具有高效的Gas使用。请记住,以太坊区块链上的每个操作都会消耗Gas,而低效的合约可能导致不必要的高成本。

4、使用正确的地址:在创建绑定代币账户时,请确保使用正确的实现地址、链ID、代币合约地址和代币ID。如果使用不正确或无效的地址,可能会导致意外行为或失去对账户的控制。

5、利用盐值:账户创建函数中的可选盐值允许您为每个绑定代币账户创建唯一的地址,即使其他参数相同。使用该功能可以增加每个账户的唯一性和安全性。

结论

ERC-6551是以太坊生态系统的一项令人兴奋的进展,通过为ERC-721代币提供独特的账户,扩展了其能力。这一发展开启了新的可能性,包括NFT拥有资产并独立与应用程序进行交互。本指南介绍了ERC-6551及其实现的概述。然而,像任何新技术一样,使用时应谨慎,并遵循最佳实践以确保合约的安全性和效率。

NFT
评论

所有评论

推荐阅读

  • 5月14日晚间要闻速递

    1. BTC突破62000美元,24小时跌幅缩窄至1.22%

  • RWA平台Re完成700万美元新一轮融资,Electric Capital领投

    代币化再保险 RWA 平台 Re 完成 700 万美元新一轮融资,Electric Capital 领投,据悉该项目曾在 2022 年底完成 1400 万美元种子轮融资,Re 的目标是到今年年底支持 2 亿美元的保费。

  • 硅谷AI和ML开发研究实验室ChainML筹集620万美元种子轮融资

    总部位于硅谷的AI和ML开发和研究实验室ChainML最近推出了其代理基础层Theoriq,获得了620万美元的种子扩展融资。这轮融资由Hack VC领投,Foresight Ventures、Inception Capital、HTX Ventures、Figment Capital、Hypersphere Ventures和Alumni Ventures参与,以股权和代币认股权的形式进行。公司计划利用这些资金扩大其开发工作。ChainML由首席执行官Ron Bodkin领导,正在开发一种名为Theoriq的AI平台,该平台基于社会进化原则,并采用区块链实施,为不断改进、社区治理的AI系统奠定基础。

  • 北京丰台警方破获一起虚拟货币传销案

    北京丰台警方近日破获一起虚拟货币组织、领导传销犯罪案件,在这起案件中,公安部门经过调查,报案人自己就是嫌疑人。闲赋在家的谢某希望通过投资赚钱,一直寻找来钱快的“机遇”。通过朋友介绍,她加入了一个名叫“华某会”的组织,通过购买虚拟币进行投资。前期小额投资获利后,她投入了家中积蓄的200万元,但未能收到返款。被套牢后,谢某开始按传销组织要求“拉人头”,逐级提成、动态分红,使其成为该传销组织在北京的骨干分子,发展下线9级,涉及300余人。随着投资平台崩盘,谢某面对下线投资人追债,选择报警。

  • Zeta Markets完成500万美元战略融资,Electric Capital领投

    据 The Block 报道,Solana 生态 DEX 项目 Zeta Markets 完成 500 万美元战略融资,由 Electric Capital 领投,Digital Asset Capital Management (DACM)、Selini Capital 和 Airtree Ventures 参投。天使投资人包括 Solana 的 Anatoly Yakovenko、Helius 的 Mert Mumtaz、Tensor 的 Richard Wu、Pyth 的 Genia Mikhalchenko。

  • Tornado Cash 开发者 Alexey Pertsev 被判处 64 个月监禁

    荷兰法官在斯海尔托亨博斯法院裁定,Tornado Cash 开发商 Alexey Pertsev 犯有洗钱罪。法庭判处Pertsev 64 个月监禁。 2022 年 8 月,Tornado Cash 被美国政府列入黑名单后,该开发商首次在荷兰被判入狱。当时,美国财政部声称 Tornado Cash 是朝鲜黑客组织 Lazarus 的关键工具。 Lazarus 集团与 Axie Infinity 旗下 Ronin Network 遭受的价值6.25 亿美元的黑客攻击以及其他重大加密货币盗窃案有关。

  • 荷兰法院裁定Tornado Cash创始人Alexey Pertsev洗钱罪名成立

    由三名法官组成的荷兰法庭判定Tornado Cash开发者Alexey Pertsev犯有在加密货币混合平台上清洗12亿美元非法资产的罪行,预计合议庭也将在周二对居住在荷兰的31岁俄罗斯人Alexey Pertsev进行宣判,Pertsev的律师将有14天的时间对法官的判决提出上诉。专家表示,这一判决将重塑去中心化金融领域的隐私保护进程,对为用户提供金融隐私保护工具的开源软件的开发产生 "寒蝉效应"。

  • Equalizer黑客已盗取2353枚EQUAL、2500枚spLP等代币

    Fantom 生态 DEX Equalizer 今日遭到黑客攻击,到目前为止,黑客已盗取用户大约 2353 枚 EQUAL 和其他代币。该黑客的钱包地址是 222 天前建立的,并一直在接收被盗用户的资金。 攻击开始于 5 月 14 日 12 点 10 分左右,2500 个 SpookySwap 流动性代币(spLP)被耗尽,导致许多其他代币从用户那里被盗。到目前为止,被盗代币包括: 2353 枚 EQUAL; 510,579 枚 FantomStarter(FS); 2500 枚 spLP; 600 万枚 AnyInu(AI); 985,565 枚 ChillPill(CHILL); 5 万枚 WigoSwap(WIGO: 25 枚 multiDEUS(DEUS)。

  • 跨境洗黑钱集团清洗8800万港元8人被捕

    香港警方商业罪案调查科于2023年11月锁定一个跨境洗黑钱集团,调查发现集团于2023年9月至2024年3月期间,招揽内地人到香港开设傀儡银行户口,透过不同类型骗案,如电话骗案、裸聊骗案、投资骗案、求职骗案等去诈骗受害人。受害人根据骗徒指示,将骗款存入犯罪集团控制的傀儡户口,之后集团会从傀儡户口以现金方式提取骗款,并到加密货币场外交易所(OTC)购买加密货币,同时又会在海外加密货币平台上以虚假身份开设户口,并存入由骗款所购买的加密货币,再转移至多个加密货币钱包,以清洗犯罪得益。 警方又指集团利用72个本地开立的银行傀儡户口,清洗超过8800万港元犯罪得益,其中670万港元是与48宗骗案有关。至昨日,警方于全港拘捕7男1女,年龄介乎26至51岁,涉嫌串谋洗黑钱,他们分别报称救生员、摄影师、电话程式员、销售员及无业,其中6人为骨干成员,2人为傀儡户口持有人。

  • DWF Ventures宣布投资链游开发商Overworld

    DWF Ventures宣布投资链游开发商Overworld, Overworld最近宣布计划推出另一NFT系列,此外,Overworld即将推出主世界竞技场。 金色财经此前报道,链游开发商Overworld完成1000万美元种子轮融资,本轮融资由Hashed、TheSpartanGroup、SanctorCapital和GalaxyInteractive共同领投,Hashkey、BigBrainHoldings和ForesightVentures参投。