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 许可协议。转载请注明出处!
评论