ZYCORD docs
Русский
ZycordДокументацияГлоссарий

Глоссарий

Сертификат, свёртка (fold), пропуск, депозит, секвенсор, принудительный путь. Некоторые из них означают здесь нечто более узкое, чем в других местах, а пара из них называет события, для которых у большинства цепочек слова нет.

Словарь, которым пользуется этот протокол, в том смысле, в котором он им пользуется. Некоторые из этих слов означают здесь нечто более узкое, чем в других местах, а два из них — пропуск и отбрасывание — называют события, для которых у большинства цепочек слова нет, потому что нет и самих событий.

Сертификат#

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

Свёртка (fold)#

Детерминированный цикл, продвигающий реестр. Он обходит сертификаты блока в каноническом порядке — сначала fill, затем все обычные сертификаты, затем принудительные сертификаты — и для каждого проверяет, выполняются ли ещё его заявленные чтения: если да, он фиксирует записи, а если нет, он его пропускает. Свёртка выполняет сравнения, сложения и записи по горячему рабочему множеству «ключ-значение» — никакого исполнения кода, никакой проверки подписей, никакого повторного исполнения и никакой арифметики на эллиптических кривых. Это единственная стадия системы, которая не распараллеливается.

Пропуск#

То, что происходит с сертификатом, объявленные чтения которого больше не верны, дельты которого вышли бы за пределы 256-битного диапазона или который записал бы что-либо под израсходованным адресом. Ничего не записывается, фиксированная комиссия за пропуск в 1 000 000 drops (0,01 ZCD) сжигается из его депозита и никому не выплачивается, остаток депозита возвращается, а блок остаётся действительным. Платит тот, кто назвал депозит: автор обычного сертификата, который выбрал чтения, или секвенсор fill. Пользователь никогда не платит за пропуск fill. Пропуск — это семантика, а не сбой: включение и применение — разные события, поэтому производитель блоков никогда не может создать недействительный блок, включив устаревший сертификат.

Отбрасывание#

Неоплачиваемое несобытие. Сертификат, чей депозит не может быть зарезервирован — ячейка депозита уже израсходована или содержит меньше суммы, которую резервирует сертификат, — отбрасывается: он переносится в блоке, не оплачивается, не помечается как виденный и может быть свободно подан повторно с новым депозитом. Поэтому честные пользователи ничего не теряют на гонках за собственную ячейку депозита.

Депозит#

Ячейка, которая отвечает за сертификат: ячейка нативного баланса пользовательского адреса, зарезервированная из неё сумма и слот сдачи, в который возвращается остаток. Ни один сертификат не существует без депозита, а ячейка депозита всегда несёт подпись. Пропуск не должен быть бесплатным, иначе мемпул захлебнётся; именно депозит даёт каждому конфликту владельца. Fill вносит депозит из постоянного баланса своего секвенсора, поэтому, когда fill пропускается, платит секвенсор, а не пользователь, а принудительный сертификат вместо этого оплачивается из платежа своего открытого интента. Поручителей и застрахованных сертификатов технического описания v1.0 больше нет; вот что их заменило.

Ячейка#

Значение в слоте — беззнаковое 256-битное целое, хранимое с обратным порядком байтов в 32 байтах. Ноль — это отсутствие: слот, в который никогда не писали, и слот, в который записали ноль, — это один и тот же слот. Это требование консенсуса, а не удобство: оно делает корень состояния функцией от состояния, а не от истории, его породившей.

Одноразовый адрес (0x01)#

Адрес, чьи полномочия на подпись безвозвратно сжигаются его первым списанием. Платёж на только что выведенный одноразовый адрес — это быстрый путь без всякой конкуренции, а вывод нового адреса на каждый платёж — то, что делает платёж несвязываемым со следующим. Цена этого в том, что “потратить часть этого” — не то, что одноразовый адрес умеет — см. правило кошелька 1.

Постоянный адрес (0x02)#

Многоразовый адрес. Он никогда не может попасть в реестр израсходованных, поэтому у него вовсе нет поверхности для атаки сжиганием. Продавцы, адреса для пожертвований, депозиты секвенсора и выплаты за майнинг используют такой адрес; zycordd --payout отвергает любой другой.

Реестр израсходованных адресов#

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

Действительный и применимый#

Два предиката, которые обычная цепочка смешивает. Действительный — без состояния, параллельный и проверяемый любым по одним лишь байтам сертификата. Применимый — с состоянием, последовательный и решаемый только позицией в реестре: совпадает ли заявленный слот с состоянием, когда до него дошла очередь. Два действительных сертификата могут заявить одно и то же входное значение для одного слота; применимым может быть не более одного.

Охраняемая дельта#

Дисциплина доступа, при которой сертификат утверждает предикат о слоте — balance ≥ 10 — не считывая значение в вычисление, и записывает знаковую дельту. Любое число охраняемых списаний и зачислений в один слот коммутирует, поэтому пропуск случается лишь при настоящем перерасходе, а не просто потому, что баланс изменился. Одна эта дисциплина покрывает переводы, эмиссии с ограниченным предложением, разрешения и доли хранилищ, и её никогда не контролирует секвенсор: секвенируемый токен по-прежнему принимает любой перевод от кого угодно.

Чистая дельта#

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

Точное чтение#

Дисциплина в стиле SLOAD: чтение возвращает значение слота в вычисление и привязывает к нему сертификат. Произвольная логика, конфликты на горячих слотах и вотчина секвенсоров.

Секвенсор#

Внецепочечный сервис, который контракт выбирает для упорядочивания своего трафика точных чтений. Запись каждого контракта содержит ключ секвенсора: пока он ненулевой, точное чтение, охранное условие равенства или установка на ячейках этого контракта требуют подписи этого ключа; пока он равен нулю, контракт открыт и защищён только своим кодом. Секвенсор исполняет интенты пользователей и публикует результаты как fill. Ему доверяют живучесть, но никогда — безопасность: он не может изменить то, что делает интент, — только то, когда, а fill, построенный на лжи, пропускается за счёт секвенсора. Если он перестанет обслуживать, остаётся принудительный путь.

Интент (intent)#

То, что пользователь подписывает вместо сертификата, чтобы вызвать секвенируемый контракт: цель и calldata, параллельный бюджет, nonce, окно не более 8 блоков, постоянный адрес секвенсора, границы результата, платёж, причитающийся каждому секвенсору, одноразовые плательщики, которые его финансируют, и выходы сдачи. Граница — это предикат на ячейку, в которую пишет вызов, — final-at-least, final-at-most, delta-at-least или delta-at-most — и хотя бы одна граница должна называть ячейку, в которую вызов записал. Интент — это всё разрешение пользователя, и его платежи проводятся, только если fill применяется.

Fill#

Сертификат, который секвенсор публикует для интента. Его программа — это интент, его депозит берётся из собственного постоянного баланса секвенсора, а его идентификатор — это хеш интента, так что два fill одного интента имеют общий идентификатор и оплачен может быть только один. В порядке свёртки fill идут первыми, каждый — как только готов каждый конвейер, в который он входит.

Квитанция#

Подписанный ответ секвенсора на интент, возвращаемый за миллисекунды, задолго до появления блока: идентификатор интента, seq конвейера и результат. Это предварительное подтверждение — обещание секвенсора, а не цепочки, окончательное только когда fill применяется. Поскольку квитанции подписаны, две квитанции от одного ключа, которые дают один seq разным интентам или одному интенту разные результаты, — это доказательство, которое любой может проверить по байтам. Консенсус за это не наказывает; пользователи уходят.

Конвейер#

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

Счётчик fence#

Счётчик в записи каждого контракта. Fill объявляет счётчик fence контрактов, поверх которых он построен, и не может войти, если какой-либо из них сдвинулся. Он продвигается, когда попавший в цепочку принудительный сертификат устанавливает одну из ячеек контракта и когда записывается ячейка секвенсора контракта, — так что принудительный путь и смена секвенсора делают недействительным каждый fill, построенный поверх изменённого ими состояния, ни с кого ничего не взимая. Чтение или дельта его не сдвигают, как и принудительный сертификат, завершившийся неудачей. Секвенсор пересобирает fill и теряет только задержку.

Совместное секвенирование#

Вызов, пересекающий контракты, привязанные к разным секвенсорам, попадает в цепочку как один fill, несущий подпись каждого секвенсора, чей точный путь он затрагивает, — до 16, каждый с seq в собственном конвейере и каждому выплачивается то, что интент для него называет. Как они координируются, решается вне цепочки и по замыслу свободно; цепочка видит один сертификат, атомарный по построению.

Каталог секвенсоров#

Место, где секвенсор объявляет свой сервис: сертификат каталога с его постоянного адреса привязывает его ключ к строке от 1 до 256 байт печатаемого ASCII, обычно URL. Запись истекает через 259 200 блоков (около 90 дней) после TTL объявившего её сертификата, если её не продлить, а отзыв удаляет её сразу. Консенсус хранит строку и никогда её не интерпретирует — это обнаружение, а не авторизация. Узел отдаёт её на /directory.

Принудительный путь#

Медленный путь, которому не нужен секвенсор. Пользователь подписывает открытый интент и передаёт его в сеть; производитель блока исполняет выбранные им открытые интенты против состояния на конец блока и добавляет результаты как принудительные сертификаты, последние сертификаты блока. Включение означает применение: нет ни очереди, ни аренды, ни квоты, ни крайнего срока. Блок несёт не более 16 принудительных сертификатов, каждый с параллельным бюджетом не более 4 000 единиц деривации (200 000 машинного gas), и именно поэтому каждый выход, который предлагает контракт, должен укладываться в этот бюджет. Принудительный сертификат, вызов которого завершился откатом, всё равно попадает в цепочку как FORCED_FAILED: его плательщики платят, сдача возвращается пользователю, и больше ничего не записывается.

Открытый интент#

Интент без указанного секвенсора и без совместных секвенсоров, оплачиваемый собственными одноразовыми плательщиками пользователя. Он распространяется в мемпуле как интент, а не как сертификат, и его платёж покрывает комиссии принудительного сертификата: часть базовой комиссии сжигается, а остальное достаётся производителю блока. zcd wallet open-intent подписывает такой интент, а zcd wallet intent --fallback подписывает его, когда секвенсор не обслуживает исходный.

cEVM#

Единственная виртуальная машина: диалект виртуальной машины Ethereum, адаптированный к сертификатам. Хранилище объявляется, а не обнаруживается, добавлены опкоды для охранных условий, дельт и установки секвенсора контракта, опкоды, которым здесь нечему соответствовать, удалены, а NUMBER и TIMESTAMP отвечают по маяку эпохи. Активна начиная с Era 1, со стандартной библиотекой, построенной в первую очередь на дельтах и предварительно развёрнутой по известным адресам. Solidity и его инструментарий переносятся.

Маяк эпохи#

Зарезервированные ячейки, в которые протокол пишет раз в эпоху: номер эпохи, высота открывшего её заголовка, слово энтропии и, начиная с Era 1, время этого заголовка. Программы не должны читать фоновые значения вроде метки времени или высоты напрямую — это сделало бы исполнение функцией чего-то помимо заявленных чтений — поэтому они читают маяк как любой другой слот, лучше всего с диапазонной охраной. Его значения постоянны в течение всей эпохи. Слово энтропии — это выход доказательства работы, и оно непригодно для лотерей на большие суммы.

Эпоха#

2 880 блоков — около суток при 30-секундных блоках, а начиная с перехода на доказательство стейка 17 280 слотов по 5 секунд, по-прежнему сутки. Единица, на границе которой ступенчато снижается субсидия, сдвигается цель последовательной ёмкости и обновляется маяк.

TTL#

Высота, до которой сертификат должен быть зафиксирован, чтобы быть действительным. Ограничен консенсусом 240 блоками (около двух часов), а начиная с перехода на доказательство стейка 1 440 блоками, — именно это позволяет обрезать множество виденных. Включение уже виденного или просроченного сертификата делает недействительным блок — поэтому за подпись можно взыскать плату не более одного раза, и только на позиции, которую подписант принял, поставив подпись.

Последовательный и параллельный gas#

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

Эра#

Этап протокола, открываемый высотой, скомпилированной в публичные релизы, а в Era 2 — ещё и стейком, измеряемым в цепочке в пределах границ по высоте, — но никогда не календарной датой и не голосованием. Era 0, работающая с блока 0: майнинг, нативные активы, оба рынка комиссий, распределение субсидии и казна, которая накапливается и запечатана. Era 1 на высоте 80 640 в mainnet, около 4 ноября 2026 года, и с высоты 2 880 в публичном testnet: cEVM, секвенсоры, интенты и fill, каталог и принудительный путь. Era 2, доказательство стейка: внесение залога открывается на эпохе 182, около 7 апреля 2027 года; разгон начинается, когда активный стейк удерживает 10% предложения в течение 30 эпох, не позднее эпохи 273; переход к производству блоков одним лишь стейком следует, когда разгон завершается. Era S добавила бы конфиденциальные платежи, только после независимых аудитов, и не входит в текущую спецификацию. Эры 2 и S выходят каждая собственным релизом, через хардфорк. Внесение залога не входит в Era 1.

Доказательство стейка#

Консенсус Era 2, в котором право произвести следующий блок разыгрывается жребием пропорционально стейку, а не продаётся за хеши, и интервал блоков сокращается с 30 до 5 секунд. Всё остальное остаётся в силе: каждый узел проверяет каждый сертификат по его байтам, свёртка и оба рынка комиссий не меняются, а недействительный сертификат внутри блока по-прежнему делает блок недействительным. Вычисления, которые майнер тратил на хеши, производитель тратит на проверку. Оно вводится через разгон и переход, и до перехода блоки добываются майнингом. Определено в техническом описании, §11.

Стейк#

Нативная монета, внесённая в залог для производства блоков. BOND перемещает баланс с постоянного адреса в ячейку стейка, привязанную к этому адресу, ключ которого и есть ключ, подписывающий блоки, а UNBOND возвращает его после задержки выхода, превышающей горизонт отката. Стейк становится активным через одну эпоху после внесения в залог, поэтому стейки нельзя создавать и отбрасывать сериями. Минимальный залог — 1 000 ZCD; один ключ — один стейк. Внесение залога открывается с Era 2, на эпохе 182.

Пул и делегирование#

Пул — это стейк, принимающий делегирование. DELEGATE направляет залог на ключ пула, с меньшим минимумом, чем у производящего залога, и баланс никогда не покидает делегатора, который может перенаправить его или вывести из залога с той же задержкой выхода. Вес пула в жеребьёвке — это его собственный залог плюс то, что ему делегировано, и свёртка раз в эпоху делит его вознаграждение между пулом, по объявленной им марже, и его делегаторами, пропорционально стейку. Делегатор никогда не подвергается слэшингу: если пул допускает двойное подписание, сжигается только его собственный залог. Это не майнинговый пул, который находится вне цепочки и вне консенсуса.

Слот#

При доказательстве стейка — 5-секундный интервал, в котором может быть произведён один блок производителем, выбранным для него жребием с вероятностью, пропорциональной стейку, из зерна, зафиксированного в предыдущей эпохе. Эпоха состоит из 17 280 слотов. Слот без блока остаётся пустым и ничего не выплачивает, а среди действительных цепочек побеждает та, что занимает больше всего слотов. В остальных контекстах слот — это место хранения, (address, word), значение которого — ячейка.

Разгон#

Вступление Era 2: 90 эпох, в течение которых каждый блок по-прежнему добывается майнингом и также несёт подпись стейка, выбранного жребием для его высоты. Стейкер получает k/180 доли производителя, где k начинается с 1 и растёт на единицу с каждой эпохой, прошедшей порог: не менее 90% блоков эпохи подписаны, а активный стейк составляет не менее 10% предложения. Блок, добытый без подписи, является действительным и никому не платит: доля его производителя и его приоритетные комиссии сжигаются. Разгон начинается, когда активный стейк удерживает 10% предложения в течение 30 эпох, и не позднее эпохи 273. Это не 30-дневный разгон эмиссии; см. эмиссию.

Переход#

Блок, на котором заканчивается доказательство работы: первый блок эпохи, следующей за 90-й эпохой, прошедшей порог разгона, — не позднее эпохи 363, около 5 октября 2027 года, если порог ни разу не приостановит переход. Начиная с него блоки идут в 5-секундных слотах, эпоха состоит из 17 280 слотов, и каждый блок выплачивает шестую часть ставки эпохи; поблочные потолки делятся на шесть, а каждое число блоков, измеряющее время, умножается на шесть, так что ёмкость и длительности в сутки остаются прежними. Блок тогда становится окончательным на глубине 120 блоков, 10 минут, тогда как доказательство работы требовало 20.

Двойное подписание#

Два заголовка, подписанные одним ключом для одного слота: единственное нарушение, наказываемое консенсусом при доказательстве стейка. Как и недействительный сертификат, это доказательство в одном сообщении, которое любой может проверить по байтам. Сертификат с сообщением о нарушении несёт оба заголовка, и свёртка сжигает собственный залог подписанта, удаляет его ключ из активного множества и выплачивает сообщившему долю. Ничто из того, что делает производитель, не затрагивает чужие монеты: делегирования пула возвращаются его делегаторам.

Эмиссия#

ZCD существует только как субсидия блока, и блок 0 не выплачивает ничего. Ставка начинается с 21 ZCD за блок и ступенчато снижается на каждой границе эпохи по точной целочисленной арифметике — E(n) = max(tail, E(n−1) − floor(E(n−1) / 1054)) — уменьшаясь вдвое примерно каждые два года, пока не достигнет бессрочного хвоста в 0,33 ZCD за блок на эпохе 4 376, примерно на 12-й год. Первые 86 400 блоков (30 дней) — это разгон: блок h выплачивает h/86 400 от ставки, которую выплачивает блок 86 400, а то, что удерживает разгон, около 907 917 ZCD, никогда не возвращается. Начиная с перехода на доказательство стейка каждый блок выплачивает шестую часть ставки эпохи, так что сутки выплачивают столько же. zcd emission --height N выводит субсидию на любой высоте.

Распределение субсидии#

Каждая субсидия блока, и никогда не комиссии, делится консенсусом в пропорции 94 / 3 / 3 начиная с блока 0: 94% — производителю блока после созревания в два часа (240 блоков, 1 440 при доказательстве стейка), 3% — на постоянный адрес основателя до эпохи 1 095 (три года) и 3% — в казну, которая с этого момента получает и 3% основателя. Во время разгона доказательства стейка 94% производителя сами делятся между майнером и выбранным жребием стейкером. Это правило, применяемое к каждому добытому блоку, а не распределение в генезисе: премайна нет.

Казна#

Нативный баланс адреса протокола. Ни один ключ не хешируется в этот адрес, ни один сертификат не может списать с него средства, а генезис не называет никакого кворума. Казна получает 3% каждой субсидии блока начиная с блока 1 и 6% начиная с эпохи 1 095. Пути расходования в протоколе не существует: его можно добавить только более поздним обновлением, с подписантами, выбранными сообществом, а не основателем, и стартовое обязательство состоит в том, что это произойдёт не раньше высоты 259 200, около 5 января 2027 года.

Предложение об управлении#

Предложение для обсуждения сообществом, а не правило консенсуса. Оно предлагает, как можно было бы расходовать казну в первые три года: пять мест с публичными уставами — ведущий разработчик, проверяющий разработчик, майнер, сообщество, публичный представитель — с 3 из 5 для расходования и 4 из 5, публичными в течение 20 160 блоков до вступления в силу, для замены держателя, ротации ключей, расходования резерва или изменения устава. Бюджеты — это доли поступлений в казну, а не фиксированные суммы. Ничто в нём не обязывает, пока обновление казны не закрепит набор ключей. Текст приведён в сопутствующем документе.

RandomX#

Функция доказательства работы, оптимизированная под универсальные CPU, чтобы обычное оборудование оставалось конкурентоспособным; mainnet и публичный testnet работают на randomx-v2. Это параметр консенсуса, а не настройка: бинарник, который не умеет вычислять pow_engine сети, отказывается запускаться, а не откатывается.

Корень состояния#

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

Где каждый термин определён нормативно#

Эта страница — вспомогательное пособие для чтения. Определения, имеющие силу, находятся в спецификации и эталонных векторах; обоснование — в техническом описании v2.0 и сопутствующем ему документе Launch, Eras and Parameters, который определяет эмиссию, эры и значение каждого параметра. Собственный словарный раздел реализации находится в docs/ARCHITECTURE.md.