面向所有人 / 它如何运作

一笔交易的旅程

从你的钱包到以太坊,五步,其中大多数快到你看不见。本页讲的是机器;确认页面讲的是每一步承诺了什么。

旅程

你在钱包里签了名并发送。它到达一台计算机,即排序器,排序器先把它记下来以免丢失,马上 把活干完,在你松开按钮之前就知道了答案。在一秒钟之内,排序器会多次把刚算出的答案打成 一捆,给这捆签名并发布。稍微不那么频繁地,它把这些捆包进一个看起来和以太坊区块一模 一样的区块,那就是你的钱包和浏览器展示给你的东西。

然后,另行地,它把那个区块里的所有内容写下来,并把这份清单的指纹发往以太坊。任何人都可 以拿到这份清单,自己重放一遍,核对得到的答案是否相同。正是这最后一步,让 Pickle 成为 以太坊的一部分,而不只是一台自称如此的快速计算机。

1. 你发送它。你的钱包给交易签名,并通过标准 JSON-RPC 提交给排序器,即 运行这条链的那个唯一进程。

2. 它被准入并持久化。排序器恢复出签名者,把交易放进一个有界队列,并在 执行之前把它追加到磁盘上一份带校验和的日志中,所以已被确认收到的交易能在崩溃中存活。

3. 它立刻执行。单个协调器按准入顺序提交交易。回执在任何区块存在之前就 已存在。

4. 它先被预确认,再被确认。以 10 毫秒的调度目标,该区间的交易被封存进一 个带签名的迷你区块;以 250 毫秒的调度目标,该区间的迷你区块被包进一个标准 EVM 区块,带有 每个工具都理解的区块号。

5. 它被提交到以太坊。每个封存的区块生成一份载荷,携带其完整交易列表, 存入数据可用性层,并以每 60 秒一次的调度目标把一份提交发布到以太坊上的收件箱合约。 任何人运行副本节点,都能从这些载荷重新执行每一笔交易,得到相同的状态。

RPC 层恢复出签名者,把交易放进一个有界的准入队列,每个发送者有上限;队列满时返回错误, 而不是让内存无限增长。每笔被接受的交易都追加到一份带校验和的预写日志并在执行前持久化, 每批一次 fsync。单个执行协调器按准入顺序提交,且从不并发执行同一个发送者,这在没有内存池 重排步骤的情况下保住了 nonce 安全。执行是即时的,所以回执在所在区块封存之前就已存在。

一个生产者以 10 毫秒的调度目标封存迷你区块:该区间的交易、回执和日志、状态差异哈希、 微秒级时间戳,以及排序器对区块头的签名。第二个生产者以 250 毫秒的调度目标封存 Cancun 形态的 EVM 区块,包裹该区间的迷你区块;下一个区块的时间戳在上一个区块封存时就已固定, 所以读取区块时间戳的交易看到的正是区块头所承诺的值。每个封存的区块向一个内容寻址的数据 可用性层发出一份派生载荷,即完整交易列表、区块范围、父哈希、区块哈希和已承诺的时间戳, 并以每 60 秒一次的调度目标把一个信封提交到 L1 收件箱合约,以 calldata 作为后备。

这些步骤中有三步带着数字,没有一个是承诺

10 毫秒、250 毫秒和 60 秒这几个数字是调度目标,即排序器力求达到的间隔。没有一个是延迟 保证,也没有一个是吞吐量声明。

生命周期,逐步说明

  1. 客户端通过标准 JSON-RPC 提交一笔已签名的交易。
  2. RPC 层恢复出签名者,把交易放进一个有界的准入队列,每个发送者有上限。队列满时返回错误, 而不是让内存无限增长。
  3. 单个执行协调器按准入顺序提交交易。同一个发送者从不被并发执行,这在没有内存池重排步骤的 情况下保住了 nonce 安全。
  4. 执行是即时的。回执在所在的 EVM 区块封存之前就已存在。
  5. 每笔被接受的交易都追加到一份带校验和的预写日志并在执行前持久化,每批一次 fsync,所以已被 确认收到的交易能在崩溃中存活。

三种执行方式

排序器并不以同一种方式运行每笔交易。它识别三种形态,并为每一种选择最短的正确路径:

  • 普通的 ETH 转账走原生路径,根本不启动虚拟机。
  • 规范的 ERC-20 转账走快速路径,直接移动余额存储槽并发出标准事件,产生与 完整虚拟机相同的结果。
  • 其他一切都经过通用 EVM,即固定在 Cancun 硬分叉的 revm。

三条路径都收取标准 gas,并以同样的方式拆分费用,所以你无法从费用看出走了哪条路径,也不 应该需要看出。快速路径之所以存在,是因为一条链的大部分流量是两种最简单的交易,而时间正 花在那里。

为什么它是确定性的

其他链交给运营者决定的两件事,在这里是编译期常量:执行硬分叉和最低 gas 价格。若做成可调, 任何一个都会让副本节点拒绝或重新定价排序器已接受的交易,独立派生就会停机。同样的推理把下一 个区块的时间戳固定在上一次封存时,并让迷你区块的间隔成为共识参数而非每个运营者各自的设置: 副本节点必须就如何切分执行流达成一致,才能复现相同的哈希。

为什么这样构建

不寻常的决定是在封存之前执行。在大多数链上,交易等待下一个区块,并作为构建该区块的 一部分被执行;在这里,交易在到达时就被执行,区块随后由已经存在的结果组装而成。这就是第一个 时刻之所以快的原因,也是迷你区块作为独立于区块的一样东西而存在的原因:迷你区块是排序器为它 已经算出的结果盖上签名,而普通区块按自己的节律在后面到达。每个时刻保证了什么,见确认页面;记录最终落在哪里,见结算页面。