文章目录
- 什么是交易?
- 交易类型
- 交易生命周期
- 关键概念:Gas 与交易费用
- 交易状态与失败原因
- 总结
什么是交易?
“交易(Transaction)” 是从一个账户向另一个账户发送的经过数字签名的指令 。例如,如果 Bob 发送 Alice 1 ETH,则 Bob 的帐户必须减少 1 ETH,而 Alice 的帐户必须增加 1 ETH。 交易会造成状态的改变(如转移以太币、调用智能合约、部署合约等)。
改变 EVM 状态的交易需要广播到整个网络。 任何节点都可以广播在以太坊虚拟机上执行交易的请求;此后,验证者将执行交易并将由此产生的状态变化传播到网络的其他部分。
交易需要付费并且必须包含在一个有效区块中。
所提交的交易包括下列信息:
字段 | 作用 |
---|---|
from | 发起账户地址(EOA,必须有私钥签名,合约账户无法主动发起交易)。 |
to | 接收账户地址: 若为 EOA 地址(如0x…),则为普通转账; 若为合约账户地址,则为调用该合约; 若为空(null),则为部署新智能合约(此时data字段为合约字节码)。 |
value | 转移的以太币数量(以 wei 为单位,1 ETH = 10¹⁸ wei),仅在转账或向合约支付 ETH 时有效。 |
gasLimit | 交易允许消耗的最大 Gas 量(防止交易因逻辑错误无限消耗资源),若实际消耗 Gas ≤ gasLimit,剩余 Gas 退还;若超过,则交易失败,已消耗 Gas 不退还。 |
maxFeePerGas | (EIP-1559 后)用户愿意支付的最高 Gas 单价(以 gwei 为单位,1 gwei = 10⁹ wei),包含基础费(base fee)和优先级费(priority fee)。 |
maxPriorityFeePerGas | (EIP-1559 后)用户额外支付给验证者的 “小费”,激励验证者优先打包交易。 |
nonce | 发起账户的交易计数器(从 0 开始),确保每笔交易唯一,防止 “重放攻击”(同一笔交易被重复提交)。 |
data | 附加数据(可选): 调用合约时,为函数名 + 参数的编码(如调用transfer(address,uint256)的编码); 部署合约时,为合约的字节码;普通转账时可留空。 |
signature | 发起账户的数字签名(由私钥生成),用于验证交易的合法性(确实由from地址的所有者发起)。 |
燃料是指验证者处理交易所需的计算。 用户必须为此计算支付费用。 gasLimit 和 maxPriorityFeePerGas 决定支付给验证者的最高交易费。
下面是一个模拟交易信息
{from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",gasLimit: "21000",maxFeePerGas: "300"maxPriorityFeePerGas: "10"nonce: "0",value: "10000000000",
}
交易类型
以太坊有几种不同类型的交易:
- 常规交易:从一个帐户到另一个帐户的交易。
- 合约部署交易:没有“to”地址的交易,数据字段用于合约代码。
- 执行合约:与已部署的智能合约进行交互的交易。 在这种情况下,“to”地址是智能合约地址。
交易生命周期
交易提交后,就会发生以下情况:
- 用户发起与签名
用户通过钱包(如 MetaMask)输入交易参数(to、value、gas等),钱包用用户私钥对交易进行签名(生成signature),确保交易不可篡改且确实由用户发起。 - 广播至网络
签名后的交易被发送到以太坊 P2P 网络,由节点(全节点或轻节点)接收并转发,快速扩散至全网。 - 节点验证
全节点收到交易后,验证其合法性:- 签名是否有效(from地址是否为私钥持有者);
- nonce是否正确(与from账户的当前nonce一致);
- from账户余额是否足够支付value + 预估Gas费;
- 若调用合约,验证data字段的函数编码是否符合合约接口。
- 进入交易池(mempool)
验证通过的交易被放入节点的 “交易池”,等待验证者(PoS)或矿工(PoW 时期)打包。交易池中的交易按 “Gas 价格” 排序,高 Gas 费的交易通常被优先处理。 - 打包进区块
验证者从交易池中选择交易(优先高 Gas 费),打包进新生成的区块,并广播区块至全网。此时交易状态从 “pending(待处理)” 变为 “included(已打包)”。 - 全网确认
其他节点验证区块合法性后,将其添加到区块链末尾。随着后续区块的生成(通常认为 6 个区块后),交易被 “最终确认”(不可篡改的概率极高),全局状态按交易指令更新(如余额变更、合约存储更新)。
关键概念:Gas 与交易费用
以太坊交易必须支付 “交易费用”(以 ETH 计价),费用高低由 Gas 决定,这是防止网络滥用的核心机制:
- Gas:衡量交易计算复杂度的单位(如简单转账需 21,000 Gas,复杂合约调用可能需数百万 Gas)。
- 实际费用:EIP-1559 后,费用 = 基础费(base fee) + 优先级费(priority fee),其中基础费会被销毁(减少 ETH 流通量),优先级费归验证者。
- 费用计算:总费用 = Gas 消耗 ×(基础费 + 优先级费),若用户设置的maxFeePerGas ≥ 实际费用,则交易有效。
交易状态与失败原因
- 常见状态:
- pending:已广播但未被打包;
- success:已打包并确认,状态更新成功;
- failed:已打包但执行失败(如合约逻辑错误、Gas 不足)。
- 失败原因:
- Gas 不足(实际消耗 Gas > gasLimit);
- 合约执行出错(如转账给不接收 ETH 的合约、条件判断不满足);
- 签名无效或nonce错误。
注意:失败的交易仍会消耗 Gas(因验证者已执行计算),费用不会退还。
总结
以太坊交易是连接用户与网络的核心接口,不仅支持简单的价值转移,更通过data字段实现了与智能合约的复杂交互,支撑了 DeFi、NFT、DAO 等丰富生态。理解其结构、类型和生命周期,是使用以太坊和开发 DApp 的基础 —— 它既是 “数字现金” 的转移工具,也是 “去中心化应用” 的操作指令,体现了以太坊 “世界计算机” 的核心价值。