Зоряний протокол у майстра · зоряний зірковий протокол · GitHub

Пропозиції, що підкріплюються активами, - це пропозиція щодо вирішення проблеми, через яку пропозиції у книзі можуть не виконуватися.

зоряний

Пропозиції з підтримкою активів - це пропозиція щодо вирішення проблеми, пов’язаної з тим, що на одному рахунку можуть бути зобов’язання у формі пропозицій у книзі, що перевищує активи рахунку. Коли це трапляється, пропозиції в книзі можуть не виконуватися, в тому сенсі, що не існує жодної пропозиції перетину, яка обміняється на всю суму пропозиції. Пропозиції в книзі, які не виконуються, створюють помилкове відчуття ліквідності.

Ми скажемо, що пропозиція є "негайно виконуваною в повному обсязі" (коротше IEIF), якщо б, якщо її перекреслила гіпотетична пропозиція без обмежень щодо суми купленого чи проданого, обмінялася б вся сума продажу активу. Бажано, щоб усі пропозиції були IEIF, оскільки це дозволяє користувачам легко оцінити обсяг наявної ліквідності.

Протокол вимагає, щоб при створенні кожна пропозиція відповідала наступним двом умовам:

  • Пропонована до продажу сума не перевищує наявного залишку активу, що продається
  • Сума, запропонована для придбання (обчислена неявно), не перевищує наявного ліміту купівельного активу

Зараз ми продемонструємо, що цих умов недостатньо, щоб гарантувати, що пропозиція є IEIF. Припустимо, що рахунок створює пропозицію в розмірі IEIF із сумою продажу, рівною наявному залишку активу, що продається. Потім рахунок створює другу пропозицію з гіршою ціною, але інакше ідентичну першій. Хоча кожна пропозиція індивідуально задовольняє вищезазначені вимоги, друга пропозиція не є IEIF. Припустимо, що другу пропозицію перетнула гіпотетична пропозиція без обмежень. Ця пропозиція перетину спочатку перетинала б першу пропозицію, яка не залишає залишку на балансі для активу, що продається. Коли друга пропозиція перетинається, ніякі активи не можуть бути обмінені.

Аналогічно наведеному вище прикладу, можна створити кілька пропозицій, які індивідуально відповідають вимогам, але перевищують доступний ліміт, якщо розглядати їх у сукупності. Припустимо, що пропозиція створює пропозицію, яка є IEIF, із сумою купівлі, що дорівнює доступному ліміту купівельного активу. Потім рахунок створює другу пропозицію з гіршою ціною, але інакше ідентичну першій. Хоча кожна пропозиція індивідуально задовольняє вищезазначені вимоги, друга пропозиція не є IEIF. Припустимо, що другу пропозицію перетнула гіпотетична пропозиція без обмежень. Ця пропозиція про перехід спочатку перетинала б першу пропозицію, яка не залишає обмежень для купівлі активу. Коли друга пропозиція перетинається, ніякі активи не можуть бути обмінені.

Ця пропозиція потребуватиме змін XDR для AccountEntry та TrustLineEntry, а також оновлення схем для таблиць облікових записів та довіри. Оновлений XDR:

SQL, необхідний для оновлення схеми:

Також необхідно додати код результату операції ACCOUNT_MERGE_DEST_FULL:

Метою пропозиції, що підтримується активами, є підтримка незмінності того, що кожна пропозиція є IEIF. Ми починаємо з обговорення того, що може призвести до того, що пропозиції більше не будуть IEIF:

З цього аналізу стає зрозуміло, що будь-яка пропозиція, яка намагається змінити або видалити пропозиції, які більше не є IEIF, потребуватиме ведення книги пропозицій після збору плати та після кожної операції. Це було б і складно, і неефективно. Натомість ми продовжуємо пропозицію, яка модифікує операції таким чином, що вони гарантують, що пропозиції залишатимуться IEIF. Для досягнення цього ми спочатку визначаємо нові величини, які є похідними даними в книзі:

  • account.sellingLiaries
    • Для рахунку А: сума власного активу, що пропонується до продажу, сукупна за всіма пропозиціями, що належать А
  • account.buyingLiaries
    • Для рахунку А: сума власного активу, який пропонується придбати, сукупна за всіма пропозиціями, що належать А

  • trustline.sellingLiaries
    • Для рахунку A та неродного активу X: сума X, яку пропонують продати, сукупна за всіма пропозиціями, що належать A
  • trustline.buyingLiaries
    • Для рахунку А та неродного активу Х: сума X, яку пропонують придбати, сукупна за всіма пропозиціями, що належать А

Ці кількості будуть оновлюватися щоразу, коли пропозиція створюється, змінюється або видаляється. Коли пропозиція створена, зобов’язання за цією пропозицією будуть розраховані та додані до зобов’язань купівлі та продажу зобов’язань у відповідних лініях рахунків та/або довіри. Коли пропозиція видаляється, зобов’язання за цією пропозицією обчислюються та віднімаються із зобов’язань купівлі та продажу зобов’язань у відповідному рахунку та/або довірчих лініях. Коли пропозиція модифікується, її можна розглядати як видалення з подальшим створенням, щоб купівельні зобов'язання та продажні зобов'язання могли бути оновлені, використовуючи логіку з цих випадків. Оскільки ми вже завантажуємо рахунки та лінії довіри під час взаємодії з пропозиціями, витрати на підтримку цих кількостей повинні бути мінімальними.

Тепер ми будемо використовувати ці кількості для модифікації операцій таким чином, щоб вони гарантували, що пропозиції залишатимуться IEIF. Далі доступним лімітом є INT64_MAX для власного активу та лімітом купівлі-продажу пасивів для неродних активів. Аналогічним чином, наявний баланс - це баланс - резерв - продаж Зобов'язання для власного активу та баланс - продаж - Зобов'язання для іноземних активів. Для того, щоб емітенти мали змогу придбати або продати будь-яку кількість (навіть перевищує INT64_MAX) випущеного ними активу, доступний ліміт та наявний залишок в цьому випадку завжди становитимуть INT64_MAX. Пропозиція пропозицій, що підтримуються активами, змінює операції таким чином, що всі пропозиції залишаються IEIF після операції:

Поведінка ManageOfferOp (і CreatePassiveOfferOp) зазнає значних змін, щоб зробити поведінку передбачуваною та ефективною щодо зобов'язань. Перш ніж перетинати будь-які пропозиції, обидві операції тепер забезпечуватимуть такі вимоги:

  • Якщо змінюється ідентифікатор пропозиції пропозиції, то зобов’язання, пов’язані з ідентифікатором пропозиції пропозиції, видаляються
  • Якщо створюється нова пропозиція, кількість підкаталогів оновлюється
  • Якщо зобов’язання щодо купівлі, пов’язані з новою пропозицією, перевищують доступний ліміт, тоді операція не вдається з MANAGE_OFFER_LINE_FULL
  • Якщо зобов'язання з продажу, пов'язані з новою пропозицією, перевищують наявний залишок, тоді операція не вдається з MANAGE_OFFER_UNDERFUNDED

Ці оновлення ManageOfferOp (і CreatePassiveOfferOp) передбачають усі модифікації, обговорені в попередньому списку для цих операцій.

Ми позначимо версію протоколу, яка включає цю пропозицію, як PROPOSAL_VERSION. Схему бази даних можна оновити, включивши купівлю-зобов'язання та продаж-зобов'язання, де для цих значень встановлено значення NULL, доки версія протоколу не буде принаймні PROPOSAL_VERSION .

Оновлення версії протоколу

Коли версію протоколу оновлено до PROPOSAL_VERSION, для всіх облікових записів, які володіють пропозиціями, потрібно буде розрахувати значення купівлі-зобов'язання та продажу зобов'язань. Для інших облікових записів ці значення можна залишити як NULL і поступово оновити, або їх можна оновити глобально до 0. Краще буде оновити значення ліниво, оскільки для цього потрібно набагато менший сегмент, ніж глобальне оновлення до 0.

Альтернативний підхід: Видаліть усі наявні пропозиції

Як випливає з опису, такий підхід буде видалити всі наявні пропозиції, коли протокол буде оновлено до PROPOSAL_VERSION. Станом на книгу 18178688, є 12734 пропозиції, що належать 2653 обліковим записам (із 474454 загальної кількості рахунків). Недоліком такого підходу є те, що він, ймовірно, призведе до значного зменшення доступної ліквідності на деякий час, поки будуть створюватися нові пропозиції. Деякі створені пропозиції належать обліковим записам, які не зможуть їх відтворити. Є 5 пропозицій, що належать 4 обліковим записам без підписувачів та вагою головного ключа 0, причому 2 з цих пропозицій продають актив, виданий обліковим записом. Є ще 1 пропозиція, що належить обліковому запису, загальна вага підписантів та головного ключа не перевищує середнього порогу, а також продає актив, виданий цим рахунком. Варто повторити, що це лише проста нижня межа кількості пропозицій, які не вдалося відтворити.

Попередній розділ детально описує лише одну точку зворотної несумісності, але процес збільшення базового резерву представляє подібну проблему зворотної несумісності, яка буде неодноразово можливою в майбутньому. Причиною цього є те, що збільшення базового резерву може призвести до того, що пропозиції, що продають власний актив, більше не будуть IEIF. Потенційні рішення, представлені в попередньому розділі, також застосовуватимуться тут, але ті самі недоліки все одно застосовуватимуться.

  • покупка зобов'язань та продаж зобов'язань оновлюються, коли пропозиції модифікуються PathPaymentOp, ManageOfferOp, CreatePassiveOfferOp та AllowTrustOp
  • Кожна операція повинна мати нову поведінку, описану вище

Відповідним комітом є git: 4dab9625d42b252d3f11500151ffcc66a1cd5ad2