Перейти к содержимому
Последнее обновление

Основы блокчейна для разработчиков

Здесь разобрано, как адреса, публичные ключи, суммы и подтверждения представлены в API Vilna. Опыт работы с блокчейном не требуется. Уже знакомы с этими понятиями? Начните с Основных концепций.

Некастодиальность - Vilna не хранит средства Только чтение - лишь публичные ключи Одна форма для любой сети Построено на открытых стандартах

Что такое блокчейн

Забудьте на минуту про хайп. Для интеграции блокчейн - это просто общая книга записей, которую все могут читать и которую никто не может тайком изменить. Новые транзакции продолжают эту историю; реорганизации могут заменить недавние блоки.

Три свойства - всё, что нужно держать в голове:

Публичность

Каждая транзакция и каждый баланс видны любому. Никаких приватных запросов нет; вы просто читаете сеть.

Только добавление

Обычно блоки продолжают цепочку, но реорганизация может заменить недавние блоки и изменить набор включённых транзакций. Перед учётом поступления сверяйте текущее состояние.

Группировка в блоки

Новые записи собираются в блоки, которые добавляются один за другим. Позиция блока - это его место во времени.

Публичный реестр позволяет наблюдать за адресом без разрешения владельца кошелька. Мониторинг Platform читает эти публичные данные.

Где находится мониторинг Platform

Читать сеть самостоятельно означает держать узлы, индексировать блоки, обрабатывать реорганизации и декодировать каждый формат транзакций, и всё это для каждой сети. Platform делает это для поддерживаемых сетей и отдаёт нормализованные данные. Мониторинг Platform наблюдает за сетью:

Что нужно мониторингу Platform

Адрес или публичный ключ. Этого достаточно, чтобы следить за балансами, замечать входящие средства и уведомлять вас.

Что не нужно мониторингу Platform

Ваш приватный ключ или seed-фраза. Мониторинг Platform не подписывает и не отправляет транзакции и не перемещает средства.

Некастодиальность означает некастодиальность

Мониторинг Platform читает публичные данные сети и сообщает, что произошло. VKS отдельно координирует согласование и подпись с участием узлов подписи (signer), а также необязательную отправку транзакций; см. руководство VKS.

Ключи и адреса

Для обычного адреса, управляемого одним приватным ключом, связь ключей и адреса можно представить так:

Приватный ключ - секрет. Он позволяет подписывать транзакции от соответствующего блокчейн-аккаунта. Кто владеет им, тот распоряжается средствами, поэтому он никогда не должен покидать ваш контроль.

Публичный ключ - выводится из приватного с помощью односторонней математики. Им можно делиться. От приватного к публичному перейти можно, обратно - никогда.

Адрес - короткий идентификатор для обмена, выведенный из публичного ключа. Это и есть «номер счёта», на который вам отправляют средства.

Вывод для интеграции: адресом и публичным ключом делиться безопасно, приватным - нет. Мониторинг Platform использует публичную сторону: передайте публичный ключ или адрес для наблюдения. Приватный ключ ему не нужен.

Берегите приватный ключ

Кто владеет приватным ключом (или seed-фразой, из которой он получен), распоряжается средствами. Никогда не помещайте его в код, логи, скриншоты или запрос к какому-либо API, включая Vilna. Мониторингу Platform он не нужен.

Как читать адрес

Формат адреса может подсказать семейство сетей, но сам адрес не определяет сеть. Перед отправкой проверяйте и идентификатор сети, и адрес:

Семейство сетейКак выглядитПример
EVM (Ethereum, Polygon, BSC, Arbitrum, Base…)0x + 40 hex-символов0x742d…7B123
Bitcoin - Legacyначинается с 11A1zP1…DivfNa
Bitcoin - SegWit-совместимыйначинается с 33J98t1…hWNLy
Bitcoin - Native SegWitначинается с bc1qbc1qar0…f5mdq
Bitcoin - Taprootначинается с bc1pbc1p5d7…g3s7p
TRONначинается с T, 34 символаTXk7…m4Qa
Solanabase58, ~44 символа5eykt4…KvdpZ

Одна удобная деталь EVM-сетей: единый адрес 0x… работает в каждой EVM-сети. Тот же адрес Ethereum может принимать средства в Polygon, Arbitrum или Base без каких-либо изменений.

Когда вы регистрируете адрес в Vilna, вы передаёте input.chain_family (evm, bitcoin или tron; solana регистрирует адрес и распознаёт его токены, без балансов и транзакций), а точный формат определяется из самого значения автоматически; эндпоинты см. в Platform API.

Один кошелёк, много адресов

Реальным продуктам нужен свежий адрес на каждого клиента, иногда тысячи адресов. Генерировать и резервировать тысячи независимых секретов неуправляемо. HD-кошельки (иерархические детерминированные) решают это одним стартовым секретом.

Вы начинаете с одной seed-фразы, обычно 12 или 24 слова. Из этого seed кошелёк может сгенерировать бесконечное дерево пар ключей. Детерминированность означает, что один и тот же seed всегда даёт одни и те же ключи, в том же порядке, всегда. Путь деривации - это маршрут вниз по дереву к одному конкретному ключу: выберите ветку на каждом уровне и придёте к единственному адресу:

Один путь деривацииm / 44' / 60' / 0' / 0 / 2
МАСТЕРНАЗНАЧЕНИЕМОНЕТААККАУНТСМЕНАИНДЕКСmмастер49'вложенный44'BIP-4484'нативный0'BTC60'ETH195'TRON0'аккаунт 01'аккаунт 10приём1сдача0адрес1адрес2адрес
Каждая строка - один уровень пути. На каждом уровне вы выбираете одну ветку; подсвеченный маршрут ведёт вниз к одному адресу. Знак ' отмечает hardened-уровень (поясняется ниже).

Одна резервная копия seed-фразы охватывает все производные адреса; отдельный адрес для каждого клиента используется в сценарии мониторинга биржи.

Расширенные публичные ключи и пути деривации

Чтобы Vilna могла генерировать и наблюдать это дерево адресов, ни разу не касаясь секрета, вы делитесь расширенным публичным ключом: особым публичным ключом, который умеет порождать дочерние адреса (и только адреса, никогда подписи). У Bitcoin три разновидности, по одной на стиль адреса:

Префикс ключаСтандартЧто порождает
xPubBIP-44Legacy-адреса (начинаются с 1)
yPubBIP-49SegWit-совместимые адреса (начинаются с 3)
zPubBIP-84Native SegWit-адреса (начинаются с bc1q)

Для EVM-сетей используется xPub (BIP-44). У Bitcoin Taproot нет однобуквенного префикса; используйте xPub с путём Taproot ниже.

Как устроен путь деривации

Путь деривации - это «адрес внутри дерева», как путь к папке, указывающий на один конкретный ключ. Читается слева направо, сужаясь от мастер-ключа до единственного адреса:

m

Корень дерева - мастер-ключ вашего кошелька. Всё происходит отсюда.

напр. мастер-ключ
44'

Purpose - какому стандарту следует путь: 44, 49, 84 или 86.

напр. BIP-44
60'

Coin type - какая сеть, из реестра SLIP-44: 60 = ETH, 0 = BTC, 195 = TRON, 501 = Solana.

напр. Ethereum
0'

Account - позволяет одному кошельку держать раздельные суб-кошельки. Почти всегда 0.

напр. аккаунт #0
0

Change - 0 для адресов, принимающих средства, 1 для внутренних адресов сдачи.

напр. приём
0

Index - номер адреса. Увеличивайте его для каждого нового адреса: 0, 1, 2, 3…

напр. первый адрес

Апостроф (') после числа означает hardened (ужесточённый): защита, которая не даёт по дочернему ключу вычислить родительский. Чаще всего вы будете копировать проверенные пути, а не собирать их вручную:

ПутьДля чегоСтандарт
m/44'/60'/0'Ethereum и все EVM-сетиBIP-44
m/84'/0'/0'Bitcoin - Native SegWitBIP-84
m/86'/0'/0'Bitcoin - TaprootBIP-86
m/44'/0'/0'Bitcoin - LegacyBIP-44
m/44'/195'/0'TRONBIP-44
m/44'/501'/0'SolanaBIP-44
Сверьте с кошельком

Экспортируйте расширенный публичный ключ для аккаунта и формата адресов, которые собираетесь отслеживать. Сохраните вместе с ним путь деривации из кошелька; в таблице приведены распространённые пути уровня аккаунта.

Импортируйте расширенный публичный ключ через POST/public-keys, затем вызовите POST/public-keys/{public_key_id}/addresses с "chain_family": "evm", "selection": {"kind": "next"} в теле запроса, чтобы получить следующий адрес последовательности. Каждый автоматически ставится на мониторинг.

Как получить свой xPub

Большинство кошельков умеют экспортировать расширенный публичный ключ. Три самых частых источника:

Ledger Live

Откройте аккаунт, перейдите в Advanced settings и скопируйте Extended Public Key.

Trezor Suite

Откройте аккаунт и выберите Show xPub.

MetaMask

Основан на аккаунтах, поэтому экспортировать xPub не умеет. Вместо этого импортируйте в Vilna отдельные адреса.

Экспортируйте публичный ключ средствами своего кошелька. Не передавайте Vilna seed-фразу или приватные ключи. Затем зарегистрируйте расширенный публичный ключ и выведите адреса; параметры и примеры запросов находятся на страницах операций.

Seed - это и есть ключи

Мнемоника (seed-фраза) может заново породить каждый приватный ключ в кошельке. Никогда не раскрывайте её в коде, логах или системе контроля версий. Для HD-деривации мониторингу Platform нужен xPub, а не мнемоника.

Именование сетей и активов

При десятках сетей и тысячах токенов фразы вроде «USDT в BSC» коду недостаточно, чтобы действовать однозначно: есть тестовые сети, мостовые копии и похожие по виду контракты. Поэтому Vilna опирается на два открытых стандарта, превращающих любую сеть или актив в одну точную, однозначную строку, о которой вы и API договариваетесь: CAIP-2 называет сеть, а CAIP-19 называет актив в этой сети.

Вручную их почти не печатают; Vilna возвращает их готовыми в каждом ответе. Здесь цель только в том, чтобы узнавать такую строку при встрече. Читайте слева направо: сеть, за которой опционально следует актив на ней.

Что вы имеете в видуИдентификатор, который использует Vilna
Ethereum, сетьeip155:1
BNB Smart Chaineip155:56
BTC, нативная монетаbip122:…/slip44:0
USDT в Ethereumeip155:1/erc20:0xdAC17…831ec7
Не заучивайте структуру

Чтобы пользоваться API, не нужно знать, как эти идентификаторы устроены. Когда понадобится посегментный разбор CAIP-2 (сети), CAIP-10 (аккаунты) и CAIP-19 (активы), всё собрано в одном месте: Стандарты.

Нативные монеты и токены

Одно различие стоит держать в голове, потому что оно определяет, как работают балансы и комиссии. У каждой сети есть одна встроенная валюта плюс любое число токенов поверх:

Нативная монета

Собственная валюта сети, которой платят комиссию за транзакции: ETH в Ethereum, BTC в Bitcoin, SOL в Solana, TRX в TRON. На сеть приходится ровно одна.

Токен

Валюта, построенная поверх сети через смарт-контракт: USDT, USDC, DAI и тысячи других. В EVM они следуют стандарту ERC-20 (взаимозаменяемые) или ERC-721 (NFT); в TRON аналог называется TRC-20. Сеть может нести неограниченное число токенов.

Список поддерживаемых сетей доступен через Platform API.

Как читать суммы

Блокчейны хранят суммы целыми числами в наименьшей единице монеты (думайте «копейки», а не «рубли», но часто с 18 знаками после запятой). Во многих суммах транзакций и балансов есть два поля:

{
  "base": "1500000000000000000",
  "formatted": "1.5"
}
  • base - сырое целое в наименьшей единице (wei для ETH, satoshi для BTC). Точное, никогда не округляется.
  • formatted - человекочитаемое десятичное число, готовое к выводу в интерфейсе.
Считайте всегда по base

Используйте base для любых вычислений, сравнений и хранимых балансов; оно не теряет точность. К formatted относитесь как к значению только для отображения; оно может округлять очень большие или очень маленькие величины.

Поля сумм счетов устроены иначе; см. Основные концепции.

Включение в блок и подтверждения

Отправка транзакции, включение в блок и подтверждение - разные этапы. Ниже показана модель подсчёта подтверждений по блокам; правила конкретной сети могут отличаться:

Отправка в сеть. До включения в блок транзакция может находиться в mempool - очереди ожидающих транзакций. На этом этапе она pending: известна узлам, но ещё не включена в блок.

Первое подтверждение. Майнер или валидатор упаковывает её в блок. Теперь она в сети: это 1 подтверждение.

Новые подтверждения. В этой модели каждый следующий блок добавляет ещё одно подтверждение. Это снижает риск исключения транзакции при реорганизации цепочки, но само по себе не гарантирует необратимости.

Финальность (finality) - свойство сети, определяющее, при каких условиях результат считается необратимым. Правила подтверждений и финальности различаются между сетями. Выберите политику подтверждений для своего приложения: фиксированное число блоков не даёт универсальной гарантии.

Vilna отслеживает это за вас

Подтверждения вам считать не нужно: Vilna уведомляет один раз на подписку. Момент определяет условие отправки уведомления (trigger): block ждёт фиксированное число блоков после включения (after_blocks: 0 означает «замечено», без гарантии необратимости), network ждёт собственной политики подтверждений сети, mempool (Bitcoin) срабатывает до включения в блок. Нужен ранний и более поздний сигнал подтверждения? Создайте две подписки с разными условиями. Учтённая транзакция всё ещё может выпасть из цепочки при реорганизации; уведомления об этом нет, проверяйте текущее состояние через API. Полную модель условий подписки см. в Событиях и мониторинге.