以太坊中的交易结构

1. 以太坊黄皮书中的交易结构

以太坊黄皮书定义了交易的核心结构。以下是相关部分的摘要:

交易格式(Transaction Format)

一个以太坊交易由以下字段组成:

  • nonce: 交易序列号,用于防止重放攻击。

  • gasPrice: 每单位gas的价格(以wei为单位)。

  • gasLimit: 交易允许消耗的最大gas量。

  • to: 目标地址(合约地址或外部账户地址)。如果为空,表示创建合约。

  • value: 发送的以太币数量(以wei为单位)。

  • data: 调用合约时的输入数据(ABI编码的函数选择器和参数)。

  • vrs: 交易的签名数据。

黄皮书中的定义

在黄皮书的Appendix F. Signing Transactions部分,交易的结构被正式定义为:

 
复制
T ≡ (nonce, gasPrice, gasLimit, to, value, data, v, r, s)

2. EVM执行模型

EVM执行交易时,会根据交易的tovaluedata字段执行相应的操作。以下是黄皮书中关于EVM执行模型的摘要:

执行环境(Execution Environment)

EVM的执行环境由以下字段定义:

  • address: 当前合约的地址(即交易的to字段)。

  • caller: 调用者的地址。

  • value: 发送的以太币数量(即交易的value字段)。

  • data: 调用合约时的输入数据(即交易的data字段)。

黄皮书中的定义

在黄皮书的Section 9.3. Substate部分,EVM的执行环境被定义为:

 
复制
I ≡ (Ia, Io, Ip, Id, Is, Iv, Ib, IH, Ie, Iw)

其中:

  • Ia 是当前合约的地址(to)。

  • Iv 是发送的以太币数量(value)。

  • Id 是调用合约时的输入数据(data)。


3. Solidity ABI规范

Solidity文档中定义了如何编码data字段。以下是相关部分的摘要:

函数选择器(Function Selector)

函数选择器是函数签名的Keccak-256哈希的前4字节。例如,函数transfer(address,uint256)的选择器为:

 
复制
keccak256("transfer(address,uint256)") → 0xa9059cbb

参数编码(Parameter Encoding)

参数根据其类型进行ABI编码。例如,调用transfer(address,uint256)时,data字段的格式为:

 
复制
0xa9059cbb + <address> + <uint256>

Solidity文档中的定义

在Solidity文档的ABI Specification部分,ABI编码规则被定义为:

  • 函数选择器:函数签名的Keccak-256哈希的前4字节。

  • 参数编码:根据参数类型(如uint256address等)进行ABI编码。


4. Gnosis Safe的operation字段

operation字段是Gnosis Safe多签钱包中定义的扩展字段,用于指定调用类型。以下是相关部分的摘要:

调用类型(Operation Type)

  • 0: 普通调用(CALL),EVM会执行目标合约的代码。

  • 1: 委托调用(DELEGATECALL),EVM会在当前合约的上下文中执行目标合约的代码。

Gnosis Safe文档中的定义

在Gnosis Safe的文档中,operation字段的定义如下:

 
复制
operation: 0 | 1
  • 0 表示CALL

  • 1 表示DELEGATECALL


总结

与EVM合约交互的数据格式由以下标准定义:

  1. 以太坊黄皮书:定义了交易的核心结构(tovaluedata等)。

  2. Solidity ABI规范:定义了如何编码data字段。

  3. Gnosis Safe文档:定义了operation字段的用途。

如果你需要更详细的规范内容,可以参考以下链接:

posted @ 2025-03-04 23:59  若-飞  阅读(122)  评论(0)    收藏  举报