Основной текст: В предыдущих статьях мы упоминали, что контракт Sequencer Inbox специально разработан для получения пакетов данных транзакций, публикуемых секвенсором на Уровне 1. В то же время, мы отметили, что Sequencer Inbox также называют "быстрым ящиком", а его аналог - Delayed Inbox (именуемый Inbox). Далее мы подробно расскажем о компонентах, связанных с передачей сообщений по цепочке, таких как Delayed Inbox.
Межцепочечные транзакции можно разделить на L1-L2 (пополнение счета) и L2-L1 (снятие средств). Обратите внимание, что депозит и вывод средств, упомянутые здесь, не обязательно связаны с активами кросс-цепочек, но могут представлять собой обмен сообщениями, не включающий непосредственно активы. Таким образом, эти два слова представляют собой лишь два направления поведения, связанного с цепочкой.
По сравнению с чистыми транзакциями L2, кросс-цепочечные транзакции обмениваются информацией в двух разных системах, L1 и L2, поэтому процесс усложняется.
Кроме того, то, что мы обычно называем поведением кросс-цепочки, - это кросс-цепочка в двух несвязанных сетях с использованием моста кросс-цепочки в режиме свидетеля. Безопасность этой кросс-цепочки зависит от моста кросс-цепочки. Исторически сложилось так, что мосты с перекрестными цепями, основанные на режиме свидетеля, часто подвергались инцидентам с кражами.
В отличие от этого, поведение кросс-цепочек между Rollup и мейннетом Ethereum в корне отличается от вышеупомянутых кросс-цепочечных операций. Это происходит потому, что состояние Уровня 2 определяется данными, записанными на Уровне 1. Пока Вы используете официальный межцепочечный мост Rollup, его операционная структура абсолютно безопасна.
Это также подчеркивает суть Rollup, который, с точки зрения пользователя, выглядит как независимая цепочка. Однако в действительности так называемый "Уровень 2" - это всего лишь окно быстрого отображения, открываемое Rollup для пользователей, а его настоящая цепочечная структура по-прежнему записана на Уровне 1. Поэтому мы можем рассматривать L2 как половину цепочки, или как "цепочку, созданную на Уровне 1".
Важно отметить, что операции с перекрестными цепочками являются асинхронными и неатомарными. В отличие от одной цепи, где результат транзакции известен сразу после ее подтверждения, межцепочечные транзакции не могут гарантировать, что определенные события произойдут на другой стороне в конкретное время. Поэтому межцепочечные транзакции могут не состояться из-за проблем с "мягкостью", но при использовании правильных методов, таких как Retryable Tickets, таких проблем, как застревание средств, не возникнет.
Retryable Tickets - это основные инструменты, используемые при пополнении счета через официальный мост Arbitrum для токенов ETH и ERC20. Его жизненный цикл состоит из трех этапов:
Отправка билета на L1: Создайте депозитный билет с помощью метода createRetryableTicket() в контракте Delayed Inbox и отправьте его.
Автоматическое погашение на L2: В большинстве случаев секвенсор может автоматически выкупить билет для пользователя без дополнительного ручного вмешательства.
Ручное погашение на L2: В некоторых крайних случаях, например, при внезапном повышении цен на газ на L2, когда предоплаченного газа на билете недостаточно, автоматическое погашение может не сработать. В таких случаях требуется ручное вмешательство пользователя. Обратите внимание, что если автоматическое погашение не удалось, билет должен быть погашен вручную в течение 7 дней; в противном случае билет может быть либо удален (что приведет к постоянной потере средств), либо потребует уплаты сбора за продление аренды.
Более того, в процессе вывода средств с официального моста Арбитрум, несмотря на некоторое симметричное сходство с поведением депозита в плане процесса, отсутствует понятие Retryables. Это можно понять как с точки зрения самого протокола Rollup, так и рассмотрев некоторые различия:
Автоматическое погашение при снятии денег невозможно, поскольку EVM не оснащен таймерами или автоматикой. В то время как на L2 автоматическое погашение может быть реализовано с помощью секвенсора, пользователям на L1 необходимо вручную взаимодействовать с контрактом Outbox, чтобы получить свои активы.
Также не существует проблемы истечения срока действия билета при выводе средств; если период испытания прошел, активы могут быть востребованы в любое время.
Межцепочечные транзакции с активами ERC-20 сложны. Мы можем рассмотреть несколько вопросов:
Мы не собираемся отвечать на все эти вопросы, поскольку они слишком сложны, чтобы рассматривать их всесторонне. Эти вопросы просто призваны проиллюстрировать сложность межцепочечных транзакций ERC-20.
В настоящее время многие решения для масштабирования используют решения типа "белый список + ручной список", чтобы избежать различных сложных проблем и граничных условий.
В Arbitrum используется система Gateway, призванная решить большинство проблем, связанных с межцепочечными транзакциями ERC20, и обладающая следующими характеристиками:
Чтобы проиллюстрировать необходимость пользовательских шлюзов, давайте рассмотрим относительно простой пример межцепочечной передачи WETH.
WETH - это ERC20-эквивалент ETH. Поскольку Эфир выступает в качестве основной валюты, многие сложные функциональные возможности в dApps невозможно реализовать напрямую. Следовательно, необходим эквивалент ERC20, например, WETH. Вкладывая некоторое количество ETH в контракт WETH, они блокируются внутри контракта, генерируя эквивалентное количество WETH.
Аналогичным образом, WETH можно сжечь, чтобы вывести ETH. Очевидно, что циркулирующее количество WETH и заблокированное количество ETH всегда будут находиться в соотношении 1:1.
Если теперь мы напрямую соединим цепочку WETH с L2, то обнаружим несколько странных проблем:
Очевидно, что это нарушает принципы дизайна WETH. Поэтому при межцепочечном пересечении WETH, будь то пополнение счета или вывод средств, необходимо сначала развернуть его в ETH, затем пересечь его и завернуть обратно в WETH. Именно здесь на помощь приходит шлюз WETH.
Аналогично, для других токенов с более сложной логикой требуются более сложные и тщательно продуманные шлюзы для правильного функционирования в межцепочечной среде. Пользовательский шлюз Arbitrum наследует логику межцепочечного взаимодействия стандартного шлюза и позволяет разработчикам настраивать поведение межцепочечного взаимодействия, связанное с логикой токенов, удовлетворяя большинство требований.
Аналогом SequencerInbox, также известного как быстрый ящик, является Inbox (официальное название - Delayed Inbox). Почему существует различие между быстрыми и отложенными коробками? Поскольку быстрый блок специально разработан для приема партий транзакций L2, опубликованных секвенсором, любые транзакции, не прошедшие предварительную обработку секвенсором в сети L2, не должны появляться в контракте быстрого блока.
Первая роль медленного ящика - обрабатывать поведение депозитов от L1 до L2. Пользователи инициируют пополнение счета через медленную коробку, а секвенсор затем отражает его на L2. В конечном счете, эта запись о депозите будет включена секвенсором в последовательность транзакций L2 и передана в контракт быстрой коробки, SequencerInbox.
В этом сценарии пользователям не следует напрямую отправлять транзакции по пополнению счета в быстрый ящик, поскольку транзакции, отправленные в SequencerInbox, будут мешать нормальной последовательности транзакций на Уровне 2, тем самым влияя на работу секвенсора.
Вторая роль отложенного ящика - сопротивление цензуре. Транзакции, напрямую отправленные в контракт с отложенным ящиком, обычно агрегируются секвенсором в быстрый ящик в течение 10 минут. Однако если секвенсор злонамеренно игнорирует Ваш запрос, в ящике с задержкой есть функция принудительного включения:
Если транзакция отправлена в Delayed Inbox и по истечении 24 часов не включена секвенсором в последовательность транзакций, пользователи могут вручную запустить функцию принудительного включения на Уровне 1. Это действие заставляет игнорируемые секвенсором запросы транзакций объединяться в быстрый ящик SequencerInbox и впоследствии обнаруживаться всеми узлами Arbitrum One, таким образом, принудительно включаясь в последовательность транзакций уровня 2.
Как мы уже говорили, данные в быстром поле представляют собой исторические данные L2. Поэтому в случаях злонамеренной цензуры транзакции могут быть в конечном итоге включены в бухгалтерскую книгу L2 с помощью отложенного ящика, что позволяет охватить такие сценарии, как принудительное изъятие средств с уровня 2.
Из этого видно, что секвенсор в конечном итоге не может постоянно цензурировать транзакции в любом направлении или на любом уровне.
Несколько основных функций медленной коробки Inbox заключаются в следующем:
Однако важно отметить, что функция forceInclusion() на самом деле находится в контракте fast box. Для наглядности мы рассмотрели его здесь вместе с функциями медленной коробки.
Outbox имеет отношение только к снятию денег и может пониматься как система записи и управления поведением при снятии денег:
Ниже мы объясним процесс пополнения и снятия средств на примере ETH. Процесс работы с токенами ERC20 аналогичен, с добавлением шлюза, но мы не будем подробно останавливаться на этом.
Пользователь вызывает функцию withdrawEth() контракта ArbSys на L2 и сжигает соответствующее количество ETH на L2.
Секвенсор отправляет запрос на снятие денег в быстрый ящик.
Узел Validator создает новый блок Rollup Block на основе последовательности транзакций в быстром блоке, который будет содержать вышеуказанные транзакции вывода средств.
После того, как блок Rollup Block пройдет период проверки и будет подтвержден, пользователь может вызвать функцию Outbox.execute Transaction() на L1, чтобы доказать, что параметры заданы контрактом ArbSys, о котором говорилось выше.
После подтверждения правильности контракта Outbox соответствующее количество ETH в мосте будет разблокировано и отправлено пользователю.
Использование оптимистичного официального моста Rollup предполагает ожидание периода вызова. Чтобы обойти эту проблему, мы можем использовать частный межцепочечный мост третьей стороны:
Функция forceInclusion() используется для борьбы с цензурой секвенсора. Его можно применять к любым локальным транзакциям L2, транзакциям L1-L2 и транзакциям L2-L1. Поскольку злонамеренная цензура секвенсора значительно ухудшает впечатления от транзакций, мы часто предпочитаем отказаться от участия в L2. Ниже приведен пример использования функции forceInclusion() для принудительного выхода:
В контексте вывода ETH только шаги 1 и 2 связаны с цензурой секвенсора. Поэтому нам нужно изменить только эти два шага:
Наконец, пользователи могут вывести средства из Outbox, и остальные шаги будут такими же, как и в обычном процессе вывода средств.
Кроме того, в репозитории arbitrum-tutorials есть подробные руководства по выполнению локальных транзакций L2 и транзакций L2 - L1 с помощью функции forceInclusion() в Arb SDK.
Основной текст: В предыдущих статьях мы упоминали, что контракт Sequencer Inbox специально разработан для получения пакетов данных транзакций, публикуемых секвенсором на Уровне 1. В то же время, мы отметили, что Sequencer Inbox также называют "быстрым ящиком", а его аналог - Delayed Inbox (именуемый Inbox). Далее мы подробно расскажем о компонентах, связанных с передачей сообщений по цепочке, таких как Delayed Inbox.
Межцепочечные транзакции можно разделить на L1-L2 (пополнение счета) и L2-L1 (снятие средств). Обратите внимание, что депозит и вывод средств, упомянутые здесь, не обязательно связаны с активами кросс-цепочек, но могут представлять собой обмен сообщениями, не включающий непосредственно активы. Таким образом, эти два слова представляют собой лишь два направления поведения, связанного с цепочкой.
По сравнению с чистыми транзакциями L2, кросс-цепочечные транзакции обмениваются информацией в двух разных системах, L1 и L2, поэтому процесс усложняется.
Кроме того, то, что мы обычно называем поведением кросс-цепочки, - это кросс-цепочка в двух несвязанных сетях с использованием моста кросс-цепочки в режиме свидетеля. Безопасность этой кросс-цепочки зависит от моста кросс-цепочки. Исторически сложилось так, что мосты с перекрестными цепями, основанные на режиме свидетеля, часто подвергались инцидентам с кражами.
В отличие от этого, поведение кросс-цепочек между Rollup и мейннетом Ethereum в корне отличается от вышеупомянутых кросс-цепочечных операций. Это происходит потому, что состояние Уровня 2 определяется данными, записанными на Уровне 1. Пока Вы используете официальный межцепочечный мост Rollup, его операционная структура абсолютно безопасна.
Это также подчеркивает суть Rollup, который, с точки зрения пользователя, выглядит как независимая цепочка. Однако в действительности так называемый "Уровень 2" - это всего лишь окно быстрого отображения, открываемое Rollup для пользователей, а его настоящая цепочечная структура по-прежнему записана на Уровне 1. Поэтому мы можем рассматривать L2 как половину цепочки, или как "цепочку, созданную на Уровне 1".
Важно отметить, что операции с перекрестными цепочками являются асинхронными и неатомарными. В отличие от одной цепи, где результат транзакции известен сразу после ее подтверждения, межцепочечные транзакции не могут гарантировать, что определенные события произойдут на другой стороне в конкретное время. Поэтому межцепочечные транзакции могут не состояться из-за проблем с "мягкостью", но при использовании правильных методов, таких как Retryable Tickets, таких проблем, как застревание средств, не возникнет.
Retryable Tickets - это основные инструменты, используемые при пополнении счета через официальный мост Arbitrum для токенов ETH и ERC20. Его жизненный цикл состоит из трех этапов:
Отправка билета на L1: Создайте депозитный билет с помощью метода createRetryableTicket() в контракте Delayed Inbox и отправьте его.
Автоматическое погашение на L2: В большинстве случаев секвенсор может автоматически выкупить билет для пользователя без дополнительного ручного вмешательства.
Ручное погашение на L2: В некоторых крайних случаях, например, при внезапном повышении цен на газ на L2, когда предоплаченного газа на билете недостаточно, автоматическое погашение может не сработать. В таких случаях требуется ручное вмешательство пользователя. Обратите внимание, что если автоматическое погашение не удалось, билет должен быть погашен вручную в течение 7 дней; в противном случае билет может быть либо удален (что приведет к постоянной потере средств), либо потребует уплаты сбора за продление аренды.
Более того, в процессе вывода средств с официального моста Арбитрум, несмотря на некоторое симметричное сходство с поведением депозита в плане процесса, отсутствует понятие Retryables. Это можно понять как с точки зрения самого протокола Rollup, так и рассмотрев некоторые различия:
Автоматическое погашение при снятии денег невозможно, поскольку EVM не оснащен таймерами или автоматикой. В то время как на L2 автоматическое погашение может быть реализовано с помощью секвенсора, пользователям на L1 необходимо вручную взаимодействовать с контрактом Outbox, чтобы получить свои активы.
Также не существует проблемы истечения срока действия билета при выводе средств; если период испытания прошел, активы могут быть востребованы в любое время.
Межцепочечные транзакции с активами ERC-20 сложны. Мы можем рассмотреть несколько вопросов:
Мы не собираемся отвечать на все эти вопросы, поскольку они слишком сложны, чтобы рассматривать их всесторонне. Эти вопросы просто призваны проиллюстрировать сложность межцепочечных транзакций ERC-20.
В настоящее время многие решения для масштабирования используют решения типа "белый список + ручной список", чтобы избежать различных сложных проблем и граничных условий.
В Arbitrum используется система Gateway, призванная решить большинство проблем, связанных с межцепочечными транзакциями ERC20, и обладающая следующими характеристиками:
Чтобы проиллюстрировать необходимость пользовательских шлюзов, давайте рассмотрим относительно простой пример межцепочечной передачи WETH.
WETH - это ERC20-эквивалент ETH. Поскольку Эфир выступает в качестве основной валюты, многие сложные функциональные возможности в dApps невозможно реализовать напрямую. Следовательно, необходим эквивалент ERC20, например, WETH. Вкладывая некоторое количество ETH в контракт WETH, они блокируются внутри контракта, генерируя эквивалентное количество WETH.
Аналогичным образом, WETH можно сжечь, чтобы вывести ETH. Очевидно, что циркулирующее количество WETH и заблокированное количество ETH всегда будут находиться в соотношении 1:1.
Если теперь мы напрямую соединим цепочку WETH с L2, то обнаружим несколько странных проблем:
Очевидно, что это нарушает принципы дизайна WETH. Поэтому при межцепочечном пересечении WETH, будь то пополнение счета или вывод средств, необходимо сначала развернуть его в ETH, затем пересечь его и завернуть обратно в WETH. Именно здесь на помощь приходит шлюз WETH.
Аналогично, для других токенов с более сложной логикой требуются более сложные и тщательно продуманные шлюзы для правильного функционирования в межцепочечной среде. Пользовательский шлюз Arbitrum наследует логику межцепочечного взаимодействия стандартного шлюза и позволяет разработчикам настраивать поведение межцепочечного взаимодействия, связанное с логикой токенов, удовлетворяя большинство требований.
Аналогом SequencerInbox, также известного как быстрый ящик, является Inbox (официальное название - Delayed Inbox). Почему существует различие между быстрыми и отложенными коробками? Поскольку быстрый блок специально разработан для приема партий транзакций L2, опубликованных секвенсором, любые транзакции, не прошедшие предварительную обработку секвенсором в сети L2, не должны появляться в контракте быстрого блока.
Первая роль медленного ящика - обрабатывать поведение депозитов от L1 до L2. Пользователи инициируют пополнение счета через медленную коробку, а секвенсор затем отражает его на L2. В конечном счете, эта запись о депозите будет включена секвенсором в последовательность транзакций L2 и передана в контракт быстрой коробки, SequencerInbox.
В этом сценарии пользователям не следует напрямую отправлять транзакции по пополнению счета в быстрый ящик, поскольку транзакции, отправленные в SequencerInbox, будут мешать нормальной последовательности транзакций на Уровне 2, тем самым влияя на работу секвенсора.
Вторая роль отложенного ящика - сопротивление цензуре. Транзакции, напрямую отправленные в контракт с отложенным ящиком, обычно агрегируются секвенсором в быстрый ящик в течение 10 минут. Однако если секвенсор злонамеренно игнорирует Ваш запрос, в ящике с задержкой есть функция принудительного включения:
Если транзакция отправлена в Delayed Inbox и по истечении 24 часов не включена секвенсором в последовательность транзакций, пользователи могут вручную запустить функцию принудительного включения на Уровне 1. Это действие заставляет игнорируемые секвенсором запросы транзакций объединяться в быстрый ящик SequencerInbox и впоследствии обнаруживаться всеми узлами Arbitrum One, таким образом, принудительно включаясь в последовательность транзакций уровня 2.
Как мы уже говорили, данные в быстром поле представляют собой исторические данные L2. Поэтому в случаях злонамеренной цензуры транзакции могут быть в конечном итоге включены в бухгалтерскую книгу L2 с помощью отложенного ящика, что позволяет охватить такие сценарии, как принудительное изъятие средств с уровня 2.
Из этого видно, что секвенсор в конечном итоге не может постоянно цензурировать транзакции в любом направлении или на любом уровне.
Несколько основных функций медленной коробки Inbox заключаются в следующем:
Однако важно отметить, что функция forceInclusion() на самом деле находится в контракте fast box. Для наглядности мы рассмотрели его здесь вместе с функциями медленной коробки.
Outbox имеет отношение только к снятию денег и может пониматься как система записи и управления поведением при снятии денег:
Ниже мы объясним процесс пополнения и снятия средств на примере ETH. Процесс работы с токенами ERC20 аналогичен, с добавлением шлюза, но мы не будем подробно останавливаться на этом.
Пользователь вызывает функцию withdrawEth() контракта ArbSys на L2 и сжигает соответствующее количество ETH на L2.
Секвенсор отправляет запрос на снятие денег в быстрый ящик.
Узел Validator создает новый блок Rollup Block на основе последовательности транзакций в быстром блоке, который будет содержать вышеуказанные транзакции вывода средств.
После того, как блок Rollup Block пройдет период проверки и будет подтвержден, пользователь может вызвать функцию Outbox.execute Transaction() на L1, чтобы доказать, что параметры заданы контрактом ArbSys, о котором говорилось выше.
После подтверждения правильности контракта Outbox соответствующее количество ETH в мосте будет разблокировано и отправлено пользователю.
Использование оптимистичного официального моста Rollup предполагает ожидание периода вызова. Чтобы обойти эту проблему, мы можем использовать частный межцепочечный мост третьей стороны:
Функция forceInclusion() используется для борьбы с цензурой секвенсора. Его можно применять к любым локальным транзакциям L2, транзакциям L1-L2 и транзакциям L2-L1. Поскольку злонамеренная цензура секвенсора значительно ухудшает впечатления от транзакций, мы часто предпочитаем отказаться от участия в L2. Ниже приведен пример использования функции forceInclusion() для принудительного выхода:
В контексте вывода ETH только шаги 1 и 2 связаны с цензурой секвенсора. Поэтому нам нужно изменить только эти два шага:
Наконец, пользователи могут вывести средства из Outbox, и остальные шаги будут такими же, как и в обычном процессе вывода средств.
Кроме того, в репозитории arbitrum-tutorials есть подробные руководства по выполнению локальных транзакций L2 и транзакций L2 - L1 с помощью функции forceInclusion() в Arb SDK.