deploy-contracts について
deploy-contractsは、AptosでMoveコントラクトをデプロイする開発者向けのスキルです。監査やテストから検証、アップグレードまでを案内し、mainnetの前にtestnetで試験する手順とオブジェクトデプロイを重視します。
主な機能
- 01デプロイ前のセキュリティ・テスト確認
- 02deploy-objectによるオブジェクトデプロイ
- 03devnetからmainnetまでの手順
- 04オブジェクトデプロイ済みモジュールの更新
- 05デプロイの検証と記録
活用シーン
- 01デプロイ前のコントラクト準備状況の確認
- 02testnetで試験してからmainnetへ公開
- 03既存のオブジェクトデプロイを更新
- 04残高・コンパイル・Gasエラーの調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aptos-labs/ aptos-agent-skills --skill deploy-contractsインストール後、Claude Code で/deploy-contractsを入力して読み込まれたか確認します。
詳細
コントラクトのデプロイスキル
概要
このスキルでは、Aptos ネットワークに Move コントラクトを安全にデプロイする方法を説明します。必ずメインネットの前にテストネットへデプロイしてください。
デプロイ前チェックリスト
デプロイする前に、すべての項目を確認してください。
セキュリティ監査 ⭐ 重要 — SECURITY.md を参照
- セキュリティ監査を完了している(
security-auditスキルを使用) - すべての重大な脆弱性を修正している
- すべてのセキュリティパターンを確認している(算術演算の安全性、ストレージのスコープ、参照の安全性、ビジネスロジック)
- アクセス制御を確認している(署名者チェック、オブジェクトの所有権)
- 入力検証を実装している(最小しきい値、手数料の検証)
- 無制限の反復処理がない(グローバルベクターではなく、ユーザーごとのストレージを使用)
- アトミック操作を使用している(フロントランニングの機会がない)
- 乱数のセキュリティを確保している(該当する場合 — エントリー関数、ガスのバランス)
テスト
- テストカバレッジを 100% 達成している:
aptos move test --coverage - すべてのテストに合格している:
aptos move test - カバレッジレポートが 100.0% を示している
- エッジケースをテストしている
コード品質
- エラーなしでコードをコンパイルできる:
aptos move compile - ハードコードされたアドレスがない(名前付きアドレスを使用)
- エラーコードが明確に定義されている
- 関数が適切に文書化されている
設定
- Move.toml が正しく設定されている
- 名前付きアドレスが設定されている:
my_addr = "_" - 依存関係が正しいバージョンで指定されている
- ネットワーク URL が設定されている
オブジェクトのデプロイ(最新のパターン)
重要:正しいデプロイコマンドを使用してください
コントラクトのデプロイ方法は 2 つあります。最新のオブジェクトベースのコントラクトには、deploy-object を使用してください。
✅ 正しい:オブジェクトのデプロイ(最新のパターン)
aptos move deploy-object \
--address-name my_addr \
--profile devnet \
--assume-yes
このコマンドで実行される処理:
- コントラクトコードを格納するオブジェクトを作成します
- パッケージをそのオブジェクトのアドレスにデプロイします
- オブジェクトアドレスを返します(デプロイするアカウントとパッケージ名に基づく決定論的なアドレス)
- オブジェクトアドレスがコントラクトアドレスになります
❌ 誤り:オブジェクトコントラクトに通常の Publish を使用する
# ❌ Don't use this for object-based contracts
aptos move publish \
--named-addresses my_addr=<address>
それぞれの使用場面:
deploy-object:オブジェクトを使用する最新のコントラクト(推奨)publish:従来のアカウントベースのデプロイ(古いパターン)
オブジェクトのデプロイが必要かどうかを判断する方法:
- コントラクトが
init_moduleで名前付きオブジェクトを作成する - コントラクトが
object::create_named_object()を使用する - 決定論的なコントラクトアドレスが必要である
- ドキュメントに「オブジェクトとしてデプロイ」と記載されている
オブジェクトのデプロイに使える別のコマンド
オプション 1:deploy-object(推奨 — 最も簡単)
aptos move deploy-object --address-name my_addr --profile devnet
- オブジェクトを自動的に作成し、コードをデプロイします
- オブジェクトアドレスは決定論的です
- ほとんどのユースケースに最適です
オプション 2:create-object-and-publish-package(高度な方法)
aptos move create-object-and-publish-package \
--address-name my_addr \
--named-addresses my_addr=default
- オプションが多く、より複雑なコマンドです
- 特定のオブジェクト設定が必要な場合にのみ使用してください
- 通常は必要ありません
推奨: 別の方法を使用する特別な理由がない限り、常に deploy-object を使用してください。
デプロイのワークフロー
ステップ 1:ローカルでテストする
# Ensure all tests pass
aptos move test
# Verify 100% coverage
aptos move test --coverage
aptos move coverage summary
# Expected output: "coverage: 100.0%"
ステップ 2:コンパイルする
# Compile contract
aptos move compile --named-addresses my_addr=<your_address>
# Verify compilation succeeds
echo $?
# Expected: 0 (success)
ステップ 3:Devnet にデプロイする(任意)
Devnet は手早いテストや実験に使用します。aptos init の実行時にアカウントへ自動で資金が付与されます。
初期化する前にプロファイルが存在するか確認してください。
# Check if default profile exists (look for "default" in output)
aptos config show-profiles
# If no profile exists, initialize one (auto-funds on devnet)
aptos init --network devnet --assume-yes
# Deploy as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# Save the object address from output for future upgrades
# Output: "Code was successfully deployed to object address 0x..."
# Verify deployment
aptos account list --account <object_address> --profile default
ステップ 4:Testnet にデプロイする(必須)
Testnet はメインネットに進む前の最終テストに使用します。
初期化する前にプロファイルが存在するか確認してください。
# Check if default profile exists
aptos config show-profiles
# If no profile exists, initialize one
aptos init --network testnet --assume-yes
ウェブの Faucet からアカウントに資金を追加します(必須 — testnet faucet には Google ログインが必要です)。
- アカウントアドレスを取得します:
aptos config show-profiles - 次のページにアクセスします:
https://aptos.dev/network/faucet?address=<your_address> - ログインして testnet APT をリクエストします
- ここに戻り、アカウントに資金を追加したことを確認します
# Verify balance
aptos account balance --profile default
# Deploy to testnet as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# IMPORTANT: Save the object address from output
# You'll need it for upgrades and function calls
# Output: "Code was successfully deployed to object address 0x..."
ステップ 5:Testnet でテストする
# Run entry functions to verify deployment
aptos move run \
--profile default \
--function-id <deployed_address>::<module>::<function> \
--args ...
# Test multiple scenarios
# - Happy paths
# - Error cases (should abort with correct error codes)
# - Access control
# - Edge cases
# Verify using explorer
# https://explorer.aptoslabs.com/?network=testnet
ステップ 6:Mainnet にデプロイする(Testnet での成功後)
十分な testnet テストを行ってから、メインネットにデプロイしてください。
初期化する前にプロファイルが存在するか確認してください。
# Check if default profile exists
aptos config show-profiles
# If no profile exists, initialize one
# IMPORTANT: Warn user that this generates a private key — store it securely
aptos init --network mainnet --assume-yes
アカウントに資金を追加します: 取引所またはウォレットから、アカウントアドレスに実際の APT を送金します。
# Verify balance
aptos account balance --profile default
# Deploy to mainnet as object (modern pattern)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--max-gas 20000 # Optional: set gas limit
# Review prompts carefully before confirming:
# 1. Gas confirmation: Review gas costs
# 2. Object address: Note the object address for future reference
# OR use --assume-yes to auto-confirm (only if you're confident)
aptos move deploy-object \
--address-name my_addr \
--profile default \
--assume-yes
# SAVE THE OBJECT ADDRESS from output
# You'll need it for upgrades and documentation
# Confirm deployment
# Review transaction in explorer:
# https://explorer.aptoslabs.com/?network=mainnet
ステップ 7:デプロイを検証する
# Check module is published
aptos account list --account <deployed_address> --profile default
# Look for your module in the output
# "0x...::my_module": { ... }
# Run view function to verify
aptos move view \
--profile default \
--function-id <deployed_address>::<module>::<view_function> \
--args ...
ステップ 8:デプロイを記録する
デプロイ記録を作成します:
# Deployment Record
**Date:** 2026-01-23 **Network:** Mainnet **Module:** my_module **Address:** 0x123abc... **Transaction:** 0x456def...
## Verification
- [x] Deployed successfully
- [x] Module visible in explorer
- [x] View functions working
- [x] Entry functions tested
## Links
- Explorer: https://explorer.aptoslabs.com/account/0x123abc...?network=mainnet
- Transaction: https://explorer.aptoslabs.com/txn/0x456def...?network=mainnet
## Notes
- All security checks passed
- 100% test coverage verified
- Tested on testnet for 1 week before mainnet
モジュールのアップグレード
既存のオブジェクトデプロイメントのアップグレード
オブジェクトとしてデプロイされたモジュールは、デフォルトでデプロイしたユーザーがアップグレードできます。
# Upgrade existing object deployment
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address_from_initial_deploy> \
--profile mainnet
# Upgrade with auto-confirm
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address> \
--profile mainnet \
--assume-yes
# Verify upgrade
aptos account list --account <object_address> --profile mainnet
重要: 最初の deploy-object の出力に表示されたオブジェクトアドレスを保存してください。アップグレード時に必要です。
アップグレードの互換性ルール:
- ✅ 可能: 新しい関数の追加
- ✅ 可能: 新しい構造体の追加
- ✅ 可能: 構造体への新しいフィールドの追加(慎重に行ってください)
- ❌ 不可: 既存の関数の削除(互換性が損なわれます)
- ❌ 不可: 関数シグネチャの変更(互換性が損なわれます)
- ❌ 不可: 構造体フィールドの削除(既存のデータが壊れます)
モジュールを不変にする
今後のアップグレードを防ぐには:
// In your module
fun init_module(account: &signer) {
// After deployment, burn upgrade capability
// (implementation depends on your setup)
}
コストの見積もり
ガスコスト
# Typical deployment costs:
# - Small module: ~500-1000 gas units
# - Medium module: ~1000-5000 gas units
# - Large module: ~5000-20000 gas units
# When you run deploy-object, the CLI shows gas estimate before confirming
# Use --assume-yes only after you've verified costs on testnet first
メインネットのコスト
ガスコストは APT で支払います:
- ガス単位数 × ガス価格 = 合計コスト
- 例:5000 ガス単位 × 100 Octas/ガス = 500,000 Octas = 0.005 APT
複数モジュールのデプロイ
複数のモジュールをデプロイする
方法 1:単一のパッケージ(推奨)
project/
├── Move.toml
└── sources/
├── module1.move
├── module2.move
└── module3.move
# Deploys all modules at once as a single object
aptos move deploy-object --address-name my_addr --profile testnet
方法 2:依存関係を含む個別のパッケージ
# Deploy dependency package first
cd dependency-package
aptos move deploy-object --address-name dep_addr --profile testnet
# Note the object address from output
# Update main package Move.toml to reference dependency address
# Then deploy main package
cd ../main-package
aptos move deploy-object --address-name main_addr --profile testnet
デプロイに関するトラブルシューティング
「APT の残高が不足しています」
Devnet: aptos init で自動的に資金が補充されます。必要な場合は、次を実行します:
aptos account fund-with-faucet --account default --amount 100000000 --profile default
Testnet: ウェブのファウセットを使用します(Google ログインが必要です):
- アカウントアドレスを取得します:
aptos config show-profiles - 次にアクセスします:
https://aptos.dev/network/faucet?address=<your_address> - ログインして testnet APT をリクエストします
- 残高を確認します:
aptos account balance --profile default
Mainnet: 取引所またはウォレットから実際の APT をアカウントに送金します。
「モジュールはすでに存在します」(オブジェクトデプロイメントの場合)
# Use upgrade-object with the original object address
aptos move upgrade-object \
--address-name my_addr \
--object-address <object_address_from_initial_deploy> \
--profile testnet
「コンパイルに失敗しました」
# Fix compilation errors first
aptos move compile
# Fix all errors shown, then retry deployment
「ガス上限を超えました」
# Increase max gas
aptos move deploy-object \
--address-name my_addr \
--profile testnet \
--max-gas 50000
デプロイチェックリスト
デプロイ前:
- セキュリティ監査に合格
- テストカバレッジ 100%
- すべてのテストに合格
- コードのコンパイルに成功
- 名前付きアドレスを設定済み
- 対象ネットワークを選択済み(まずは testnet!)
デプロイ中:
- 正しいネットワークを選択
- 正しいアドレスを指定
- トランザクションを送信
- トランザクションハッシュを記録
デプロイ後:
- エクスプローラーでモジュールを確認
- ビュー関数が動作
- エントリー関数をテスト
- デプロイを記録
- チームに通知
CLI 引数の型
CLI 経由でエントリー関数またはビュー関数を呼び出す場合は、次の型プレフィックスを使用します:
プリミティブ型
--args u64:1000 # u8, u16, u32, u64, u128, u256
--args bool:true # boolean
--args address:0x1 # address
複合型
--args string:"Hello World" # UTF-8 string
--args hex:0x48656c6c6f # raw bytes
--args "u64:[1,2,3,4,5]" # vector<u64>
--args "string:[\"one\",\"two\",\"three\"]" # vector<String>
オブジェクト型
# For Object<T> parameters, pass the object address
--args address:0x123abc...
必ず守るルール
- ✅ デプロイ前に必ず包括的なセキュリティ監査を実施します(
security-auditスキルを使用) - ✅ セキュリティテストでテストカバレッジ 100%を必ず確認します
- ✅ SECURITY.md に記載されたすべてのパターン(算術演算、ストレージのスコープ設定、参照の安全性、ビジネスロジック)を必ず確認します
- ✅ 必ず
deploy-objectを使用します(レガシーのresource_account::create_resource_account()は使用しません) - ✅ メインネットの前に必ず testnet にデプロイします
- ✅ testnet で必ず十分にテストします(正常系、エラーケース、セキュリティシナリオ)
- ✅ 秘密鍵を必ず安全にバックアップします
- ✅ デプロイアドレスを必ず記録します
- ✅ エクスプローラーでデプロイを必ず確認します
- ✅ デプロイ後に必ず関数をテストします
- ✅ testnet と mainnet では必ず別々のキーを使用します(SECURITY.md - Operations)
禁止事項
- ❌ 包括的なセキュリティ監査なしでデプロイしないでください
- ❌ テストカバレッジが 100% 未満の状態でデプロイしないでください
- ❌ セキュリティテストの検証なしでデプロイしないでください
- ❌ テストネットでテストせずに、メインネットへ直接デプロイしないでください
- ❌ 最初にテストネットでテストせずにデプロイしないでください
- ❌ 秘密鍵をバージョン管理にコミットしないでください
- ❌ デプロイ後の検証を省略しないでください
- ❌ メインネットへのデプロイを急がないでください
- ❌ テストネットとメインネットで公開鍵を使い回さないでください(セキュリティリスク)
- ❌
~/.aptos/config.yamlや.envファイルの内容を読み取ったり表示したりしないでください(秘密鍵が含まれています) - ❌ 回答に秘密鍵の値を表示しないでください。「0x...」のプレースホルダーを使用してください
- ❌
cat ~/.aptos/config.yaml、echo $VITE_MODULE_PUBLISHER_ACCOUNT_PRIVATE_KEY、または類似のコマンドを実行しないでください - ❌
.envが.gitignoreに含まれていることを確認せずに、git add .やgit add -Aを実行しないでください
参考資料
公式ドキュメント:
- CLI による公開:https://aptos.dev/build/cli/working-with-move-contracts
- ネットワークエンドポイント:https://aptos.dev/nodes/networks
- ガスと手数料:https://aptos.dev/concepts/gas-txn-fee
エクスプローラー:
- メインネット:https://explorer.aptoslabs.com/?network=mainnet
- テストネット:https://explorer.aptoslabs.com/?network=testnet
- Devnet:https://explorer.aptoslabs.com/?network=devnet
関連スキル:
security-audit- デプロイ前に監査するgenerate-tests- テストが存在することを確認する
忘れないでください: セキュリティ監査 → テスト 100% → テストネット → 徹底的なテスト → メインネット。テストネットを省略しないでください。