Open1

Anchor

YuheiNakasakaYuheiNakasaka

Anchor

リソース

やること

  • Anchorでの開発の習得

メモ

  • AnchorはSolanaのProgramとそのクライアントの開発のためのフレームワーク
  • A Minimal Example | ⚓ Anchor
    • basic-0: Anchorの動かし方
      • Anchorの使い方解説が主
      • anchor build
        • IDLを生成する。SolidityでいうところのABIと同じ(多分)。
      • anchor deploy
        • 文字通りデプロイ
      • ANCHOR_WALLET=<YOUR-KEYPAIR-PATH> node client.js
        • IDLを使ってclientからRPCでProgramとやりとりを行う
        • Tutorial0ではNODE_PATHを元に実行するのでexport NODE_PATH="$(npm config get prefix)/lib/node_modules"を忘れない。忘れるとCannot find module '@project-serum/anchor'というエラーが出る。
      • anchor test
        • networkの起動~deploy~testまでやってくれる
    • basic-1: Accountの作成と基礎
      • #[program]
        • #[program]のmodule(program)にはRPC request handler(いわゆるinstruction)を書く。clientから呼び出されるendpointみたいなやつになる。
      • #[account]
        • structにserializeとdeserializeを実装する
        • #[account]のstructは#[program]の引数にContextに加えて渡される。
      • #[derive(Accounts)]
        • &[AccountInfo]をstructにデコードできるようにする
        • #[derive(Accounts)]のstructではprogramのinstructionで使われる全てのAccountを定義する。これはprogramのContext<Initialize>Context<Update>のような形でinstructionの引数のcontextに渡される。
        • #[account(init, payer = user, space = 8 + 8)]
          • initは新しく作成されるAccountには必要。payerが誰でどのくらいのサイズを必要とするかを指定する(これによってガス代が変わるので必要)。
        • #[account(mut)]
          • ProgramによるAccountの変更を保持することを意味する
      • Account
        • deserializeされたAccountのラッパー。
        • AccountsをderiveしているstructのAccountdeclared_id!で定義されたProgramに所有されてることが保証される。
    • basic-2: Access Controlについて
      • #[account(mut, has_one = authority)]
        • #[derive(Accounts)]のstructで利用すると、そのAccountへのアクセス制限が可能になる。例えばこの例でいうとIncrement.counter.authority == Increment.authority.keyに等しい制限をかけられる。
        #[account]
        pub struct Counter {
            pub authority: Pubkey, // <- このauthorityと
            pub count: u64,
        }
         
        #[derive(Accounts)]
        pub struct Increment<'info> {
            #[account(mut, has_one = authority)]
            pub counter: Account<'info, Counter>,
            pub authority: Signer<'info>, // <- このauthorityが一致しないとAccountにアクセスできないようになる
        }
        
    • basic-3: 異なるProgram間での呼び出し:
      • CpiContext
        • programIdと関連するaccountをまとめてcontextを作る。このcontextをpuppet::cpi::set_data(cpi_ctx, data)みたいな形でCPIで呼び出すinstructionに渡す
    • basic-4: Errors
      • #[error]
        • #[error]で定義されたenumは各fieldに#[msg("This is a custom error.")]みたいな感じでアノテーションをつけられる。あとはErr(ErrorCode::Hello.into())感じで使えば良い。
  • The Complete Guide to Full Stack Solana Development with React, Anchor, Rust, and Phantom - DEV Community
    • AnchorでCRUD(Dはないけど)アプリを作ってみるTutorial
      • anchor testでいきなりFailed to run test: mocha -t 1000000 tests/: No such file or directoryが出るが...
      • localhostのairdropが出来ない
        • URLを指定したらできた: solana airdrop 1 <WALLET ADDRESS> --url http://127.0.0.1:8899
      • Javascriptだとparameterの間違いに気づけなかったりでハマりやすいのでTypescriptでUIは書いた方がいいと思った(signerssignerと書いておりしばらくハマったので...)
  • Anchor Example: Escrow Program - HackMD
    • わからなすぎなのでとりあえずツッコミを入れながら写経することにした