EVM硬核底层原理
            
            
                一问:智能合约是怎么部署到链上的?
- 字节码 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中,通常有以下几种省费用的操作码:
 
使用
view和pure关键字:在Solidity中,如果一个函数不修改合约状态并且不访问合约存储,那么可以使用view或pure关键字来标记该函数。这样可以避免在执行函数时进行状态变更和存储访问,从而减少gas费用。使用
memory关键字:在Solidity中,如果一个函数需要使用临时内存来存储数据,那么可以使用memory关键字来标记该数据。这样可以避免在执行函数时将数据存储到合约存储中,从而减少gas费用。使用
bytes32类型:在Solidity中,如果一个变量需要存储一个固定长度的字节序列,那么可以使用bytes32类型来存储。这样可以避免使用动态数组或映射类型,从而减少gas费用。避免重复计算和存储:在Solidity中,如果一个变量的值可以通过其他变量计算得出,那么可以避免重复计算和存储该变量的值。这样可以减少gas费用。
避免使用循环:在Solidity中,循环语句的执行会消耗大量的gas费用。因此,如果可以使用其他方式来实现相同的功能,那么应该避免使用循环语句。
这些操作码可以帮助开发者减少智能合约的gas费用,从而提高智能合约的性能和可用性。
- 本文标题:EVM硬核底层原理
 - 创建时间:2023-08-16 18:54:30
 - 本文链接:2023/08/16/Web3/evm-core/
 - 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 
         评论