https://docs.solana.com/developing/programming-model/calling-between-programs
アカウント
Solanaにおけるあらゆるデータオブジェクト。ユニークなAddressを持つ。
例えばWalletはアカウントであるが、Wallet自体が保有するトークンもアカウントを持っている(トークンアカウント)
アカウントはSolana上に存在するためにrent feeを所有している。ある一定額以上所有するとと永久的に存在できる。
// とあるトークンアカウントの例
$ solana account 7c7jnsMLTQ83vGfqiyYZd5DEdT5px4FB5RXqyyZMQT9H
Public Key: 7c7jnsMLTQ83vGfqiyYZd5DEdT5px4FB5RXqyyZMQT9H
Balance: 0.00203928 SOL // rent fee
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA //所有者
Executable: false //プログラムじゃないよ
Rent Epoch: 178
蛇足だが、あらゆるアカウントはプログラムに所有されている
プログラム
// トークンを送付するインストラクション
let transfer_to_initializer_instruction = spl_token::instruction::transfer(
token_program.key, // プログラムアカウント
taker_sending_token_account.key, // 送付するトークンアカウント
initializer_receive_token_account.key, // 受け取るトークンアカウント
taker.key, // 実行権限を持つアカウント
&[&taker.key], // 署名者(このインストラクションでは送付者と同じ)
escrow_info.expected_amount, // 送る量
)?;
// transfer tokens to initializer's receive token account
invoke(
&transfer_to_initializer_instruction,
&[
taker_sending_token_account.clone(),
initializer_receive_token_account.clone(),
taker.clone(),
token_program.clone(),
],
)?;
署名
エスクローのケースでPDAがどう使われるか