Перемещайте ценности. Перемещайте данные. На ваших условиях.
Транзакция ZooBC представляет собой подписанный конверт, в который вложено небольшое типизированное тело. Конверт одинаков для всех типов, а тело и несколько необязательных модификаторов определяют, что именно произойдёт: обычная отправка, перевод токена, зарплата с вестингом, сделка через эскроу, ход в приложении, запланированный триггер. Здесь собрана полная карта.
01Анатомия транзакции
Всё сериализуется в порядке little-endian в единый байтовый буфер, который затем подписывается. Синие поля образуют конверт (одинаковый для всех типов); фиолетовое тело меняется от типа к типу.
Адрес аккаунта состоит из 4-байтового типа (LE) и открытого ключа: 00000000+32 Б ed25519 для ZBC, 04000000+ETH, 05000000+BTC и так далее. Отсутствующий получатель записывается как пустой тип 02000000. В хвостовом поле сообщения обычная отправка передаёт свою заметку, а тело SendZBC содержит только сумму; получатель и заметка находятся в конверте.
02Подписание
Тип аккаунта определяет и префикс адреса, и схему подписи. Подписывается весь конверт (без поля подписи) с префиксом из тега подписания и хеша генезиса. Все три схемы детерминированы, поэтому браузерный кошелёк и узел совпадают байт в байт.
ZooBC (ed25519) · тип 00000000
// digest, then sign digest = SHA3_256("ZBC-TX" ‖ genesis_hash ‖ txBytes) sig = ed25519(digest, privkey) // 64 bytes
Эта же схема используется для Solana, Cardano, Tezos, Polkadot: тот же ключ ed25519, но другие префикс адреса и кодировка отображения.
Ethereum (secp256k1) · тип 04000000
// recoverable ECDSA, low-s digest = keccak256(SHA3_256("ZBC-TX" ‖ genesis_hash ‖ txBytes)) r,s,v = secp256k1.sign(digest) sig = r ‖ s ‖ (v+27) // 65 bytes
MetaMask может также отправить собственную подписанную RLP-транзакцию; узел восстанавливает отправителя и преобразует её в перевод ZBC.
Bitcoin (secp256k1) · тип 05000000
// double-sha over the SHA3 payload digest = SHA256d(SHA3_256("ZBC-TX" ‖ genesis_hash ‖ txBytes)) sig = secp256k1.sign(digest) field = [len(2)] ‖ compressedPub(33) ‖ sig
Коротко о комиссии
Минимальная комиссия зависит от размера: базовая ставка × коэффициент комиссий сети плюс побайтовая составляющая за хранение и срок. Получайте её в реальном времени из https://zoobc.network/api/v1/blockchain/fee-params или рассчитывайте точную стоимость транзакции через /estimate-fee, чтобы кошелёк никогда не расходился с узлом даже на одну атомарную единицу. Переплата при отправке с точной комиссией возвращается.
Дайджест, привязанный к блокчейну (версия подписания 2)
Начиная с узла v0.4.0 самый внутренний член одинаков во всех трёх схемах, потому что узел вычисляет этот дайджест один раз и передаёт его той схеме подписи, которую выбирает тип аккаунта.
- "ZBC-TX" состоит из шести байтов ASCII без завершающего символа: 5a 42 43 2d 54 58.
- genesis_hash представляет собой 32 необработанных байта блока 0 того блокчейна, для которого делается подпись.
Считывайте genesis_hash из GET /api/v1/node/info; тот же ответ содержит signing_version: 2 и signing_tag: "ZBC-TX". Никогда не прописывайте его жёстко в коде: он меняется при каждом перезапуске тестовой сети.
Именно включение хеша генезиса в дайджест делает подпись действительной ровно в одной сети, поэтому транзакцию, подписанную для тестового блокчейна, нельзя повторно воспроизвести в другом. Подписание голого SHA3_256(txBytes) соответствует версии подписания 1, и узел отклоняет его с ошибкой:
Invalid transaction signature: legacy unbound digest (signing v1); this chain requires signing v2
03Три вида монет
Суммы всегда указываются в атомарных единицах (1 ZBC = 100 000 000). Между монетами меняется только поле token_id, механика перемещения одинакова.
① Нативный ZBC
token_id = 0 везде. Монета для газа и комиссий, наград за блоки и стейкинга. SendZBC (тип 1) является простым путём.
② Токены генезиса / моста
Обёрнутые внешние активы, выпущенные при генезисе (ZBTC, ZETH, ZSOL…). Это обычные цветные токены с фиксированным token_id, назначенным в конфигурации генезиса; на уровне протокола в них нет ничего особенного.
③ Токены, выпущенные пользователями
Любой может выпустить токен с помощью IssueToken (тип 10): символ, предложение, число знаков после запятой, необязательное обеспечение в ZBC. Его token_id выводится из транзакции выпуска. Применяются те же TransferToken / MintToken / BurnToken.
Везде, где в теле есть token_id (перевод, обмен, ставка в приложении, ликвидный платёж, вестинг…), передавайте 0 для ZBC или идентификатор токена для цветной монеты. Обеспеченные токены могут даже сами оплачивать свою комиссию (флаг fee_in_token) по цене относительно их обеспечения в ZBC.
04Модификаторы: один платёж, много форм
Помимо базовых типов, четыре обёртки времени и доверия меняют то, когда средства поступят и поступят ли вообще. Именно благодаря им возможности кажутся такими обширными.
Эскроу
Добавьте секцию эскроу в конверт любой транзакции с ценностью (утверждающий · комиссия · тайм-аут · инструкция). Средства удерживаются, пока назначенный утверждающий не подпишет ApprovalEscrow (тип 4), чтобы выплатить или отклонить, либо пока не истечёт тайм-аут. Условная сделка поверх любого перевода.
Ликвидный
LiquidPayment (тип 6): один отложенный платёж на протяжении окна. Получатель получает всю сумму по завершении окна или пропорциональную долю, если отправитель досрочно вызовет LiquidPaymentStop (тип 262). Краткосрочный (часы), в ZBC или токене.
Запланированный / с вестингом
ScheduledTransfer (тип 29): выплата траншами по таймеру в виде вестинга (средства блокируются заранее) или регулярной зарплаты (списывается каждый период). Клифф, отзыв, отказ получателя, переназначение. Долгосрочный (от недель до лет). Выплаты отображаются как движения в реестре, а не как новые транзакции.
Триггер / остановка
Облегчённый таймер: CreateTrigger (15) блокирует сумму для срабатывания на будущей высоте; CancelTrigger (16) возвращает её. Чтобы остановить долгосрочные: CancelSchedule (30) для отзыва или отказа, LiquidPaymentStop (262).
Их можно комбинировать. Ежемесячная зарплата, которая к тому же проходит через эскроу, грант с вестингом в цветном токене: примитивы сочетаются друг с другом. (Полное сочетание регулярных платежей с эскроу есть в дорожной карте; все строительные блоки доступны уже сегодня.)
05Поддержание жизни объектов данных
Объекты в блокчейне, которые хранят данные, а именно наборы данных (профили «ключ/значение», чат, бизнес-формы) и токены, платят аренду, чтобы продолжать существовать. «Пополнить объект» означает пополнить финансирование его существования.
Наборы данных и файлы → предоплаченное хранилище
Данные записываются через SetupAccountDataset (тип 3, пара свойство → значение), а файл сохраняется через DFSCreateFile (8). Каждый блок списывает арендную плату за хранение с предоплаченного хранилища вашего аккаунта; когда средства заканчиваются, объект удаляется. Пополняйте его через AddPrepaidStorage (тип 9): тело содержит только сумму, которая зачисляется прямо на ваш баланс предоплаченного хранилища. Больше предоплаты = дольше жизнь.
Токены → финансирование существования
Цветной токен тоже платит за своё существование. FinanceToken (тип 14) продлевает горизонт существования токена за счёт комиссии, увеличивая срок, в течение которого он остаётся активным, прежде чем неиспользованное обеспечение вернётся создателю. Та же идея, но для каждого токена отдельно.
06Полный каталог транзакций
Все 50 типов транзакций с точной структурой тела в порядке little-endian. монета = поддерживает token_id · модифицируемый = принимает секцию эскроу · новый блокчейн = уровень консенсуса (появляется с запуском блокчейна).