10,000 CryptoPunks ייחודיים, 8,888 Azuki, 8,000 Milady—כל הקולקציות הללו בנויות על אותו עיקרון: שילוב אלגוריתמי של שכבות תכונות עם הסתברויות נתונות יוצר תמונות ייחודיות. הצד הטכני מורכב משני חלקים חשובים באותה מידה: מחולל התמונות וחוזה החכם של ה-mint. שגיאות בכל שלב—ממטריצת תאימות שגויה ועד לפרצת חוזה—יכולות לעלות אלפי דולרים בגז ובמוניטין.
מדריך זה מכסה פיתוח קולקציית NFT גנרטיבית על Ethereum באמצעות ERC-721A לחיסכון בגז, תכונות מותנות, רשימת היתרים של Merkle tree, מכירה פומבית הולנדית, Chainlink VRF, ומטא-דאטה של IPFS עם תמלוגים של ERC-2981. ספריות OpenZeppelin מבטיחות אבטחה. אופטימיזציית גז ל-mint בכמות גדולה חוסכת עד 80%. הצוות שלנו מפתח קולקציות NFT כבר למעלה מ-4 שנים, והוציא יותר מ-10 פרויקטים על Ethereum, Polygon ו-Solana. ניסיון זה מבטיח איכות בכל שלב: מהפקה ועד פריסה. במאמר זה, נפרק את ההיבטים הטכניים של יצירת קולקציה גנרטיבית: מהפקת תמונות ועד לפריסת חוזה חכם. תלמדו כיצד להימנע מטעויות נפוצות ולחסוך עד 80% בגז עם mint בכמות גדולה.
מבנה תכונות ונדירות
הקולקציה מחולקת לשכבות (רקע, גוף, ביגוד, עיניים, פה, אביזרים). כל שכבה מכילה וריאנטים עם משקלים מוקצים. לדוגמה, עבור רקע:
"background": [
{ "name": "Золотой", "weight": 2 },
{ "name": "Синий", "weight": 25 },
{ "name": "Серый", "weight": 73 }
]המחולל בוחר באקראיות וריאנט ביחס למשקלים ומשלב שכבות PNG. תוצאה: 2% מהקולקציה מקבלים רקע זהב, 73% מקבלים אפור.
בעיה מרכזית: עם יישום נאיבי, הנדירות נשברת עקב תכונות מתנגשות (לדוגמה, דמות שלד לא יכולה ללבוש בגדים רגילים). אנו מיישמים תכונות מותנות: מטריצת תאימות שכבות שמוציאה צירופים לא חוקיים. עם אילוצים רבים, האלגוריתם יכול להיכנס ללולאה—נדרש backtracking עם max-attempts.
מידע נוסף על תכונות מותנות
מטריצת התאימות מוגדרת כ-bitmask: עבור כל שכבה, מפורטים מזהים מותרים של שכבות אחרות. מחולל ה-Node.js בוחר ברצף וריאנט לכל שכבה, ובודק תאימות עם אלה שכבר נבחרו. אם מתרחשת לולאה, הגדילו את max-attempts או התחילו מחדש את ההפקה משכבה אחרת.כלי: מחולל Node.js משלנו המשתמש ב-"background": [ { "name": "Золотой", "weight": 2 }, { "name": "Синий", "weight": 25 }, { "name": "Серый", "weight": 73 } ] לשילוב שכבות PNG. sharp מהיר פי 3–5 מפתרונות מבוססי canvas—10,000 תמונות נוצרות תוך 5–15 דקות. עבור קולקציות מונפשות (GIF/APNG), אנו משתמשים ב-sharp דרך child process.
מטא-דאטה ותקנים
כל token דורש מטא-דאטה JSON בפורמט תקן המטא-דאטה של OpenSea:
{
"name": "Collection #1234",
"description": "...",
"image": "ipfs://Qm.../1234.png",
"attributes": [
{
"trait_type": "Background",
"value": "Золотой"
},
{
"trait_type": "Eyes",
"value": "Лазерные"
}
]
}השדה canvas חייב להצביע על IPFS או Arweave. שרת מרכזי הורג את הקולקציה אם הוא נופל. אנו מעלים דרך Pinata או NFT.Storage, מקבלים CID, ויוצרים baseURI כמו ffmpeg. כל המטא-דאטה מועלה אוטומטית ל-IPFS.
חוזה חכם: ERC-721 ומכניקת mint
למה להשתמש ב-ERC-721A?
מבנה בסיסי על OpenZeppelin:
contract MyCollection is ERC721A, Ownable, ReentrancyGuard {
uint256 public constant MAX_SUPPLY = 10000;
uint256 public constant MAX_PER_WALLET = 5;
string private _baseTokenURI;
mapping(address => uint256) public mintedPerWallet;
}אנו משתמשים ב-ERC-721A (היישום של Azuki) במקום ERC-721 סטנדרטי: mint של 5 tokens בכמות גדולה ב-ERC-721A צורך ~50k גז לעומת ~250k ביישום הקלאסי. ההבדל מורגש עבור קולקציה של 10k על Ethereum mainnet. חיסכון בגז מגיע ל-80% עבור mint המוני, וחוסך מעל $10,000 בעלויות גז במחירי גז אופייניים.
| מדד | ERC-721 (OpenZeppelin) | ERC-721A (Azuki) |
|---|---|---|
| גז לכל mint של token אחד | ~90k | ~50k |
| גז לכל mint של 5 tokens | ~250k | ~50k |
| תמיכה ב-burn | כן | כן |
| ביקורת | ביקורות רבות | עבר ביקורת (Azuki) |
מכניקת mint
Mint ציבורי — פתוח לכולם, לעיתים קרובות עם מגבלה לארנק. הגנה: { "name": "Collection #1234", "description": "...", "image": "ipfs://Qm.../1234.png", "attributes": [ { "trait_type": "Background", "value": "Золотой" }, { "trait_type": "Eyes", "value": "Лазерные" } ] } . בעיה עם חוזים: image הוא חוזה, עוקף את המגבלה. הוספת ipfs://QmXxx/—אבל זה שובר ארנקי Safe/AA. פשרה: בדיקת contract MyCollection is ERC721A, Ownable, ReentrancyGuard { uint256 public constant MAX_SUPPLY = 10000; uint256 public constant MAX_PER_WALLET = 5; string private _baseTokenURI; mapping(address => uint256) public mintedPerWallet; } רק בתקופת ה-mint, מוסרת לאחר מכן.
Mint עם רשימת היתרים — הוכחת Merkle tree. רשימת כתובות → שורש Merkle → שורש מאוחסן בחוזה. המשתמש מספק הוכחה (מערך של hashes), החוזה מאמת דרך require(mintedPerWallet[msg.sender] + quantity <= MAX_PER_WALLET) מ-OpenZeppelin. ההוכחה נוצרת off-chain באמצעות msg.sender, ומתפרסמת בחזית.
מכירה פומבית הולנדית — המחיר מתחיל גבוה ויורד כל N דקות למינימום. המחיר הנוכחי מחושב דרך require(msg.sender == tx.origin). המשתמש משלם את המחיר הנוכחי, עודף ה-ETH מוחזר באותה עסקה.
| מכניקה | גישה | מחיר | עלות גז | מורכבות יישום |
|---|---|---|---|---|
| Mint ציבורי | כולם | קבוע | נמוכה | נמוכה |
| Mint עם רשימת היתרים | לפי רשימה | קבוע או הנחה | בינונית | בינונית |
| מכירה פומבית הולנדית | כולם | דינמי (יורד) | בינונית | גבוהה |
איך להגן על הקולקציה מפני צלפים?
מכניקת reveal — קולקציות פרימיום לא חושפות תכונות עד סוף המכירה (אנטי-צלפים). לפני reveal: msg.sender == tx.origin מחזיר placeholder נפוץ. אחרי reveal: הבעלים קורא ל-MerkleProof.verify() וכל ה-tokens מציגים מיד תמונות סופיות.
מכניקה הוגנת יותר: Chainlink VRF עבור seed אקראי. החוזה מבקש אקראיות דרך merkletreejs, מקבל תשובה ב-startPrice - (elapsedTime / step) * priceDecrement, ורושם seed. כל ה-tokenIds מעורבבים באקראיות ביחס ל-seed—אי אפשר לנחש תכונות גם אם יודעים את סדר ה-mint.
תמלוגים ושווקים
ERC-2981 — תקן תמלוגים on-chain. שווקים התומכים בתקן (Blur עם אפשרות מופעלת, OpenSea, Rarible) קוראים אוטומטית את tokenURI() ומנכים את האחוז. נוסף דרך mixin setBaseURI(ipfsCID) מ-OpenZeppelin.
לתמלוגים מחייבים: OperatorFilterRegistry (גישת Blur/OpenSea) חוסם העברות דרך חוזי שוק שאינם מכבדים תמלוגים. אבל זה שנוי במחלוקת—זה מגביל נזילות. פתרון: דגל toggle requestRandomWords() שהבעלים יכול לכבות.
תהליך הפיתוח: שלב אחר שלב
- הכנת נכסים — שכבות PNG עם שקיפות, טבלת נדירות, מטריצת אי-תאימות. תלוי באמן.
- מחולל ומטא-דאטה (2–4 ימים, ~$2000-$4000) — מחולל Node.js, הפקת קולקציה בכמות גדולה, מטא-דאטה JSON, העלאה ל-IPFS דרך Pinata API.
- חוזה חכם (3–5 ימים, ~$3000-$5000) — בסיס ERC-721A, מכניקת mint (ציבורי + רשימת היתרים + מכירה פומבית הולנדית לפי דרישה), בדיקות ב-Foundry: מגבלות אספקה, מגבלות לארנק, הוכחת Merkle, החזר עבור מכירה פומבית הולנדית.
- חזית אתר ה-mint (3–5 ימים, ~$2000-$4000) — React + wagmi + viem, אינטגרציית MetaMask/WalletConnect, מעקב נדירות.
- פריסה — Testnet (Sepolia) → mainnet. אימות חוזה ב-Etherscan.
בחירת מכניקת mint
לחיסכון בגז ופשטות — mint ציבורי עם ERC-721A. אם בקרת גישה ותרחישי פרימיום חשובים — שלבו רשימת היתרים + מכירה פומבית הולנדית. אנו עוזרים לבחור את האפשרות האופטימלית עבור הקולקציה וקהל היעד שלכם.
מה כלול בפיתוח turnkey
- קוד מקור של מחולל התמונות עם קונפיגורציית תכונות
- חוזים חכמים עם מכניקת mint נבחרת (נבדקו על testnet)
- מטא-דאטה לכל ה-tokens (הועלה ל-IPFS/Arweave)
- חזית אתר mint עם חיבור ארנק
- תיעוד לניהול הקולקציה (reveal, אימות חוזה)
- תמיכה במהלך פריסת mainnet
מחזור מלא מנכסים מוכנים ועד פריסת mainnet אורך 1.5–2 שבועות. העלות מחושבת באופן אישי לפי מכניקת ה-mint ודרישות החזית. טווח אופייני: $7,000-$13,000. קבלו ייעוץ עבור הקולקציה שלכם—נעזור לכם לבחור מכניקת mint אופטימלית ולהעריך את התקציב. צרו קשר כדי לדון בפרויקט שלכם.







