Розроблення 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
Сатоші Накамото дав кожному сатоші унікальний порядковий номер (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> {
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 isTickerAvailable(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 explorers 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 тижнів.







