導入
Solana のクラスタは、世界中のバリデータが台帳のコピーを保持し続けることで成り立っています。誰も使っていない古いデータがいつまでも無料でネットワークに残り続けたら、そのコストは誰が負担するのでしょうか。Solana はこの問題に「家賃(レント)」という考え方で応えています。
説明
前のレッスンで触れたとおり、Solana の通貨単位は SOL で、その最小単位が lamport です(1 SOL = 1,000,000,000 lamport)。プログラムの手数料の支払いだけでなく、アカウントを維持するコストの支払いにも lamport が使われます。
アカウントがデータを保持し続けるには、ネットワークのストレージ資源を占有し続けることになります。これに対する対価として、Solana には レント(rent) という仕組みがあります。アカウントに十分な残高(lamport)が入っていないと、レントが徴収されて残高が減っていき、最終的には残高が尽きてアカウントごと削除される可能性があります。
flowchart TD
A["アカウントを作成<br/>データサイズを確保"] --> B{"残高は<br/>rent-exempt最低額<br/>以上か?"}
B -->|Yes| C["レント免除<br/>データが保持され続ける"]
B -->|No| D["レントが定期的に徴収され<br/>残高が減っていく"]
D --> E["残高が尽きると<br/>アカウントが削除される"]
実務上、多くの Solana アカウントは rent-exempt(レント免除) の状態で運用されます。これは、アカウントのデータサイズに応じて計算される「最低残高」を、アカウント作成時に一括で入金しておく方法です。この最低額以上の lamport を維持している限り、レントは徴収されず、データは保持され続けます。
// クライアント側のイメージ(TypeScript / @solana/web3.js)
// アカウント作成に必要な「rent-exempt最低額」を取得する例
const dataSize = 8; // 保存したいデータのバイト数(例: u64を1つ)
const rentExemptLamports =
await connection.getMinimumBalanceForRentExemption(dataSize);
console.log(`このアカウントを維持するには最低 ${rentExemptLamports} lamport 必要`);
つまり Solana では、「アカウントを作る=そのデータを保持してもらう分の家賃を、あらかじめ前払いする」というイメージを持っておくと理解しやすくなります。使われなくなったアカウントを閉じれば、預けていた lamport は取り戻すこともできます。
演習
大きなデータを保存するアカウントと、小さなデータしか保存しないアカウントとで、rent-exempt に必要な最低残高はどちらが高くなるでしょうか。理由も合わせて考えてみましょう。
ヒント1を見る
レントは「ネットワークのストレージ資源をどれだけ占有しているか」に応じた対価です。
ヒント2を見る
データサイズが大きいアカウントほど、多くのストレージを占有します。