Розробка системи breeding NFT
NFT breeding — створення нового NFT шляхом «скрещивання» двох існуючих з спадкуванням характеристик батьків. Механіка стала популярною завдяки CryptoKitties та Axie Infinity. Правильно реалізована система breeding створює багаторівневу економіку: ринок «племенників», ринок «чистопородних», стратегічні рішення про breeding combinations.
Дизайн генетичної системи
Ключове питання: як передаються атрибути від батьків до потомка?
Gene encoding
Кожен NFT має набір генів — числові значення атрибутів. Типова структура:
struct Genes {
uint8 bodyType; // 0-255, кодує тип тіла
uint8 color; // 0-255, колір
uint8 speed; // 0-100, швидкість
uint8 strength; // 0-100, сила
uint8 intelligence; // 0-100, інтелект
uint8 rarity; // 0-7, рівень рідкісності
uint8[4] hiddenGenes; // рецесивні гени (не видні, але передаються)
}
Рецесивні гени—приховані гени, які не впливають на характеристики поточного NFT, але можуть проявитися в потомків. Це створює глибину системи: два звичайних на вигляд NFT можуть виробити рідкісного потомка.
Механіка спадкування
function _inheritGene(
uint8 parentAGene,
uint8 parentBGene,
uint256 random,
uint8 geneIndex
) internal pure returns (uint8 childGene) {
// 50% шанс кожного батька
bool fromParentA = (random >> geneIndex) & 1 == 1;
uint8 inheritedGene = fromParentA ? parentAGene : parentBGene;
// 10% шанс мутації
uint256 mutationRoll = (random >> (geneIndex + 8)) & 0xFF;
if (mutationRoll < 26) { // ~10% (26/256)
// Випадкова мутація в межах ±20% від успадкованого значення
int16 mutation = int16(uint16((random >> (geneIndex + 16)) & 0xFF)) - 128;
int16 mutated = int16(uint16(inheritedGene)) + mutation / 10;
childGene = uint8(uint16(mutated < 0 ? 0 : mutated > 255 ? 255 : mutated));
} else {
childGene = inheritedGene;
}
}
Smart contract: повна реалізація
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract BreedableNFT is ERC721, AccessControl, VRFConsumerBaseV2Plus {
struct NFTData {
uint256 tokenId;
uint256 generation; // покоління (0 = genesis)
uint256 breedCount; // скільки разів розводили
uint256 maxBreeds; // максимум розводок
uint256 lastBreedTime; // timestamp останнього breeding
uint256 breedCooldown; // у секундах
Genes genes;
bool isOnBreedingMarket;
}
mapping(uint256 => NFTData) public nftData;
// Стоимість breeding в ERC-20 токенах
IERC20 public breedingToken;
uint256[] public breedingCosts; // за поколіннями: gen0 дешевше, gen5 дороже
// Cooldown растёт с каждым breeding
uint256 public baseCooldown = 12 hours;
mapping(uint256 => BreedingRequest) public pendingBreeds;
struct BreedingRequest {
address breeder;
uint256 parent1Id;
uint256 parent2Id;
bool fulfilled;
}
event BreedingInitiated(uint256 requestId, uint256 parent1, uint256 parent2);
event BreedingCompleted(uint256 requestId, uint256 newTokenId, Genes childGenes);
function breed(uint256 parent1Id, uint256 parent2Id)
external returns (uint256 requestId)
{
// Перевіряємо права
require(ownerOf(parent1Id) == msg.sender, "Not owner of parent1");
require(
ownerOf(parent2Id) == msg.sender || nftData[parent2Id].isOnBreedingMarket,
"No access to parent2"
);
// Перевіряємо обмеження
NFTData storage p1 = nftData[parent1Id];
NFTData storage p2 = nftData[parent2Id];
require(p1.breedCount < p1.maxBreeds, "Parent1 max breeds reached");
require(p2.breedCount < p2.maxBreeds, "Parent2 max breeds reached");
require(
block.timestamp >= p1.lastBreedTime + p1.breedCooldown,
"Parent1 on cooldown"
);
require(
block.timestamp >= p2.lastBreedTime + p2.breedCooldown,
"Parent2 on cooldown"
);
// Запобігаємо інбридингу (опціонально)
require(!_areRelated(parent1Id, parent2Id), "Inbreeding not allowed");
// Оплата breeding
uint256 gen = Math.max(p1.generation, p2.generation);
uint256 cost = breedingCosts[Math.min(gen, breedingCosts.length - 1)];
breedingToken.transferFrom(msg.sender, address(this), cost);
// Оновлюємо батьків
p1.breedCount++;
p1.lastBreedTime = block.timestamp;
p1.breedCooldown = baseCooldown * (1 + p1.breedCount); // зростаючий cooldown
p2.breedCount++;
p2.lastBreedTime = block.timestamp;
p2.breedCooldown = baseCooldown * (1 + p2.breedCount);
// Запрошуємо VRF для генерації генів потомка
requestId = _requestVRF();
pendingBreeds[requestId] = BreedingRequest({
breeder: msg.sender,
parent1Id: parent1Id,
parent2Id: parent2Id,
fulfilled: false,
});
emit BreedingInitiated(requestId, parent1Id, parent2Id);
}
}
Breeding marketplace
Тримач NFT може виставити його «в аренду» для breeding за платою:
struct BreedingOffer {
uint256 sireId; // NFT який здається для breeding
uint256 price; // вартість у токенах
bool onlyWhitelisted; // тільки для конкретних адрес
mapping(address => bool) whitelist;
}
Генеалогічне дерево
Зберігання історії батьків для відображення і anti-inbreeding логіки.
Економічний баланс
Breeding система повинна бути економічно збалансована через control supply via обмежені breeds, зростаючі витрати, cooldowns, demand drivers через унікальні візуали, gameplay advantage, rarity hunting, passive income від breeding market.
Сроки
- Базовий breeding (гени + VRF + спадкування): 5-7 тижнів
- Breeding marketplace: +2-3 тижні
- Genealogy tracking + візуалізація: +2-3 тижні
- Anti-cheat + економічна настройка: +2-3 тижні
- Security audit: обов'язковий, +4-5 тижнів
- Итого: 3-4 місяці







