Access Protocol V2中的可转让订阅

--

可转让订阅无疑是Access Protocol V2中最具突破性的功能。

这一新机制允许用户无缝地发送和接收现在以NFT形式存在于他们钱包中的订阅。在这篇文章中,我将概述我们为什么需要构建可转让订阅,它们是如何工作的,以及描述它们在Solana上使用压缩NFT独特实现的技术细节。
可转让订阅无已经在链上实现,并将很快在用户的前端应用程序中可用。

概览
在Access Protocol的V1中,用户可以使用他们的钱包将ACS质押到创作者池中,领取日常奖励并将资金撤回到他们的钱包。通过质押他们的资金,他们可以访问创作者发布的内容 — — 无论是书面内容、NFT投放还是访问第三方内容提供商(例如The Block,CryptoSlate等)。
最简单的形式,Access Protocol中的质押代表了只对执行质押操作的钱包有效的生成奖励的订阅。
这引入了围绕以下内容的限制和不便:

  • 更换订阅钱包
  • 赠送订阅(Patreon上创作者请求的第二大功能)
  • 销售订阅
  • 通过法币或其他资产进行订阅

所有这些问题都源于质押账户与用户钱包地址绑定。改变质押账户关联的对象以实现可转移性是解决方案。因此,我们决定改变我们的链上程序逻辑,使所有订阅功能不再绑定于用户的钱包,而是绑定于用户在质押ACS代币过程中收到的NFT。这使得简单的大规模订阅分发成为可能,同时使用户能够在二级市场上交易这些订阅 — — 转移质押的ACS及其关联的任何未领取的ACS奖励。

技术深入探索
实现Access Protocol可转让订阅(Access Transferable)的主要目标如下:

  • 尽可能使NFT逻辑与Access Protocol主链程序(Access Base)逻辑隔离。
  • 在引入额外的智能合约逻辑时保持尽可能低的费用。

提供动态设置的NFT元数据,准确反映订阅的当前状态,如:

  1. 订阅中质押的ACS数量
  2. 与NFT相关联的奖励数量
  3. NFT提供访问的创作者
  4. 订阅何时以及是否可以解锁

为实现这些目标,我们决定采用以下实现:

  • 我们将登录逻辑实现为一个单独的链上程序,该程序使用CPI调用到Access Base。这个程序只实现不能直接通过主程序执行的最小功能。
  • 使用压缩NFT以提高成本效率
  • 由于在编写代码时还没有机制可以修改链上cNFT的元数据,我们决定实现一个离线服务,该服务将动态提供适当的JSON元数据。这个服务的URL将存储在链上cNFT元数据中。但是,细节超出了本文的范围。

使用cNFT作为“钱包”
为了能够照常使用Access Base,我们不得不设计一种方法让cNFT充当钱包。这使我们能够创建适当的与cNFT而非特定用户钱包绑定的质押账户,使cNFT持有者能够领取ACS奖励或撤销资金。
为此,我们利用了PDAs。正如您可能知道的,cNFT是使用Metaplex Bubblegum链上程序创建的,并不直接存储在链上,而是存储在Ledger(所有链上操作的历史日志)上。

即使您可以用不包含任何数据或资金的PDA签名请求,cNFT数据也不属于我们的链上程序的所有,因此我们无法使用它们进行签名。我们决定从cNFT资产ID派生PDA,并使用这个PDA作为质押账户的所有者。这使我们能够为cNFT签名,同时保持与底层资产ID的不可破坏的联系。

这种实现存在一些陷阱

  • 我们在创建时不知道cNFT的资产ID,因为它是从创建时在Merkle Tree中获得的索引派生的。
  • 我们希望用户只有在有足够的ACS质押以访问底层池内容时才接收cNFT。

这迫使我们将cNFT创建和ACS质押分成以下步骤

  1. 将cNFT铸造给一个临时所有者 — — 一个由Access Transferable拥有的PDA。
  2. 通过Access Base使用从cNFT资产ID派生的可转让订阅PDA作为所有者创建一个质押账户。
  3. 通过Access Base将资金质押到上一步创建的质押账户中。
  4. 检查是否有足够的ACS质押,如果是,则自动将cNFT提现到用户的钱包。

实际上,这可以通过两个交易发送,因为步骤2–4不必单独进行。

有门槛和无门槛的操作
正如您可能注意到的,一些操作是通过Access Base程序进行的,而一些则需要调用Access Transferable。通过Access Transferable进行的操作是那些在进行之前需要检查cNFT持有者或包含一些额外的cNFT逻辑的操作。

这些包括:

  • 奖励索赔进入cNFT所有者的钱包。
  • 从质押或债券账户中撤销ACS,不仅将质押的ACS返回给用户。如果用户撤销了订阅中的所有ACS,则cNFT被销毁。

cNFT生命周期
cNFT的整个生命周期可以在以下图表中:

https://i.postimg.cc/hjBvnBQ4/Screenshot-2024-04-24-123534.jpg

cNFT Merkle Tree的创建
在整个cNFT创建过程中仍有一部分缺失 — — 它们需要一个Merkle Tree来存储。因此,我们实现了一个无权限的指令来创建一个以Access Transferable程序PDA为权限的Merkle Tree。这样我们就可以轻松地监控当前树中有多少cNFT,如果需要,我们可以创建一个新的。此外,该程序确保总是将cNFT铸造到最新创建的树中。

安全性
然而,创建一个Merkle树是有代价的。尽管创建是无权限的,我们可以安全地假设Access Protocol的钱包将负责这项操作。因此,我们希望确保有一种方式在树填满时收集适当数量的SOL。
此外,我们希望确保没有简单的方式让一个钱包能够创建无限量的没有在相关账户中质押ACS代币的cNFT。

我们添加了两个安全措施来解决这个问题:

  • 我们总是在铸造cNFT时强制创建带数据的PDA,并且只有在用户撤回cNFT时才将这个PDA中的资金退还给用户。这确保用户一次只能创建一个cNFT,并且必须质押并撤回cNFT才能创建下一个。
  • 收取每次cNFT创建的小额费用,同时覆盖Merkle空间。

通过使用这些原则,我们可以轻松确保我们永远不会为Merkle的创建耗尽资金,因为合同管理员能够撤回收集的资金。

cNFT元数据
为确保cNFT具有一致的元数据,在我们允许将cNFT订阅铸造到这个池之前,为每个Access Base池创建了一个Access Transferable PDA。通过添加这个功能,我们确保我们可以为每个NFT设置适当的名称、符号和网址。

二级市场费用
与大多数NFT项目一样,我们保留了向cNFT添加二级市场费用的权利。费用基点是可配置的,但已经铸造的NFT无法更改它们。

唯一有权将NFT铸造到Merkle树中的是存储Access Transferable程序状态信息的PDA。这个权限也被设置为cNFT的唯一创建者,因此费用被发送到这个地址。

为了能够撤回收集的版税,我们实现了一个专用的指令。这个指令只能由合同管理员调用,并将所有收集的SOL资金转移到管理员钱包,账户中留下恰好1 SOL以确保有足够的资金支付租金。

结论
可转让订阅标志着链上订阅管理的一个令人兴奋的新篇章。虽然cNFT和可转让订阅为Access引入了新的链上复杂性,但用户和创作者的体验大大增强了。

敬请期待可转让订阅在我们的新Hub应用程序上线。

https://twitter.com/AccessProtocol

--

--

Access Protocol - China

A Web3 platform on Solana dedicated to revolutionizing the way content creators, artists, and researchers engage with their audiences globally.