本页面试图描述在ETH上发生的各种交易。

基本属性

  1. from:一个ETH地址,交易发起方
  2. to:一个ETH地址,交易的接收方
  3. value:uint256,这笔交易所携带的wei数额,这些wei会被从from转移到to。
  4. gas:uint256,gaslimit,交易的最大gas数量限制
  5. gasprice:uint256,每消耗1 gas需要付出的wei数量
  6. data:bytes,一个大端序表示的字节序列,会传递给交易接收方处理
  7. nonce:int,EOA每发起一次transaction就会递增1(无论是否revert),初始值为0

合约创建

当创建合约时,需要把to设为null/None/不设置(注意0x0000000000000000000000000000000000000000是一个合法的EOA,并非创建合约地址),此时,EVM会通过某种方式计算出新合约的地址,同时在该地址下将data直接作为code从开始执行,最后将返回的数据作为新合约的code写入区块链。

就如构造函数中所说的,合约创建时是可以接受value的,只需要constructor是payable的

一般来说,通过solidity编写的智能合约的在部署时的data可以分为4部分:

  1. 部署代码:这部分包括使用CODECOPY指令把需要部署的合约复制到mem中,并通过RETURN返回给evm,创建新合约的code部分。同时,还包含solidity源码中的合约构造函数执行。
  2. 合约代码:不会在创建时被EVM执行,单纯地被复制和返回
  3. 元数据:包含一些和编译器版本相关的内容(内容奇怪,有兴趣可以看看编译器源码)
  4. 构造函数参数(optional):传递给构造函数的数据,被append到末尾。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Exp {
    constructor(address target) {}
}

raw data:

deploy: 6080604052348015600f57600080fd5b506040516101053803806101058339818101604052810190602f91906090565b5060b8565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006062826039565b9050919050565b6070816059565b8114607a57600080fd5b50565b600081519050608a816069565b92915050565b60006020828403121560a35760a26034565b5b600060af84828501607d565b91505092915050565b603f806100c66000396000f3fe
contract: 6080604052600080fdfea2646970667358221220b1a981cf3f7372d983b667a16d435e63d6bf7c2a87ec35f0a70dc2897be2829064736f6c634300080d0033
constructor args: 000000000000000000000000612086b50997e36d332db56518f57a321992ad28