Skip to content

feat(protocol): sfLEVersion — версия схемы Vault (rippled #7817) - #74

Merged
Platonenkov merged 2 commits into
devfrom
claude/vault-leversion-778740
Aug 4, 2026
Merged

feat(protocol): sfLEVersion — версия схемы Vault (rippled #7817)#74
Platonenkov merged 2 commits into
devfrom
claude/vault-leversion-778740

Conversation

@Platonenkov

@Platonenkov Platonenkov commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

База — dev. PR изначально был stacked поверх #71; после его мержа ветка пересажена на dev через rebase --onto (squash-мерж #71 схлопнул историю, поэтому простое переключение базы дало бы конфликт), и дифф содержит только собственные изменения.

Зачем

3 августа protocol-watch сообщил (issue #46) об изменении sfields.macro и ledger_entries.macro на develop. Изменение ровно одно:

TYPED_SFIELD(sfLEVersion, UINT8, 6)          // sfields.macro
{sfLEVersion,            SoeDefault},        // ledger_entries.macro, ltVAULT

Источник — rippled #7817 «Implement LoanBroker cash-basis accounting», влит в develop 30.07.2026.

Поле помечает, по какой схеме учёта живёт хранилище. Ключевая деталь семантики: хранилища, созданные до активации cash-basis accounting, не несут LEVersion вовсе, и rippled трактует его отсутствие как версию 0 (VaultVersion::Legacy), а не как ошибку — то есть отсутствие значения осмысленно, это не потеря данных.

Что сделано

  • definitions.json + сгенерированный Field.Uint8.Generated.cs. Нужны оба: definitions.json в рантайме не читается, он вход для Tools/GenerateEnums. Поле, добавленное только туда, не доезжает никуда. Сгенерированный файл получен запуском инструмента, а не правкой руками.
  • LOVault.LEVersionuint?, как остальные UInt8-поля этого объекта (Scale, WithdrawalPolicy), плюс enum VaultVersion (Legacy = 0, CashBasis = 1), дающий имена значениям, которые протокол определяет на сегодня. Тип свойства оставлен простым, а не enum'ом, — тем же решением, что и для SignerListFlags/DirectoryNodeFlags в feat(models): флаги ledger-объектов, гвард по LedgerFormats.h и покрытие DynamicMPT (10.11.0.0) #71.
  • Тесты: TestULEVersion_BinaryRoundTrip (кодек действительно возит поле) и TestULOVault_LEVersion_Deserialize (обе формы: поле присутствует; legacy-хранилище без него даёт null).

Что поймал round-trip тест

Он и есть причина, по которой стоило писать тест, а не ограничиться правкой JSON: до кодогенерации тест падал — кодек про поле не знал, decoded["LEVersion"] был null. Правка definitions.json сама по себе не даёт ничего, и без этой проверки поле молча не работало бы.

Попутно всплыла деталь кодека, не требующая правок: Uint8.FromJson берёт byte, поэтому JsonObject с int-литералом падает с Can't decode 'Scale' from '6', а распарсенный из текста JSON (то, в каком виде приходит ответ ноды) работает. Тест использует второй путь.

Версии

Xrpl.BinaryCodec 10.9.0.0 → 10.10.0.0 — minor, добавлено поле. Остальные base-пакеты (Xrpl.AddressCodec, Xrpl.Keypairs) не тронуты и сохраняют версии по правилу из CLAUDE.md.

Xrpl не бампится: 10.11.0.0 из #71 ещё не выпущен и уже описывает модельные правки этой серии, поэтому LOVault.LEVersion уезжает в тот же номер. Запись добавлена в существующий раздел CHANGES.md.

Проверка

Прогон Результат
Сборка решения 0 ошибок
Юнит-тесты 877/877 passed (875 + 2 новых), перепроверено после пересадки на dev
Tools/GenerateEnums [Uint8] + LEVersion (nth: 6), остальные 22 файла без изменений

Интеграционного покрытия нет намеренно: поле появляется только на нодах с cash-basis accounting, а это develop после 30.07 — свежее, чем пин nightly-стенда (3.3.0~b1 от 11.07). Когда стенд поднимут до сборки с #7817, поле можно будет проверить на живом Vault.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2da0ee96-54b7-492c-a1c3-524ac93294ef

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@Platonenkov
Platonenkov changed the base branch from claude/node-3-2-1-updates-901277 to dev August 4, 2026 17:13
protocol-watch сообщил 03.08 об изменении sfields.macro и ledger_entries.macro
на develop. Изменение одно: TYPED_SFIELD(sfLEVersion, UINT8, 6) и его появление
в ltVAULT как SoeDefault (rippled #7817, cash-basis accounting для LoanBroker).

Поле помечает, по какой схеме учёта живёт хранилище. Хранилища, созданные до
активации cash-basis, не несут LEVersion вовсе, и rippled трактует его отсутствие
как версию 0 (VaultVersion::Legacy), а не как ошибку — то есть отсутствие
значения осмысленно, это не потеря данных.

* definitions.json + сгенерированный Field.Uint8. Нужны ОБА: definitions.json
  в рантайме не читается, он вход для Tools/GenerateEnums, поэтому поле,
  добавленное только туда, не доезжает никуда. Файл перегенерирован
  инструментом, а не правился руками
* LOVault.LEVersion (uint?, как остальные UInt8-поля этого объекта) и enum
  VaultVersion (Legacy = 0, CashBasis = 1) — имена для значений, которые
  протокол определяет на сегодня
* TestULEVersion_BinaryRoundTrip — именно он показал, что одного definitions.json
  мало: до кодогенерации кодек поля не знал и тест падал
* TestULOVault_LEVersion_Deserialize — обе формы: поле присутствует, и legacy-
  хранилище без него десериализуется в null

Xrpl.BinaryCodec поднят до 10.10.0.0 (minor: добавлено поле). Остальные
base-пакеты не тронуты и сохраняют версии. Xrpl не бампится: 10.11.0.0 ещё
не выпущен и уже описывает модельные правки этой серии.

Проверено: сборка решения без ошибок, юнит-тесты 877/877.
Кодек везёт sfLEVersion, то есть меняется вместе с моделями, — держать его на
собственной ветке нумерации незачем: потребитель читает один номер для обоих
пакетов. Вместо следующего минора кодека (10.10.0.0) ставится 10.11.0.0.

10.10.x просто пропускается: последняя опубликованная версия Xrpl.BinaryCodec —
10.9.0, номер 10.10.0.0 на NuGet не выходил, так что ничего не переиспользуется
и не переписывается.

Xrpl.AddressCodec и Xrpl.Keypairs остаются на 10.9.0.0 — они не менялись.
@Platonenkov
Platonenkov force-pushed the claude/vault-leversion-778740 branch from d584554 to d85d856 Compare August 4, 2026 17:15
@Platonenkov
Platonenkov added this pull request to the merge queue Aug 4, 2026
Merged via the queue into dev with commit 7639041 Aug 4, 2026
4 checks passed
@Platonenkov
Platonenkov deleted the claude/vault-leversion-778740 branch August 4, 2026 21:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant