Solana AnchorでdeployするとError: Account XXX is not an upgradeable program or already in use

Solana x Anchorでdevnetにdeployするとエラーになる件。

現象

ProgramIDがすでに使われているというエラーが表示される。

% anchor deploy --provider.cluster devnet
Deploying workspace: https://api.devnet.solana.com
Upgrade authority: /Users/user/.config/solana/id.json
Deploying program “crud”...
Program path: /Users/user/Desktop/blockchain/solana-anchor-react-minimal-example-main/2.crud/target/deploy/crud.so...
Error: Account FxzSDGiTEE33f5s7MfMeJPjfdLsMgmAkEqqMxDgaNhr2 is not an upgradeable program or already in use
There was a problem deploying: Output { status: ExitStatus(ExitStatus(256)), stdout: “”, stderr: “” }.

原因

Anchor側で記述していたProgramIDが間違っていて、デプロイに失敗していた。

対応

正しいProgramIDに書き換える。

アドレスを取得する。

% solana address -k target/deploy/[PJ namae]-keypair.json
3mEYunJWpq6hTjSwYJy3a21Ej5LHq3n8pghjBkRYA9T8

Anchor.tomlを正しいアドレスに書き換える。

initialize = "3mEYunJWpq6hTjSwYJy3a21Ej5LHq3n8pghjBkRYA9T8"

programs/[PJ name]/src/lib.rsも同様に書き換える。

declare_id!("3mEYunJWpq6hTjSwYJy3a21Ej5LHq3n8pghjBkRYA9T8");

再度、ビルド&デプロイ。

% anchor build
% anchor deploy --provider.cluster devnet 

補足1

結構間違いやすいため、さわっているディレクトリ自体が正しいか、Keypairパスが正しいか(=アドレスが正しいか)に要注意。

補足2

気づかずに、実はすでにデプロイ済みの場合がある。念のため、「% anchor deploy」で表示されたアドレスや「% solana address -k target/deploy/[PJ namae]-keypair.json」で表示されたアドレスで、Solana Explorerで検索するとよい。

https://explorer.solana.com/?cluster=devnet