以太坊,作为区块链2.0的代表,不仅仅是一个加密货币平台,更是一个去中心化的全球计算机,它的核心魅力在于允许开发者构建和运行被称为“智能合约”的程序,这些运行在以太坊上的程序——也就是我们常说的以太坊DApp(去中心化应用)的后端逻辑——究竟是如何工作的呢?本文将带您一步步揭开以太坊程序运行的神秘面纱。
我们要明确,以太坊上的“程序”通常指的是智能合约,它是一段部署在以太坊区块链上的代码,一旦部署,就无法被篡改,并且会在满足预定条件时自动执行,你可以把它理解为一个自动执行的、去中心化的“数字协议”或“数字合同”。

这些智能合约是用特定的编程语言编写的,最常用的是Solidity,它语法类似JavaScript,也支持Vyper等其他语言。
智能合约代码本身(如Solidity代码)是人类可读的文本,并不能直接在以太坊网络上运行,它需要一个“翻译官”和“执行环境”,这就是以太坊虚拟机(Ethereum Virtual Machine,简称EVM)的角色。
EVM是什么? EVM是一个图灵完备的虚拟机,意味着它可以执行任何复杂的计算任务,它是以太坊网络中所有节点(计算机)都能理解和执行的统一执行环境,想象一下,EVM就像一个标准化的“计算机处理器”,每个参与以太坊网络的节点都运行着一个EVM实例。
EVM的作用:
让我们以一个简单的转账合约为例,看看以太坊程序是如何从编写到最终运行的:

第一步:编写智能合约(Solidity代码)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 public storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
这个合约很简单,只有一个存储变量storedData,一个设置值的set函数和一个获取值的get函数。
第二步:编译合约生成字节码
开发者使用Solidity编译器(如Solc)将上述Solidity代码编译成字节码(Bytecode),字节码是EVM能够理解和执行的机器码指令序列,还会生成一个ABI(Application Binary Interface),它定义了合约函数如何被调用,包括函数名、参数类型、返回值类型等,是外部应用与合约交互的“说明书”。
第三步:部署合约到以太坊网络

这是将程序“上线”的关键步骤,部署过程实际上是一笔特殊的交易(Transaction)。
storedData的默认值0)被记录在以太坊的状态树(State Tree)中,状态树是以太坊状态数据库的核心数据结构。第四步:调用合约函数
合约部署后,用户就可以通过发送交易来调用其函数了。
set(42),需要发送一笔目标地址为SimpleStorage合约地址的交易,交易数据中包含了函数选择器(根据ABI生成)和参数42。set函数的字节码。
set这样的修改状态函数,它会修改合约的存储(将storedData设置为42),这个修改会被记录在状态树的相应位置。get这样的查询函数(通常用call发送,不修改状态,只消耗少量gas),EVM会执行函数并返回结果,但不会永久修改状态。以太坊程序运行不是免费的,需要支付Gas,Gas是以太坊网络中衡量计算资源消耗的单位,同时也是防止恶意合约消耗网络资源的机制。
以太坊程序之所以可信,关键在于其去中心化和共识机制。
以太坊程序的运行是一个涉及多个组件和步骤的复杂过程,可以概括为: