在以太坊的世界里,我们经常会遇到各种术语,区块”、“交易”、“Gas”、“智能合约”等等,但有一个看似简单却内涵丰富的词——“空”(Empty),它不仅仅是指“没有东西”,在不同的上下文中,它有着非常具体且重要的技术含义,我们就来深入探讨一下,以太坊里的“空”究竟是什么意思。

这是“空”最常见、最容易理解的含义。
定义: 一个空交易指的是一个在数据字段中没有任何有效内容的交易,换句话说,它除了支付Gas和接收方地址之外,不执行任何具体的操作,比如不调用智能合约函数,也不发送任何ETH或数据。
结构分析: 一个标准的以太坊交易包含以下部分:
to (接收方地址):可以是外部账户地址,也可以是智能合约地址。value (转账金额):发送的ETH数量,单位是Wei。data (数据字段):这是交易的核心,如果是向智能合约发送交易,data字段包含了函数选择器和参数,如果是普通ETH转账,data字段通常是空的(0x)。一个空交易就是指 data 字段为 0x,value 也为 0 的交易。
它的作用是什么? 空交易看似“无用”,但实际上有几个关键用途:
空交易就像一张只写了“你好”但没写任何具体内容的明信片,它完成了“投递”这个动作,但没有传递实质性的信息或价值。
在智能合约的开发中,“空”也扮演着重要角色。

定义: 当一个外部账户向一个智能合约发送交易时,data 字段的前4个字节被称为函数选择器,它是对函数签名(如 transfer(address,uint256))进行 Keccak-256 哈希后取前4个字节的结果,用来告诉EVM应该执行合约中的哪个函数。
如果一个合约函数没有任何参数,它的函数选择器就是 0xc2985578(这是 的哈希值前4字节),当 data 字段的开头是这个值时,表示调用的是一个“无参数”函数。
一个特殊的“空”状态: 如果一个智能合约的 fallback 或 receive 函数是 external payable 的,并且没有其他函数被调用,那么发送给这个合约的 data 字段可以是空的(0x),在这种情况下,EVM会直接执行 receive 函数(如果存在),或者 fallback 函数。

例子:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract EmptyExample {
// 一个没有参数的函数
function doSomething() external pure {
// ... 执行一些操作
}
// 当接收不带data的ETH时,会触发这个函数
receive() external payable {
// ... 处理接收到的ETH
}
}
当你向 EmptyExample 合约发送一个 value > 0 且 data = 0x 的交易时,receive 函数会被触发,这可以看作是合约对“空数据”的一种响应。
“空”的概念也延伸到了区块层面。
定义: 一个空区块指的是一个区块中不包含任何交易,它只包含区块头信息(如前一区块哈希、时间戳、难度等)和矿工/验证者的奖励交易(即向矿工地址发送新铸造的ETH的交易)。
为什么会存在空区块?
空区块的存在是网络正常运作的一部分,它反映了网络当前的交易活跃度。
这是以太坊状态数据库中的一个基础概念。
定义: 一个空账户指的是一个在以太坊状态中存在,但其余额为0,且没有关联代码(即不是合约账户)的账户,它的 nonce(序列号)可能为0(从未交易过),也可能大于0(曾经交易过但余额已清零)。
重要区别:
当你向一个空账户地址发送ETH时,这个账户就会被“激活”,其状态从“空”变为“有余额”,这就像你在银行开了一个账户,虽然里面没钱,但这个账户是真实存在的。
以太坊里的“空”远不止字面上的“空空如也”,它是一个多层次的术语:
fallback/receive 逻辑。