ERC6551: 当 NFT 碰上合约钱包

Spectrum Labs
2023年9月28日 17:00
收藏

作者:Ash Li, Noah Ho


ERC -6551 协议在社区中的讨论逐渐加热,这一协议为 NFT 带来了巨大的拓展潜力。 ERC -6551 通过代币绑定账户( Token Bond Account , TBA )为每个 NFT 创建一个独特的合约钱包,使其能够持有资产并记录相关行为。这为非同质化代币( Non - Fungible Token , NFT )的身份验证和组合型 NFT 创造了可能性。深入探究,我们可以发现 ERC -6551 实际上为 NFT 提供了一个功能齐全的钱包,而这个钱包的“钥匙”正是 NFT 本身。本文将回顾 NFT 的标准发展历程,并涵盖之前对 NFT 拓展的尝试。鉴于 TBA 的核心是合约钱包,我们也会对合约钱包进行简要介绍。最后,我们将深入探讨该协议的实现细节及其潜在的应用前景。

一、 NFT 标准历史及现状

NFT 作为一种特殊的加密货币和数字艺术资产,为艺术品提供了新的数字载体,并拓展了区块链技术的应用场景。与传统的同质化代币不同,每个 NFT 都是独一无二的,并关联着特定的元数据,如艺术品、游戏道具、音乐等电子资料。因此, NFT 可以作为电子数据的所有权凭证,供人们收藏或交易。2014年 5 月3日,数字艺术家 Kevin McCoy 创作了首个已知的 NFT 作品“ Quantum ”。它是由各种形状构成的像素化八边形,并以迷幻的方式呈现。然而,直到 ERC -721( Ethereum Request for Comments 721)的出现, NFT 才真正有了统一的标准,为广大开发者在不同项目中的应用提供了便利。

ERC -721

ERC -721与 CryptoPunks 的发展历程紧密相连。 CryptoPunks 于 2017 年问世,包括了10000个唯一的 24x24 像素艺术形象。正是其成功吸引了开发者和社区的广泛关注,使更多人认识到 NFT 的巨大潜力。此后,它成为了众多 NFT 项目的蓝本,并催生了 ERC -721 标准的制定。该标准由 CryptoKitties 的 CTO Dieter Shirley 创立。2018 年 1 月, William Entriken 、 Dieter Shirley 、 Jacob Evans 和 Nastassia Sachs 共同提出了 ERC -721标准。这一非同质化代币标准在智能合约中实现了代币相关的 ABI ,为在以太坊上创建、管理和转移独特的数字资产奠定了基础,开启了艺术家、收藏家以及数字艺术市场的新篇章。

ERC -721主要特点如下:

  • 独特性:与 ERC -20 代币不同(它们是同质化的,每个代币都与其他代币完全相同),每个 ERC -721 代币都是独一无二的。
  • 所有权和转移:这种代币标准允许确定任何给定代币的所有者,并允许所有者或经过批准的个体转移代币。
  • 元数据关联:允许与每个代币关联元数据,这可能包括代币的图片、描述或其他相关属性。

为了确保其作为一个标准, ERC -721定义了以下关键方法和事件:

balanceOf ()、 ownerOf ()、 approve ()、 getApproved ()、 set Approval ForAll ()、 isApprovedForAll ()、 transferFrom () 和 safe Transfer From () 等方法。

以及 Transfer () 和 Approval () 等事件。

简而言之, ERC -721标准为以太坊上的独特资产提供了一种机制,确保了每个资产的独特性和所有权,并允许它们被验证、交易和管理。 ERC -721作为非同质化代币的标准,在数字艺术和收藏品领域取得了爆炸性的成功。 ERC -721重要的是定义了
然而,尽管它为 NFT 应用带来了许多著名的项目,但仍然存在一些局限性,如它们不能作为代理操作,或与其他链上资产进行直接关联。为了解决这些问题,社区提出了一系列扩展和新标准,其中最具代表性的是 EIP3664 和 EIP3525 。

ERC -3664

早在 2021 年5月, DRepublic 团队提出了 EIP -3664这一 NFT 属性扩展协议。该提案通过一种巧妙的方式,解决了主流 NFT 标准如 ERC -721或 ERC -1155在属性表现力不足、 NFT 之间难以融合以及属性存储中心化等局限性。

具体来说, EIP -3664不需要修改现有的 ERC -721和 ERC -1155标准。它通过在 NFT 的铸造( mint )方法中使用I ERC 721 Receiver 或I ERC 1155 Receiver 接口的回调函数为 NFT 动态添加属性。或者通过重写铸造的方式也可。使用该协议,一个 NFT 可以无限制地附加任意多个属性。

在 EIP -3664中,所有属性都实现了I ERC 3664接口。基础属性包含 ID 、名称、符号、 URI 地址、余额等几个基本字段,用于描述 NFT 的元数据。通过 EIP -3664, NFT 的属性扩展变得更加灵活和可定制。它为 NFT 的属性功能提供了一种标准化的实现方式,并且与现有的 NFT 生态系统无缝集成。

ERC -3525

EIP -3525则引入了半同质化代币( SFT ),它可以看作是介于可替代代币( FT )和不可替代代币(NFT )之间的资产。与NFT 相似, SFT 代币可以从一个钱包地址完整地转移到另一个地址。但与 FT 相似, SFT 允许在不同代币之间只转移部分的价值。例如,可以仅转移土地的部分"使用年限"到另一块土地上。无疑, SFT 在定制性上超越了 FT ,在效率上超越了NFT 。

ERC3525 允许构建多层级的 SFT 结构,类似于俄罗斯套娃,从而实现更复杂的虚拟世界,并定义不同层级之间的交互规则。通过使用 ERC3525 , NFT 可以搭载任意的数字货币。这意味着可以在 NFT 中嵌入具有经济价值的代币,实现更丰富的功能和交互方式。例如,一个 SFT 可以包含一个携带价值的 NFT ,而 NFT 中又可以嵌套其他代币。通过 ERC3525 ,开发者可以通过智能合约定义 SFT 的规则和逻辑,为其定制特定的行为规则和交易规则。这些特性使得 ERC3525 成为 NFT 领域的重要标准之一,为开发者和项目方提供了更多创造性的空间。

二、 ERC -6551

介绍

为了增强 NFT 的拓展性和实用性, ERC -6551 提案旨在为每个 NFT 赋予与以太坊用户相同的权益。这意味着, NFT 不仅可以持有资产,还可以记录交易历史,从而极大地提高了其应用范围。在这一提案下, NFT 的持有者能够为其 NFT 创建一个专属的名为 TBA ( Token Bond Account , 代币绑定账户)的合约钱包,进行链上的各种操作。这是通过定义一个统一的注册表—— Registry 来实现的。这个注册表专门为所有的 NFT 分配独特且固定的智能合约账户地址,并确保该账户的控制权完全在 NFT 的持有者手中。值得注意的是,这一提案与现有的 ERC -721或 1155 标准完全兼容,无需进行任何修改,同时也适应了大部分支持以太坊账户的基础设施。

这一创新为 NFT 提供了与以太坊账户相同的功能,为 NFT 开辟了众多新的应用场景。例如,现实中的复杂资产,如角色扮演游戏中的角色、由多种部件组成的汽车、多元化的投资组合,甚至是打卡会员卡等,都可以通过这一提案被转化为 NFT 形式。此外,这一提案不仅与所有现有的链上资产标准相容,还为未来的新资产标准提供了扩展可能性。

正如上文所述, ERC -6551允许为每个 NFT 创建一个专用于链上交互的钱包。这种钱包与我们在 Metamask 等平台上常用的钱包有所不同,它实际上是一个合约钱包,也就是部署在以太坊网络上的智能合约。在深入探讨其实现方式之前,我们首先来了解这两种钱包之间的主要区别。

合约账户

以太坊账户是一个实体,它拥有以太币( ETH )的余额,并可以在以太坊网络上发送交易。账户可以由用户控制,也可以作为智能合约进行部署。

在以太坊中账户拥有 4 个字段:

  • nonce : 一个计数器,用来显示外部帐户发送的交易数量或合约帐户创建的合约数量。 每个帐户只能执行具有一个给定随机数的一笔交易,以防范重放攻击,重放攻击指多次广播和重复执行已签署的交易。
  • balance : 余额记账模型,这个地址拥有的 Wei 数量。 Wei 是以太币的计数单位。
  • codeHash : 该哈希表示以太坊虚拟机 ( EVM ) 上的帐户代码。 合约帐户具有编程的代码片段,可以执行不同的操作。 如果帐户收到消息调用,则执行此 EVM 代码。 与其他帐户字段不同,不能更改。 所有代码片段都被保存在状态数据库的相应哈希下,供后续检索。 此哈希值称为 codeHash 。 对于外部所有的帐户, codeHash 字段是空字符串的哈希。
  • storageRoot : 存储哈希。 Merkle Patricia trie 根节点的 2 56 位哈希已编码了帐户的存储内容( 2 56 位整数值映射),并编码为 Trie ,作为来自 2 56 的 Keccak 2 56 位哈希的映射位整数键,用于 RLP 编码的 2 56 位整数值。 此 Trie 对此帐户存储内容的哈希进行编码,默认情况下为空。

以太坊账户一共分为 2 种:外部账户(用户管理私钥)、合约账户。

  1. 外部账户 ( Externally Owned Accounts , EOA ):由私钥控制,其 codeHash 为空。这类账户可以发送和接收加密货币,并与智能合约交互。我们常用的 Metamask 钱包就属于此。
  2. 合约账户 ( Contract Account , CA ):没有私钥,其 codeHash 非空。它是部署在以太坊网络上的智能合约,通过外部账户与该合约交互来控制合约钱包。

在 CA 中有标准合约钱包,比如 ERC4337 账户抽象钱包,和 Native AA 类型的钱包,比如 ZkSync 和 StarkNet 等链其中没有传统交易,所有账户都是合约账户。目前钱包存在所有权和签名权的问题,比如私钥难以保护,用户失去私钥后就会失去所有资产,以及存在签名算法少权限高问题,还有手续费只可以通过 ETH 付款的单币种结算问题。

在不改变共识协议层的前提下,可以帮助以太坊向着账户抽象的方向前进, ERC4337 可以通过智能合约来实现账户抽象的升级,将原来整个交易的发起至其被包含到整个区块链之中的过程进行了更新改变,引入了 UserOperation ,描述代表用户发送的事务的结构, Bundler 会对这些内存池中的交易进行打包,降低用户的交易成本,多签的场景更加完整,去实现社交恢复等功能的升级。

实现

在 ERC -6551标准下, NFT 的持有者可以通过与 Register Contract 交互,在以太坊网络或其他支持 EVM 的区块链上部署一个新的智能合约,即 TBA 。 TBA 的所有权属于 NFT 的持有者,且会随 NFT 的转移而变更。只有 NFT 的持有者才能控制这个 TBA 。 TBA 的代码,即其规则,来源于实现合约 ( Implementation Contract )的调用。

以下图解展示了 ERC -6551的工作原理:假设一个用户是 NFT 的持有者,其 User A ccount 拥有 Contract A 的#123和 Contract B 的#456两个 NFT 。 User Account 与无许可注册表即注册合约 ( Register Contract )交互,输入 NFT 信息和实现合约的地址,从而创建 TBA 。当 User A ccount 在调用注册合约时,输入 Token #123的 NFT 信息和 Implementation A ( 0x321 …)的地址,合约钱包 Account A ( 0x123 …)将被创建。其所有权属于 NFT Token #123的持有者,其功能和规则来源于 Implementation A 的规定。当 User Account 再次调用注册合约并更改输入内容时,会生成另一个 TBA 。但是对于特定的 NFT 和实现合约,只能存在一个独一无二的对应的 TBA 。

TBA 的创建与行为完全依赖于注册合约和实现合约。这些合约中的规则决定了 TBA 的特性和功能。 EIP -6551为这些合约提供了代码模板。我们将在后续部分深入探讨这些模板。然而,这些模板并不是唯一的选择,它们的代码决定了 TBA 的部署方式和功能实现。这为开发者提供了广泛的扩展可能性。例如,注册合约可以设定哪些 NFT 有资格使用该注册合约进行注册。而实现合约可以定义 TBA 的功能和规则,如设定 TBA 的每日交易限额或指定其可持有的资产类型。

实现合约 ( Implementation Contract )

通过注册合约创建的所有 TBA 都可以选择他们希望为该账户使用的实现合约 。实现合约记录了智能合约账户的功能与规则。它至少实现合约必须提供以下功能:

executeCall (): 用于执行与外部合约交互的任意智能合约函数的函数。例如,要在与 NFT 绑定的账户中销售包含的资产,您可能需要调用 Uniswap 合约中的函数。 exe

  • cuteCall ()允许您代表智能合约账户进行该函数调用,从而让您能够买卖/交换任何您想要的资产。
  • token (): 一个只读的视图函数,返回拥有此与令牌绑定的账户的 NFT 的标识符。它返回链 ID ( NFT 是否在主网络、 Polygon 、 Optimism 等), NFT 合约地址和 NFT 令牌 ID 。
  • owner (): 返回控制此与令牌绑定账户的 NFT 的所有者的地址。按照上面的例子,这将是 User Account 的地址。
  • nonce (): 返回此智能合约钱包的当前 nonce 。每个成功的交易都会将 nonce 增加1,初始值为0。

最后,虽然不是一个函数调用,但与令牌绑定账户的实现合约必须具有一个 receive ()函数,以便能够直接接收原生资产(如 ETH )到其地址。

注册合约 ( Register Contract )

下面是利用 Solidity 语言编写的 Registry 智能合约:

这个代码可以表明,在为某个 NFT 创建账户需要的参数包括 implementation () 执行合约地址、 chainId () 目标链的 id 、 token Contract () 对应 NFT 所属合约、 token Id () 对应 NFT 所属 id 、混淆值 salt 。根据 Fast Dapp 的 Demo 创建一个 NFT 账户仅需要输入 NFT 合约地址与 ID ,其余字段均自动生成,步骤是比较简单的。
ERC -6551提案是一个全新 Token 标准,属于一种对原 NFT 标准的颠覆升级, ERC -6551使用了一个与现有 ERC -721 NFT 兼容的无需许可的注册表。 该注册表是一个智能合约,作为 TBA s 的工厂和目录。 任何人都可以通过调用注册表上的函数并支付少量费用为任何 ERC -721代币创建一个 TBA 。注册表的智能合约具有两个函数:

  • createAccount ():为给定的 ERC -721 NFT 和特定实现部署一个新的与 token 绑定的账户。
  • account ():一个只读的视图函数,返回给定 ERC -721 NFT 的与 token 绑定账户的地址,给出其实现。

潜在的应用

自从 Azuki 事件之后,单一静态图像的 NFT 的吸引力已大大降低,导致许多顶级项目的价值下滑。然而,具有高度互动性和可组合性的 NFT 可能是市场复苏的关键。从区块链游戏、音乐、 DID 到元宇宙,这些领域都充满了无尽的潜力。

NFT 不仅仅是资产;它们还拥有自己的链上身份和容器属性,能够与去中心化应用( Dapps )进行交互。这意味着所有与 NFT 的互动都会直接记录在 NFT 本身,而不是其持有者的账户。此外,由于 NFT 基于智能合约,它们的行为和交互可以通过合约规则进行定义和控制,提供了灵活性和安全性。

ERC -6551协议在 NFT 领域中带来了革命性的变化,将焦点从用户钱包转移到了 NFT 本身,为交易、游戏、追溯和治理等提供了新的可能性。随着 NFT 的进一步发展,这一协议将引领我们进入一个更加个性化、互动和有意义的数字时代。

考虑以下四个潜在的应用方向:

  • 资产打包: NFT 可以作为资产容器,允许在单一 NFT 中打包和交易多个资产。例如,一个音乐专辑 NFT 可能包含多首歌曲 NFT ,或一个艺术集 NFT 可能包含多幅艺术品 NFT 。这不仅使收藏更加系统化,还可以在交易时减少 Gas 费用。
  • 投资组合: NFT 可以作为资产管理工具,允许用户在一个 TBA 中存放和管理多种 Token 。此外, NFT 持有者还可以授权第三方管理者进行资产交易,并在智能合约中明确定义管理者的权限,确保资产的安全性。
  • NFT 身份管理: NFT 可以记录其在链上的所有活动,使其成为一个真正的链上身份。用户可以使用单一的 ENS 钱包代表自己,并使用不同的 TBA 代表在不同社群或应用中的角色。
  • 模块化 NFT :主 NFT 可以生成 TBA ,用于存储其组件 NFT 。例如,在游戏中,角色 NFT 可能配备各种装备 NFT 。这不仅使元宇宙的实现变得更加可能,还可以与 AI 结合,创建更加逼真的 NPC 角色。

总之, NFT 的未来充满了无限的可能性。从资产管理到身份验证,再到模块化的游戏设计,它们都将在数字世界中发挥关键作用。

链捕手ChainCatcher提醒,请广大读者理性看待区块链,切实提高风险意识,警惕各类虚拟代币发行与炒作, 站内所有内容仅系市场信息或相关方观点,不构成任何形式投资建议。如发现站内内容含敏感信息,可点击 “举报”,我们会及时处理。
ChainCatcher 与创新者共建Web3世界