Если вы давно мечтали почувствовать себя программистом — этот день настал. Сегодня создать собственное децентрализованное приложение (dApp) не так сложно. Для работы не нужны специальные знания и умения. Достаточно следовать инструкции
Рассказываем, как создать свое децентрализованное приложение на Solana, если ты не программист.
Шаг 1. Подготовка окружения
1.1 Устанавливаем Node.js (LTS 20 или 18)
Node 20 — актуальный LTS, но React Native 0.73 официально поддерживает и Node 18. Выберите тот, что проще поставить в вашем окружении.
# macOS / Linux (через nvm) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash nvm install –lts # LTS=20.x nvm use –lts # Windows (через winget) winget install OpenJS.NodeJS.LTS
Проверяем:
node –version # v20.xx (или v18.xx)
1.2 Yarn Classic через Corepack
Corepack поставляется вместе с Node. Активируем его и включаем стабильную Yarn 1.22 (на RN сборках она надежнее Yarn Berry).
corepack enable # включает Corepack corepack prepare [email protected] –activate
Проверяем:
yarn –version # 1.22.19
1.3 Git
Скачайте с https://git-scm.com и установите.
git –version # git 2.45.1
1.4 Java JDK 17
React Native 0.73 использует Gradle 8, которому нужна Java ≥17.
# macOS (Homebrew) brew install openjdk@17 # Ubuntu sudo apt install openjdk-17-jdk
Задайте переменную JAVA_HOME и добавьте $JAVA_HOME/bin в PATH.
1.5 Android Studio + SDK
- Установите Android Studio (https://developer.android.com/studio).
- В SDK Manager скачайте Android 14 (API 34) + Build‑Tools 34.0.x.
- Добавьте переменные окружения: ANDROID_HOME=<путь_до>/Android/Sdk PATH=$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools
- Проверьте: adb –version.
1.6 Кошельки для тестов
Платформа Кошелек Ссылка iOS/Android Phantom https://phantom.app/download iOS/Android Backpack https://backpack.app Android‑эмулятор Fake Wallet (из примеров Solana Mobile) https://docs.solanamobile.com/react-native/first_app_tutorial
Включите сеть Devnet в настройках кошелька.
1.7 Обязательные polyfill‑библиотеки
@solana/web3.js ожидает глобальные объекты crypto, Buffer, URL. В React Native их нет. Ставим:
yarn add react-native-get-random-values buffer react-native-url-polyfill
Подключаем их перед любыми другими импортами — в index.js или App.js:
import ‘react-native-get-random-values’; import { Buffer } from ‘buffer’; global.Buffer = Buffer; import ‘react-native-url-polyfill/auto’;
Шаг 2. Создаем проект React Native
npx react-native@latest init MySolanaApp # создаст проект 0.73.x cd MySolanaApp
Совет: в имени проекта избегайте пробелов и спецсимволов.
Шаг 3. Устанавливаем зависимости Solana
yarn add @solana/[email protected] @solana/[email protected] @solana/[email protected] @solana-mobile/[email protected] @solana-mobile/[email protected] @metaplex-foundation/[email protected]
- Почему именно они?
- web3.js 1.98.2 — последняя LTS версия JS‑SDK Solana.
- wallet-adapter-react 0.15.39 — React‑обертка адаптеров.
- wallet-adapter-mobile 2.2.2 — MWA 2.0 для React Native.
- Metaplex JS 0.18.0 — упрощенный SDK для NFT (уже архивный, но по‑прежнему самый простой для старта).
Важно: готового UI для Jupiter (обмен токенов) в React Native нет. Для свопов используйте пример Jupiter Core RN либо REST API.
Шаг 4. Подключаем сеть и Mobile Wallet Adapter
Откройте App.js и замените содержимое:
import React from ‘react’; import { View, StyleSheet } from ‘react-native’; import { clusterApiUrl } from ‘@solana/web3.js’; import { ConnectionProvider, WalletProvider } from ‘@solana/wallet-adapter-react’; import { MobileWalletAdapter } from ‘@solana-mobile/wallet-adapter-mobile’; /* — ваши компоненты — */ import ConnectWalletButton from ‘./ConnectWalletButton’; import AccountInfo from ‘./AccountInfo’; import MintExample from ‘./MintExample’; export default function App() { const endpoint = clusterApiUrl(‘devnet’); // Единственный адаптер, необходимый в React Native const wallets = [ new MobileWalletAdapter({ appIdentity: { name: ‘MySolanaApp’ } }), ]; return ( <ConnectionProvider endpoint={endpoint} config={{ commitment: ‘processed’ }}> <WalletProvider wallets={wallets} autoConnect> <View style={styles.container}> <ConnectWalletButton /> <AccountInfo /> <MintExample /> </View> </WalletProvider> </ConnectionProvider> ); } const styles = StyleSheet.create({ container: { flex: 1, padding: 16 }, });
- autoConnect пытается восстановить последний выбранный кошелек.
- Чтобы перейти на Mainnet, поменяйте clusterApiUrl(‘mainnet-beta’).
Шаг 5. Кнопка подключения кошелька (ConnectWalletButton.js)
import React from ‘react’; import { Button, Text, View } from ‘react-native’; import { useWallet } from ‘@solana/wallet-adapter-react’; export default function ConnectWalletButton() { const { adapter, connect, connecting, connected, publicKey } = useWallet(); if (!adapter) return <Text>Подготавливаем адаптеры…</Text>; return ( <View style={{ marginBottom: 16 }}> <Button title={connected ? ‘Кошелек подключен’ : connecting ? ‘Подключаем…’ : ‘Подключить кошелек’} onPress={() => connect().catch(err => alert(‘Ошибка: ‘ + err.message))} disabled={!adapter.ready || connecting} /> {connected && ( <Text style={{ marginTop: 8 }}>Адрес: {publicKey.toBase58()}</Text> )} </View> ); }
Шаг 6. Баланс и NFT (AccountInfo.js)
import React, { useEffect, useState } from ‘react’; import { View, Text, FlatList } from ‘react-native’; import { Connection, LAMPORTS_PER_SOL, clusterApiUrl, PublicKey } from ‘@solana/web3.js’; import { TOKEN_PROGRAM_ID } from ‘@solana/spl-token’; import { useWallet } from ‘@solana/wallet-adapter-react’; import { Metaplex, walletAdapterIdentity } from ‘@metaplex-foundation/js’; const connection = new Connection(clusterApiUrl(‘devnet’)); export default function AccountInfo() { const { publicKey, wallet } = useWallet(); const [balance, setBalance] = useState(0); const [tokens, setTokens] = useState([]); useEffect(() => { if (!publicKey || !wallet) return; const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet)); // Баланс SOL connection.getBalance(publicKey).then(lamports => { setBalance(lamports / LAMPORTS_PER_SOL); }); // Список токенов / NFT connection .getParsedTokenAccountsByOwner(publicKey, { programId: TOKEN_PROGRAM_ID }) .then(({ value }) => value.filter(v => +v.account.data.parsed.info.tokenAmount.amount > 0)) .then(async list => { const detailed = await Promise.all( list.map(async acc => { const mintStr = acc.account.data.parsed.info.mint; const mint = new PublicKey(mintStr); try { const nft = await metaplex.nfts().findByMint({ mintAddress: mint }).run(); return { mint: mintStr, name: nft.name }; } catch { return { mint: mintStr }; } }), ); setTokens(detailed); }); }, [publicKey, wallet]); return ( <View style={{ marginBottom: 16 }}> <Text>Баланс SOL: {balance.toFixed(4)}</Text> <Text style={{ marginTop: 8 }}>Токены / NFT:</Text> <FlatList data={tokens} keyExtractor={item => item.mint} renderItem={({ item }) => <Text>- {item.name || `Mint: ${item.mint}`}</Text>} /> </View> ); }
Шаг 7. Минтим свое NFT (MintExample.js)
import React from ‘react’; import { Button } from ‘react-native’; import { useWallet } from ‘@solana/wallet-adapter-react’; import { Connection, clusterApiUrl } from ‘@solana/web3.js’; import { Metaplex, walletAdapterIdentity } from ‘@metaplex-foundation/js’; export default function MintExample() { const { wallet, publicKey } = useWallet(); const connection = new Connection(clusterApiUrl(‘devnet’)); const mintNFT = async () => { if (!wallet || !publicKey) return alert(‘Сначала подключите кошелек’); const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet)); try { const { nft } = await metaplex.nfts().create({ uri: ‘https://example.com/metadata.json’, // замените на ваш JSON name: ‘Мое первое NFT’, sellerFeeBasisPoints: 500, // 5 % роялти }).run(); alert(‘NFT создано! Адрес: ‘ + nft.address.toBase58()); } catch (err) { alert(‘Ошибка: ‘ + err.message); } }; return <Button title=”Создать NFT” onPress={mintNFT} />; }
Примечание: библиотека Metaplex JS с марта 2025 архивирована и заменена Umi‑‑пакетами, но для первого знакомства она остается самой простой. Для production‑кода изучите umi и пакет @metaplex-foundation/mpl-core.
Шаг 8. Сборка и запуск
- Старт Metro с очисткой кеша: npx react-native start –reset-cache
- iOS (macOS): cd ios && arch -x86_64 pod install && cd .. npx react-native run-ios
- Android: npx react-native run-android
Проверяем работу
- Подключите Phantom / Backpack на устройстве.
- Убедитесь, что отображается баланс SOL.
- Нажмите «Создать NFT» — после подтверждения транзакции в кошельке NFT появится на Devnet.
Типичные ошибки
Сообщение Причина Решение ReferenceError: Buffer is not defined polyfill buffer не подключен Добавьте в самом верху index.js импорт buffer. Invariant Violation: attempted to call missing method при запуске Android забыли включить JDK 17 Проверьте java –version. walletAdapterIdentity: identity not provided Metaplex вызывается до подключения кошелька Создавайте экземпляр Metaplex после того, как wallet станет доступен.
Что дальше
- Изучите пример Jupiter Core RN, чтобы добавить обмен токенов.
- Посмотрите на Umi‑пакеты (@metaplex-foundation/mpl-core, umi-signer-wallet-adapters) — именно они будут поддерживаться дальше.
Зачем нужны dApps на Solana
DApp на Solana (децентрализованное приложение) — это приложение, в котором логика, данные и пользовательские взаимодействия лежат прямо в блокчейне Solana или на смарт-контрактах, а не на традиционных серверах. За счет высокой пропускной способности (до десятков тысяч транзакций в секунду) и низких комиссий Solana позволяет создавать быстрые, масштабируемые и дешевые приложения.
Зачем нужны DApp’ы
- Децентрализация и доверие. Владея смарт-контрактом, вы можете быть уверены, что код выполнится точно так, как заложено, без возможности «откатить» транзакцию или изменить правила извне.
- Автоматизация и прозрачность. Все операции записываются в публичный блокчейн, что обеспечивает проверяемость и защищенность данных.
- Низкие комиссии и скорость. Solana предлагает комиссии в доли цента и время подтверждения транзакции менее секунды.
Как зарабатывать на Solana-dApps
- Разработка и аудит. Компании и проекты платят за написание и проверку смарт-контрактов.
- Сбор комиссий. Внутриприложения можно брать процент от операций (обмен, займы, торговля NFT).
- Токеномика. Выпуск собственного токена проекта и его листинг на биржах: рост его цены приносит прибыль держателям и команде разработчиков.
- Пулы ликвидности и стейкинг. Вы можете вложить свои активы в пулы DeFi-протоколов на Solana и получать вознаграждение за предоставление ликвидности или делегирование токенов.
Источник: cryptonews.net