Я постоянно думаю о двух типах транзакций, которые Dusk представила в Rusk: CanonicalTransaction и LedgerTransaction.
Они представляют разные уровни одной и той же транзакции. CanonicalTransaction — это логическая форма, с которой работает Rusk, а LedgerTransaction оборачивает эту транзакцию в представление реестра (ledger), требуемое конкретной версией протокола. Напряжение заключается в том, что Dusk хочет, чтобы эти форматы хранения развивались, не заставляя смысл транзакции развиваться вместе с ними — важное свойство, поскольку это подталкивает к внедрению финансовых рынков onchain с организациями, лицензированными в ЕС. Чего я пока не знаю, так это будет ли это разделение действительно удерживать изменения версий внутри Rusk, или же изменения формата все равно «выплеснутся» в кошельки, приложения и исторический повтор (historical replay).
На что стоит обратить внимание: как Dusk нормализует входящие транзакции, выбирает корректное представление ledger и интерпретирует более старые транзакции после обновлений протокола.
То, что кошелек продолжает отправлять транзакции после обновления, является полезным свидетельством совместимости. Более сильная проверка — сможет ли Dusk изменить представление «под капотом», сохранив при этом ту же семантику транзакции «сверху».
Я бы оценивал эту абстракцию по тому, насколько мало сложности версионирования приложениям нужно знать.
Вопрос в том, действительно ли Dusk отделила то, что означает транзакция, от того, как ledger хранит её, или просто перенесла бремя обработки версий куда-то еще в стеке.
Я наблюдаю, как эта граница выдержит будущие изменения формата и исторический повтор.
#dusk $DUSK @Dusk