Модульна доступність даних для OP Stack
Вступ
OP Stack набув значної популярності серед rollup розробників після свого анонсу минулого року. Його охоплюють як розробники, які створюють нові rollups, так і постачальники модульної інфраструктури, такі як Caldera та Conduit, які дозволяють розробникам швидко запускати власні rollups.
Модульність є фундаментальним аспектом бачення OP Stack, як зазначено в минулорічному повідомленні:
Кожен рівень стеку OP описується чітко визначеним API, який заповнюється модулем для цього рівня. [...] Хочете замінити Ethereum на Celestia в ролі рівня доступності даних? Звичайно! Хочете запустити Bitcoin як рівень виконання? Чому ні!
Швидке оновлення Bedrock від Optimism призведе до модуляції рівнів виконання OP Stack і системи доказів, забезпечуючи сумісність із майбутніми доказами фальсифікації та дійсності.
Надихнувшись цим, Celestia Labs зосередилася на подальшому просуванні модульності OP Stack. І тому сьогодні ми раді оголосити про випуск бета-версії модульного інтерфейсу доступності даних (DA) для OP Stack, першого мода OP Stack, який OP Labs виділяє для відгуків розробників. Інтерфейс дозволяє розробникам визначати рівень DA та успадковувати безпеку від будь-якого блокчейну, якому вони віддають перевагу, будь то Ethereum, Celestia або навіть Bitcoin.
Розробники можуть почати експериментувати вже сьогодні з версією OP Stack, яка використовує Celestia для DA і “осідає” на Ethereum. А Caldera незабаром випустить тестнет Taro, який дозволить розробникам і користувачам випробувати перший публічний тестнет OP Stack за допомогою модульного DA.
Рівень доступності даних є основою архітектури rollups, що забезпечує доступність даних, необхідних для незалежної перевірки rollup ланцюга. Нижче ми досліджуємо основи доступності даних у OP Stack і те, як ми його модулювали за допомогою чітко визначеного інтерфейсу DA для публікації та отримання даних з L1.
Ця співпраця має на меті надихнути інших перейти на модульність і переосмислити архітектуру блокчейнів на користь розробників і користувачів, просуваючи галузь в еру співпраці, де модульність процвітає над максималізмом.
Модульна доступність даних для OP Stack: сьогодні
Як OP Stack обробляє доступність даних сьогодні? Для наших цілей ми заглибимося в два фундаментальні компоненти, Rollup Node і Batcher, які описано нижче.
Щоб глибше зрозуміти, як решта OP Stack працює під капотом, ознайомтеся з документацією Optimism.
Rollup Node
Rollup Node — це компонент, відповідальний за отримання правильного ланцюга L2 із блоків L1 (і пов’язаних із ними квитанцій). Rollup Node отримує блоки L1, фільтрує транзакції для даних, часто у формі calldata
транзакції, і виводить правильний ланцюжок L2 з цих даних.
Batcher
Пакетний відправник, також відомий як batcher, є сутністю, яка надсилає дані секвенсора L2 на L1, щоб зробити їх доступними для верифікаторів. І Rollup Node, і Batcher працюють у циклі, так що нещодавно надіслані пакетом дані блоку L2 витягуються за допомогою Rollup Node з L1 і використовуються для отримання наступного блоку L2.
Кожна транзакція, надіслана Batcher, включає calldata
, які є даними секвенсора L2, розділеними на байти, які називаються кадрами, що є найнижчим рівнем абстракції для даних у Optimism.
Модульний інтерфейс DA для OP Stack
Створюючи модульний інтерфейс DA для OP Stack, наша мета проста: дозволити rollup розробникам вказувати будь-який блокчейн як рівень доступності даних, будь то Ethereum, Celestia або навіть Bitcoin. За відсутності такого інтерфейсу кожна інтеграція нового рівня DA може вимагати від розробників реалізації та підтримки окремого форка OP Stack.
OP Stack уже містить абстракції, які визначають L1Chain
і L2Chain
у кодовій базі, що дозволяє нам моделювати новий блокчейн-агностичний інтерфейс для Data Availability Chain, який ми називаємо DAChain
.
Використовуючи наведений нижче інтерфейс, розробники можуть реалізувати DAChain
для читання та запису даних у будь-який базовий блокчейн або навіть у централізований бекенд, як-от S3.
// Ми повторно використаємо деяку термінологію з кодової бази операційних вузлів
// Ref є посиланням на якийсь об’єкт, тому FrameRef є посиланням на фрейм
// DAChain дозволяє читати та записувати дані на рівень DA
// FrameRef містить дані для пошуку кадру за його посиланням
// Тут він містить висоту блоку та індекс tx, за яким була включена транзакція,
// комбінація яких унікально посилається на кадр.
func (f *FrameRef) MarshalBinary(w io.Writer) error { ... }
func (f *FrameRef) UnmarshalBinary(r ByteReader) error { ... }
// FrameFetcher повертає фрейм із DAChain за його FrameRef
FetchFrame(ctx, ref FrameRef) ([]byte, error)
// FrameWriter записує серіалізований кадр у DAChain і повертає його FrameRef
WriteFrame(ctx, []byte) (FrameRef, error)
// DAChain задовольняє як читання, так і запис на DAChain
Фаза написання
У наведеному нижче прикладі написання для реалізації інтерфейсу Celestia описано інтеграцію з Batcher:
SimpleTxManager.send
— це функція, яка відповідає за створення та надсилання фактичної транзакції, її змінено для виклику WriteFrame
, який записує кадр у Celestia та повертає посилання.
Потім посилання надсилається як calldata
на адресу пакетної скриньки замість звичайних даних кадру.
// send виконує фактичне створення та надсилання транзакції.
func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*types.Receipt, error) {
ref, err := m.daChain.WriteFrame(ctx, candidate.TxData)
tx, err := m.craftTx(ctx, TxCandidate{TxData: buf, ...})
// WriteFrame записує кадр до DA та повертає його посилання
func (c *CelestiaDA) WriteFrame(ctx context.Context, data []byte) (FrameRef, error) {
tx, err := c.client.SubmitPFB(ctx, nid, data, gas, fee)
Фаза читання
А ось схема того, як виглядатиме реалізація Celestia інтерфейсу, інтегрованого з rollup node:
DataFromEVMTransactions
— це функція, яка відповідає за повернення даних кадру зі списку транзакцій. Його змінено, щоб використовувати посилання на кадр, отримане з пакетних calldata
вхідної скриньки, щоб фактично отримати кадр і додати його до даних повернення.
func DataFromEVMTransactions(config *rollup.Config, daChain *rollup.DAChain, batcherAddr common.Address, txs types.Transactions, log log.Logger) ([]eth.Data, error) {
// Прочитати посилання з calldata
err := ref.UnmarshalBinary(buf)
data, err := daChain.FetchFrame(ctx, ref)
// FrameFetcher повертає фрейм із DAChain за його FrameRef
func (c *CelestiaDA) FetchFrame(ctx, ref FrameRef) ([]byte, error) {
data, err := c.client.NamespacedData(context.Background(), nid, ref.BlockHeight)
Зауважте, що виклик NamespacedData
повертає масив байтових фрагментів усіх блобів, поданих із заданою BlockHeight
, тому ми повертаємо лише TxIndex
, який нас цікавить.
Інтеграція Celestia як рівня DA
Діаграма, що показує архітектуру OP Stack порівняно з інтеграцією Celestia + OP Stack.
З кількома незначними модифікаціями rollup node і batcher ми можемо змусити OP Stack використовувати Celestia для DA.
Це означає, що всі дані, необхідні для отримання ланцюжка L2, можуть бути доступні в Celestia як рідні дані blob замість публікації в Ethereum, хоча невелике посилання на кадр фіксованого розміру все ще публікується в Ethereum як calldata
пакета. Посилання на кадр використовується для пошуку відповідного кадру на Celestia за допомогою легкого вузла celestia-node.
Фаза написання
Як описано вище, batcher надсилає дані секвенсора L2 у вигляді байтів, які називаються кадрами, на адресу пакетного контракту вхідної скриньки на Ethereum L1.
Ми зберігаємо пакет і транзакції calldata
, щоб гарантувати впорядкування кадрів, але ми замінюємо кадри в calldata
посиланням на кадр фіксованого розміру. Що таке посилання на кадр? Це посилання на транзакцію даних Celestia, яка успішно включила дані кадру як частину Celestia.
Ми робимо це, вбудовуючи легкий вузол celestia-node у сервіс batcher. Щоразу, коли є новий пакет, який очікує на надсилання, ми спочатку надсилаємо транзакцію даних до Celestia за допомогою легкого вузла, а потім надсилаємо лише посилання на кадр у batcher calldata
.
Фаза читання
На фазі читання ми робимо протилежне, тобто використовуємо посилання на кадр із calldata
транзакції batcher, щоб вирішити його та отримати відповідні фактичні дані кадру з Celestia. Тут знову ми вбудовуємо легкий вузол celestia-node у rollup node, щоб запитувати його для транзакцій.
Під час отримання ланцюжка L2 rollup node тепер прозоро зчитує дані з легкого вузла та може продовжувати створення нових блоків. Легкий вузол завантажує лише дані, надіслані rollup, а не весь ланцюжок, як у випадку з Ethereum.
Погляд в майбутнє
Докази фальсифікації є ключовою частиною дорожньої карти Optimism після Bedrock, і ми сподіваємося вивчити можливість оновлення нашої інтеграції OP Stack x Celestia для роботи з доказами фальсифікації поверх основної мережі Ethereum.
Для цього ми можемо використовувати Quantum Gravity Bridge (QGB), який передає кросс-чейн атестації DA в Ethereum, щоб увімкнути онлайн-перевірку того, що rollup дані були доступні на Celestia, щоб rollup дані можна було використовувати та автентифікувати в межах доказ фальсифікації. Це дозволить rollups OP Stack безпосередньо використовувати гарантії DA, надані Celestia.
Українська спільнота
Приєднуйтесь до нашаго Telegram каналу, щоб читати всі новини та апдейти про Celestia українською. Також, підписуйтесь на наш Twitter. Ми будемо раді Вас бачити!