Solana x Anchorでdevnetにdeployするとエラーになる件。
Agenda
現象
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