Предложение, которое изменило Midnight для меня, было резким: транзакция может потерпеть неудачу в ошибочной фазе и все равно оставить гарантированные эффекты.
Как только я это прочитал, я не мог вернуться к обычной криптоумственной модели. Документы Midnight говорят, что транзакции проходят проверку на корректность, затем фазу гарантии, затем ошибочную фазу. Если сбой происходит в фазе гарантии, транзакция не включается. Но если сбой происходит позже, гарантированные эффекты все равно применяются, и книга учета фиксирует частичный успех. Документы также говорят, что сборы за все фазы собираются в фазе гарантии и теряются, если ошибочная фаза терпит неудачу. Это означает, что сбой в Midnight не всегда можно отменить. Иногда это остаток.
Это гораздо больший факт продукта, чем кажется на первый взгляд.
Многие люди все еще думают о сбое транзакций в простых терминах. Это сработало, или это потерпело неудачу и ничего на самом деле не произошло. Midnight ослабляет этот краткий путь. Его семантика этапирована. Некоторые части действия могут стать реальными до того, как поздние части будут разрешены на неудачу. Документация ясно указывает, что выполнение фаз может включать такие вещи, как вставка обязательств, вставка аннулирований, проверка прошлых корней и обновление набора прошлых корней. Так что к тому времени, когда подверженное ошибке условие рушится, транзакция уже могла изменить состояние книги таким образом, что приложение не может притворяться, что этого не произошло.
Сборы уже исчезли тоже.
Это сочетание делает модель серьезной. Поздняя неудача - это не просто сообщение об ошибке. Это может быть неудавшийся план, лежащий на успешном префиксе.
Самый ясный способ увидеть проблему - это с помощью частного доступа. Представьте себе приложение Midnight, где пользователь пытается осуществить какие-то частные разрешения. Приложение хочет, чтобы действие казалось простым. Пользователь нажимает один раз и ожидает одного чистого ответа. Однако за экраном транзакция может пройти проверку на корректность, войти в гарантированную фазу, собрать сборы и применить эффекты, которые там принадлежат. Затем позднее подверженное ошибке условие терпит неудачу. Может быть, какое-то бизнес-правило не было выполнено. Может быть, поздняя ветка не смогла завершиться. С точки зрения пользователя действие провалилось. С точки зрения Midnight неудача пришла после того, как книга уже изменилась.
Это не крошечный семантический крайний случай. Это поведение продукта.
И Midnight не рассматривает этот разрыв как случайный. Документация говорит, что если вызов контракта содержит как гарантированные, так и подверженные ошибкам секции, секция с ошибками должна начинаться с ckpt. Мне нравится эта деталь, потому что она делает архитектуру честной. Линия между "это должно выжить" и "это все еще может прерваться" явна. Строители не только принимают решение о том, что делает их частная логика. Они решают, что система может сохранить, если полное намерение никогда не будет достигнуто.
Вот где начинается давление дизайна.
Строитель может взглянуть на контракт Midnight, увидеть, что доказательства правильные, и все равно пропустить более сложный вопрос. Если это действие потерпит неудачу поздно, что уже стало правдой. Если ответ "некоторые обязательства, некоторые аннулирования, сборы и запись частичного успеха", тогда приложение не может говорить о сбое так же, как это делал бы обычный механизм отката. Логика повторных попыток меняется. Сообщения пользователю меняются. Поддержка меняется. Красное состояние ошибки больше не может означать "ничего не произошло".
Это настоящая компромисс. Midnight получает более выразительную модель транзакций. Гарантированная работа может быть отделена от последующей подверженной ошибкам работы. Это полезно. Это дает строителям больше контроля над структурой выполнения. Но цена в том, что приложения должны проектировать вокруг частичного успеха как состояния первого класса. Не ошибка. Не случайная реализация. Состояние.
Если они этого не сделают, продукт начинает обманывать.
Пользователь видит "неудача". Книга говорит "частично завершено". Сборы исчезли в любом случае. Этот разрыв - это то, где начинается путаница. Команда может легко неправильно истолковать это тоже. Они могут рассматривать проблему как обычный сбой времени выполнения, когда настоящая проблема заключается в том, что модель транзакций позволила некоторым эффектам выжить по замыслу. Midnight не скрывал этого от них. Документация сказала им. Ошибка заключается в том, чтобы притворяться, что пользовательский опыт может оставаться все или ничего после того, как семантика перестала быть все или ничего.
Вот почему я думаю, что модель выполнения Midnight заслуживает больше внимания, чем получает. Люди будут говорить о конфиденциальности, выборочном раскрытии и том, что может оставаться скрытым. Хорошо. Но серьезный продукт определяется не только тем, что он может скрыть. Он также определяется тем, что он позволяет значить неудачу. Midnight изменяет это значение очень точным образом. Неудачное частное действие все еще может иметь необратимую переднюю половину.
Таким образом, настоящий стандарт обзора не может остановиться на "подтверждает ли доказательство". Он также должен спрашивать: какие эффекты были помещены в гарантированную фазу, что выживает при поздних сбоях и объясняет ли приложение это честно пользователю. В Midnight это не второстепенные детали UX. Они являются частью семантики.
Самые сильные приложения Midnight будут теми, которые с первого дня будут рассматривать частичный успех как реальное состояние продукта. Более слабые будут продолжать называть это провалом и надеяться, что никто не заметит, что книга уже изменилась.
@MidnightNetwork $NIGHT #night

