На DUSK я нашёл более неприятный сценарий отказа, чем отклонение транзакции: те же байты транзакции принимаются, а затем интерпретируются по-разному в зависимости от того, какая часть Rusk к ним обращается.
Вот такой бардак пришлось разрулить Boreas. Живые транзакции декодируются в соответствии с активной версией протокола. Старые обёртки Aegis всё ещё могут приходить на сетевой край, но Rusk нормализует их, прежде чем они уйдут глубже. Транзакции, запечатанные локально, снова канонизируются перед тем, как они будут зафиксированы в реестре.
Самая неудобная часть — история. DUSK не может просто удалить старые правила после обновления, потому что узлам всё ещё нужно переигрывать блоки до Aegis и до Boreas. Поэтому текущий узел должен понимать форматы вчерашнего дня, не допуская, чтобы вчерашние правила просачивались в сегодняшнее производство блоков.
Для оператора последствие получается предельно простым. Перезапуск, пересборка архива или полная перепроигровка должны восстановить то же состояние цепочки, до которого дошёл живой узел. Если mempool читает одно значение, а историческая перепроигровка — другое, всё может выглядеть здорово, пока не выяснится несоответствие в индексе, балансе или переходе состояния.
Меня меньше волнует, что обновление меняет правила транзакций; важнее другое — может ли DUSK менять их, не изменяя прошлое.
#dusk $DUSK @Dusk
Вот такой бардак пришлось разрулить Boreas. Живые транзакции декодируются в соответствии с активной версией протокола. Старые обёртки Aegis всё ещё могут приходить на сетевой край, но Rusk нормализует их, прежде чем они уйдут глубже. Транзакции, запечатанные локально, снова канонизируются перед тем, как они будут зафиксированы в реестре.
Самая неудобная часть — история. DUSK не может просто удалить старые правила после обновления, потому что узлам всё ещё нужно переигрывать блоки до Aegis и до Boreas. Поэтому текущий узел должен понимать форматы вчерашнего дня, не допуская, чтобы вчерашние правила просачивались в сегодняшнее производство блоков.
Для оператора последствие получается предельно простым. Перезапуск, пересборка архива или полная перепроигровка должны восстановить то же состояние цепочки, до которого дошёл живой узел. Если mempool читает одно значение, а историческая перепроигровка — другое, всё может выглядеть здорово, пока не выяснится несоответствие в индексе, балансе или переходе состояния.
Меня меньше волнует, что обновление меняет правила транзакций; важнее другое — может ли DUSK менять их, не изменяя прошлое.
#dusk $DUSK @Dusk

