near-smart-contracts について
NEAR ProtocolでRustとNEAR SDK v5.xを使うスマートコントラクト開発向けのスキルです。NEAR固有のルールと例を通じて、安全設計、テスト、デプロイ、ガス最適化を扱います。
主な機能
- 01NEAR SDK v5.xの開発ガイド
- 02セキュリティと状態管理のルール
- 03クロスコントラクト呼び出しとアップグレード
- 04テストとガス最適化の実践
- 05cargo nearによる作成とデプロイ手順
活用シーン
- 01cargo nearでRustコントラクトを開始
- 02コントラクトの安全性と状態処理のレビュー
- 03コールバックと失敗ケースのテスト
- 04コントラクト操作のガスコスト削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ near/ agent-skills --skill near-smart-contractsインストール後、Claude Code で/near-smart-contractsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
rules/best-contract-tools.mdchain-signatures.mdsecurity-storage-checks.mdstate-collections.mdstructure-near-bindgen.mdtesting-integration-tests.mdupgrade-migration.mdxcc-promise-chaining.mdyield-resume.md詳細
NEAR スマートコントラクト開発
Rust と NEAR SDK(v5.x)を使用して、NEAR Protocol 上で安全かつ効率的なスマートコントラクトを開発するための包括的なガイドです。
適用する場面
次のような場合に、これらのガイドラインを参照してください。
- Rust で新しい NEAR スマートコントラクトを作成するとき
- セキュリティと最適化の観点から既存のコントラクトコードをレビューするとき
- コントラクト間呼び出しとコールバックを実装するとき
- コントラクトの状態とストレージを管理するとき
- NEAR コントラクトをテストしてデプロイするとき
- ガス使用量とパフォーマンスを最適化するとき
はじめに
前提条件
開発を始める前に、必要なツールをインストールしてください。
# Install Rust (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Add wasm32 target for compiling contracts
rustup target add wasm32-unknown-unknown
# Install cargo-near (build, deploy, and manage contracts)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/cargo-near/releases/latest/download/cargo-near-installer.sh | sh
# Install near-cli-rs (interact with NEAR network)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/latest/download/near-cli-rs-installer.sh | sh
新しいプロジェクトの作成
重要:新しいプロジェクトを作成する際は、必ず
cargo near newを実行してください。Cargo.toml、lib.rs、またはプロジェクトファイルを手動で作成しないでください。このコマンドは、正しい設定で必要なファイルをすべて生成します。
# REQUIRED: Create a new contract project using the official template
cargo near new my-contract
# Navigate to project directory
cd my-contract
# Build the contract
cargo near build
# Run tests
cargo test
cargo near new が必須である理由:
- 適切な依存関係とビルド設定を含む正しい
Cargo.tomlを生成します src/lib.rsのテンプレートを含む適切なプロジェクト構造を作成しますtests/ディレクトリに統合テストの設定を含めますoverflow-checks = trueを指定したリリースプロファイルを設定します- WASM コンパイルに適した正しい crate-type を設定します
- ビルド失敗の原因となる一般的な設定ミスを防ぎます
次のことはしないでください:
Cargo.tomlを手動で作成するsrc/lib.rsを手動で作成する- サンプルからプロジェクト構造をコピー&ペーストする
- この手順を省略して、ファイルを直接作成する
プロジェクト構造
my-contract/
├── Cargo.toml # Dependencies and project config
├── src/
│ └── lib.rs # Main contract code
├── tests/ # Integration tests
│ └── test_basics.rs
└── README.md
Testnet へのデプロイ
# Create a testnet account (if needed)
near account create-account sponsor-by-faucet-service my-contract.testnet autogenerate-new-keypair save-to-keychain network-config testnet create
# Build in release mode
cargo near build --release
# Deploy to testnet
cargo near deploy my-contract.testnet without-init-call network-config testnet sign-with-keychain send
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | セキュリティと安全性 | 重大 | security- |
| 2 | コントラクト構造 | 高 | structure- |
| 3 | 状態管理 | 高 | state- |
| 4 | コントラクト間呼び出し | 中〜高 | xcc- |
| 5 | コントラクトのアップグレード | 中〜高 | upgrade- |
| 6 | チェーン署名 | 中〜高 | chain- |
| 7 | ガス最適化 | 中 | gas- |
| 8 | Yield と Resume | 中 | yield- |
| 9 | テスト | 中 | testing- |
| 10 | ベストプラクティス | 中 | best- |
1. セキュリティと安全性(重大)
security-storage-checks- ストレージ操作を必ず検証し、デポジットを確認するsecurity-access-control-predecessor_account_idを使用して適切なアクセス制御を実装するsecurity-reentrancy- 再入攻撃を防ぐ(外部呼び出しの前に状態を更新する)security-overflow- オーバーフローを防ぐため、Cargo.toml でoverflow-checks = trueを使用するsecurity-callback-validation- コールバックの結果を検証し、失敗に対処するsecurity-private-callbacks- 外部呼び出しを防ぐため、コールバックに#[private]を付けるsecurity-yoctonear-validation-#[payable]関数で付随するデポジットを検証するsecurity-sybil-resistance- スパムを防ぐため、最低デポジット額のチェックを実装する
2. コントラクト構造(高)
structure-near-bindgen- コントラクト構造体に#[near(contract_state)]マクロを使用する(旧#[near_bindgen]の代替)structure-initialization-#[init]パターンを使って適切な初期化を実装するstructure-versioning- バージョン管理の仕組みを用いて、コントラクトのアップグレードに備えるstructure-events-env::log_str()と構造化イベントログ(NEP-297)を使用するstructure-standards- 標準規格については NEAR Enhancement Proposals(NEP)に従うstructure-serializers- データ構造体には#[near(serializers = [json, borsh])]を使用するstructure-panic-default- 初期化を必須にするため、#[derive(PanicOnDefault)]を使用する
3. 状態管理(HIGH)
state-collections-near_sdk::storeの SDK コレクションを使用します:IterableMap、IterableSet、Vector、LookupMap、LookupSet、UnorderedMap、UnorderedSet、TreeMapstate-serialization- 状態には Borsh、外部インターフェースには JSON を使用しますstate-lazy-loading- ガスを節約するため、遅延読み込みには SDK コレクションを使用します(一度にすべてではなく、必要に応じて読み込みます)state-pagination- 大規模なデータセットには.skip()と.take()でページネーションを実装しますstate-migration- バージョン管理を用いた状態移行戦略を計画しますstate-storage-cost- 1 NEAR ≈ 100kb のストレージであり、コントラクトは自身のストレージに対して支払いが必要ですstate-unique-prefixes- すべてのコレクションに一意のバイトプレフィックスを使用します(衝突を避けます)state-native-vs-sdk- ネイティブコレクション(Vec、HashMap)はすべてのデータを読み込むため、100 エントリー未満の場合にのみ使用します
4. コントラクト間呼び出し(MEDIUM-HIGH)
xcc-promise-chaining- プロミスを正しくチェーンしますxcc-callback-handling- すべてのコールバックシナリオ(成功、失敗)に対応しますxcc-gas-management- コントラクト間呼び出しに適切なガスを割り当てますxcc-error-handling- 堅牢なエラー処理を実装しますxcc-result-unwrap- チェックせずにプロミスの結果をアンラップしないでください
5. コントラクトのアップグレードと移行(MEDIUM-HIGH)
upgrade-migration- 状態のバージョン管理には列挙型を使用し、#[init(ignore_state)]を指定したmigrateメソッドを実装しますupgrade-self-update- コントラクトがプログラムから自身を更新できるようにするパターンですupgrade-cleanup-old-state- ストレージを解放するため、古い状態構造を必ず削除しますupgrade-dao-controlled- 本番環境のアップグレードガバナンスには、マルチシグまたは DAO を使用します
6. Chain Signatures(MEDIUM-HIGH)
chain-signatures- 外部ブロックチェーンのアドレスを導出し、MPC 署名をリクエストして、マルチチェーントランザクションを構築しますchain-callback-handling- MPC 署名のコールバックを適切に処理しますchain-gas-allocation- MPC 呼び出しには十分なガスを割り当てます(yield/resume パターン)
7. ガスの最適化(MEDIUM)
gas-batch-operations- トランザクションコストを削減するため、操作をバッチ処理しますgas-minimal-state-reads- 状態の読み書きを最小限に抑えます(メモリにキャッシュします)gas-efficient-collections- 適切なコレクション型を選択します(LookupMap と IterableMap)gas-view-functions- 読み取り専用関数を view(Rust では&self)として指定しますgas-avoid-cloning- 大規模なデータ構造の不要なクローンを避けますgas-early-validation- 無効な入力に対するガスを節約するため、早い段階でrequire!を使用しますgas-prepaid-gas- コントラクト間呼び出しには適切なガスを付与します(推奨値:30 TGas)
8. Yield と Resume(MEDIUM)
yield-resume- yield されたプロミスを作成し、再開を通知し、タイムアウトに対応して、yield/resume 間の状態を管理しますyield-gatekeeping- 権限のない呼び出し元から resume メソッドを保護します
9. テスト(MEDIUM)
testing-integration-tests- 統合テストにはnear-sandboxとnear-apiを使用しますtesting-unit-tests- モックコンテキストを使って包括的な単体テストを作成しますtesting-sandbox- testnet/mainnet の前にローカルサンドボックス環境でテストしますtesting-edge-cases- 境界条件、オーバーフロー、空の状態をテストしますtesting-gas-profiling- 統合テストでガス使用量をプロファイリングしますtesting-cross-contract- コントラクト間呼び出しとコールバックを十分にテストしますtesting-failure-scenarios- プロミスの失敗とタイムアウトのシナリオをテストしますtesting-time-travel- 時間に依存するテストにはsandbox.fast_forward()を使用します
10. ベストプラクティス(中級)
best-contract-tools- NEP 標準(FT、NFT など)および NEP-297 の構造化イベントには、near-sdk-contract-toolsを使用しますbest-panic-messages- 明確で、対処方法が分かるパニックメッセージを記述しますbest-logging- デバッグとイベントの出力には、env::log_str()を使用しますbest-documentation- 公開メソッド、パラメーター、複雑なロジックをドキュメント化しますbest-error-types- カスタムエラー型を定義するか、説明的な文字列を使用しますbest-constants- マジックナンバーや設定には定数を使用しますbest-require-macro- より適切なエラーメッセージを表示できるよう、assert!の代わりにrequire!を使用しますbest-promise-return- 適切に追跡できるよう、コントラクト間呼び出しからプロミスを返しますbest-sdk-crates- SDK がエクスポートするクレート(borsh、serde、base64 など)を再利用しますbest-account-id-encoding- ストレージを 40% 節約するため、AccountId を base32 でエンコードします
使用方法
詳しい説明とコード例については、個々のルールファイルを参照してください。
rules/security-storage-checks.md
rules/structure-near-bindgen.md
rules/state-collections.md
rules/xcc-promise-chaining.md
rules/upgrade-migration.md
rules/chain-signatures.md
rules/yield-resume.md
rules/best-contract-tools.md
rules/testing-integration-tests.md
各ルールファイルには、次の内容が含まれています。
- 重要な理由の簡潔な説明
- 誤ったコード例とその説明
- 正しいコード例とその説明
- 追加の背景情報と NEAR 固有の考慮事項
追加ルール(上流ドキュメント)
ローカルファイルがないルールについては、公式ドキュメントを参照してください(プレーンな Markdown の場合は .md を付加します)。
最新のツールとバージョン
開発ツール
- cargo-near:最新 — コントラクトのビルド、デプロイ、管理(
cargo near build、cargo near deploy) - near-cli-rs:最新 — NEAR 用コマンドラインインターフェース(
near contract call、near contract view) - rustc:最新の安定版 — Rust コンパイラー
- near-sandbox:最新 — 統合テスト用のローカルサンドボックス環境
- near-api-rs:最新 — NEAR とやり取りするための Rust API クライアント(テストでは near-workspaces-rs に代わるもの)
- omni-transaction-rs:最新 — 複数のブロックチェーン(Bitcoin、Ethereum など)向けのトランザクションを構築
SDK バージョン
- near-sdk-rs:v5.x(最新は 5.29.x)— 現行の安定版 SDK。
#[handle_result]と#[near(contract_state)]が最新の慣用表現です - near-sdk-contract-tools:最新 — NEP 標準(FT、NFT、ストレージ管理)用の導出マクロ
主な機能
- 統一されたマクロ構文:
#[near(contract_state)]が#[near_bindgen]と derive を置き換えます - 柔軟なシリアライズ:データ構造体に
#[near(serializers = [json, borsh])]を指定できます - ストアコレクション:
near_sdk::store::IterableMap、IterableSet、LookupMap、LookupSet、Vector、UnorderedMap、UnorderedSet、TreeMap - 簡素化されたコントラクト間呼び出し:
Promise::new()と.then()を使った高水準のプロミス API - NEP サポートを標準搭載:FT(NEP-141)、NFT(NEP-171)、その他の標準規格
- 結果の処理:パニックを起こさずに
Result<T, E>を返すメソッドに使用する#[handle_result] - Yield/Resume:コントラクトは実行を一時停止し、外部サービスによる再開を待機できます
- チェーン署名:他のブロックチェーン(Bitcoin、Ethereum、Solana など)向けのトランザクションに署名できます
- コントラクトツール:Owner、Pause、ロールベースアクセス制御パターン向けの derive マクロ
リソース
- NEAR ドキュメント:https://docs.near.org
- スマートコントラクト クイックスタート:https://docs.near.org/smart-contracts/quickstart
- コントラクトの構造:https://docs.near.org/smart-contracts/anatomy/
- NEAR SDK Rust:https://docs.near.org/tools/sdk
- SDK Rust リファレンス:https://docs.rs/near-sdk
- ストレージとコレクション:https://docs.near.org/smart-contracts/anatomy/collections
- ベストプラクティス:https://docs.near.org/smart-contracts/anatomy/best-practices
- コントラクト間呼び出し:https://docs.near.org/smart-contracts/anatomy/crosscontract
- Yield と Resume:https://docs.near.org/smart-contracts/anatomy/yield-resume
- コントラクトのアップグレード:https://docs.near.org/smart-contracts/release/upgrade
- チェーン署名:https://docs.near.org/chain-abstraction/chain-signatures
- チェーン署名の実装:https://docs.near.org/chain-abstraction/chain-signatures/implementation
- セキュリティのベストプラクティス:https://docs.near.org/smart-contracts/security/checklist
- 統合テスト:https://docs.near.org/smart-contracts/testing/integration-test
- NEP-297 イベント:https://github.com/near/NEPs/blob/master/neps/nep-0297.md
- NEAR 標準規格(NEP):https://github.com/near/NEPs
- NEAR のサンプル:https://github.com/near-examples
- Sandbox テスト:https://github.com/near/near-sandbox
- NEAR API Rust:https://github.com/near/near-api-rs
- Omni Transaction RS:https://github.com/near/omni-transaction-rs
- コントラクトツール:https://github.com/near/near-sdk-contract-tools
ストレージコストの参考情報
| ストレージ | コスト | 備考 |
|---|---|---|
| 1 byte | 0.00001 NEAR | 0.1 NEAR あたり約 10kb |
| 100 KB | 約 1 NEAR | おおよその目安 |
| AccountId | 64+ bytes | base32 エンコーディングで 40% 節約できます |
| コントラクトコード | 変動 | コントラクトアカウントが支払います |
SDK コレクションのリファレンス
| コレクション | 反復可能 | クリア | 順序あり | 範囲検索 | 用途 |
|---|---|---|---|---|---|
Vector | はい | はい | はい | はい | インデックスアクセスが可能な順序付きリスト |
LookupMap | いいえ | いいえ | いいえ | いいえ | 反復が不要な高速なキーと値の格納 |
LookupSet | いいえ | いいえ | いいえ | いいえ | 高速な要素の存在確認 |
IterableMap | はい | はい | はい | いいえ | 反復可能なキーと値の格納 |
IterableSet | はい | はい | はい | いいえ | 反復可能なセット |
UnorderedMap | はい | はい | いいえ | いいえ | 順序なしで反復するキーと値の格納 |
UnorderedSet | はい | はい | いいえ | いいえ | 順序なしで反復するセット |
TreeMap | はい | はい | はい | はい | 範囲クエリに対応したソート済みのキーと値の格納 |
コメント
Markdown 対応