Open1

Solanaの学習

YuheiNakasakaYuheiNakasaka

Solanaの学習

リソース

やること

  • Solana全然わからんのに片っ端からわかりやすそうなのをやっていく

メモ

  • Solana Tutorial - Create Your Own Token and NFT
    • CLIでwalletの使い方やFT&NFTの発行の仕方をdevnetで説明してくれる。Wallet,Account,Tokenの関係がわかりやすい。
    • Explorer | Solanaでアドレスを追いながら確認できる
      1. Walletの作成
      • solana-keygen new --outfile ~/.config/solana/my-keypair.json
      • Phantomに~/.config/solana/my-keypair.jsonの中身をImport private keyに入力すると連携できる。
      1. configの設定
      • solana config set --url https://api.devnet.solana.com --keypair ~/.config/solana/my-keypair.json
      1. token作成
      • spl-token create-token
        • address: 5FoKaw3YzoTHQaQUMZiixPmkBbpmtPxwuHwP2UkrvpSY
      1. account作成
      • spl-token create-account 5FoKaw3YzoTHQaQUMZiixPmkBbpmtPxwuHwP2UkrvpSY
      1. mint
      • spl-token mint 5FoKaw3YzoTHQaQUMZiixPmkBbpmtPxwuHwP2UkrvpSY 100
      1. tokenの固定
      • spl-token authorize 5FoKaw3YzoTHQaQUMZiixPmkBbpmtPxwuHwP2UkrvpSY mint --disable
  • Programming Solana
    • solana-labs/example-helloworld: Hello world on Solanaのコードレベルでの丁寧な解説
    • 中身
      • Program(contract)とClientのやりとりが実装されてる
      • ClientからsayHelloされるとProgramのAccountのdataがカウントアップされる
      • Client(TypeScript)とProgram(Rust)の間のやりとりで使われるデータがどうエンコード・デコードされるかあたりが見所。
      • EthereumだとSolidityがjson形式のabiを吐いて、それを使いクラアント側から呼び出す感じだったが、それがSolanaのSmart Contractだとどうなるのかを考えながら読むと良さそう
    • ownerはuserではなくcontrollerに近い。 == program_id
    • near/borsh-rs: Rust implementation of Binary Object Representation Serializer for Hashing
      • バイナリデータのシリアライズ/デシリアライズを行う
      • バイナリ <-> 型の変換を行なっている
    • greeting_account.serialize(&mut &mut account.data.borrow_mut()[..])?;は何をやっとる?
      • borrow_mutとは?
        • RC<T>RefCell<T>Box<T>の整理
          • RC<T>は値への参照の数をカウントする型。同じデータに複数の所有者を持たせてくれる。
            • UseCase: ヒープにプログラムの複数箇所で読む何らかのデータを確保したいけれど コンパイル時にはどの部分が最後にデータを使用し終わるか決定できない時に使用される。
          • RefCell<T>は実行時に精査されるBox<T>みたいなやつ。不変参照でもRefCell<T>の値を可変にできるのが強い。
            • Box<T>はコンパイル時に不変借用も可変借用も精査される。いかなる時も(以下の両方ではなく、)1つの可変参照かいくつもの不変参照のどちらかが可能になる。参照は常に有効。<- RefCel<T>と違うところ
        • borrow_mutRefCell<T>から可変参照を取得するためのメソッド
      • つまり、「account.data(Rc<RefCell<mut [u8]>>)にborrow_mutを呼び出して可変参照で[u8]を取り出し、[..]で中身を全て展開し、それらのデータをserializeでエンコードしてる」という意味
  • Create a Solana NFT collection - Ultimate guide (devnet)
  • A Gentle Introduction to Solana. | Kirima's Blog
    • solana-labs/example-helloworld: Hello world on Solanaのコードレベルでの丁寧な解説の記事バージョン。Youtubeの動画より落ち着いて読めるのでこっちの方が良い。
    • This is because Solana programs do not store data, data is stored in accounts

    • In Solana, we also have to pay rent for the storage cost of keeping the account alive. However, an account can be made entirely exempt from rent collection by depositing at least 2 years worth of rent.

  • Understanding Program Derived Addresses | Brian Friel
    • Programming on Solana - An Introduction | paulxがどうしても理解しきれないとDiscordで呟いたらこの記事がおすすめされたので読んでみる
    • KeyPairの保存への課題に対しての解決策としてPDA(Program Derived Address)
    • 全てのProgramは状態を持たないステートレスな存在。よって状態は全てAccountにあり、Programには参照で渡される。
    • AccountはSystem Programによって作成/登録される。
    • Accountへのread&creditは誰でもできる、writeはowner accountのみができる。
    • Accountはkeypairを持つ。public keyはunique addressになる。
      • ではprivate keyは誰が持ってるのか->誰も持っていない!?
    • PDAはAccountがProgramから操作できるようにするためのアドレス(ed25519由来でないaddress)。
      • PDAを使うとProgramはaddressをprivate key無しで署名できる
        • 署名: 平文が改竄されてないことを証明するもの
      • PDAは署名されたaddressのprivate keyを外部のユーザーが生成できないことも保証する
        • どうやって
          • findProgramDerivedAddress(programId, seeds, seedBump)をed25519の楕円曲線暗号に一致しないaddress(=public key)が見つかるまで回す。よってprivate keyに関連しないaddressが生成できる。private keyが存在しない = 外部のユーザーがPDAのための正確な署名を生成することもできない。
  • Derived Address日本語で
    • これで完全に理解できる。神。日本語解説。ありがた杉内。
      こいつ(PDA)は要は、Walletみたいな感じでトランザクションの署名(改竄されないようにする)をやってくれる役割のやつだった。ProgramがAccount1からAccount2へ送金みたいなことをしたい時にどうしても署名が必要になる。トランザクションの署名には通常Keypairが必要。だがしかしWallletのPublic&PrivateKeyみたいなKeypairをProgramでは保持できない(したくない)。代わりにそのトランザクションに署名してくれるやつが必要になる。その時に使われるのがPDAである。PDAはprogram_idとseedから作成される。PDAの中身はただのPublic keyみたいなAddressである。Public key みたいな Address とは何かというと、正確にはPDAは楕円曲線暗号のed25519(通常のKeypairを生成する方法)とは異なるやり方で生成されているということ。楕円曲線暗号とは異なるということはつまりPDAにはPrivateKeyが存在しないということになる。これの何が嬉しいかというとPrivateKeyが存在しないので翻って言えば外部のユーザーには正確な署名を生成できないということになる。またKeypairをどこかに保存しておく必要もなくなる。ランタイムだけがどのProgramがinstructionを実行するのか知っておりprogram_idとseedからPDAを再生成できる(=これで安全に署名が可能になる)。こうして安全にProgramがAccountとAccountの間のやりとり=CPI(Cross-Program Invocations)が行えるようになるわけだ。
  • Learning Solana #3: What Is a Program Derived Address? | by Matt Lim | Oct, 2021 | Medium
  • Figment Learn | Tutorials
    • SolanaのJavascript SDKの使い方を実際の動かないコードを動くように修正しながら学んでいけるサイト
    • 題材はsolana-labs/example-helloworld: Hello world on Solanaとほぼ同じ。
    • GUIで実際に動きが確認できるしweb3.jsのドキュメントを読んでコードを変更していくのでスッと頭に入ってくる感じがある