見出し画像

SolanaのPDA(プログラム派生アドレス)を理解しよう!

1 はじめに

まず、PDA(プログラム派生アドレス)とは、その名の通り、プログラムから派生したアドレスです。

ちなみに、「プログラム」とは、イーサリアムなどでいうところの、スマートコントラクトです。

2 PDAの見つけ方

1 「作る」ではなく「見つける」

まず、PDA「見つける」にはプログラムのIDシード(任意の値)が必要です。

2 Anchorフレームワークの例

例えば、「Anchor」では、「findProgramAddressSync」シードプログラムIDを渡して、PDAを見つけます。

「find」とあるように、これは見つけるものです。

3 PDAの特徴

1 概要

PDAの特徴「秘密鍵がない」ことです。

2 秘密鍵と公開鍵の関係性

まず、前提として、秘密鍵から公開鍵が導かれます。

逆に公開鍵から秘密鍵を導けないからこそ、公開することができます。
(量子コンピュータなどで、将来はわかりません。

3 Ed25519について

そして、Solanaでは、Ed25519という楕円曲線暗号アルゴリズムを用いています。

そのため、生成された公開鍵は、必ずEd25519曲線上にあります。

4 bumpについて

PDAの見つけ方ですが、「シード」と「プログラムID」から見つけるのでした。

ただ、下のように、たまたま公開鍵がEd25519上にあることがありえます。

ここで出てくるのが「bump」です。

Ed25519上でなくなるまで、「bump」の値で調整していきます。

この値は「255」から減らして調整していきます。
(そのため、最大で「256回」調整でき、1バイトでまかなえます。)


これにより、PDAには秘密鍵が存在しないと言いきれます。

5 格納データについて

これは、アカウントとしての特徴ですが、データを紐づけることができます。

後ほど出てきますが、今回は、100バイトの領域を確保し、「authority」「count」という2つのデータを保持します。

4 Anchorでの具体的な処理

以下で、具体的なコードを見ていきます。

概要だけ知りたかったという方は、ここは不要かもしれません。

1 アカウントの構成の定義

アカウント作成時には、下のように、「init(初期化)」「seeds」「bump」を設定しています。

また、「payer」ガス代の支払い者を、「space」データのサイズを指定しています。

そして、そのアカウントが持つデータの構造は、下のように定義されています。

「authority」と「count」の2つを持ちます。)

2 PDAの取得(見つける作業)

まずは、「findProgramAddressSync」を用いて、PDAの公開鍵を取得します。

引数として渡すのは、下のように、「シード」「プログラムID」です。

そして、取得できるのは、「PDAの公開鍵」「bump」です。

下では、その後、「bump」を使用しないため、「_」で受けています。

3 PDAの処理の実行

あとは処理の際に、アカウントで渡しているだけです。

下の場合は、「updateCounter」というメソッドを実行した時の処理です。

エクスプローラで確認すると、このように関係性も確認することができます。

https://explorer.solana.com/tx/3FEv9X2otQKQKooaXbruA2WetnfC85ZS2bb1jnqZANPfZon7Bf3FxoMuvmeXgFybWpf9oVUYQddXMV4QGSe8wbeS?cluster=devnet

4 アカウントの確認

ちなみに、PDAを確認すると、下のように、プログラムと紐づいていることがわかります。

https://explorer.solana.com/address/9u5sLMuFYnKh4sZt1dABNH4uBFmzB9M5RTavnSdFektb?cluster=devnet

また、先ほど指定したサイズも確認できました。

今回は以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊