Разработка SocialFi-платформы
SocialFi — конвергенция социальных сетей и DeFi: пользователи владеют своим контентом и социальным графом, монетизация встроена в протокол, а не контролируется платформой. Friend.tech в 2023 году доказал product-market fit: $50M+ trading volume за первый месяц на простейшей механике — покупка «ключей» доступа к чату с конкретным пользователем.
Но Friend.tech также продемонстрировал проблему: пользователи — спекулянты, а не участники социальной сети. Построить устойчивую SocialFi платформу значит решить проблему, где социальная ценность и финансовая механика усиливают, а не подменяют друг друга.
Архитектурные компоненты SocialFi
1. On-chain Social Graph
Традиционные соцсети хранят социальный граф в централизованных базах данных. SocialFi переносит ownership граф on-chain. Два подхода:
Lens Protocol. Открытый протокол для social graph на Polygon/PoS. Profile = NFT. Follow = NFT. Post (Publication) = on-chain record. Все данные owned пользователем, любое приложение читает граф. Lens v2 добавил модули монетизации: collect fee, referral, currency.
Farcaster. Децентрализованный протокол на Ethereum + Optimism. Аккаунт регистрируется on-chain, сообщения хранятся в p2p сети (Hubs). Значительно дешевле Lens по газу. Активная экосистема: Warpcast — flagship клиент, Frames — интерактивные NFT-приложения прямо в ленте.
Custom on-chain graph. Для специфических продуктов — собственный контракт. Гибко, но нет готовой экосистемы.
// Упрощённый on-chain social graph
contract SocialGraph {
struct Profile {
address owner;
string handle; // уникальное имя @handle
string metadataURI; // IPFS CID с avatar, bio, etc.
uint256 followerCount;
uint256 createdAt;
}
mapping(uint256 => Profile) public profiles;
mapping(address => uint256) public addressToProfileId;
mapping(uint256 => mapping(uint256 => bool)) public follows;
// follows[followerId][profileId] = true/false
uint256 public nextProfileId = 1;
event ProfileCreated(uint256 indexed profileId, address indexed owner, string handle);
event Followed(uint256 indexed followerId, uint256 indexed profileId);
function createProfile(string calldata handle, string calldata metadataURI)
external returns (uint256 profileId) {
require(addressToProfileId[msg.sender] == 0, "Already has profile");
require(handleToProfileId[handle] == 0, "Handle taken");
profileId = nextProfileId++;
profiles[profileId] = Profile({
owner: msg.sender,
handle: handle,
metadataURI: metadataURI,
followerCount: 0,
createdAt: block.timestamp
});
addressToProfileId[msg.sender] = profileId;
emit ProfileCreated(profileId, msg.sender, handle);
}
function follow(uint256 profileId) external {
uint256 followerId = addressToProfileId[msg.sender];
require(followerId != 0, "Must have profile");
require(!follows[followerId][profileId], "Already following");
follows[followerId][profileId] = true;
profiles[profileId].followerCount++;
emit Followed(followerId, profileId);
}
}
2. Creator Economy механики
Bonding Curve токены (Friend.tech модель). Каждый creator имеет свой токен с bonding curve: цена растёт при покупке, падает при продаже. Держатели токена получают доступ к эксклюзивному контенту / чату.
contract CreatorToken {
// Bonding curve: price = (supply^2) / CURVE_FACTOR
uint256 constant CURVE_FACTOR = 16000;
mapping(address => uint256) public supply; // supply[creator] = текущее supply
mapping(address => mapping(address => uint256)) public balances; // balances[creator][holder]
uint256 constant PROTOCOL_FEE = 50; // 0.5%
uint256 constant CREATOR_FEE = 50; // 0.5%
function getBuyPrice(address creator, uint256 amount) public view returns (uint256) {
uint256 s = supply[creator];
// Интеграл: sum от s до s+amount от i=0 к n
return _getPrice(s, amount);
}
function _getPrice(uint256 startSupply, uint256 amount) internal pure returns (uint256) {
uint256 sum1 = startSupply == 0 ? 0 : (startSupply - 1) * startSupply * (2 * startSupply - 1) / 6;
uint256 sum2 = (startSupply + amount - 1) * (startSupply + amount) * (2 * (startSupply + amount) - 1) / 6;
return (sum2 - sum1) * 1 ether / CURVE_FACTOR;
}
function buyTokens(address creator, uint256 amount) external payable {
uint256 price = getBuyPrice(creator, amount);
uint256 protocolFee = price * PROTOCOL_FEE / 10000;
uint256 creatorFee = price * CREATOR_FEE / 10000;
require(msg.value >= price + protocolFee + creatorFee, "Insufficient ETH");
supply[creator] += amount;
balances[creator][msg.sender] += amount;
payable(creator).transfer(creatorFee);
// protocolFee остаётся в контракте / идёт в treasury
}
}
Subscription NFT. Ежемесячная подписка на creator через NFT. Контракт проверяет expiration при доступе к контенту. ERC-5643 — стандарт для renewable NFT subscriptions.
Post monetization. Lens Protocol Collect module: пользователи платят за коллектирование (mint копии) поста. Creator получает proceed. Можно настраивать: free collect, paid collect, limited edition collect (только N копий).
3. Content Storage
On-chain хранение контента — слишком дорого для любого масштаба. Стандартные решения:
IPFS + Pinning. Контент публикуется в IPFS, CID сохраняется on-chain. Пинниг через Pinata / web3.storage / собственную ноду гарантирует доступность. Проблема: если никто не пинит — данные исчезают.
Arweave. Постоянное хранилище с однократной оплатой. «Pay once, store forever» модель. AR токен. Используется Lens Protocol для metadata. Bundlr (теперь Irys) — JS SDK для загрузки в Arweave.
Ceramic Network. Mutable decentralized data streams. Данные изменяемы (можно редактировать профиль), но история изменений сохраняется. Используется в Orbis (Lens-based social app).
// Загрузка контента в Arweave через Irys
import Irys from '@irys/sdk'
async function uploadPost(content: string, mediaFiles: File[]): Promise<string> {
const irys = new Irys({
url: 'https://node2.irys.xyz',
token: 'ethereum',
key: wallet.privateKey,
})
// Загружаем медиа
const mediaUpload = await irys.uploadFolder(mediaFiles)
// Публикуем пост с IPFS CID медиа
const postData = {
content,
media: mediaUpload.map(m => `ar://${m.id}`),
timestamp: Date.now(),
}
const receipt = await irys.upload(JSON.stringify(postData), {
tags: [
{ name: 'Content-Type', value: 'application/json' },
{ name: 'App-Name', value: 'YourSocialFi' },
]
})
return `ar://${receipt.id}` // этот URI записываем on-chain
}
4. Token-gated Communities
Доступ к контенту, чатам, событиям — только для держателей определённого NFT или минимального количества creator токенов.
// Backend middleware для token-gating
async function requireTokenAccess(creatorAddress: string, userAddress: string): Promise<boolean> {
const balance = await creatorToken.read.balances([creatorAddress, userAddress])
return balance > 0n
// Или проверка NFT:
// const nftBalance = await nftContract.read.balanceOf([userAddress])
// return nftBalance > 0n
}
// Real-time chat через token-gating (Sign-In With Ethereum + token check)
app.use('/chat/:creatorId', async (req, res, next) => {
const { address } = req.user // из JWT после SIWE аутентификации
const hasAccess = await requireTokenAccess(req.params.creatorId, address)
if (!hasAccess) return res.status(403).json({ error: 'Token required' })
next()
})
Построение на Lens Protocol
Lens — наиболее зрелый social protocol. Использование Lens даёт готовый social graph без его построения с нуля.
import { PublicClient, development } from '@lens-protocol/client'
const client = PublicClient.create({ environment: development })
// Получение профиля
const profile = await client.profile.fetch({ forHandle: 'lens/username' })
// Публикация поста через Lens
async function createPost(content: string, contentURI: string) {
const result = await client.publication.postOnchain({
contentURI, // ar:// или ipfs:// URI
})
}
// Чтение ленты
const feed = await client.feed.fetch({ where: { for: profile.id } })
Lens App Development Kit дает React hooks: useProfile, useFeed, usePublication. Полноценная social платформа на Lens без написания graph контракта — значительно быстрее.
Компромисс Lens: Polygon L1 (теперь переезжает на zkSync), gas не нулевой. Для mass market пользователей нужна gasless интеграция через Lens Dispatcher (Lens оплачивает gas за verified apps).
Farcaster Frames
Frames — интерактивные приложения прямо в Farcaster ленте. Пост может содержать кнопки, формы, изображения. Пользователь взаимодействует не выходя из клиента. Применение: mint NFT из поста, vote в polls, game mechanics прямо в ленте.
// Frame metadata (Open Graph расширение)
export const metadata = {
other: {
'fc:frame': 'vNext',
'fc:frame:image': 'https://your-app.com/frame-image.png',
'fc:frame:button:1': 'Mint NFT',
'fc:frame:button:2': 'Share',
'fc:frame:post_url': 'https://your-app.com/api/frame-action',
}
}
// Frame action handler
app.post('/api/frame-action', async (req, res) => {
const { buttonIndex, fid, castId } = req.body.untrustedData
// Верифицируем через Farcaster Hub
const verified = await verifyFrameMessage(req.body)
if (buttonIndex === 1) {
// Минтим NFT для пользователя (по fid → ETH address)
const userAddress = await getAddressForFid(fid)
await mintNft(userAddress)
return res.json({ image: 'https://your-app.com/minted.png' })
}
})
Экономика платформы
Revenue streams для creator:
- Trading fee от bonding curve операций (0.5-2%)
- Subscription платежи
- Collect fees за контент
- Tips (прямые донаты)
Revenue streams для протокола:
- Protocol fee от каждой операции (0.5-1%)
- Premium features (верификация, расширенная аналитика)
- B2B лицензирование
Governance токен. Держатели governance токена получают долю protocol fees через staking, участвуют в DAO голосованиях (параметры комиссий, whitelist creator programs). Создаёт aligned incentives: токен ценен → больше builders → больше пользователей → больше fees → токен ценен.
Anti-spam и Sybil resistance
На открытой платформе без барьеров — спам и бот-аккаунты. Варианты защиты:
ETH deposit для создания профиля. Небольшой deposit (0.001-0.01 ETH) при регистрации, возвращается при удалении. Поднимает стоимость Sybil атаки, не блокирует реальных пользователей.
Proof of Humanity / Worldcoin. Верификация уникальности человека. Верифицированные пользователи получают badge, дополнительный access или снижение fees.
Reputation stake. Creator deposts токены как «репутационный стейк». При плохом поведении (спам жалобы) стейк может быть slashed. Аналог operator bond в restaking экосистеме.
Стек разработки
| Компонент | Технология |
|---|---|
| Social Protocol | Lens Protocol / Farcaster / кастомный |
| Smart contracts | Solidity + Foundry |
| Content storage | Arweave (Irys) + IPFS (Pinata) |
| Real-time chat | WebSocket + token-gating middleware |
| Frontend | Next.js + wagmi + Lens SDK / @farcaster/hub-web |
| Backend | Node.js + PostgreSQL (индексирование событий) |
| Indexer | The Graph (subgraph) / Ponder |
| Mobile | React Native + WalletConnect |
Процесс разработки
Стратегия и protocol выбор (1 неделя). Строить на Lens/Farcaster или кастомный граф? Определяет весь scope.
Smart contracts (3-5 недель). Creator token с bonding curve, subscription NFT, collect mechanics, governance token. Аудит — обязателен, bonding curve манипулируема при неправильной реализации.
Backend и indexer (3-4 недели). Subgraph для индексирования событий, API для social feed, token-gating middleware, IPFS/Arweave интеграция.
Frontend (4-6 недель). Feed, профили, post composer, token trading UI, creator dashboard.
Mobile (опционально, 4-6 недель). React Native клиент с WalletConnect.
MVP на Lens Protocol с базовой монетизацией — 2-3 месяца. Полная кастомная SocialFi платформа с собственным протоколом — 5-8 месяцев.







