先把答案说完整
“全球计算机”是一个好入口,但只有把它拆成四个条件,才不会把比喻当成事实。
更准确地说,以太坊是一台逻辑上单例、物理上多副本的确定性状态机: 全球各地的完整执行节点,从同一父状态开始,按同一顺序执行同一批交易,并用状态根核对结果; 共识层再决定哪一串有效状态转换成为规范链,并最终确定。
用自己的话解释“全球”“计算机”和“一台”分别指什么。
从签名交易一路追踪到 EVM 执行、状态根核验和最终确定。
分清确定性、执行有效性、分叉选择与最终性回答的不同问题。
知道这个比喻何时有帮助,何时会把云计算、节点和合约讲错。
全球表示参与者分散且无需许可; 计算机表示 EVM 能执行一般程序; 一台表示协议最终维护一条规范历史及其对应状态,而不是存在一台中央机器。
要让“多台机器看起来像一台逻辑计算机”,至少需要四样东西:
- 共同起点:节点认可同一个父块和父状态承诺。
- 共同输入:区块给出同一批、严格有序的交易与区块上下文。
- 共同规则:客户端按同一协议分叉版本、Gas 和回滚规则运行 EVM。
- 共同历史:共识从多个有效候选中选出规范链,并逐步把检查点最终确定。
本课说“全球节点共同执行”时,严格含义是正常验证新区块的完整执行客户端会执行或重执行 execution payload。轻客户端、钱包和普通 RPC 用户不会保存并执行完整世界状态。
从账本,走向状态机
账本回答“发生过什么”;状态机还要回答“按照规则执行之后,世界现在是什么样”。
把比特币类比成公开账本很自然:交易改变余额归属。以太坊保留了账本能力, 又加入可编程状态——账户余额、合约代码、合约存储都能按统一规则改变。
“状态机”并不神秘。它只是一套把旧状态和输入转换成 新状态的规则。自动售货机也是状态机:当前库存与投入硬币是输入,规则决定出货、 找零和新库存。以太坊把这个模型扩展到全球网络,并用密码学签名、Gas、区块和共识来限制谁能发指令、 指令如何执行、结果如何验证。
Y(S, T) = S′
给定旧的有效状态 S 和一组有效交易 T,状态转换函数 Y 产生新的有效状态 S′。
入门公式很干净,但真实区块执行还需要更多共同输入:
(Sₙ₊₁, receipts) = F_fork(Sₙ, blockContextₙ, [tx₀, tx₁, …, txₖ])
协议分叉版本、区块上下文、严格交易顺序、Gas、异常与系统操作都参与计算;执行还会生成收据、日志和资源用量。
交易
带签名的状态修改请求:转账、调用合约或部署合约。
不是结果;进入 mempool 也还没有改变规范状态。智能合约
位于地址上的字节码与持久数据,收到消息调用时执行。
不像后端守护进程,不会自行醒来持续运行。EVM
解释字节码、计量 Gas、处理调用与回滚的协议虚拟机。
像一套 CPU 规则,但不是某颗中央物理 CPU。世界状态
地址到账户记录的映射,以及合约的持久 storage。
节点本地保存数据;区块用 state root 作承诺。完整节点
接收区块、独立重执行交易,并拒绝不符合协议的结果。
多个副本带来独立验证,不是把计算分片加速。共识
决定哪一批有效交易、按哪条历史成为规范链并最终确定。
不通过投票决定 2 + 2 的计算结果。“共享状态”究竟共享什么?
共享的不是一台数据库服务器,而是对同一规范状态及其密码学承诺的共同认可。
执行层世界状态可以想成一张巨大的映射表:每个地址对应一条账户记录。 账户记录包含 nonce、余额、代码哈希和存储根;合约的具体持久数据位于自己的 storage trie 中。
一个状态根,承诺整份执行状态
0x8f3a…7c9e
- nonce
- 12
- balance
- 5.0 ETH
- codeHash
- 0x…
- storageRoot
- empty
- nonce
- 4
- balance
- 2.0 ETH
- codeHash
- 0x…
- storageRoot
- empty
- balance
- 0 ETH
- codeHash
- 0x91…42
- slot 0
- counter = 7
- storageRoot
- 0xa4…19
当前 nonce、余额、代码和合约 storage;它是下一次执行的起点。
区块、交易和过去的执行输入;普通节点不必永久保存每个旧状态快照。
成功状态、累计 Gas 和日志等结果;收据不是世界状态本身。
区块不会把整个世界状态复制一遍。执行客户端在自己的数据库中维护状态;
execution payload 里的 state_root 承诺执行完该块后应得到的状态。
任何余额、nonce、代码或存储槽发生变化,都会沿哈希路径传播,通常得到不同的根。
现代以太坊同时有共识层 BeaconState 的 state_root和 execution payload 内的执行状态根。本课“全球计算机的共享状态”主要指后者; 说“以太坊只有一个状态根”在严格技术上并不正确。
程序如何“活”在链上?
合约是可被调用的代码与持久数据,不是一段在云端永远运行的进程。
开发者把 Solidity 等语言编译成 EVM 字节码,再通过交易部署。部署完成后,运行时代码与账户关联; 后续交易可以携带 calldata 调用函数,函数还可向其他合约发送内部消息调用。
- 代码:定义允许哪些状态转换,例如“只有余额足够才能转出代币”。
- storage:保存跨交易存在的数据,例如余额表、所有者和计数器。
- memory 与 stack:只在一次调用执行期间存在,结束后不会写入世界状态。
- Gas:为每条操作计量资源,限制无限循环与网络滥用。
- 调用者与区块上下文:签名者、msg.sender、value、时间戳等成为共同输入。
合约不能读取每台节点自己的本地时钟、操作系统随机数或网页 API。它能读取的
block.timestamp、block.number、prevRandao 等来自区块上下文,
对验证同一个区块的节点是共同输入。链外价格、天气等信息必须由预言机或其他机制带上链。
合约也不会自行“定时运行”。如果需要在某个条件满足时执行,仍要有人或自动化服务提交交易。 以太坊保证的是:一旦这笔交易进入候选区块,所有验证它的完整执行节点都按相同规则处理。
一笔交易的全球旅程
从钱包按下确认,到状态成为共同锚点,中间不是一次上传,而是授权、传播、排序、执行、核验与共识。
先记住一个关键边界:签名交易只是请求。它进入某个节点的交易池,甚至传遍网络, 都不等于已经改变规范状态。状态只会随被接受的区块转换。
从签名到共享状态
STEP 01 · USER AUTHORIZATION
钱包构造包含 nonce、目标、value、calldata、Gas 与费用参数的交易;用户用私钥签名。 签名证明授权,不保证交易一定被打包或成功执行。
完整流程拆解
- 钱包签名:私钥只用于签名,不会发送给网络。nonce 让来自同一账户的交易有顺序,并防止重复执行。
- RPC 与 mempool:钱包通常把交易交给某个执行客户端;客户端做基础检查后放入自己的本地交易池,并通过执行层 P2P 网络传播。
- 提议候选块:当前 slot 的提议者确定父块;其执行客户端或外部 builder 选择并排序交易,执行后生成 execution payload。
- 广播 Beacon Block:提议者的共识客户端把 execution payload 放入信标块,验证者签名并在共识网络广播。
- 其他节点复算:共识客户端核验共识字段,再通过 Engine API 让本机执行客户端重放交易、计算状态根和收据根。
- 证明与最终性:验证者只应为有效链头发出 attestation;分叉选择决定当前 head,检查点投票逐步带来最终性。
每个执行节点有自己的交易池。传播延迟、费用策略、私下订单流和节点配置都会让待处理交易集合与顺序不同。 真正成为共同输入的是某个候选区块中已经固定顺序的交易列表。
SharedCounter:一次调用改了什么?
Before · Sₙ
- Alice nonce 12
- Alice balance 5.0 ETH
- Counter value 7
- state root 0x8f3a…7c9e
After · Sₙ₊₁
- Alice nonce 13
- Alice balance 5.0 ETH − fee
- Counter value 10
- state root 0x27b1…a042
为什么不同节点会算出同一个答案?
关键不是大家使用同一份程序代码,而是不同实现都服从同一套可测试的协议语义。
Geth 用 Go 编写,Besu 用 Java,Nethermind 用 C#,Reth 用 Rust。它们的内部结构可以不同, 但处理同一个有效区块时必须得到同一个协议结果,否则至少有一个实现存在缺陷或使用了错误规则。
确定性需要把所有会影响结果的东西都变成共同输入或固定规则:
- 字节必须相同:签名交易的字段、calldata 与访问列表不能各自解释。
- 顺序必须相同:tx₁ 的输出可能成为 tx₂ 的输入;交换顺序可能改变余额、价格或成功与否。
- 上下文必须相同:时间戳、base fee、区块号、prevRandao 等来自候选区块,而非节点本机。
- 异常必须相同:out-of-gas、revert、无效 opcode、调用深度与退款规则都由协议定义。
- 分叉版本必须相同:网络升级会改变规则;客户端必须在同一激活条件切换。
同一程序,多种客户端,同一状态根
Geth
root: waiting等待 execution payload
Besu
root: waiting等待 execution payload
Reth
root: waiting等待 execution payload
Nethermind
root: waiting等待 execution payload
如果 N·03 算出不同状态根,其他节点不是因为“3 比 1”才认定它错。每个诚实节点都能独立重算, 并发现 payload 的承诺与协议结果不匹配。共识投票只能在执行有效的候选历史之间赋予权重, 不能让无效状态转换变成有效。
执行层与共识层,各回答什么?
“答案怎么算”与“采用哪段历史”是两个正交问题;现代以太坊用两类客户端协作处理。
签名、查询状态、模拟调用、提交交易。
用户如何与节点交互?
mempool、交易规则、EVM、状态数据库、payload 构建与重算。
这批交易算出什么状态?
CL 请求构建或验证 execution payload,并同步 head / safe / finalized。
两层怎样交换结果?
信标块、attestation、分叉选择、justification 与 finalization。
哪段有效历史成为规范链?
在获派职责时提议区块或签署 attestation;不是所有完整节点都运行。
谁为共识提供经济权重?
一个完整节点内部发生了什么
合并后的普通完整节点通常需要一个执行客户端和一个共识客户端。共识客户端收到 Beacon Block,
检查 slot、父块、提议者签名等共识字段;再把 execution payload 交给执行客户端。执行客户端从已知父状态重放交易,
检查 state_root、receipts_root、Gas 等是否一致,并向共识客户端报告 payload 是否有效。
承诺验证者集合、余额、检查点等 BeaconState。
承诺账户、余额、代码与合约 storage 的执行后状态。
执行客户端可以判断某个候选块的状态转换是否有效;共识层决定它是否位于当前规范链; 最终确定又表示回滚它需要付出极高的可罚没经济代价。这三个判断不能混成“交易成功了”一个词。
全球状态不是瞬间同步
物理网络有延迟,也可能短暂出现多个有效候选;“共享”指协议让诚实节点收敛,而不是每个时刻毫秒级一致。
两位提议者、传播延迟或临时网络分区都可能造成短时分叉。节点在同一时刻看到不同链头并不违反确定性: 它们面对的是不同父块或不同交易顺序,也就是不同输入。
交易只在若干本地 mempool 中,尚未改变规范状态。
交易进入一个执行有效的候选区块,可能仍处在短时分叉。
分叉选择支持当前链头;随着证明累积,回滚风险下降。
检查点获得协议最终性;回滚将要求大规模可罚没冲突行为。
可以把确定性与共识画成一个二维表:
确定性回答“给定这些输入,正确输出是什么”;分叉选择回答“当前跟随哪条有效链”; 最终性回答“哪一段历史已获得强经济终局性”。三者合起来,才构成稳定的共享状态。
为什么它不是云计算集群?
云计算常用更多机器提升性能;以太坊 L1 用更多独立验证副本提升可信度、韧性与可审计性。
最容易误解“全球计算机”的地方,是以为全球节点把一项大任务拆开并行,所以节点越多,合约就跑得越快。 实际上,验证新区块的完整执行节点主要在重复相同计算。
| 维度 | 云计算集群 | 以太坊 L1 |
|---|---|---|
| 工作方式 | 常把任务拆分并行,或由一个运营方复制服务。 | 多个独立节点重复执行并验证同一状态转换。 |
| 主要目标 | 吞吐、延迟、成本与可用性。 | 无需信任的正确性、抗篡改、抗审查与可验证性。 |
| 控制权 | 服务商或租户管理员分配权限。 | 公开协议、签名与合约规则限制状态修改。 |
| 结果信任 | 通常信任运营方、日志与访问控制。 | 可运行客户端本地重算,并核验状态承诺。 |
| 节点增加 | 常可让单项服务更快或容量更大。 | 通常不会让单次 L1 合约调用因此更快。 |
| 数据隐私 | 可在私有环境处理秘密数据。 | 公共 L1 输入与状态默认公开;隐私需额外密码学或链下设计。 |
| 失败边界 | 取决于运营方架构、区域与账户权限。 | 单个节点离线不改协议结果;整体活性仍依赖足够网络与共识参与。 |
重复计算看似浪费,却正是安全属性的来源:你不必相信提议者或 RPC 服务器声称的结果, 可以自己执行规则。代价是吞吐、延迟、存储与费用受限,所以并非所有计算都适合放在 L1。
共享状态为什么如此强大?
所有合约在同一执行环境读取同一规范状态,让开放程序能够同步组合,并在一笔交易里原子完成。
如果代币、交易所、借贷协议和 NFT 市场都能按同一套寻址与调用规则访问彼此, 开发者就不必先向每家公司申请数据库权限。一个合约可以在同一笔交易中调用另一个合约, 继续调用第三个合约,并把所有结果合并成一次状态转换。
借入 → 交易 → 偿还:要么全部成功,要么合约修改回滚
这种“共享内存式”组合体验是以太坊应用生态的核心:合约地址、代码和状态公开可发现,调用规则统一, 交易具备原子性。但要注意,顶层交易如果执行失败,合约内部状态修改通常回滚, 发送者 nonce 仍会消耗,Gas 费用仍会支付,并产生失败收据。
一个交易依赖多个合约,任何一个外部调用、价格输入或权限假设出错,都可能影响整条调用链。 “像乐高一样组合”描述开发便利,不代表每个积木都安全,也不代表升级代理背后的实现永远不变。
哪些计算值得全网重复?
链上计算最适合那些必须由多方共享、独立验证并在没有单一管理员时结算的规则。
如果一项任务只需要一家公司内部完成,或者输入必须保密、数据巨大、计算昂贵,把它交给每个完整节点重复执行通常不合理。 “能写成合约”与“应该写在 L1”是两回事。
这项计算应该放在哪里?
适合链上:状态归属必须由所有参与者共同验证
签名、余额检查和最终所有权是协议状态的一部分。把核心转移规则放在链上, 可以避免某个数据库管理员单方面改写结果。
Gas 与区块资源
计算和状态写入都有协议计量;无限循环会耗尽 Gas,区块容量限制全网每段时间能重复验证的工作。
不能直接读取互联网
链外事实需要预言机、证明或受信输入上链;EVM 本身不会发 HTTP 请求。
公共状态默认公开
加密秘密直接放进合约 storage 并不会对执行节点保密;隐私需要专门协议设计。
不是每个节点都存一切
普通完整节点可用快照同步并修剪旧状态;归档节点才为历史查询保留广泛旧状态。
Layer 2 如何改变“全球计算机”
Rollup 把大量交易执行移到 L2,再把数据、状态承诺和欺诈证明或有效性证明相关材料提交到以太坊。 因此现代的更好心智模型是:L1 作为全球可验证的结算与数据可用性底座,L2 承担更多应用执行。 以太坊 L1 完整节点并不会逐笔执行所有 L2 内部交易;它们验证 L1 上定义的结算规则与提交内容。
“所有计算都由所有 L1 节点重复”不是扩容后的完整描述。不同 L2 有不同执行、数据发布和证明模型; 共同点是把最终安全或结算锚定到以太坊,而不是把 L1 当作无限算力的云服务器。
十个最常见的误解
能否主动纠正这些句子,决定你是否真正建立了“全球计算机”的技术心智模型。
“节点越多,合约跑得越快”
完整节点主要重复验证同一工作。更多独立节点增强韧性,不直接加速单次 L1 调用。
“广播后状态立即改变”
待处理交易只进入各自 mempool;被规范链接受的区块才产生规范状态转换。
“所有节点每一刻完全一致”
传播延迟和临时分叉会造成短时不同链头;协议目标是收敛与最终性。
“每个参与者都重放交易”
正常完整执行节点会验证新块;钱包、轻客户端和普通 RPC 用户不维护完整状态。
“全节点等于归档节点”
普通完整节点可以修剪旧状态;归档节点为直接历史查询保留更广泛旧状态。
“状态根就是状态压缩包”
根是承诺。没有底层数据或证明,无法从根直接恢复账户和 storage。
“验证者投票决定计算结果”
EVM 规则决定有效结果;质押权重帮助选择有效候选历史与最终性。
“合约像服务器持续运行”
合约通常由交易或内部消息调用触发,受 Gas 限制,调用结束后停止。
“合约可以直接查询网页”
不同节点不能各自读取可能不同的链外响应;数据需通过预言机等机制成为共同输入。
“失败交易什么都没发生”
合约修改通常回滚,但被包含的失败交易仍会使用 nonce、支付 Gas 并生成失败收据。
“一台全球计算机”描述的是逻辑状态机。物理上,每个完整节点有自己的数据库、网络视图和客户端进程; 节点传播的是交易、区块和承诺,不是从某台中央机器下载一份权威数据库。
把整课压成八句话
如果你能不看上文解释这八句之间的因果关系,就真正理解了“全球计算机”。
- 01
以太坊是逻辑上单例、物理上多副本的确定性状态机。
- 02
世界状态包含账户 nonce、余额、代码与合约 storage;执行状态根对它作密码学承诺。
- 03
交易是带签名的状态修改请求,进入 mempool 并不等于已经改变规范状态。
- 04
区块把交易顺序与上下文固定下来,完整执行节点才能从同一父状态重算同一结果。
- 05
不同客户端实现必须遵循同一协议语义;本地结果不匹配就应拒绝 payload。
- 06
执行层判断状态转换是否有效;共识层选择有效候选历史并提供最终性。
- 07
节点重复计算换来独立验证、抗篡改和韧性,也带来吞吐、费用、公开性与资源边界。
- 08
Layer 2 把更多执行移出 L1,再利用以太坊作为可验证的结算、安全或数据底座。
理解检查
1. “以太坊是一台全球计算机”最准确的含义是什么?
答案 B。它是一台逻辑状态机的多副本验证网络,不是并行超级计算机,也没有中央主机。
2. 一笔签名交易已经出现在多个节点的 mempool 中,这说明什么?
答案 C。mempool 是节点本地视图;只有区块中的固定输入被接受后,才形成规范状态转换。
3. 两个客户端对同一父状态和同一有效区块算出不同状态根,最合理的解释是什么?
答案 A。确定性要求同输入、同规则得到同结果;共识不会平均状态根,也不会投票改写 EVM 语义。
4. 执行层和共识层的核心分工是什么?
答案 B。EL 处理交易、EVM 和执行状态;CL 处理信标块、证明、分叉选择与最终性。
5. 一个被包含的合约调用执行 revert,下面哪项最准确?
答案 C。失败交易仍是区块状态转换的一部分;只是可回滚的执行子状态不会提交。
6. 为什么视频转码通常不适合直接交给以太坊 L1?
答案 A。链上应保留需要共同验证的最小规则;重计算和大数据处理通常放在链下。
术语与一手资料
协议与客户端会更新。本课使用以太坊官方开发者文档、执行规范与共识规范校准到 2026 年 7 月 25 日。
- State machine
- 根据当前状态、输入和规则产生新状态的系统。
- World state
- 执行层地址到账户记录的映射,以及账户所承诺的合约持久存储。
- State transition
- 交易与协议操作按顺序把旧状态变成新状态的过程。
- EVM
- 执行客户端中的协议虚拟机,解释字节码、计量 Gas 并实现调用与回滚规则。
- State root
- 对某一时刻完整状态的密码学承诺;本课主要指 execution payload 的执行状态根。
- Execution payload
- Beacon Block 中承载有序交易、执行区块字段和执行后承诺的部分。
- Execution client · EL
- 管理交易池、运行 EVM、维护执行状态、构建或重算 payload 的客户端。
- Consensus client · CL
- 处理 Beacon Block、attestation、分叉选择与最终性的客户端。
- Engine API
- 本机 EL 与 CL 交换 payload 构建、有效性和 head / safe / finalized 信息的认证接口。
- Canonical chain
- 分叉选择当前认定应跟随的规范历史;它可在最终确定前发生短时重组。
- Finality
- 检查点得到足够质押权重支持后的强经济终局性。
- Determinism
- 相同前状态、交易顺序、区块上下文和协议规则产生相同结果。
官方资料
-
01
ethereum.org · Technical intro to Ethereum 以太坊、EVM、状态和智能合约的官方技术导论。
-
02
ethereum.org · Ethereum Virtual Machine 分布式状态机、状态转换函数、EVM 栈与执行上下文。
-
03
ethereum.org · Transactions 交易字段、签名消息、合约调用与交易生命周期。
-
04
ethereum.org · Blocks Beacon Block、execution payload、执行重放与区块字段。
-
05
ethereum.org · Accounts nonce、余额、codeHash、storageRoot 与账户状态结构。
-
06
ethereum.org · Introduction to smart contracts 智能合约的部署、调用、组合性与链外数据边界。
-
07
ethereum.org · Nodes and clients 执行客户端、共识客户端、完整节点、轻节点和归档节点。
-
08
ethereum.org · Node architecture 合并后的 EL、CL、验证者客户端与 Engine API 架构。
-
09
ethereum.org · Gasper LMD-GHOST 分叉选择、Casper FFG、justification 与 finalization。
-
10
ethereum.org · Merkle Patricia Trie 执行状态、交易与收据如何通过根哈希承诺。
-
11
Ethereum Execution Layer Specifications 当前执行层协议的可读 Python 规范与网络升级定义。
-
12
Ethereum Consensus Specs · Bellatrix Beacon Chain execution payload 验证、执行引擎接口与 BeaconState 转换规范。
到这里,你已经能把“全球计算机”从一句宣传语还原成一套可验证的系统: 交易给出输入,EVM 定义状态转换,完整节点独立复算,状态根承诺结果, 共识选择规范历史并提供最终性。下一步,账户模型会回答“谁能够发出这些指令,以及状态究竟挂在哪个地址上”。