1. 以太坊黄皮书中的交易结构
以太坊黄皮书定义了交易的核心结构。以下是相关部分的摘要:
交易格式(Transaction Format)
一个以太坊交易由以下字段组成:
-
nonce
: 交易序列号,用于防止重放攻击。 -
gasPrice
: 每单位gas的价格(以wei为单位)。 -
gasLimit
: 交易允许消耗的最大gas量。 -
to
: 目标地址(合约地址或外部账户地址)。如果为空,表示创建合约。 -
value
: 发送的以太币数量(以wei为单位)。 -
data
: 调用合约时的输入数据(ABI编码的函数选择器和参数)。 -
v
,r
,s
: 交易的签名数据。
黄皮书中的定义
在黄皮书的Appendix F. Signing Transactions部分,交易的结构被正式定义为:
T ≡ (nonce, gasPrice, gasLimit, to, value, data, v, r, s)
2. EVM执行模型
EVM执行交易时,会根据交易的to
、value
和data
字段执行相应的操作。以下是黄皮书中关于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字节。
-
参数编码:根据参数类型(如
uint256
、address
等)进行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合约交互的数据格式由以下标准定义:
-
以太坊黄皮书:定义了交易的核心结构(
to
、value
、data
等)。 -
Solidity ABI规范:定义了如何编码
data
字段。 -
Gnosis Safe文档:定义了
operation
字段的用途。
如果你需要更详细的规范内容,可以参考以下链接:
-
以太坊黄皮书: https://ethereum.github.io/yellowpaper/paper.pdf
-
Solidity ABI规范: https://docs.soliditylang.org/en/v0.8.0/abi-spec.html
-
Gnosis Safe文档: https://docs.gnosis.io/safe/docs/