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.