Разработка Runes-токена (Bitcoin)
До Runes была путаница: BRC-20 работал поверх Ordinals, создавал inscription для каждого transfer, засорял mempool junk-транзакциями. Casey Rodarmor, создатель Ordinals, разработал Runes как clean-room решение для fungible токенов на Bitcoin — без лишних данных, с использованием существующих биткоин-примитивов. Runes решают проблему масштабирования токенов: каждый BRC-20 transaction создаёт ненужные inscription, увеличивая размер блокчейна. Runes используют UTXO и OP_RETURN, что в 10 раз компактнее. В этой статье разберём архитектуру, etching, передачу и индексирование Runes, а также покажем реальные примеры кода. Вы узнаете, как избежать типичных ошибок, таких как потеря токенов из-за pointer logic, и как правильно настроить индексер. Наш опыт — 5+ лет в блокчейн-разработке, 15+ проектов на Bitcoin и EVM. Гарантируем соответствие протоколу и отсутствие потерь из-за pointer logic. Свяжитесь для консультации — оценим сложность и сроки за 1 день.
Как работает протокол Runes?
Runes не требует изменений в Bitcoin консенсусе. Протокол живёт в OP_RETURN — данные не хранятся в UTXO set, блокчейн не засоряется (в отличие от BRC-20, хранящего состояние в satoshi).
Ключевые концепции:
- Runestone — сообщение протокола в OP_RETURN. Содержит etching, mint, transfer, edict.
- UTXO как носитель баланса — балансы Runes хранятся не в глобальном маппинге (как ERC-20), а в конкретных UTXO. Если вы держите 1000 RUNE, значит у вас есть UTXO с attached balance.
- Rune ID — {block_height}:{tx_index} etching-транзакции. Например, первый Rune имеет ID 840000:3.
- Spacers — визуальные разделители в имени (точки), например UNCOMMON•GOODS.
Как создать Rune (Etching)?
Etching — это транзакция с Runestone в OP_RETURN, объявляющая новый Rune.
Параметры etching: divisibility (0–38, аналог decimals в ERC-20), symbol (Unicode символ для отображения), premine (количество токенов для etcher'а сразу), terms (условия open mint, если разрешён) — amount, cap, height, offset, turbo (флаг совместимости с будущими версиями).
Структура данных Runestone кодируется через varint encoding (LEB128) — компактное представление чисел переменной длины.
Практическая реализация через ord CLI
# Установка ord (официальный клиент)
cargo install ord
# Синхронизация с Bitcoin нодой (или через RPC к внешней)
ord --bitcoin-rpc-url http://user:pass@localhost:8332 index
# Создание wallet
ord wallet create
# Etching нового Rune
ord wallet etch \
--rune "MYTOKEN•NAME" \
--divisibility 8 \
--symbol "M" \
--supply 21000000 \
--premine 21000000 \
--fee-rate 20
# Mint (если включён open mint)
ord wallet mint \
--rune "MYTOKEN•NAME" \
--fee-rate 20
Через библиотеку (JavaScript/TypeScript)
Для интеграции в приложение используется runestone npm пакет или прямая работа с bitcoinjs-lib:
import { Runestone, Etching, Terms, RuneId } from "runestone-lib";
import * as bitcoin from "bitcoinjs-lib";
function buildEtchingTransaction(
utxo: UTXO,
runeName: string,
divisibility: number,
supply: bigint,
feeRate: number
): bitcoin.Transaction {
const runestone = new Runestone({
etching: new Etching({
rune: Rune.fromString(runeName),
divisibility,
symbol: "T",
premine: supply,
turbo: true,
}),
edicts: [{
id: new RuneId(0n, 0n), // 0:0 = самого себя при etching
amount: supply,
output: 1n, // output index для получения premine
}],
});
const psbt = new bitcoin.Psbt({ network: bitcoin.networks.bitcoin });
// Input: funded UTXO для оплаты fee
psbt.addInput({
hash: utxo.txid,
index: utxo.vout,
witnessUtxo: { script: utxo.scriptPubKey, value: utxo.value },
});
// Output 0: OP_RETURN с Runestone
psbt.addOutput({
script: bitcoin.script.compile([
bitcoin.opcodes.OP_RETURN,
Buffer.from("52554e45", "hex"), // RUNE magic bytes
runestone.encipher(),
]),
value: 0,
});
// Output 1: получатель premine (должен быть не dust)
psbt.addOutput({
address: recipientAddress,
value: 546, // dust limit для P2WPKH
});
// Output 2: сдача
psbt.addOutput({ address: changeAddress, value: changeAmount });
return psbt;
}
Технические детали Runestone
Runestone — это бинарный формат, который может содержать etching, mint, transfer и edicts. Поле etching определяет атрибуты нового токена: имя (до 26 символов с разделителями), делимость (0-38), символ (один Unicode), премайн и условия open mint. Edicts — это инструкции передачи, каждая содержит id Rune, количество и номер output'а. Стоимость etching в mainnet составляет примерно $2–5 за транзакцию при текущих комиссиях.Передача Runes (edicts)
Передача Runes — транзакция с Runestone, содержащим edicts. Каждый edict задаёт: какой Rune, сколько, в какой output.
Важное правило протокола: если Rune balance входного UTXO не полностью покрыт edicts — остаток автоматически идёт в первый non-OP_RETURN output (pointer). Нет явного указания = первый output. Это отличие от EVM, где неуказанные средства остаются у отправителя.
Пример: у вас UTXO с 1000 RUNE. Транзакция с edict: send 300 RUNE → output 2. Автоматически: 700 RUNE → output 1 (default pointer). Если output 1 = burn address — вы нечаянно сожгли 700 RUNE. Это основная причина потери токенов — непонимание pointer logic. При разработке кошелька для Runes нужно явно конфигурировать pointer output на change адрес пользователя.
Индексирование Runes: варианты и практика
Runes не имеют стандартного RPC API в Bitcoin Core — нужен отдельный индексер. Сравним варианты:
| Индексер | Тип | Преимущества | Недостатки |
|---|---|---|---|
| ord | Self-hosted | Полный контроль, открытый исходный код | Требует Bitcoin ноду + ~100 ГБ SSD |
| Hiro Ordinals API | Hosted | Не требует своей ноды, простой REST | Платный, риск недоступности |
| Unisat API | Hosted | Поддержка Runes, бесплатный лимит | Rate limit для высоких нагрузок |
Для production мы используем собственный ord индексер с репликацией — это даёт гарантию доступности и скорость. Экономия до 40% по сравнению с hosted-решениями.
Какие отличия Runes от BRC-20?
| Характеристика | Runes | BRC-20 |
|---|---|---|
| Модель данных | UTXO с attached balance | inscription с JSON-стейтом |
| Размер транзакции | ~100–200 байт | ~400–1000 байт |
| Требования к ноде | Полная Bitcoin нода + ord | Полная Bitcoin нода + Ordinals |
| Гибкость | Только transfer/burn | Только transfer/burn |
| Зрелость | Активная разработка, май 2024 | Стабильный, но багливый |
Что входит в нашу разработку Runes-токена?
- Анализ токеномики и протокольных параметров
- Etching, mint, transfer логика
- Интеграция с кошельками (список поддерживающих Runes)
- Разработка индексного API (ord + кастомные эндпоинты)
- UI для mint/transfer (опционально)
- Тестирование в testnet и mainnet
- Документация и обучение команды
- Техническая поддержка 1 месяц после запуска
Ограничения Runes (что нужно знать заранее)
Runes — не смарт-контракты. Никаких conditional transfers, стейкинга или DEX без отдельного решения. Вся логика, привычная в Solidity, здесь невозможна on-chain. Доступны только: создание, transfer, burn.
Для DeFi поверх Runes нужен offchain matching (централизованный orderbook) или отдельный L2 с проверкой через Bitcoin SPV. Сравнение с ERC-20: EVM токены выигрывают в гибкости, но Runes дают native Bitcoin-безопасность и аудиторию.
Срок разработки: etching и базовый кошелёк — 1–2 недели. Полноценная интеграция с индексером и marketplace — 6–10 недель. Стоимость рассчитывается индивидуально после аудита требований. Получите консультацию по вашему проекту — мы оценим сложность и предложим оптимальное решение.
Наш опыт: 5+ лет в блокчейн-разработке, 15+ проектов на Bitcoin и EVM. Гарантируем соответствие протоколу и отсутствие потерь из-за pointer logic.







