Здесь разобрано, как адреса, публичные ключи, суммы и подтверждения представлены в API Vilna. Опыт работы с блокчейном не требуется. Уже знакомы с этими понятиями? Начните с Основных концепций.
Некастодиальность - Vilna не хранит средства Только чтение - лишь публичные ключи Одна форма для любой сети Построено на открытых стандартах
Забудьте на минуту про хайп. Для интеграции блокчейн - это просто общая книга записей, которую все могут читать и которую никто не может тайком изменить. Новые транзакции продолжают эту историю; реорганизации могут заменить недавние блоки.
Три свойства - всё, что нужно держать в голове:
Каждая транзакция и каждый баланс видны любому. Никаких приватных запросов нет; вы просто читаете сеть.
Обычно блоки продолжают цепочку, но реорганизация может заменить недавние блоки и изменить набор включённых транзакций. Перед учётом поступления сверяйте текущее состояние.
Новые записи собираются в блоки, которые добавляются один за другим. Позиция блока - это его место во времени.
Публичный реестр позволяет наблюдать за адресом без разрешения владельца кошелька. Мониторинг 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 | начинается с 1 | 1A1zP1…DivfNa |
| Bitcoin - SegWit-совместимый | начинается с 3 | 3J98t1…hWNLy |
| Bitcoin - Native SegWit | начинается с bc1q | bc1qar0…f5mdq |
| Bitcoin - Taproot | начинается с bc1p | bc1p5d7…g3s7p |
| TRON | начинается с T, 34 символа | TXk7…m4Qa |
| Solana | base58, ~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Одна резервная копия seed-фразы охватывает все производные адреса; отдельный адрес для каждого клиента используется в сценарии мониторинга биржи.
Чтобы Vilna могла генерировать и наблюдать это дерево адресов, ни разу не касаясь секрета, вы делитесь расширенным публичным ключом: особым публичным ключом, который умеет порождать дочерние адреса (и только адреса, никогда подписи). У Bitcoin три разновидности, по одной на стиль адреса:
| Префикс ключа | Стандарт | Что порождает |
|---|---|---|
xPub | BIP-44 | Legacy-адреса (начинаются с 1) |
yPub | BIP-49 | SegWit-совместимые адреса (начинаются с 3) |
zPub | BIP-84 | Native SegWit-адреса (начинаются с bc1q) |
Для EVM-сетей используется xPub (BIP-44). У Bitcoin Taproot нет однобуквенного префикса; используйте xPub с путём Taproot ниже.
Путь деривации - это «адрес внутри дерева», как путь к папке, указывающий на один конкретный ключ. Читается слева направо, сужаясь от мастер-ключа до единственного адреса:
Корень дерева - мастер-ключ вашего кошелька. Всё происходит отсюда.
мастер-ключPurpose - какому стандарту следует путь: 44, 49, 84 или 86.
BIP-44Coin type - какая сеть, из реестра SLIP-44: 60 = ETH, 0 = BTC, 195 = TRON, 501 = Solana.
EthereumAccount - позволяет одному кошельку держать раздельные суб-кошельки. Почти всегда 0.
аккаунт #0Change - 0 для адресов, принимающих средства, 1 для внутренних адресов сдачи.
приёмIndex - номер адреса. Увеличивайте его для каждого нового адреса: 0, 1, 2, 3…
первый адресАпостроф (') после числа означает hardened (ужесточённый): защита, которая не даёт по дочернему ключу вычислить родительский. Чаще всего вы будете копировать проверенные пути, а не собирать их вручную:
| Путь | Для чего | Стандарт |
|---|---|---|
m/44'/60'/0' | Ethereum и все EVM-сети | BIP-44 |
m/84'/0'/0' | Bitcoin - Native SegWit | BIP-84 |
m/86'/0'/0' | Bitcoin - Taproot | BIP-86 |
m/44'/0'/0' | Bitcoin - Legacy | BIP-44 |
m/44'/195'/0' | TRON | BIP-44 |
m/44'/501'/0' | Solana | BIP-44 |
Экспортируйте расширенный публичный ключ для аккаунта и формата адресов, которые собираетесь отслеживать. Сохраните вместе с ним путь деривации из кошелька; в таблице приведены распространённые пути уровня аккаунта.
Импортируйте расширенный публичный ключ через POST/public-keys, затем вызовите POST/public-keys/{public_key_id}/addresses с "chain_family": "evm", "selection": {"kind": "next"} в теле запроса, чтобы получить следующий адрес последовательности. Каждый автоматически ставится на мониторинг.
Большинство кошельков умеют экспортировать расширенный публичный ключ. Три самых частых источника:
Откройте аккаунт, перейдите в Advanced settings и скопируйте Extended Public Key.
Откройте аккаунт и выберите Show xPub.
Основан на аккаунтах, поэтому экспортировать xPub не умеет. Вместо этого импортируйте в Vilna отдельные адреса.
Экспортируйте публичный ключ средствами своего кошелька. Не передавайте Vilna seed-фразу или приватные ключи. Затем зарегистрируйте расширенный публичный ключ и выведите адреса; параметры и примеры запросов находятся на страницах операций.
Мнемоника (seed-фраза) может заново породить каждый приватный ключ в кошельке. Никогда не раскрывайте её в коде, логах или системе контроля версий. Для HD-деривации мониторингу Platform нужен xPub, а не мнемоника.
При десятках сетей и тысячах токенов фразы вроде «USDT в BSC» коду недостаточно, чтобы действовать однозначно: есть тестовые сети, мостовые копии и похожие по виду контракты. Поэтому Vilna опирается на два открытых стандарта, превращающих любую сеть или актив в одну точную, однозначную строку, о которой вы и API договариваетесь: CAIP-2 называет сеть, а CAIP-19 называет актив в этой сети.
Вручную их почти не печатают; Vilna возвращает их готовыми в каждом ответе. Здесь цель только в том, чтобы узнавать такую строку при встрече. Читайте слева направо: сеть, за которой опционально следует актив на ней.
| Что вы имеете в виду | Идентификатор, который использует Vilna |
|---|---|
| Ethereum, сеть | eip155:1 |
| BNB Smart Chain | eip155:56 |
| BTC, нативная монета | bip122:…/slip44:0 |
| USDT в Ethereum | eip155: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 для любых вычислений, сравнений и хранимых балансов; оно не теряет точность. К formatted относитесь как к значению только для отображения; оно может округлять очень большие или очень маленькие величины.
Поля сумм счетов устроены иначе; см. Основные концепции.
Отправка транзакции, включение в блок и подтверждение - разные этапы. Ниже показана модель подсчёта подтверждений по блокам; правила конкретной сети могут отличаться:
Отправка в сеть. До включения в блок транзакция может находиться в mempool - очереди ожидающих транзакций. На этом этапе она pending: известна узлам, но ещё не включена в блок.
Первое подтверждение. Майнер или валидатор упаковывает её в блок. Теперь она в сети: это 1 подтверждение.
Новые подтверждения. В этой модели каждый следующий блок добавляет ещё одно подтверждение. Это снижает риск исключения транзакции при реорганизации цепочки, но само по себе не гарантирует необратимости.
Финальность (finality) - свойство сети, определяющее, при каких условиях результат считается необратимым. Правила подтверждений и финальности различаются между сетями. Выберите политику подтверждений для своего приложения: фиксированное число блоков не даёт универсальной гарантии.
Подтверждения вам считать не нужно: Vilna уведомляет один раз на подписку. Момент определяет условие отправки уведомления (trigger): block ждёт фиксированное число блоков после включения (after_blocks: 0 означает «замечено», без гарантии необратимости), network ждёт собственной политики подтверждений сети, mempool (Bitcoin) срабатывает до включения в блок. Нужен ранний и более поздний сигнал подтверждения? Создайте две подписки с разными условиями. Учтённая транзакция всё ещё может выпасть из цепочки при реорганизации; уведомления об этом нет, проверяйте текущее состояние через API. Полную модель условий подписки см. в Событиях и мониторинге.