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」というメソッドを実行した時の処理です。
エクスプローラで確認すると、このように関係性も確認することができます。
4 アカウントの確認
ちなみに、PDAを確認すると、下のように、プログラムと紐づいていることがわかります。
また、先ほど指定したサイズも確認できました。
今回は以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊