솔라나 “Rent” 수수료를 돌려받는 방법

액세스 프로토콜
Access Protocol
Published in
5 min readDec 4, 2023

임대료(Rent)”란

솔라나에서 상태(값)를 저장하는 공간을 Account(주소, 계정)라고 하며, 이를 이용하기 위해 지불하는 수수료를 Rent(이하 임대료)라고 합니다.

블라드(Vlad)는 액세스 프로토콜의 풀 스택 소프트웨어 엔지니어로, 솔라나 프로그램 개발과 백엔드 및 UI를 담당하고 있습니다. 블라드는 전통 핀테크 회사에서 대규모 시스템을 구축하였으며, 이후 웹3로 뛰어들었습니다. 엑스(트위터) 또는 이메일을 통해 블라드에게 연락하실 수 있습니다.

여러분이 솔라나 프로그램(=컨트랙트)을 만들었다고 가정해 보겠습니다. 실제 솔라나 프로그램 대부분은 데이터를 온체인에 저장해야 합니다. 이를 위해 프로그램은 프로그램 파생 주소(Program Derived Addresses, PDA)에 계정을 생성합니다. 그리고 계정을 생성하는 순간, 누군가는 이에 대한 임대료를 지불하기 위해 $SOL을 제공해야 합니다. 만약 사용자가 $SOL 수수료를 지불하지 않도록 하려면, 결국 여러분이 임대료를 직접 지불해야 합니다. 직접 임대료를 지불하는 방법에 대해서는 앞선 “액세스 트랜잭션 수수료 구조” 글을 참고하시길 바랍니다.

오늘 다루고자 하는 문제는 사용자가 온체인 계정을 폐쇄하고 자신의 주소로 임대료를 상환할 때 발생합니다. 이때 만약 누군가가 반복적으로 계정을 개설하고 해지한다면 수수료 납부자의 지갑이 금방 고갈 될 수 있습니다.

이 문제를 해결하는 간단한 방법이 있습니다. 바로 계정을 폐쇄할 때 임대료 상환 주소를 강제하는 것 입니다. 원래 임대료를 지불한 주소만 알면 해당 주소로 임대료를 반환하도록 강제할 수 있습니다.

이 작업은 솔라나 앵커를 통해 다음과 같이 수행할 수 있습니다:

use anchor_lang::prelude::*;

declare_id!("F3cfJcsELoKqwXFViEMPS3MAUSUjwrgLExpwSqLLEphf");

#[program]
pub mod rent_return {
use super::*;

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
ctx.accounts.acc.rent_payer = *ctx.accounts.fee_payer.key;
Ok(())
}

pub fn close(_ctx: Context<Close>) -> Result<()> {
Ok(())
}
}

#[account]
pub struct MyData {
pub rent_payer: Pubkey,
// ... any other data
}

impl MyData {
pub const MAX_SIZE: usize = 32; // + size of your data
}

#[derive(Accounts)]
pub struct Initialize<'info> {
// Your real seeds will probably be more complex
#[account(init, payer = fee_payer, space = 8 + MyData::MAX_SIZE, seeds = [b"acc"], bump)]
pub acc: Account<'info, MyData>,
#[account(mut)]
pub fee_payer: Signer<'info>,
pub system_program: Program<'info, System>
}

#[derive(Accounts)]
pub struct Close<'info> {
#[account(mut, close = destination, seeds = [b"acc"], bump)]
acc: Account<'info, MyData>,
/// CHECK:
#[account(address = acc.rent_payer)] // we only allow the rent payer as the destination
destination: AccountInfo<'info>,
}

그러나 여러분이 위 방법을 사용하지 않을 몇 가지 이유가 있습니다:

1. 계정을 만드는 데 필요한 임대료가 증가하므로 자주 닫았다가 다시 열어야 하는 계정에만 유용합니다.

2. PDA는 10KB로 제한되어 있으므로 공간이 부족한 경우 임대료 납부자 주소를 넣지 못할 수 있습니다.

이러한 프로그램의 한 가지 예인 SPL 토큰 프로그램을 살펴보면, 임대료를 수수료 납부자 계정으로 강제로 반환할지 아니면 납부한 임대료를 상환받을 다른 메커니즘을 찾을지 스스로 결정할 수 있습니다.

핵심 소스 코드
https://gist.github.com/vl-dev/0120a41b3feebd6919822b000c3f5437

이를 실행하기 위한 타입스크립트 테스트
https://gist.github.com/vl-dev/b870976148cbfbc63ccf17f123df631c

--

--

액세스 프로토콜
Access Protocol

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