130 / 736CSV

CSV

Ожидание от подтверждения конкретных монет

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

CSV — сокращение OP_CHECKSEQUENCEVERIFY в Bitcoin Script. Вместе с BIP 68 он позволяет установить относительный замок: конкретный путь расходования доступен, когда подтверждённый выход достаточно стар. Выход — полученная сумма с условиями расходования. Само ожидание не заменяет подпись и не отправляет деньги.

Анна и Пётр могут потратить совместно хранимые монеты по договорённости. Они также хотят запасной путь, которым Анна воспользуется одна, но лишь после ожидания от подтверждения соответствующего выхода. CSV помогает обеспечить это условие. В отличие от CLTV с его фиксированной высотой или временем, здесь граница не является заранее заданной точкой всей истории. Она зависит от конкретных монет. Создание кошелька, подготовка подписи или долгое ожидание неподтверждённой транзакции не заменяют этот начальный момент. Кошелёк — приложение или устройство для получения и отправки биткоинов. [1] [2] [8]

Блок объединяет транзакции в пакет, добавляемый в общую историю. Высота блока — его позиция в цепочке. Представим выход, подтверждённый на высоте 900000, и необходимую задержку 10 блоков. По этому замку самый ранний блок для расходования — 900010. Промежутка лишь в 9 блоков недостаточно. Это не обещание точного числа минут: блоки появляются с неравномерными интервалами. Достаточный возраст также не означает подтверждения платежа. Транзакция должна быть действительна во всём остальном, а майнер должен действительно включить её в блок. [2] [4] [9]

Задержку можно кодировать шагами по 512 секунд. Тогда код 2 означает 1024 секунды. Но сравниваются не двое компьютерных часов. Начало — Median Time Past блока перед тем, который подтвердил выход; другая точка — Median Time Past блока перед блоком-кандидатом. Это средняя по позиции временная метка последних не более чем 11 блоков после сортировки. Разница между этими медианами должна достичь требуемой задержки. Это не точный будильник по местному времени. [2] [4] [7]

Для платежа кошелёк может объединить несколько ранее полученных сумм. Каждый вход транзакции ссылается на ранее полученный выход, возраст которого отсчитывают от подтверждения в цепочке. Поле nSequence находится в самом входе. Это поле несёт сведения для относительного ожидания. Недостаточно, чтобы только часть денег была достаточно старой: все применимые замки транзакции должны быть выполнены. Реорганизация цепочки также может изменить место подтверждения. Поэтому прежняя возможность потратить монету не является её необратимым свойством. При реорганизации сеть принимает другую действительную ветвь цепочки, заменяя часть прежней истории блоков. [2] [4] [9]

Full Node самостоятельно проверяет правила с помощью связанных проверок. CSV по BIP 112 сравнивает аргумент скрипта с nSequence входа, расходующего данный выход. Сам он не вычисляет возраст — этим занимается BIP 68 при проверке транзакции. Для обычного аргумента без флага отключения нужна версия транзакции не ниже 2, а бит 31 в nSequence должен быть сброшен. Бит — маленький переключатель внутри числового поля. Отрицательный аргумент, более старая версия или несовместимое nSequence приводят к провалу проверки. [1] [2] [3]

Бит 22 определяет, как читать задержку. Если он не установлен, единица — блоки; если установлен — шаги по 512 секунд. Аргумент скрипта и nSequence должны использовать один тип. Это похоже на сравнение измерений: большего числа недостаточно, если одна сторона считает километры, а другая часы. Здесь несоответствие возникает между числом блоков и временным интервалом. [1] [2] [3]

Длину задержки несут младшие 16 битов. Маска 0x0000ffff выбирает эту часть числового поля. CSV сравнивает её вместе с типом задержки, а не считает любое большое nSequence автоматически более долгим ожиданием. После выбора нужных битов требование скрипта не должно превышать значение входа. Для разработчиков кошельков это важная техническая граница. Обычному пользователю не следует настраивать её вручную без понимания всей процедуры. [1] [2] [3]

Нулевая задержка не добавляет ожидания, но остальные проверки обычного CSV сохраняются. Другой случай — когда в неотрицательном аргументе самого скрипта установлен бит 31. Тогда CSV ведёт себя как NOP, инструкция без воздействия на относительный замок. Такой аргумент не обеспечивает ожидание. Его следует отличать от того же флага в nSequence входа: с обычным аргументом этот флаг входа должен быть сброшен. [1] [3]

Если запасной путь Анны требует её подписи, предоставить её нужно и после задержки. Закрытый ключ — секретное числовое значение, с помощью которого создают такую подпись. Потерянный приватный ключ не возвращается, а другая ветвь по-прежнему может разрешать более раннее расходование. При выполнении скрипта CSV оставляет аргумент на стеке, рабочей стопке данных; поэтому за ним часто идёт OP_DROP, убирающий аргумент. Удаление данных не даёт никому права на деньги. Это определяют подписи и остальные условия выбранного пути. [1] [3] [5]

BIP 112 ввёл CSV вместо OP_NOP3 вместе с BIP 68 и BIP 113. Это действующая возможность, а не только план. Её используют, например, платёжные каналы Lightning Network, где задержка может дать другой стороне время на реакцию, но не организует саму реакцию. После ожидания транзакцию всё равно нужно распространить и подтвердить. Важны комиссия, доступные данные и состояние цепочки. Подробности проверок описаны в Bitcoin Core v29.0 и указанных спецификациях. [1] [2] [6]

Для полной картины прочитайте эту статью вместе с CLTV, Opcode, Timelock, Bitcoin Script, Bitcoin, Full Node. На эту статью также ссылаются Подтверждение, Timelock, HTLC, Opcode.

DOC · 001BIP 112 — OP_CHECKSEQUENCEVERIFYСпецификация DOC · 002BIP 68 — Relative lock-timeСпецификация DOC · 003Bitcoin Core v29.0 — Script interpreterДокументация DOC · 004Bitcoin Core v29.0 — Transaction sequence locksДокументация DOC · 005Bitcoin Developer Reference — TransactionsДокументация DOC · 006Bitcoin Core 0.12.1 — BIP 68/112/113 release notesДокументация DOC · 007BIP 113 — Median time-past lock-time calculationsСпецификация DOC · 008BIP 65 — OP_CHECKLOCKTIMEVERIFYСпецификация DOC · 009Bitcoin Developer Guide — Block ChainДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией