Solana Anchorで「does not match authority provided」エラー

現象

すでにデプロイしているAnchorのWalletが、いろいろ試しすぎたため、トークンやNFTで非常に汚くなってしまい、テストがやりにくくなってしまった。
そこで、AnchorのWalletを変更して「anchor test」したところ、プログラムの変更権限がない旨のエラー。

ターミナル:

 *  Executing task: anchor test 

BPF SDK: /Users/user/.local/share/solana/install/releases/1.10.8/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.52s
cargo-build-bpf child: /Users/user/.local/share/solana/install/releases/1.10.8/solana-release/bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /Users/user/Desktop/dev/guess-the-number/anchor/guess_the_number/target/deploy/guess.so

To deploy this program:
  $ solana program deploy /Users/user/Desktop/dev/guess-the-number/anchor/guess_the_number/target/deploy/guess.so
The program address will default to this keypair (override with --program-id):
  /Users/user/Desktop/dev/guess-the-number/anchor/guess_the_number/target/deploy/guess-keypair.json
Deploying workspace: https://api.devnet.solana.com
Upgrade authority: ./app/assets/keys/payer.key.json
Deploying program "guess"...
Program path: /Users/user/Desktop/dev/guess-the-number/anchor/guess_the_number/target/deploy/guess.so...
Error: Program's authority Some(HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg) does not match authority provided 88K2xdjhYggYAjWwvcU44XNbjLYYDKHvX87wHvspB9Py
There was a problem deploying: Output { status: ExitStatus(unix_wait_status(256)), stdout: "", stderr: "" }.

Anchor.toml(wallet箇所を新しいKeypairに指定):

[features]
seeds = false
skip-lint = false
[programs.localnet]
guess = "73nne9bqtG4wJiey1spoFfSsstZzE8TwPyvUogP1yiep"

[registry]
url = "https://api.apr.dev"

[provider]
# cluster = "localnet"
cluster = "devnet"
# wallet = "~/.config/solana/id.json"
wallet = "./app/assets/keys/payer.key.json"

[scripts]
test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"

原因

すでにプログラムをデプロイしているため、現プログラムと旧Walletが紐付いてしまっている。旧Wallet以外ではデプロイができない状態。

【現プログラムID】
73nne9bqtG4wJiey1spoFfSsstZzE8TwPyvUogP1yiep

【旧Wallet(変更権限がこのWalletに紐付いている)】
HXtBm8XZbxaTt41uqaKhwUAa6Z1aPyvJdsZVENiWsetg

【新Wallet(変更権限がないと言われたWallet)】
88K2xdjhYggYAjWwvcU44XNbjLYYDKHvX87wHvspB9Py

逆に、新Walletで変更できてしまうと、デプロイされているプログラムを誰でも勝手に変更できてしまうため、当然の挙動と思われる。

対応

デプロイ時に生成される下記のプログラムIDを削除してから、「anchor build」または「anchor test」を実行。

target/deploy/<PJ名>-keypair.json

そうすると、新しくプログラムID用のKeypairが生成されるため、以下を対応する

  1. ターミナルで「anchor keys list」でプログラムIDを取得
  2. Anchor.toml と programs/src/lib.rs を新しいプログラムIDに変更
  3. 再度、「anchor test」を実施して成功していることを確認(ただし、新Walletにトランザクション手数料を入れるのを忘れずに)