交易结构
交易是由**外部账户(External Account)**发出的、经过加密签名的指令,通过 JSON-RPC 广播到整个网络。
一个交易的解剖结构包含以下核心字段:
-
nonce
-
gasPrice(每单位gas价格)、
-
gasLimit(交易执行允许消耗的最大 Gas 数量)、
-
to:20 字节的接收者地址。该字段决定了交易的模式:若字段为空(Empty),则为合约创建模式。若地址为外部账户,则为价值转移(转账)。若地址为合约账户,则为合约执行,会调用合约代码)
-
value:转移给接收者的 Wei 数量。在合约创建模式中,这会成为新合约账户的初始余额
-
data:指定给 EVM 输入的无限大小字节数组。在合约创建中,它是初始化字节码;否则是输入数据数组
-
Signature:发送者的 ECDSA 签名
以太坊中合约创建与代码执行的区别

如何利用 nonce 替换已发送的交易
当一笔交易因为 Gas 价格设置过低而“卡住”在待处理队列中时,可以利用 nonce 机制进行替换。
操作方法:发送一笔新的交易,该交易必须具备与原交易相同的 nonce 值,并支付更高的 gasPrice。
矿工通常会优先处理 Gas 价格更高的交易。一旦新交易被包含进区块,具有相同 nonce 的旧交易就会被 EVM 拒绝,因为它违反了 nonce 必须递增且唯一的规则。
取消交易:有些钱包利用这一特性,通过发送一笔相同 nonce、更高 Gas 价格、但 value 为 0 的交易来有效地“撤回”或覆盖原有的待处理交易。
合约创建模式下的 data 字段包含什么
在合约创建模式中,to 字段为空,此时的 data(也称为 init)字段是一个无限大小的字节数组,指定了给 EVM 的输入。
初始化字节码:该字段包含的是用于部署合约的初始化代码,而非合约本身的业务逻辑。
执行逻辑:这段 init 代码仅在账户创建时由 EVM 执行一次。
返回值:执行 init 代码后的返回值被确定为运行时字节码(runtime bytecode),这部分代码会永久存储在合约账户中,并在后续每次调用该合约时执行。
运行时字节码与初始化字节码的区别
- 初始化字节码 (Initialization Bytecode / init):
这是包含在交易 data 字段中的代码。
执行频率:它仅在账户创建时由以太坊虚拟机(EVM)执行一次。
作用:它的主要任务是设置合约的初始状态并返回合约的逻辑代码。例如,它可能会将逻辑代码复制到内存中并将其返回。
- 运行时字节码 (Runtime Bytecode):
这是初始化代码执行后的返回值。
存储与执行:它会被永久存储在合约账户中。每当该合约收到交易(即代码执行模式)时,EVM 就会运行这段运行时字节码。