anchor-cliをアップデートしたらanchor testでエラー

anchor-cliを最新版にインストール したら、機能が変わったらしく、いろいろと動かなくなった。

今回 v0.19.0 から v0.22.1 にアップデートした。

現象

(例1)Safety checksエラー

Safety checksのエラーが表示される。

% anchor test
BPF SDK: /Users/user/.local/share/solana/install/releases/1.9.9/solana-release/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: cargo +bpf build --target bpfel-unknown-unknown --release
    Finished release [optimized] target(s) in 0.35s
cargo-build-bpf child: /Users/user/.local/share/solana/install/releases/1.9.9/solana-release/bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow.so

To deploy this program:
  $ solana program deploy /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow.so
The program address will default to this keypair (override with --program-id):
  /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow-keypair.json
Error:
        /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/programs/escrow/src/lib.rs:112:8
        Struct field "initializer" is unsafe, but is not documented.
        Please add a `/// CHECK:` doc comment explaining why no checks through types are necessary.
        See https://book.anchor-lang.com/chapter_3/the_accounts_struct.html#safety-checks for more information.

原因

anchor-cliの新バージョンでSafety checks機能が実装されたため。

(参考)もし、新バージョンのまま対応したい場合

Safety checks に書かれているとおりだが、セキュリティを無視して開発環境で手っ取り早く解決したい場合は、CHECKを追記する。

変更前

pub struct CancelEscrow<'info> {
    pub initializer: AccountInfo<'info>,

変更後

pub struct CancelEscrow<'info> {
    /// CHECK:
    pub initializer: AccountInfo<'info>,

(例2)Code not parseableエラー

現象

% anchor test
BPF SDK: /Users/user/.local/share/solana/install/releases/1.9.9/solana-release/bin/sdk/bpf
cargo-build-bpf child: rustup toolchain list -v
cargo-build-bpf child: cargo +bpf build --target bpfel-unknown-unknown --release
    Finished release [optimized] target(s) in 0.23s
cargo-build-bpf child: /Users/user/.local/share/solana/install/releases/1.9.9/solana-release/bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow.so

To deploy this program:
  $ solana program deploy /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow.so
The program address will default to this keypair (override with --program-id):
  /Users/user/Documents/Programming/Blockchain/solana-anchor-react-minimal-example/anchor/sandbox/anchor-cli-v0.19/escrow/target/deploy/escrow-keypair.json
thread 'main' panicked at 'Code not parseable: Error("the payer specified for an init constraint must be mutable.")', lang/syn/src/idl/file.rs:357:58
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

対応

各種エラーは、新バージョンに対応したコードに書き直すのが一番きれいだが、時間がない場合は、過去に動いていたバージョンまでanchor-cliをダウングレードすることで対応可能。

以下は v0.19.0 を指定した場合。

% cargo install --git https://github.com/project-serum/anchor --tag v0.19.0 anchor-cli --locked --force