What is PDA (program derived address)?

A Solana address that has no private key and can only be signed for by the program it derives from.

Not yet verifiedHow we verify

3 min read

In this entry

A Solana address that has no private key and can only be signed for by the program it derives from.

Because it lies off the signature curve by construction, nobody can produce a signature for it, so a program can own accounts and vaults without anyone holding a key to them (source: the Solana documentation). It is the mechanism that makes trustless custody possible inside a Solana program.

Your own Solana token balances sit in accounts derived this way, which is why a wallet holds a set of addresses rather than a single one. That surprises people arriving from Ethereum, where a token balance is a number inside the token's own contract and your address is just an entry in it.

How it works

An ordinary Solana address is a public key with a matching private key. A program derived address is generated by hashing a program's identifier together with a set of seeds, then adjusting the result with a bump value until it falls off the curve that valid public keys lie on.

Two properties follow. Nobody can sign for it, because no private key exists that corresponds to it. And the runtime allows the owning program to sign on its behalf, by supplying the same seeds, which proves the address belongs to it.

The addresses are deterministic. Anyone who knows the program and the seeds can compute the address without looking it up, which is why protocols use them for per-user state, escrow accounts, and vaults. A lending protocol's collateral vault for your account is at a predictable address derived from your public key and the program.

Solana's account model also charges rent for storage. Accounts must hold a minimum balance to be rent exempt, which is why opening a token account costs a small amount of the native coin.

Example

Illustrative sequence for receiving a token. Someone sends you a Solana token for the first time. Your wallet address alone cannot hold it. An associated token account, itself a program derived address computed from your wallet address and the token's identifier, has to exist.

If it does not, the sender's transaction typically creates it, paying the rent-exempt minimum. If your wallet is empty and you try to send that token onward, you may find you cannot, because the transaction fee still has to be paid in the native coin. This is the same problem paymasters solve on other chains, and on Solana the usual answer is to keep a small native balance.

Why it matters when you buy

If you buy a Solana token on an exchange and withdraw it, the deposit and withdrawal both depend on this account structure, and keeping a small balance of the network's native coin in your wallet is a practical requirement rather than an optional extra. Sending tokens to a program derived address whose program does not expect them can strand them permanently, so use the address your wallet or exchange gives you. Withdrawal support by venue is recorded at the exchange directory.

Questions

Why does my Solana wallet show several addresses?

Because each token you hold lives in its own account derived from your wallet address and that token's identifier. The wallet displays them together, but on chain they are separate accounts.

Why did receiving a token cost something?

Creating the token account requires a rent-exempt minimum balance in the native coin. The sender usually pays it, and it is recoverable if the account is later closed.

Can anyone take funds from a PDA?

Only the program that derives it can authorize a transfer, and only according to its own code. No key exists, so there is nothing for a person to steal or lose.