以太坊,作为继比特币之后最具影响力的加密货币之一,早已不满足于仅仅作为一种数字支付工具,它立志成为一台“世界计算机”,一个去中心化的、可编程的区块链平台,允许开发者构建和部署各种去中心化应用(DApps),要理解这台“计算机”是如何工作的,仅仅看文字描述可能略显抽象,本文将通过一系列生动的图解,带你一步步拆解以太坊的核心架构与运行原理。
以太坊的“骨架”——区块链与账户模型
想象一下,如果比特币的区块链是一本只能记录“谁转给谁多少钱”的简单账本,那么以太坊的区块链则更像一本可以记录任何复杂规则和逻辑的智能笔记本。
- 比特币的UTXO模型 vs 以太坊的账户模型
- 比特币(UTXO模型):每一笔交易都是消耗旧的“未花费交易输出”(UTXO)来创建新的UTXO,就像你用一张100元钞票(UTXO)去买一杯30元的咖啡,找零70元,原来的100元钞票消失了,变成了30元的咖啡和70元的零钱。
- 以太坊(账户模型):它更像我们日常的银行账户,每个账户都有一个地址,账户里记录着余额(Ether)和状态,状态可以是账户的代码(对于合约账户)或数据,交易直接改变账户的状态,比如从A账户向B账户转账10个ETH,就是直接修改A和B的余额状态。
图示(概念图):
+---------------------+ +---------------------+
| 账户 A (外部账户) | | 账户 B (外部账户) |
|---------------------| |---------------------|
| 地址: 0x123...abc | | 地址: 0x456...def |
| 余额: 100 ETH |----->| 余额: 50 ETH |
| 代码: 无 | | 代码: 无 |
+---------------------+ +---------------------+
| |
| 1. 发起转账交易 | 2. 接收转账
| (转账10 ETH) |
| |
v v
+------------------------------------------------------------------+
| 以太坊区块链 (共享账本) |
| |
| [区块1] ... [区块N] ... [区块N+1] |
| ... 交易数据:从0x123...abc 转账10 ETH 到 0x456...def ... |
| |
+------------------------------------------------------------------+
^ ^
| 3. 矿工打包交易并验证 | 4. 状态更新
| 5. 区块确认后,全网同步账本 |
| |
+---------------------+ +---------------------+
| 账户 A (外部账户) | | 账户 B (外部账户) |
|---------------------| |---------------------|
| 地址: 0x123...abc | | 地址: 0x456...def |
| 余额: 90 ETH |<-----| 余额: 60 ETH |
| 代码: 无 | | 代码: 无 |
+---------------------+ +---------------------+
核心要点:


- 外部账户 (EOA):由用户私钥控制,用于发起交易,像我们的个人银行卡。
- 合约账户:由代码控制,没有私钥,当被外部交易或其它合约调用时自动执行代码,像自动售货机或智能合约。
以太坊的“灵魂”——智能合约
如果说账户是骨架,那么智能合约就是以太坊的灵魂,它是在以太坊区块链上运行的一段代码,一旦部署,就无法篡改,会按照预设的规则自动执行。
智能合约的“一生”:
- 创建 (Creation):开发者编写合约代码(通常用Solidity语言),然后部署到一个特定的地址,部署过程本身也是一笔交易,会消耗一定的ETH作为“ gas fee ”(燃料费)。
- 存储 (Storage):合约部署后,其代码和状态变量(如用户余额、计数器值等)会永久存储在以太坊的区块链上。
- 交互 (Interaction):其他用户(外部账户)或其他合约可以通过发送交易来调用合约中的特定函数,从而改变合约的状态或触发某些操作。
图示(智能合约交互流程图):

+----------------+ 部署交易 +---------------------+
| 开发者 | ----------------> | 合约账户 (已部署) |
| (编写Solidity) | (包含代码) |---------------------|
+----------------+ | 地址: 0x789...ghi |
| 代码: (函数如 |
| deposit(), |
| withdraw()) |
| 状态: (余额记录) |
+----------+----------+
|
| 调用交易 (如 deposit 10 ETH)
| (包含函数名和参数)
v
+----------------+ +---------------------------------+ +---------------------+
| 用户 (外部账户) | --> | 矿工节点 | --> | 以太坊网络 |
| (发起调用) | | | | (广播交易,验证执行) |
+----------------+ | 1. 接收交易 | +----------+----------+
| 2. 从区块链读取合约代码和状态 | |
| 3. 在EVM中执行合约函数 | |
| (更新状态: 用户余额+10) | |
| 4. 将执行结果和状态变更打包进区块| |
+---------------------------------+ |
^ |
| 区块确认后 |
| 状态同步 |
v |
+---------------------+ +---------------------------------+ +---------------------+
| 合约账户 (已部署) | <--- | 区块链 | <--- | 其他节点 |
|---------------------| | (记录最新的状态变更) | | (同步最新状态) |
| 地址: 0x789...ghi | +---------------------------------+ +---------------------+
| 代码: (不变) |
| 状态: (用户余额已+10)| <-- 状态更新
+---------------------+
以太坊的“心脏”——虚拟机 (EVM)
当用户调用智能合约时,谁来执行这些代码呢?答案是以太坊虚拟机 (EVM - Ethereum Virtual Machine)。
EVM是以太坊的“心脏”,是一个去中心化的、图灵完备的虚拟机,它像一个分布在全球计算机上的沙箱环境,负责执行所有智能合约的代码。
EVM的工作流程图解:
+----------------+ 发送交易 +------------------------+ 执行代码 +-----------------------+
| 用户/合约 | ----------------> | 以太坊节点 (矿工/全节点) | ---------------> | EVM |
| (发起调用) | | | | (执行引擎) |
+----------------+ |------------------------| |-----------------------+
| 1. 从交易池获取交易 | | 1. 读取合约代码和状态 |
| 2. 检查交易有效性 (gas, | | 2. 在沙箱中执行字节码 |
| 签名等) | | 3. 更新状态 |
| 3. 调用EVM执行合约代码 | | 4. 产生日志/事件 |
| 4. 将执行结果(状态根、 | | 5. 返回执行结果 |
| 收据根)返回 | | |
+------------------------+ +-----------------------+
^ | ^ |
| | 状态更新 | | 结果返回
| v | v
+------------------------+ +-----------------------+
| 以太坊区块链 | <--------------- | 交易收据 (Receipt) |
| (记录新状态和交易结果) | | (记录日志、 gas使用等) |
+------------------------+ +-----------------------+
核心要点:
- 沙箱环境:EVM的执行是隔离的,合约代码无法直接访问节点的文件系统或网络,保证了安全性。
- Gas (燃料):为了防止无限循环或恶意代码消耗网络资源,EVM引入了Gas机制,每执行一条操作码都需要消耗一定量的Gas,发起交易时需要预先支付Gas,Gas用完或执行完毕,交易即终止,这既

