Program Derived Address (PDA)는 프로그램 ID와 시드 집합으로부터 결정론적으로
파생된 32바이트 계정 주소입니다. 이 주소는 Ed25519 곡선 위에 있지 않음이
보장되므로, 개인 키가 존재하지 않습니다. 파생에 사용된 프로그램 ID를 가진
프로그램만이 PDA에 대해 "서명"할 수 있으며, 이는 크로스 프로그램 호출(CPI) 중
invoke_signed를 통해 수행됩니다.
Program Derived Address
PDA 파생
파생 알고리즘, 표준 bump, 다양한 시드 유형을 사용한 findProgramAddress 예제.
PDA 계정
PDA 주소에서 계정 생성, invoke_signed 서명, Anchor 패턴.
주요 사항
- 결정론적: 동일한 시드와 프로그램 ID는 항상 동일한 주소를 생성합니다.
- 오프커브: 파생된 주소는 유효한 Ed25519 공개 키가 아님이 검증됩니다. 해시가 우연히 곡선 위에 위치하면 파생이 실패하고 다른 bump seed가 시도됩니다.
- 개인 키 없음: 주소가 오프커브이므로, 누구도 이에 대한 암호화 서명을 생성할
수 없습니다. 프로그램은 런타임의
invoke_signed메커니즘을 통해 "서명"합니다.
PDA 사용 시기
- 결정론적 주소 지정: 동일한 시드로부터 매번 동일한 계정을 파생합니다.
- 프로그램 서명: 소유 프로그램만이 *rs
invoke_signed*를 통해 서명할 수 있어, 프로그램이 자율적 권한으로 작동할 수 있습니다. - 사용자 범위 상태: 사용자 pubkey 시드로부터 사용자별 계정을 파생합니다(예:
["user", user_pubkey]). - keypair 관리 불필요: 저장하거나 분실할 개인 키가 없습니다. 주소는 순전히 시드로부터 파생됩니다.
제한 사항
| 제한 사항 | 값 | 출처 |
|---|---|---|
| 최대 seed 수 | 16 | MAX_SEEDS |
| 최대 seed 길이 | seed당 최대 32바이트 | MAX_SEED_LEN |
| Bump 범위 | 0-255 (1바이트) | 마지막 seed 요소로 추가됨 |
create_program_address 비용 | 1,500 CU | create_program_address_units |
find_program_address 최악의 경우 비용 | 1,500 진입 + 1,500 x 반복 횟수 | 진입 시 1,500 + 실패한 bump당 1,500 |
| CPI당 최대 PDA 서명자 수 | 16 | MAX_SIGNERS |
Is this page helpful?