Celestia
December 4, 2023

Резервне копіювання Ethereum

Резервне копіювання Ethereum — це резервний механізм, який дозволяє Ethereum L2 (або L3) “повернутися” до використання calldata Ethereum для доступності даних у разі простою Celestia Mainnet Beta. Ця функція наразі підтримується інтеграціями Celestia з:

У разі простою або тимчасової недоступності Celestia, L2 можуть повернутися до публікації транзакцій як calldata на Ethereum або іншому рівні DA для доступності даних замість публікації в Celestia. Цей механізм гарантує, що користувачі можуть продовжувати безпечно та безперешкодно здійснювати транзакції, запобігаючи збоям і допомагаючи гарантувати, що кошти користувачів не застрягають у мосту L2 на Ethereum.

Резервне копіювання Ethereum запускається щоразу, коли секвенсор має помилку під час надсилання транзакції PayForBlobs на Celestia. Резервне копіювання може бути ініційоване через перевантажений mempool або помилку nonce і може бути змодельований з такою помилкою, як низький баланс або неправильна послідовність. Резервне копіювання також може бути запущене у випадку, якщо Blobstream припиняє ретрансляцію атестацій.

OP Stack

Резервне копіювання Ethereum реалізовано у випуску celestiaorg/optimism v1.0.0.

Файли op-batcher/batcher/driver.go та op-node/rollup/derive/calldata_source.go є частиною резервного копіювання Ethereum у op-batcher та op-node відповідно.

У driver.go функція sendTransaction відповідає за шлях резервного копіювання Ethereum. Ця функція створює та надсилає транзакцію на адресу пакетної скриньки з указаними даними. Він використовує базовий txmgr для обробки надсилання транзакцій і керування цінами на газ.

Якщо дані транзакції можна опублікувати як блоб у Celestia, вона замінює calldata на ідентифікатор блобу та надсилає транзакцію з цими даними. Якщо його неможливо опублікувати в Celestia, він повертається до Ethereum без будь-яких змін у транзакції.

Ідентифікатор блобу починається зі спеціального префікса 0xce, який був обраний як мнемоніка для Celestia, і вказує, що решта даних має інтерпретуватися як висота блоку (8 байтів) і зобов’язання блобу (32 байти) у кодованому порядку. Комбінацію з них можна пізніше використати для отримання оригінальних calldata з Celestia.

Префікс | 8 байти | 32 байти
0xce Висота блоку Зобов'язання блобу

func (l *BatchSubmitter) sendTransaction(
    txdata txData,
    queue *txmgr.Queue[txData],
    receiptsCh chan txmgr.TxReceipt[txData],
) {
    // ...
}

У calldata_source.go функція DataFromEVMTransactions визначає шлях читання резервного копіювання Ethereum. Ця функція фільтрує всі транзакції та повертає calldata з транзакцій, яка надсилається на адресу пакетної скриньки з адреси відправника пакету.

Якщо calldata збігається з префіксом версії 0xce, вонв розшифровується як ідентифікатор великого об'єкта, вихідна calldata витягується з Celestia та повертається для похідного. Якщо calldata не збігається з префіксом, уся calldata повертаються для деривації.

func DataFromEVMTransactions(
    config *rollup.Config,
    batcherAddr common.Address,
    txs types.Transactions,
    log log.Logger
) ([]eth.Data, error) {
    // ...
}

Ці дві функції працюють разом, щоб забезпечити правильну роботу резервного механізму Ethereum, дозволяючи rollups продовжувати працювати навіть під час простою Celestia.

Arbitrum

В Arbitrum Nitro резервне копіювання Ethereum у функції BatchPosterобробляє процес зберігання даних із резервним механізмом для зберігання даних у ланцюжку, якщо первинне сховище доступності даних виходить з ладу.

Інтеграція @celestiaorg/nitro використовує той самий резервний механізм.

Українська спільнота Celestia

Приєднуйтесь до нашаго Telegram каналу, щоб читати всі новини та апдейти про Celestia українською. Також, підписуйтесь на наш Twitter. Ми будемо раді Вас бачити!