nft-development について
トークン規格、メタデータ、マーケットプレイス連携、オンチェーン生成アートを扱う NFT 開発ガイドの技能です。NFT コントラクトやコレクションを設計・構築する開発者を対象としています。
主な機能
- 01ERC-721、ERC-721A、ERC-1155、DN404 の比較
- 02NFT メタデータの設計
- 03OpenSea とロイヤリティの解説
- 04オンチェーン SVG アートの生成
- 05ガス最適化と注意点の説明
活用シーン
- 01コレクションに使うトークン規格の選定
- 02NFT メタデータの構成
- 03コントラクトへのロイヤリティ追加
- 04メタデータやミントの問題の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-blockchain --skill nft-developmentインストール後、Claude Code で/nft-developmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py詳細
NFT 開発スキル
トークン規格、メタデータ設計、マーケットプレイス連携、オンチェーンのジェネレーティブアートを活用した NFT 開発を習得します。
クイックスタート
# Invoke this skill for NFT development
Skill("nft-development", topic="standards", standard="ERC721A")
対象トピック
1. トークン規格
適切な規格を選択します。
- ERC-721:標準的な NFT。ID ごとに 1 つのトークン
- ERC-721A:ガスを最適化したバッチミント
- ERC-1155:マルチトークン、セミファンジブル
- DN404:分割可能な NFT ハイブリッド
2. メタデータ設計
NFT データを構成します。
- オンチェーン:Base64 JSON、SVG
- IPFS:コンテンツアドレス指定型ストレージ
- Arweave:永続ストレージ
- 動的:進化するトレイト
3. マーケットプレイス連携
NFT を出品・販売します。
- OpenSea:Seaport プロトコル
- ロイヤリティ:EIP-2981
- オペレーターフィルター:ロイヤリティの強制
- コレクション認証:メタデータ規格
4. オンチェーンアート
Solidity でアートを生成します。
- SVG 生成:動的な図形
- シードベース:決定論的なランダム性
- トレイト:希少性の分布
- Base64:データ URI エンコード
コード例
ERC-721A ミント
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721A, Ownable {
uint256 public constant MAX_SUPPLY = 10000;
uint256 public constant PRICE = 0.08 ether;
error MaxSupplyReached();
error InsufficientPayment();
constructor() ERC721A("MyNFT", "MNFT") Ownable(msg.sender) {}
function mint(uint256 quantity) external payable {
if (_totalMinted() + quantity > MAX_SUPPLY) revert MaxSupplyReached();
if (msg.value < PRICE * quantity) revert InsufficientPayment();
_mint(msg.sender, quantity);
}
function _startTokenId() internal pure override returns (uint256) {
return 1;
}
}
オンチェーン SVG
function tokenURI(uint256 tokenId) public view returns (string memory) {
uint256 seed = seeds[tokenId];
string memory svg = string(abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">',
'<rect width="400" height="400" fill="#', _getColor(seed), '"/>',
'<circle cx="200" cy="200" r="80" fill="#', _getColor(seed >> 24), '"/>',
'</svg>'
));
string memory json = string(abi.encodePacked(
'{"name":"Art #', tokenId.toString(),
'","image":"data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}'
));
return string(abi.encodePacked(
"data:application/json;base64,",
Base64.encode(bytes(json))
));
}
EIP-2981 ロイヤリティ
import "@openzeppelin/contracts/token/common/ERC2981.sol";
contract NFTWithRoyalty is ERC721A, ERC2981 {
constructor() {
_setDefaultRoyalty(msg.sender, 500); // 5%
}
function supportsInterface(bytes4 interfaceId)
public view override(ERC721A, ERC2981)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
メタデータスキーマ
ERC-721 規格
{
"name": "Cool NFT #1",
"description": "A very cool NFT",
"image": "ipfs://QmXxx.../1.png",
"animation_url": "ipfs://QmXxx.../1.mp4",
"external_url": "https://example.com/1",
"attributes": [
{ "trait_type": "Background", "value": "Blue" },
{ "trait_type": "Rarity", "value": "Legendary" },
{ "display_type": "number", "trait_type": "Power", "value": 100 }
]
}
規格の比較
| 規格 | 最適な用途 | ガス(1 ミント) | ガス(5 ミント) |
|---|---|---|---|
| ERC-721 | シンプルな NFT | ~100k | ~500k |
| ERC-721A | PFP コレクション | ~100k | ~120k |
| ERC-1155 | ゲームアイテム | ~50k | ~80k |
よくある落とし穴
| 落とし穴 | 問題 | 解決策 |
|---|---|---|
| メタデータが表示されない | tokenURI の不備 | JSON を検証し、CORS を確認する |
| ガス代が高すぎる | 標準の ERC-721 | バッチには ERC-721A を使用する |
| ロイヤリティが支払われない | マーケットプレイスが無視する | オペレーターフィルターを使用する |
| リビールが機能しない | ベース URI の誤り | まずテストネットでテストする |
トラブルシューティング
「OpenSea でメタデータが表示されない」
- tokenURI が有効な JSON を返すことを確認します
- IPFS ゲートウェイにアクセスできることを確認します
- API 経由でメタデータを更新します。
curl "https://api.opensea.io/api/v2/chain/ethereum/contract/{addr}/nfts/{id}/refresh"
「バッチミントでガス不足になる」
- ERC-721 の代わりに ERC-721A を使用します
- 1 回のトランザクションあたりのバッチサイズを 10~20 に制限します
「ロイヤリティが強制されない」
オペレーターフィルターを実装します。
import "operator-filter-registry/src/DefaultOperatorFilterer.sol";
function setApprovalForAll(address op, bool approved)
public override onlyAllowedOperatorApproval(op)
{
super.setApprovalForAll(op, approved);
}
ガスの最適化
| 手法 | 節約量 |
|---|---|
| ERC721A のバッチ処理 | バッチで約 80% |
| Merkle ホワイトリスト | マッピングと比べて約 50% |
| パックドストレージ | スロットあたり約 20k |
| カスタムエラー | エラーあたり約 200 |
相互参照
- Bonded Agent:
07-nft-development - 関連スキル:
solidity-development、web3-frontend
リソース
- ERC-721:eips.ethereum.org/EIPS/eip-721
- ERC-721A:erc721a.org
- OpenSea メタデータ:docs.opensea.io/docs/metadata-standards
バージョン履歴
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 2.0.0 | 2025-01 | 規格とオンチェーン機能を備えた本番品質のリリース |
| 1.0.0 | 2024-12 | 初回リリース |
コメント
Markdown 対応