mcpField
D
deploy-contracts

deploy-contracts

github.com/aptos-labsクラウド・DevOps2090 回インストール24 週間前に更新
リポジトリ

deploy-contracts について

deploy-contractsは、AptosでMoveコントラクトをデプロイする開発者向けのスキルです。監査やテストから検証、アップグレードまでを案内し、mainnetの前にtestnetで試験する手順とオブジェクトデプロイを重視します。

主な機能

  1. 01デプロイ前のセキュリティ・テスト確認
  2. 02deploy-objectによるオブジェクトデプロイ
  3. 03devnetからmainnetまでの手順
  4. 04オブジェクトデプロイ済みモジュールの更新
  5. 05デプロイの検証と記録

活用シーン

  1. 01デプロイ前のコントラクト準備状況の確認
  2. 02testnetで試験してからmainnetへ公開
  3. 03既存のオブジェクトデプロイを更新
  4. 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

このコマンドで実行される処理:

  1. コントラクトコードを格納するオブジェクトを作成します
  2. パッケージをそのオブジェクトのアドレスにデプロイします
  3. オブジェクトアドレスを返します(デプロイするアカウントとパッケージ名に基づく決定論的なアドレス)
  4. オブジェクトアドレスがコントラクトアドレスになります

❌ 誤り:オブジェクトコントラクトに通常の 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 ログインが必要です)。

  1. アカウントアドレスを取得します:aptos config show-profiles
  2. 次のページにアクセスします:https://aptos.dev/network/faucet?address=<your_address>
  3. ログインして testnet APT をリクエストします
  4. ここに戻り、アカウントに資金を追加したことを確認します
# 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 ログインが必要です):

  1. アカウントアドレスを取得します:aptos config show-profiles
  2. 次にアクセスします:https://aptos.dev/network/faucet?address=<your_address>
  3. ログインして testnet APT をリクエストします
  4. 残高を確認します: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 を実行しないでください

参考資料

公式ドキュメント:

エクスプローラー:

関連スキル:

  • security-audit - デプロイ前に監査する
  • generate-tests - テストが存在することを確認する

忘れないでください: セキュリティ監査 → テスト 100% → テストネット → 徹底的なテスト → メインネット。テストネットを省略しないでください。

コメント