Разработка BRC-20 токена (Bitcoin Ordinals)
BRC-20 — это экспериментальный стандарт токенов на Bitcoin, построенный поверх протокола Ordinals. Никакого смарт-контракта, никакого виртуального машины — только JSON-данные в witness-части Bitcoin транзакций и off-chain индексеры, которые отслеживают состояние всех балансов.
Первое, что нужно понять: BRC-20 это не ERC-20 на Bitcoin. Это принципиально разная система, у которой нет on-chain исполнения логики. «Контракт» BRC-20 токена — это JSON объект, записанный в сатоши через Ordinals inscription.
Как работает Ordinals
Satoshi Nakamoto дал каждому сатоши уникальный порядковый номер (ordinal number) согласно порядку майнинга. Протокол Ordinals (Casey Rodarmor, 2023) использует эти номера для привязки произвольных данных к конкретным сатошам через inscriptions — данные записываются в witness поле SegWit транзакции.
Размер inscription не ограничен жёстко, но Bitcoin nodes принимают witness данные до 4MB (лимит блока при SegWit). Стоимость записи зависит от fee rate (sat/vbyte) и размера данных. Средняя стоимость при нормальной нагрузке в сети: $5–50 за inscription.
JSON-формат BRC-20
BRC-20 использует три типа операций, каждая из которых — отдельная Ordinals inscription:
Deploy — создание токена:
{
"p": "brc-20",
"op": "deploy",
"tick": "MYtk",
"max": "21000000",
"lim": "1000",
"dec": "18"
}
tick — 4-символьный тикер (case-insensitive, но хранится как есть). max — максимальный supply. lim — максимум за одну mint транзакцию. dec — decimals (опциональный, default 18).
Mint — минтинг токенов (любой может выполнить до заполнения max):
{
"p": "brc-20",
"op": "mint",
"tick": "MYKT",
"amt": "1000"
}
Transfer — передача токенов (двухшаговый процесс):
{
"p": "brc-20",
"op": "transfer",
"tick": "MYKT",
"amt": "500"
}
Transfer BRC-20 — это не один шаг. Сначала создаётся transfer inscription на адрес отправителя. Затем эта inscription передаётся получателю через стандартную Bitcoin транзакцию. Индексер фиксирует оба шага и засчитывает перевод только при отправке именно той UTXO, в которой находится transfer inscription.
Работа с Ordinals API и индексерами
Для создания inscriptions — библиотека ord (официальный клиент) или сторонние API:
import axios from 'axios';
// Использование Ordinalsbot API для создания inscription
async function deployBRC20Token(config: {
tick: string;
max: string;
lim: string;
receiverAddress: string;
}) {
const inscriptionData = JSON.stringify({
p: "brc-20",
op: "deploy",
tick: config.tick,
max: config.max,
lim: config.lim,
});
const response = await axios.post('https://api.ordinalsbot.com/inscribe', {
files: [{
name: "deploy.json",
size: Buffer.byteLength(inscriptionData),
type: "text/plain;charset=utf-8",
dataURL: `data:text/plain;charset=utf-8,${inscriptionData}`,
}],
receiveAddress: config.receiverAddress,
fee: 15, // sat/vbyte — проверять актуальную комиссию
lowPostage: false,
});
return response.data; // содержит payment address для отправки BTC
}
Проверка баланса через индексеры. Официальных индексеров нет — BRC-20 полностью зависит от сторонних сервисов:
// Hiro API — один из наиболее надёжных индексеров
async function getBRC20Balance(address: string, ticker: string): Promise<string> {
const response = await axios.get(
`https://api.hiro.so/ordinals/v1/brc-20/balances/${address}`,
{
params: { ticker: ticker.toUpperCase() },
headers: { 'x-api-key': process.env.HIRO_API_KEY },
}
);
const token = response.data.results.find(
(t: any) => t.ticker.toLowerCase() === ticker.toLowerCase()
);
return token?.overall_balance ?? "0";
}
// Проверка доступного (transferable) баланса
async function getTransferableBalance(address: string, ticker: string): Promise<string> {
// Отдельный запрос для токенов, готовых к transfer
const response = await axios.get(
`https://api.hiro.so/ordinals/v1/brc-20/balances/${address}`,
{ params: { ticker, balance_type: "transferable" } }
);
return response.data.results[0]?.transferable_balance ?? "0";
}
Особенности, которые часто ломают интеграции
Двухшаговый transfer. Разработчики привыкшие к ERC-20 часто ожидают, что transfer — одна транзакция. Нет. Если UTXO с transfer inscription потрачена не на адрес получателя, а на произвольный адрес — индексер считает это «сжиганием» токенов. Это необратимо.
Зависимость от UTXO. BRC-20 баланс привязан к Bitcoin UTXO, содержащим inscriptions. Если кошелёк не «aware» об inscriptions и случайно потратит UTXO с inscription как обычный биткоин (например, в рамках fee bumping) — токены потеряны.
Разные индексеры — разные результаты. В ранний период BRC-20 разные индексеры интерпретировали edge cases по-разному. Сейчас ситуация стабилизировалась, но при разработке проверять результаты на нескольких индексерах (Hiro, UniSat, OKX Ordinals).
Тикер захват. Первый deploy с тикером «MYKT» становится каноническим. Второй deploy с тем же тикером валиден технически, но индексеры игнорируют его — первый имеет приоритет. Перед деплоем обязательно проверять, не занят ли тикер.
async function isTakerAvailable(ticker: string): Promise<boolean> {
const response = await axios.get(
`https://api.hiro.so/ordinals/v1/brc-20/tokens/${ticker.toLowerCase()}`
);
return response.status === 404; // 404 = тикер свободен
}
Mint механизм и fair launch
Стандартный BRC-20 предполагает open mint: любой может заминтить до lim за одну транзакцию, пока не достигнут max. Это fair launch — первые майнеры получают токены за стоимость gas.
Для проектов, которые хотят контролируемое распределение — BRC-20 не подходит нативно. Варианты:
- Установить
lim = max, тогда один адрес может заминтить весь supply - Использовать ORC-20 или другие экспериментальные расширения с более богатой логикой
- Применить external whitelist и продавать право на mint адресам
Инфраструктура для BRC-20 проекта
Помимо самого деплоя токена, для реального проекта нужно:
Indexer нода. Для надёжной работы сервиса — собственная или от доверенного провайдера. Запуск полной Bitcoin ноды + ord daemon: требует 600+ GB SSD, синхронизация 3–7 дней.
Inscription service. Сервис для создания mint/transfer inscriptions от имени пользователей (если это часть UX вашего продукта). Управление UTXO, fee estimation, retry при failed транзакциях.
Explorer. Большинство BRC-20 проектов делают собственный explorer для отображения балансов и транзакций — стандартные Bitcoin explorer-ы BRC-20 не показывают.
Ограничения BRC-20
BRC-20 не имеет:
- Программируемой логики (нет смарт-контрактов)
- Атомарных свопов с другими BRC-20 токенами (DEX на BRC-20 — сложная off-chain конструкция)
- Мгновенного подтверждения (Bitcoin блоки ~10 минут)
- Дешёвых транзакций при нагрузке (в пиковые периоды BRC-20 активности fee достигал $30–100 за transfer)
Для проектов, которым нужна программируемость — Stacks (Clarity смарт-контракты с Bitcoin finality) или Bitcoin L2 (Merlin, BEVM).
Срок разработки самого BRC-20 деплоя — несколько часов. Создание полноценной инфраструктуры (indexer, mint service, explorer, кошелёк) — 4–8 недель.







