신규: Helius가 Light Protocol을 인수했습니다
Solana PDA란? 설명 및 예시
블로그/기초

Solana PDA란? 설명 및 예시(2026년)

개발자 교육X의 Mike MacCanaLinkedIn의 Mike MacCana
읽는 데 6분

검토해 주신 0xIchigo, 영화 리뷰 프로그램을 제공해 주신 Unboxed Software, 그리고 Robocop을 만든 Paul Verhoeven에게 감사드립니다.

Solana 프로그램(스마트 컨트랙트)은 Program Derived Address(PDA)라는 별도 계정에 데이터를 저장합니다.

PDA는 독립적으로 접근하고 업데이트할 수 있어 경합을 줄이고 병렬 처리를 지원합니다.

PDA 자체는 어려운 개념이 아니지만, 새로운 개발자가 이해하기는 쉽지 않을 수 있습니다.

이 글에서는 PDA를 키/값 저장소로 이해하는 방법을 설명하고, 네 가지 실용적인 PDA 사례를 소개합니다.

시작하겠습니다.

키/값 데이터 저장소로서의 PDA

키/값 저장소는 블록체인이 등장하기 훨씬 전부터 프로그래밍에 사용되었습니다. 데이터를 빠르게 찾는 방법입니다. 저장소에서 특정 키의 값을 조회하면 항상 동일한 데이터를 찾을 수 있습니다.

Solana의 프로그래밍 모델에서 프로그램의 키/값 저장소는 PDA 시스템입니다.

각 데이터의 키는 프로그래머가 정한 입력 시드로 생성되는 특수한 형태의 주소입니다.

같은 시드는 항상 같은 주소를 생성하므로 누구나 특정 시드 집합에 해당하는 데이터를 결정론적으로 찾을 수 있습니다.

PDA 주소는 값이 ‘곡선 밖(off curve)’에 있으므로 실제 공개 키와 충돌하지 않습니다. 즉, PDA용 주소는 Solana의 Ed25519 곡선에 존재하는 공개 키 값과 수학적으로 구분됩니다.

값은 프로그램 작성자가 저장하려는 필드와 값으로 구성된 구조체(또는 객체)입니다.

PDA는 예시로 설명하는 것이 가장 좋습니다. 바로 살펴보겠습니다.

1. 지갑과 연결된 토큰을 저장하는 PDA

먼저 이미 사용해 본 다른 프로그램부터 살펴보겠습니다. 지갑에는 여러 토큰이 있고 각 토큰마다 잔액이 있다는 사실을 알고 계실 것입니다. 이것이 첫 번째 PDA 사례입니다!

각 토큰 잔액은 PDA 계정에 저장되며, 시드는 Associated Token Account 프로그램이 결정합니다.

정확히 어떻게 작동하는지 살펴보겠습니다.

영상 요약

프로그램: Associated Token Account 프로그램

계정 용도: 지갑에 있는 특정 토큰의 잔액 저장

시드: 지갑 주소와 토큰의 민트 주소

데이터: 이 지갑이 보유한 해당 토큰의 잔액

장점:

사용자가 보유한 특정 토큰을 조회할 수 있는 표준 위치가 생깁니다. 또한 사용자 잔액이 별도 계정에 있으므로 더 많은 트랜잭션을 병렬로 실행할 수 있어 Solana가 빨라집니다!

2. 프로그램 데이터를 저장하는 PDA

그렇다면 Solana 프로그램에서 PDA를 범용 데이터 저장소로 어떻게 사용할 수 있을까요? PDA의 시드와 데이터를 설계할 때 무엇을 고려해야 할까요?

영상 요약

프로그램: 자산 소유권을 활용해 리뷰의 신뢰도를 높이는 영화 리뷰 프로그램

계정 용도: 각 자산 소유자의 영화 리뷰 저장

시드: 지갑 주소, 영화 제목, 개봉 연도

데이터:

  1. 작성된 리뷰(string)
  2. u8로 저장되는 0~10점의 평점

장점:

특정 영화에 대한 사용자의 리뷰를 조회할 수 있는 표준 위치가 생깁니다. 사용자는 서로를 차단하지 않고 리뷰를 병렬로 업데이트할 수 있습니다. 정교한 PDA 설계를 통해 사용자당 영화 리뷰가 하나만 존재하도록 보장하며, 악당들이 Robocop을 리메이크하는 것과 같은 예외 상황도 처리할 수 있습니다.

3. 프로그램의 구성 가능한 값을 설정하는 PDA

자체 앱을 만들 때는 프로그램의 수명 주기 전반에 걸쳐 설정하려는 값이 있을 수 있습니다. 

  • 상수 값(예: 플랫폼 수수료)
  • 프로그램에서 사용할 토큰의 민트 주소 목록
  • 필요에 따라 활성화하거나 비활성화할 수 있는 기능 플래그
  • 프로그램의 활성화 또는 일시 중지 여부(예: 관리자 계정이 프로그램을 일시 중지하도록 허용하는 기능은 많은 블록체인 프로그램에서 일반적인 비상 대응 기능입니다)

이러한 값을 변경할 때마다 프로그램을 업그레이드하는 것은 비효율적입니다. 구성을 PDA 계정에 저장해 보겠습니다! 그런 다음 이러한 값을 업데이트하는 명령어 핸들러를 만들고, 들어오는 명령어가 지정된 ‘관리자’ 계정으로 서명되었는지 확인할 수 있습니다. 

이 예시에서는 프로그램과 상호작용할 수 있는 대상을 제한하기 위해 허용된 공개 키 목록을 구성에 포함합니다. 필요하다면 다른 구성 설정도 추가할 수 있습니다.

PDA를 이런 방식으로 전역 구성을 저장하는 데 사용할 수 있다는 사실은 쉽게 떠올리기 어려우므로 흥미로운 예시입니다!

영상 요약

프로그램: 직접 만든 모든 프로그램

계정 용도: 동적으로 업데이트할 수 있는 구성 저장

시드: "config"

데이터: 이 예시에서는 허용 목록과 관리자 계정으로 구성된 설정

  • allow_list: 이 앱을 사용할 수 있는 사용자의 공개 키 벡터
  • authority: 이러한 설정을 변경할 수 있는 계정의 공개 키(Solana 앱에서는 일반적으로 특정 권한을 나타낼 때 authority라는 단어를 사용합니다). 이 계정이 권한이 필요한 작업에 서명하도록 보장합니다!

장점:

특정 구성을 소스 코드에 하드코딩하는 대신, 프로그램의 명령어 함수를 사용해 즉시 업데이트할 수 있습니다.

또한 관련 없는 데이터가 변경되어도 구성 업데이트가 차단되지 않습니다. 프로그램을 처음 배포할 때는 intialize_config()도 실행해 권한 계정을 설정해야 합니다!

4. 토큰을 소유하고 전송하는 PDA

PDA는 데이터 저장에만 사용되지 않습니다. PDA는 자체 토큰 계정을 소유할 수도 있습니다. 그러면 프로그램은 PDA 자격으로 트랜잭션에 서명해 해당 토큰 계정의 토큰을 다른 곳으로 옮깁니다. 이를 통해 프로그램이 가치를 저장하고 전송할 수 있습니다.

영상 요약

프로그램: 스왑 프로그램

계정 용도: 

  1. 스왑 제안의 세부 정보를 저장합니다. 구체적으로는 제안자가 제공한 토큰의 대가로 받고자 하는 토큰의 종류와 수량입니다. 
  2. 이 PDA는 제공된 토큰을 저장하는 토큰 계정을 소유합니다. PDA는 트랜잭션에 서명하고 이 계정에서 수신자에게 토큰을 전송할 수 있습니다. 

시드: "offer", 제안 ID(이미 사용되지 않은 식별자라면 무엇이든 가능), 제안자의 주소

데이터:

  • maker_wanted_token: 대가로 받고자 하는 토큰으로, 해당 토큰의 민트 주소 공개 키
  • maker_wanted_amount: 받고자 하는 토큰의 수량(u64)

장점:

이 PDA를 사용하면 데이터를 저장할 수 있을 뿐만 아니라 토큰 계정의 소유자 역할도 수행해 토큰을 보관하고 다른 계정으로 전송할 수 있습니다.

요약

지금까지 Solana PDA의 실용적인 예시 네 가지를 살펴봤습니다.

첫째, Associated Token Account 프로그램은 PDA를 사용해 지갑이 보유한 각 토큰의 잔액을 저장합니다.

둘째, 직접 작성한 프로그램은 사용자의 공개 키를 활용해 특정 사용자와 연결된 데이터를 저장하거나, 데이터에 지정한 ID를 사용해 특정 데이터 항목과 연결된 데이터를 저장할 수 있습니다.

셋째, 프로그램은 자체 구성을 PDA에 저장하고, 관리자 전용 명령어 핸들러로 해당 설정을 수정할 수 있는 대상을 제한할 수 있습니다.

넷째, PDA는 자체 토큰 계정을 소유할 수 있어 프로그램이 자금을 보관할 수 있습니다. 프로그램은 토큰 계정을 소유한 PDA의 시드를 지정하는 것만으로 해당 토큰을 사용하는 트랜잭션에 ‘대신 서명’할 수 있습니다.

PDA는 Solana를 빠르게 만들 뿐만 아니라, 지정한 시드를 기준으로 프로그램이 데이터를 빠르게 찾을 수 있는 완전한 키/값 저장소를 제공합니다. 

PDA를 즐겁게 활용하고 Paul Verhoeven의 영화도 더 많이 감상해 보세요!

Helius 구독하기

최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요