feat(models): флаги ledger-объектов, гвард по LedgerFormats.h и покрытие DynamicMPT (10.11.0.0) - #71
Open
Platonenkov wants to merge 2 commits into
Open
feat(models): флаги ledger-объектов, гвард по LedgerFormats.h и покрытие DynamicMPT (10.11.0.0)#71Platonenkov wants to merge 2 commits into
Platonenkov wants to merge 2 commits into
Conversation
…amicMPT Модели MPT отставали от rippled по флагам ledger-объектов, а DynamicMPT (XLS-94) не имел ни гварда, ни интеграционных тестов: поля MutableFlags в моделях были, но против ноды никогда не проверялись. * MPTokenIssuanceFlags + MPTCanHoldConfidentialBalance (0x80) — вводит ConfidentialTransfer; остальная поддержка амендмента уже полная (транзакции 85-89, IssuerEncryptionKey/AuditorEncryptionKey, ConfidentialOutstandingAmount), не хватало только имени у флага * MPTokenFlags + lsfMPTAMM (0x4) — пробел старше: флаг есть уже в 3.2.1. AMMCreate ставит его вместе с lsfMPTAuthorized, неявно авторизуя MPT-актив для псевдо-аккаунта AMM (src/libxrpl/tx/transactors/dex/AMMCreate.cpp) * AmendmentGuard + DynamicMPT; id совпал с тем, что generate-amendments.sh уже кладёт в [amendments] nightly-стенда * TestIDynamicMPT — 4 теста, каждый читает результат из ledger-объекта: MutableFlags с Create доезжают в LOMPTokenIssuance; MPTokenIssuanceSet меняет TransferFee и MPTokenMetadata, не переписывая MutableFlags; tmfMPTSetCanLock поднимает lsfMPTCanLock на issuance, созданном без него; мутация без разрешения отбивается tecNO_PERMISSION, а метаданные в ledger остаются прежними Сценарии выверены по транзактору rippled 3.3.0-rc1 (src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp), а не по документации: отсюда tfMPTCanTransfer на создании — preclaim требует lsfMPTCanTransfer уже установленным, включение его той же транзакцией правило не удовлетворяет. Проверено: nightly-стенд (3.3.0-b1, DynamicMPT enabled) — 4/4 passed; CI-стенд (xrpld 3.2.0) — 4 skipped через гвард, exit 0; MPT-регрессия 28/28, юнит-тесты 867/867. Значение 0x80 подтверждено на живом объекте: MPTokenIssuanceSet с MutableFlags=0x40 даёт Flags=128.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
… дрейфа LedgerFormats.h — единственное место, где протокол объявляет, какие lsf-флаги принадлежат какому ledger-объекту (definitions.json несёт коды полей и типы объектов, но не значения флагов). Против него не стоял ни один тест, поэтому пропущенный флаг не давал симптома: безымянный бит всё равно приходит в модель числом, теряется только возможность проверить его по имени. Так lsfMPTAMM прожил несколько релизов. Пофайловый диф всех enum'ов против тега 3.3.0-rc1 нашёл четыре пробела. * MPTokenIssuanceFlags + MPTCanHoldConfidentialBalance (0x80) — от ConfidentialTransfer; значение подтверждено на живом объекте * MPTokenFlags + lsfMPTAMM (0x4) — пробел старше, флаг есть уже в 3.2.1 * LOLoan.Flags — у объекта Loan вообще не было свойства Flags (нет его и в BaseLedgerEntry), то есть lsfLoanDefault/lsfLoanImpaired/lsfLoanOverpayment не читались типизированной моделью никак: статус дефолта и impairment займа был ненаблюдаем. Добавлено как LoanFlags? * новые SignerListFlags и DirectoryNodeFlags — сами свойства Flags остаются raw uint (смена типа была бы breaking), enum'ы дают именованные константы вместо магических чисел; ложный комментарий у LODirectoryNode.Flags про «протокол не определяет флагов» исправлен TestULedgerFlagsConformance — ledger-аналог TestUTxFormatConformance: вендоренный Fixtures/LedgerFormats.h с пином по sha, парсер, падающий громко на незнакомом LSF_FLAG* и на тощем разборе, диф в обе стороны и требование регистрировать каждый флагованный объект — новый объект роняет сборку, а не пропускается молча. Проверен мутациями: неверное значение, удалённый флаг и незарегистрированный объект дают внятное падение. Интеграционное покрытие DynamicMPT (XLS-94): AmendmentGuard + TestIDynamicMPT, 4 теста, каждый читает результат из ledger-объекта. Сценарии выверены по транзактору rippled, а не по документации. Версия Xrpl поднята до 10.11.0.0 (minor: только добавления в публичном API), base-пакеты не менялись. CHANGES.md дополнен. Проверено: nightly-стенд — TestILoan/TestIDynamicMPT/TestIMPToken 41/41 passed; юнит-тесты 869/869; сборка решения без ошибок.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Зачем
Разбор состава грядущего релиза ноды 3.3.0 по моделям SDK показал, что протокол покрыт полностью — поля, типы транзакций, ledger-объекты и коды результата совпадают с
3.3.0-rc1один в один — кроме двух мест: DynamicMPT без интеграционного покрытия и флаги ledger-объектов, которые не сверялись с протоколом ничем.Второе оказалось системной проблемой.
LedgerFormats.h— единственное место, где протокол объявляет, какиеlsf-флаги принадлежат какому ledger-объекту (definitions.jsonнесёт коды полей и типы объектов, но не значения флагов). Против него не стоял ни один тест, и пропущенный флаг не давал симптома: безымянный бит всё равно приходит в модель числом, теряется только возможность проверить его по имени. ТакlsfMPTAMMпрожил несколько релизов.Что сделано
Флаги ledger-объектов
Пофайловый диф всех enum'ов против тега
3.3.0-rc1нашёл четыре пробела:MPTokenIssuanceFlags+MPTCanHoldConfidentialBalance(0x80) — вводит ConfidentialTransfer. Остальная поддержка амендмента уже полная (транзакции 85–89,IssuerEncryptionKey/AuditorEncryptionKey,ConfidentialOutstandingAmount), не хватало только имени у флага.MPTokenFlags+lsfMPTAMM(0x4) — пробел старше ConfidentialTransfer: флаг есть уже в 3.2.1.AMMCreateставит его вместе сlsfMPTAuthorized, неявно авторизуя MPT-актив для псевдо-аккаунта AMM.LOLoan.Flags— у объекта Loan вообще не было свойстваFlags(нет его и вBaseLedgerEntry), то естьlsfLoanDefault/lsfLoanImpaired/lsfLoanOverpaymentне читались типизированной моделью никак: статус дефолта и impairment займа был ненаблюдаем. Добавлено какLoanFlags?.SignerListFlagsиDirectoryNodeFlags— новые enum'ы. Сами свойстваFlagsостаютсяuint(смена типа была бы breaking), enum'ы дают именованные константы вместо магических чисел. Заодно исправлен ложный комментарий уLODirectoryNode.Flags, утверждавший, что протокол не определяет флагов для этого объекта.TestULedgerFlagsConformance— гвард против повторенияLedger-аналог существующего
TestUTxFormatConformance:Tests/Xrpl.Tests/Fixtures/LedgerFormats.hвендорен байт-в-байт и пиннут по sha в.ref— перепроверяется обычнымcurl … | diff. Пин, а не живая ветка, по той же причине, что и уtransactions.macro: отслеживание upstream-дрейфа — работа protocol-watch, а сетевой тест краснел бы по релизному расписанию Ripple, а не по нашему.RippledLedgerFlagsпарсит макросыLEDGER_OBJECT/LSF_FLAGи падает громко: незнакомый вариантLSF_FLAG*или разбор, давший меньше 10 объектов / 50 флагов, бросает исключение вместо того, чтобы оставить тест зелёным на пустой таблице.tf*-члены, живущие в одном enum с ledger-флагами (OfferFlags.tfInnerBatchTxn), и нулевые члены исключены по правилу.lsf/lsmf/tmf, поэтомуlsfMPTLocked≡MPTLocked, аlsmfMPTCanEnableCanLockу rippled ≡tmfMPTCanEnableCanLockу нас (rippled сам делаетtmfX = lsmfXвTxFlags.h).Гвард проверен мутациями, а не только тем, что он зелёный. Три ветки, каждая даёт внятное падение:
MPTokenIssuance.lsfMPTCanHoldConfidentialBalance: rippled 0x00000080, MPTokenIssuanceFlags 0x00000081lsfMPTAMMMPToken.lsfMPTAMM (0x00000004): declared by rippled, missing from MPTokenFlagsLoanубран из реестраLoan: declares 3 flag(s) in LedgerFormats.h but no model enum is registered for itDynamicMPT (XLS-94)
AmendmentGuardполучил id амендмента (совпал с тем, чтоgenerate-amendments.shуже пишет в[amendments]nightly-стенда),TestIDynamicMPT— 4 теста, каждый читает результат из ledger-объекта, а не изEngineResult:MutableFlagsсMPTokenIssuanceCreateдоезжают вLOMPTokenIssuanceбез искажения;MPTokenIssuanceSetменяетTransferFeeиMPTokenMetadata, не переписываяMutableFlags;tmfMPTSetCanLockподнимаетlsfMPTCanLockна issuance, созданном без этой возможности;tecNO_PERMISSION, метаданные в ledger остаются прежними.Сценарии выверены по транзактору
src/libxrpl/tx/transactors/token/MPTokenIssuanceSet.cpp@3.3.0-rc1, а не по документации: отсюдаtfMPTCanTransferна создании во втором тесте —preclaimтребуетlsfMPTCanTransferуже установленным, включение его той же транзакцией правило не удовлетворяет.Проверка
3.3.0-b1),TestILoan|TestIDynamicMPT|TestIMPTokenxrpld 3.2.0),TestIDynamicMPTTestU)Значение
0x80подтверждено не только по заголовку, но и на живом объекте:MPTokenIssuanceSetсMutableFlags = tmfMPTSetCanHoldConfidentialBalance (0x40)переводит issuance изFlags = 0вFlags = 128.Версия
Xrplподнят 10.10.0.0 → 10.11.0.0 — minor, потому что в публичном API только добавления (новые члены enum, новые enum-типы, новое свойствоLOLoan.Flags); ничего не удалено и не переименовано, типы существующих свойств не менялись. Base-пакеты (Xrpl.AddressCodec,Xrpl.BinaryCodec,Xrpl.Keypairs) не затронуты —git diff origin/dev...HEAD -- Base/пуст, поэтому их версии остаются как есть.CHANGES.mdдополнен разделом 10.11.0.0.