Для всех / Как это работает

Путь транзакции

Из вашего кошелька в Ethereum за пять шагов, большинство из них быстрее, чем вы можете увидеть. Эта страница - машина; страница подтверждений - то, что обещает каждый шаг.

Путь

Вы подписываете что-то в кошельке и отправляете. Это прибывает на один компьютер, секвенсер, который записывает это, чтобы оно не могло потеряться, сразу выполняет работу и знает ответ раньше, чем вы отпустили кнопку. Много раз в секунду секвенсер собирает только что произведённые ответы в пакет, подписывает пакет и публикует его. Чуть реже он оборачивает эти пакеты в блок, который выглядит точно как блок Ethereum, и именно его показывают вам кошелёк и обозреватель.

Затем, отдельно, он записывает всё, что было в этом блоке, и отправляет отпечаток этого списка на Ethereum. Любой может взять список, проиграть его сам и проверить, что получает тот же ответ. Этот последний шаг и делает Pickle частью Ethereum, а не просто быстрым компьютером, который так о себе говорит.

1. Вы отправляете. Ваш кошелёк подписывает транзакцию и передаёт её по стандартному JSON-RPC секвенсеру, единственному процессу, который управляет сетью.

2. Она принимается и делается надёжной. Секвенсер восстанавливает подписанта, помещает транзакцию в ограниченную очередь и дописывает её в журнал на диске с контрольной суммой до исполнения, так что подтверждённая к приёму транзакция переживает сбой.

3. Она исполняется сразу. Один координатор фиксирует транзакции в порядке приёма. Квитанция существует до любого блока.

4. Она предподтверждается, затем подтверждается. С целевым интервалом 10 миллисекунд транзакции интервала запечатываются в подписанный мини-блок; с целевым интервалом 250 миллисекунд мини-блоки интервала оборачиваются в стандартный EVM-блок с номером, который понимает каждый инструмент.

5. Она фиксируется на Ethereum. Каждый запечатанный блок производит пакет с его полным списком транзакций, хранящийся в слое доступности данных, и одна фиксация на целевой интервал 60 секунд публикуется в контракт-инбокс на Ethereum. Из них любой, кто запускает реплику, повторно исполняет каждую транзакцию и приходит к тому же состоянию.

Слой RPC восстанавливает подписанта и помещает транзакцию в ограниченную очередь приёма с лимитом на отправителя; полная очередь возвращает ошибку, а не растит память без предела. Каждая принятая транзакция дописывается в журнал упреждающей записи с контрольной суммой и делается надёжной до исполнения, один fsync на пакет. Один координатор исполнения фиксирует в порядке приёма и никогда не исполняет одного отправителя параллельно, что сохраняет безопасность nonce без шага переупорядочивания в мемпуле. Исполнение немедленное, так что квитанция существует до того, как содержащий её блок запечатан.

Продюсер запечатывает мини-блок с целевым интервалом 10 мс: транзакции, квитанции и логи интервала, хеш диффа состояния, метка времени с точностью до микросекунды и подпись секвенсера над заголовком. Второй продюсер запечатывает EVM-блок в формате Cancun с целевым интервалом 250 мс, оборачивающий мини-блоки интервала; метка времени следующего блока фиксируется при запечатывании предыдущего, так что транзакция, читающая метку времени блока, видит значение, которое фиксирует заголовок. Каждый запечатанный блок выпускает пакет деривации, полный список транзакций, диапазон блоков, хеш родителя, хеш блока и зафиксированную метку времени, в контентно-адресуемый слой доступности данных, и один конверт на целевой интервал 60 с фиксируется в инбоксе L1, с calldata в качестве резерва.

Три из этих шагов несут число, и ни одно не является обещанием

Каждая из цифр 10 миллисекунд, 250 миллисекунд и 60 секунд - целевой интервал, ритм, к которому стремится секвенсер. Ни одна не является гарантией задержки, и ни одна не является заявлением о пропускной способности.

Жизненный цикл, шаг за шагом

  1. Клиент передаёт подписанную транзакцию по стандартному JSON-RPC.
  2. Слой RPC восстанавливает подписанта и помещает транзакцию в ограниченную очередь приёма с лимитом на отправителя. Полная очередь возвращает ошибку, а не растит память без предела.
  3. Один координатор исполнения фиксирует транзакции в порядке приёма. Один и тот же отправитель никогда не исполняется параллельно, что сохраняет безопасность nonce без шага переупорядочивания в мемпуле.
  4. Исполнение немедленное. Квитанция существует до того, как содержащий её EVM-блок запечатан.
  5. Каждая принятая транзакция дописывается в журнал упреждающей записи с контрольной суммой и делается надёжной до исполнения, один fsync на пакет, так что подтверждённая к приёму транзакция переживает сбой.

Три способа исполнения

Секвенсер не выполняет каждую транзакцию одинаково. Он распознаёт три формы и выбирает кратчайший корректный путь для каждой:

  • Простой перевод ETH идёт нативным путём, вовсе не запуская виртуальную машину.
  • Канонический перевод ERC-20 идёт быстрым путём, который напрямую перемещает слот баланса и выпускает стандартное событие, давая тот же результат, что дала бы полная машина.
  • Всё остальное проходит через общий EVM, которым является revm, закреплённый на хардфорке Cancun.

Все три берут стандартный газ и делят комиссию одинаково, так что по комиссии нельзя понять, какой путь был выбран, и вам не должно быть нужно это знать. Быстрые пути существуют потому, что большая часть трафика сети - это два простейших вида транзакций, и именно на них уходит время.

Почему это детерминировано

Две вещи, которые другие сети оставляют оператору, здесь являются константами времени компиляции: хардфорк исполнения и минимальная цена газа. Сделай любую из них настраиваемой, и реплика смогла бы отвергнуть или переоценить транзакцию, которую секвенсер принял, и независимая деривация остановилась бы. То же рассуждение фиксирует метку времени следующего блока при предыдущем запечатывании и делает интервал мини-блока параметром консенсуса, а не настройкой отдельного оператора: реплика должна быть согласна в том, как нарезается поток, чтобы воспроизвести те же хеши.

Почему это построено так

Необычное решение - исполнять до запечатывания. В большинстве сетей транзакция ждёт следующего блока и исполняется как часть его сборки; здесь она исполняется по прибытии, а блоки собираются потом из результатов, которые уже существуют. Именно это делает первый момент быстрым, и именно поэтому мини-блок существует как отдельная вещь от блока: мини-блок - это секвенсер, ставящий подпись под результатами, которые он уже вычислил, тогда как обычный блок приходит в собственном ритме за ним. Что гарантирует каждый момент - на странице подтверждений, а где оказывается запись - на странице расчёта.