액세스 프로토콜 V2 구독 양도 기능

액세스 프로토콜
Access Protocol
Published in
8 min readApr 22, 2024

블라드(Vlad)는 액세스 프로토콜의 풀 스택 소프트웨어 엔지니어입니다. 엑스(트위터) 또는 이메일을 통해 블라드에게 연락하실 수 있습니다.

이제 이 새로운 메커니즘을 통해 지갑에서 NFT로 표시되는 ‘구독’을 주고받을 수 있습니다.

이 글에서는 구독 양도 기능을 추가해야 했던 이유와 작동 방식, 그리고 솔라나의 cNFT(Compressed NFT)를 활용한 온체인 구현의 기술적 세부 사항을 간략하게 설명해드리겠습니다.

해당 기능은 이미 온체인에 구현되어 있으며 곧 사용자 대면 프론트엔드 애플리케이션에서 사용할 수 있게 될 것입니다.

개요

액세스 프로토콜 V1에서 사용자는 자신의 지갑을 사용해 크리에이터 풀에 $ACS를 스테이킹하고, 일일 보상을 받고, 지갑에 다시 언스테이킹할 수 있습니다. 자금을 스테이킹하면 크리에이터가 제공하는 콘텐츠를 이용할 수 있는 권한을 얻을 수 있으며, 이는 글로 된 콘텐츠, NFT 드롭 또는 제 3자 콘텐츠 제공자(더 블록, 크립토슬레이트 등) 등이 될 수 있습니다.

액세스 프로토콜의 스테이킹은 가장 단순한 방식으로, 스테이킹을 수행한 지갑에 대해서만 보상을 제공하는 구독을 의미합니다.

여기에는 다음과 같은 제한과 불편함이 따릅니다.

  • 구독 지갑 변경
  • 정기구독권 선물하기(패트리온(Patreon)에서 크리에이터가 가장 많이 요청하는 기능 2위)
  • 정기구독 판매
  • 법정화폐 또는 기타 자산을 통한 구독 온램프

이 모든 문제는 스테이킹 계정이 사용자 지갑 주소에 묶여 있기 때문에 발생합니다. 해결책은 스테이킹 계정이 연결된 대상을 변경하여 양도 기능을 제공하는 것입니다.

따라서 저희는 온체인 프로그램 로직을 변경하여 모든 구독 기능이 사용자의 지갑에 연결되지 않고, 사용자가 $ACS 토큰을 스테이킹하는 과정에서 받는 NFT에 연결되도록 변경하기로 결정했습니다.

이를 통해 간단한 대량 구독 배포를 가능하게 하는 동시에 사용자가 2차 시장에서 이러한 구독을 거래할 수 있도록 하여 스테이킹된 $ACS와 이와 관련된 미청구 $ACS 보상을 이전할 수 있습니다.

기술적 분석

액세스 프로토콜 전송 가능 구독(액세스 전송 가능)을 위한 솔루션을 구현을 위한 저희의 주요 목표는 다음과 같습니다.

  • NFT 로직을 기본 액세스 프로토콜 온체인 프로그램(액세스 베이스) 로직과 최대한 분리합니다.
  • 추가 스마트 컨트랙트 로직을 도입하면서 가능한 최저 수수료를 유지합니다.
  • 현재 구독 상태를 정확하게 반영하는 동적으로 설정된 NFT 메타데이터를 제공합니다. 메타데이터 내용은 다음과 같습니다.

    1. 구독에 스테이킹된 $ACS의 수량
    2. NFT와 연결된 보상 수량
    3. NFT와 연결된 크리에이터
    4. 구독 해제 가능 여부와 시기

저희는 이를 달성하기 위해 다음과 같이 구현하기로 결정했습니다.

  • 저희는 액세스 베이스에 CPI 호출을 활용하는 별도의 온체인 프로그램에 로그인을 구현했습니다. 이 프로그램은 메인 프로그램을 통해 직접 수행할 수 없는 최소한의 기능만 구현합니다.
  • 비용 효율을 위해 cNFT를 활용합니다.
  • 코드를 작성할 당시에는 cNFT의 온체인 메타데이터를 수정할 수 있는 메커니즘이 없었기 때문에 저희는 적절한 JSON 메타데이터를 동적으로 제공하는 오프체인 서비스를 구현하기로 결정했습니다. 이 서비스의 URL은 온체인 cNFT 메타데이터에 저장될 것입니다. 자세한 내용은 이 글의 범위를 벗어나기 때문에 생략하겠습니다.

cNFT를 “지갑”으로 사용하기

액세스 베이스를 그대로 사용할 수 있도록 하기 위해 저희는 cNFT가 지갑 역할을 할 수 있는 방법을 설계해야 했습니다. 이를 통해 특정 사용자 지갑 대신 cNFT에 연결된 적절한 스테이킹 계정을 생성하여 cNFT 보유자가 $ACS 보상을 받거나 스테이킹을 해제할 수 있도록 할 수 있습니다.

이를 위해 저희는 PDA를 활용했습니다. 아시다시피, cNFT는 메타플렉스 버블검 온체인 프로그램을 사용하여 생성되며, 온체인에 직접 저장되는 것이 아니라 렛저(모든 온체인 작업에 대한 기록 로그)에 저장됩니다.

데이터나 자금이 포함되지 않은 PDA로는 요청에 서명할 수 있지만, cNFT 데이터는 온체인 프로그램이 소유하지 않으므로 서명에 사용할 수 없습니다. 따라서 저희는 cNFT 자산 ID에서 PDA를 추출하고 이 PDA를 스테이킹 계정의 소유자로 사용하기로 결정했습니다. 이렇게 하면 기본 자산 ID와 끊어지지 않는 연결을 유지하면서 cNFT에 서명할 수 있습니다.

이 구현에는 몇 가지 위험 요소가 있습니다.

  • cNFT 자산 ID는 NFT가 생성된 후 머클 트리에서 가져오는 인덱스에서 파생되기 때문에 생성 시점에 이를 알 수 없습니다.
  • 저희는 사용자가 기본 풀 콘텐츠를 이용하기에 충분한 $ACS가 스테이킹되어 있을 때만 cNFT를 받기를 원합니다.

따라서 저희는 cNFT 생성과 ACS 스테이킹을 다음과 같은 단계로 나누어야 했습니다.

  1. 임시 소유자(액세스 Transferable이 소유한 PDA)에게 cNFT를 발행합니다.
  2. cNFT 자산 ID(현재 획득할 수 있는)에서 파생된 구독 양도 권리가 포함된 PDA를 소유자로 사용하여 액세스 베이스를 통해 스테이킹 계정을 생성합니다.
  3. 액세스 베이스를 통해 이전 단계에서 생성한 스테이킹 계정에 자금을 스테이킹합니다.
  4. 스테이킹된 $ACS가 충분한지 확인하고, 충분하다면 자동으로 사용자의 지갑으로 cNFT를 출금합니다.

실제로는 2~4단계를 따로 수행할 필요가 없으므로 두 번의 트랜잭션으로 cNFT를 전송할 수 있습니다.

게이트 및 언게이트 작업
아시다시피 일부 작업은 액세스 베이스 프로그램을 사용해 수행되는 반면, 일부는 액세스 Transferable을 호출해야 합니다. 액세스 Transferable을 거치는 작업은 진행하기 전에 cNFT 소유자 확인이 필요하거나 추가 cNFT 로직이 포함된 작업입니다.

해당 작업들은 아래와 같습니다.

  • 보상 클레임을 cNFT 소유자의 지갑으로 전송하는 작업
  • 스테이킹 또는 채권 계정에서 스테이킹된 $ACS를 사용자에게 반환하지 않는 $ACS 언스테이킹 작업. 사용자가 구독 중인 모든 $ACS를 언스테이킹하면 cNFT가 소각됩니다.

cNFT 수명 주기
아래 이미지에서 cNFT의 전체 수명 주기를 확인할 수 있습니다.

전체 화면

cNFT 머클 트리 생성

cNFT를 생성하는 전체 과정에서 아직 한 가지 빠진 부분이 있는데, 바로 저장할 머클 트리가 필요하다는 것입니다. 따라서 저희는 접근 권한이 PDA로 설정된 머클 트리를 생성하는 무허가 명령어를 구현했습니다. 이렇게 하면 현재 트리에 얼마나 많은 cNFT가 있는지 쉽게 모니터링할 수 있고, 필요한 경우 새 트리를 생성할 수 있습니다. 또한 이 프로그램은 항상 가장 최근에 생성된 트리로 cNFT를 채굴하도록 합니다.

보안
그러나 머클 트리를 생성하는 데에는 비용이 발생합니다. 생성이 자유롭긴 하지만, 이 작업을 처리하는 것은 액세스 프로토콜 지갑이 될 것이라고 가정할 수 있습니다. 따라서 저희는 트리가 채워질 때 적절한 양의 $SOL을 수집할 수 있는 방법이 있는지 확인하고 싶었습니다.

또한, 저희는 지갑이 관련 계정에 스테이킹된 $ACS 토큰 없이도 cNFT를 제한 없이 생성할 수 있는 간단한 방법이 없도록 하고 싶었습니다.

이를 해결하기 위해 두 가지 보안 조치를 추가했습니다.

  • cNFT를 발행할 때 항상 데이터가 포함된 PDA를 강제로 생성하고, 이 PDA의 자금은 cNFT를 출금할 때만 사용자에게 환불됩니다. 따라서 사용자는 한 번에 하나의 cNFT만 생성할 수 있으며, 다음 cNFT를 생성하기 전에 반드시 스테이킹하고 출금해야 합니다.
  • 모든 cNFT 생성에 대해 소액의 수수료를 징수하며, 머클 트리 공간도 충당합니다.

이러한 원칙을 사용하면 컨트랙트 관리자가 수집된 자금을 인출할 수 있으므로 머클 트리 생성을 위한 자금이 부족하지 않도록 보장할 수 있습니다.

cNFT 메타데이터

cNFT가 일관된 메타데이터를 갖도록 하기 위해 각 액세스 베이스 풀에 대해 액세스 Transferable PDA를 생성한 후 이 풀에 대한 cNFT 구독을 허용합니다. 이 기능을 추가함으로써 각 NFT에 적절한 이름, 심볼, URL을 설정할 수 있습니다.

보조 수수료

대부분의 NFT 프로젝트처럼 저희는 cNFT에 2차 시장 수수료를 추가할 수 있는 권리를 보유했습니다. 수수료 기준은 설정할 수 있지만 이미 발행된 NFT에서는 변경할 수 있는 방법이 없습니다.

NFT를 머클 트리에 발행할 수 있는 유일한 권한은 액세스 Transferable 프로그램의 상태에 대한 정보를 저장하는 PDA만 가집니다. 또한 cNFT의 유일한 생성자로 설정되어 있으므로 수수료가 이 주소로 전송됩니다.

징수된 로열티를 인출할 수 있도록 전용 명령이 구현되었습니다. 이 명령은 컨트랙트 관리자만 호출할 수 있으며, 수집된 모든 $SOL 자금을 관리자 지갑으로 이체하여 계정에 정확히 1 SOL만 남기고 임대료를 위한 충분한 자금을 확보합니다.

결론

구독 양도 기능은 온체인 구독 관리의 새 지평을 열었습니다. cNFT와 구독 양도 기능은 액세스에 온체인 프로그램을 더 복잡하게 만들지만, 사용자와 크리에이터의 경험은 크게 향상될 것입니다.

새로운 허브 애플리케이션에서 구독 양도 기능이 출시될 예정이니 기대해 주세요.

--

--

액세스 프로토콜
Access Protocol

전세계 모든 디지털 콘텐츠 크리에이터를 위한 새로운 수익 창출 레이어 https://accessprotocol.co