EVM硬核底层原理
Tim Chen(motion$) Lv5

一问:智能合约是怎么部署到链上的?

  • 字节码 bytecode:智能合约通过编译器编译后生成的二进制代码,它是一种中间代码,可以被EVM虚拟机执行。
  • 操作码/指令码 opcode:操作码是一种特殊的字节码,它是EVM虚拟机的指令集,用于执行智能合约的逻辑。
  • GitHub Copilot的回答:
    • GitHub Copilot: 您好!智能合约是通过将其编译为字节码(bytecode),然后将字节码发送到区块链网络上的节点来部署的。一旦节点接收到字节码,它将创建一个合约地址,并将字节码存储在该地址下。这样,其他用户就可以通过调用该地址上的函数来与合约进行交互。
  • ChatGPT的回答:

opcode的分类

  • GitHub Copilot: 您好!EVM虚拟机的操作码可以分为以下几类:
    GitHub Copilot: 以下是EVM操作码按类分类的列表:

栈操作(Stack Operations)17个

  • 0x80 - 0x8f: DUP1-DUP16
  • 0x90 - 0x9f: SWAP1-SWAP16
  • 0x58: POP
  • 0x59: MLOAD
  • 0x5a: MSTORE
  • 0x5b: MSTORE8
  • 0x50: PUSH1
  • 0x51: PUSH2
  • 0x5f: PUSH32
  • PUSH1 - PUSH32共32个

流程控制(Flow Control)3个

  • 0x56: JUMP
  • 0x57: JUMPI
  • 0x5b: JUMPDEST

环境信息(Environmental Information)15个

  • 0x30: ADDRESS
  • 0x31: BALANCE
  • 0x32: ORIGIN
  • 0x33: CALLER
  • 0x34: CALLVALUE
  • 0x35: CALLDATALOAD
  • 0x36: CALLDATASIZE
  • 0x37: CALLDATACOPY
  • 0x38: CODESIZE
  • 0x39: CODECOPY
  • 0x3a: GASPRICE
  • 0x3b: EXTCODESIZE
  • 0x3c: EXTCODECOPY
  • 0x3d: RETURNDATASIZE
  • 0x3e: RETURNDATACOPY

存储和内存(Storage and Memory)4个

  • 0x54: SLOAD
  • 0x55: SSTORE
  • 0x5a: MSTORE
  • 0x5b: MSTORE8

数学运算(Mathematical Operations)11个

  • 0x01: ADD
  • 0x02: MUL
  • 0x03: SUB
  • 0x04: DIV
  • 0x05: SDIV
  • 0x06: MOD
  • 0x07: SMOD
  • 0x08: ADDMOD
  • 0x09: MULMOD
  • 0x0a: EXP
  • 0x0b: SIGNEXTEND

比较和逻辑运算(Comparison and Bitwise Logic Operations)15个

  • 0x10: LT
  • 0x11: GT
  • 0x12: SLT
  • 0x13: SGT
  • 0x14: EQ
  • 0x15: ISZERO
  • 0x16: AND
  • 0x17: OR
  • 0x18: XOR
  • 0x19: NOT
  • 0x1a: BYTE
  • 0x1b: SHL
  • 0x1c: SHR
  • 0x1d: SAR

加载和存储(Loading and Storing)14个

  • 0x32: ORIGIN
  • 0x33: CALLER
  • 0x34: CALLVALUE
  • 0x35: CALLDATALOAD
  • 0x36: CALLDATASIZE
  • 0x37: CALLDATACOPY
  • 0x38: CODESIZE
  • 0x39: CODECOPY
  • 0x3a: GASPRICE
  • 0x3b: EXTCODESIZE
  • 0x3c: EXTCODECOPY
  • 0x3d: RETURNDATASIZE
  • 0x3e: RETURNDATACOPY

合约调用(Contract Calls)10个

  • 0xf0: CREATE
  • 0xf1: CALL
  • 0xf2: CALLCODE
  • 0xf3: RETURN
  • 0xf4: DELEGATECALL
  • 0xf5: CREATE2
  • 0xfa: STATICCALL
  • 0xfd: REVERT
  • 0xff: SELFDESTRUCT

杂项(Miscellaneous)11个

  • 0x00: STOP
  • 0x0f: BREAKPOINT
  • 0x3f: BLOCKHASH
  • 0x40: COINBASE
  • 0x41: TIMESTAMP
  • 0x42: NUMBER
  • 0x43: DIFFICULTY
  • 0x44: GASLIMIT
  • 0x45: CHAINID
  • 0x46: SELFBALANCE
  • 0x47: BASEFEE

了解这些操作码的分类可以帮助开发者更好地理解EVM虚拟机的指令集,从而更好地编写和优化智能合约的代码。

二问:如何写智能合约才能更省gas费用?

  • GitHub Copilot: 在Solidity中,通常有以下几种省费用的操作码:
  1. 使用viewpure关键字:在Solidity中,如果一个函数不修改合约状态并且不访问合约存储,那么可以使用viewpure关键字来标记该函数。这样可以避免在执行函数时进行状态变更和存储访问,从而减少gas费用。

  2. 使用memory关键字:在Solidity中,如果一个函数需要使用临时内存来存储数据,那么可以使用memory关键字来标记该数据。这样可以避免在执行函数时将数据存储到合约存储中,从而减少gas费用。

  3. 使用bytes32类型:在Solidity中,如果一个变量需要存储一个固定长度的字节序列,那么可以使用bytes32类型来存储。这样可以避免使用动态数组或映射类型,从而减少gas费用。

  4. 避免重复计算和存储:在Solidity中,如果一个变量的值可以通过其他变量计算得出,那么可以避免重复计算和存储该变量的值。这样可以减少gas费用。

  5. 避免使用循环:在Solidity中,循环语句的执行会消耗大量的gas费用。因此,如果可以使用其他方式来实现相同的功能,那么应该避免使用循环语句。

这些操作码可以帮助开发者减少智能合约的gas费用,从而提高智能合约的性能和可用性。

 评论