EPF学习笔记-交易解析

交易结构

交易结构

交易是由**外部账户(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),这部分代码会永久存储在合约账户中,并在后续每次调用该合约时执行。

运行时字节码与初始化字节码的区别

  1. 初始化字节码 (Initialization Bytecode / init):

这是包含在交易 data 字段中的代码。

执行频率:它仅在账户创建时由以太坊虚拟机(EVM)执行一次。

作用:它的主要任务是设置合约的初始状态并返回合约的逻辑代码。例如,它可能会将逻辑代码复制到内存中并将其返回。

  1. 运行时字节码 (Runtime Bytecode):

这是初始化代码执行后的返回值。

存储与执行:它会被永久存储在合约账户中。每当该合约收到交易(即代码执行模式)时,EVM 就会运行这段运行时字节码。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计