‘마스터링 이더리움’ 세미나 11 13장. 이더리움 가상 머신

이번 세미나에서는 ’13장. 이더리움 가상 머신’을 다룹니다.

 

그림 13.1을 복사해 가까운 곳에 붙여두고, 완전히 이해하고 설명할 수 있을 때까지 반복해서 보도록 합니다.

  • 이더리움 계정은 EOA와 컨트랙트 계정으로 구분됩니다.
    • 계정 별로 잔고와 논스가 관리됩니다.
      • 논스는 EOA인 경우는 성공적으로 전송한 트랜잭션 수를 나타내고, 컨트랙트 계정인 경우는 생성된 컨트랙트 수를 나타냅니다.
    • 컨트랙트 계정은 컨트랙트 실행을 위해 추가적으로 코드와 스토리지를 갖습니다.
  • 트랜잭션이 스마트 컨트랙트 코드 실행인 경우
    • 실행을 위해 EVM 인스턴스가 생성됩니다.
      • EVM은 샌드박스로 실행됩니다.
        • 외부와 철저하게 차단된 상태에서 초기화되어 실행됩니다.
          • 블록 헤더와 트랜잭션의 일부 정보로 월드 상태와 전역 변수를 설정합니다.
        • 실행이 성공할 경우에만 이더리움 월드 상태로 반영됩니다.
          • EVM이 인스턴스될 때 이더리움 월드 상태를 복제하고, EVM은 이를 기반으로 코드를 실행하고, 코드 실행이 성공하면 코드 실행으로 인한 상태 변경을 이더리움 월드 상태로 반영합니다.
    • EVM은 코드 실행을 위해 가스를 사용합니다.
    • The EVM has a stack-based architecture, storing all in-memory values on a stack.
  • 컨트랙트는 다른 컨트랙트를 호출할 수 있습니다.
    • 컨트랙트에서 다른 컨트랙트를 호출하는 것은 EOA에서 컨트랙트를 호출하는 것과 같이 트랜잭션으로 처리됩니다.
      • 호출된 컨트랙트를 실행하기 위해 새로운 EVM 인스턴스가 생성됩니다.

 

 

EVM 명령어 집합(바이트코드 연산)

아래 요약한 내용을 다시 한 번 읽어 봅니다.

  • EVM 명령어 집합은 다음과 같은 바이트코드 연산이 가능하다.
    • 산술 및 비트 논리 연산
      • ADD, SUB, MUL, DIV, SDIV(부호 있는), MOD, SMOD(부호 있는), ADDMOD, MULMOD, EXP, SIGNEXTEND(Extend the length of a two’s complement signed integer), SHA3
        • All arithmetic is performed modulo 2256 (unless otherwise noted), and that the zeroth power of zero, 00, is taken to be 1.
      • LT, GT, SLT(부호 있는), SGT(부호 있는), EQ, ISZERO, AND, OR, XOR, NOT, BYTE(Retrieve a single byte from a full-width 256-bit word)
    • 스택, 메모리 및 스토리지 접근
      • POP, PUSHx(Place x byte item on the stack, where x can be any integer from 1 to 32 (full word) inclusive), DUPx(Duplicate the x-th stack item, where x can be any integer from 1 to 16 inclusive), SWAPx(Exchange 1st and (x+1)-th stack items, where x can be any integer from 1 to 16 inclusive)
      • MLOAD, MSTORE, MSTORE8(Save a byte to memory), MSIZE(Get the size of the active memory in bytes)
      • SLOAD, SSTORE
    • 흐름 제어
      • STOP, JUMP, JUMPI, PC(Get the value of the program counter – prior to the increment corresponding to this instruction), JUMPDEST
    • 실행 컨텍스트 조회
      • ADDRESS, BALANCE, GAS, GASPRICE, ORIGIN, CALLER, CALLVALUE, CALLDATASIZE, CALLDATALOAD, CALLDATACOPY, CODESIZE(Get the size of code running in the current environment), CODECOPY(Copy the code running in the current environment to memory), EXTCODESIZE(Get the size of any account’s code), EXTCODECOPY(Copy any account’s code to memory), RETURNDATASIZE(Get the size of the output data from the previous call in the current environment), RETURNDATACOPY(Copy data output from the previous call to memory)
    • 로깅, 호출 및 기타 연산
      • LOGx(Append a log record with x topics, where x is any integer from 0 to 4 inclusive), CREATE, CALL, CALLCODE, DELEGATECALL, STATICCALL, REVERT, INVALID(The designated invalid instruction), RETURN(Halt execution and return output data), SELFDESTRUCT
      • BLOCKHASH, COINBASE, TIMESTAMP, NUMBER, DIFFICULTY, GASLIMIT
  • 바이트코드 연산 외에도 EVM은 계정 정보(예: 주소 및 잔액) 및 블록 정보(예: 블록 번호 및 현재 가스 가격)에 접근할 수 있다.
  • EVM은 모든 피연산자를 스택에서 가져와 연산하고 결과(적용 가능한 경우)를 스택 상단에 다시 넣는다.

 

솔리디티 컴파일

아래 내용은 기억해 둡니다.

  • 원시 연산코드 스트림 생성(일부 정보 제외)
  • 원시 연산코드 스트림 생성(전체 정보 생성)
  • 바이너리 코드 생성

 

 

컨트랙트 배포 코드

아래 인용한 본문 내용을 다시 한 번 읽어 봅니다. 강조한 부분은 주의를 기울여 읽습니다.

  • There is an important but subtle difference between the code used when creating and deploying a new contract on the Ethereum platform and the code of the contract itself.
  • In order to create a new contract, a special transaction is needed that has its to field set to the special 0x0 address and its data field set to the contract’s initiation code.
  • When such a contract creation transaction is processed, the code for the new contract account is not the code in the data field of the transaction. Instead, an EVM is instantiated with the code in the data field of the transaction loaded into its program code ROM, and then the output of the execution of that deployment code is taken as the code for the new contract account. This is so that new contracts can be programmatically initialized using the Ethereum world state at the time of deployment, setting values in the contract’s storage and even sending ether or creating further new contracts.
  • When compiling a contract offline, e.g., using solc on the command line, you can either get the deployment bytecode or the runtime bytecode.
  • The deployment bytecode is used for every aspect of the initialization of a new contract account, including the bytecode that will actually end up being executed when transactions call this new contract (i.e., the runtime bytecode) and the code to initialize everything based on the contract’s constructor.

바이트코드 분해

아래 인용한 본문 내용 정도를 기억해 두고, 바이트코드의 실행과정을 따라가는 정도로 본문 내용을 읽습니다.

EVM 바이트코드를 분해하는 것은 EVM에서 고수준의 솔리디티가 어떻게 작동하는지 이해하는 좋은 방법이다. 이 작업을 수행하는데 사용할 수 있는 몇 가지 디스어셈블러가 있다.

  • Porosity is a popular open source decompiler.
  • Ethersplay is an EVM plug-in for Binary Ninja, a disassembler.
  • IDA-Evm is an EVM plugin for IDA, another disassembler.

 

 

아래 인용한 본문 내용을 다시 한 번 주의를 기울여 읽습니다.

  • The EVM is a quasi–Turing-complete state machine; “quasi” because all execution processes are limited to a finite number of computational steps by the amount of gas available for any given smart contract execution.
  • The EVM, therefore, has no scheduling capability, because execution ordering is organized externally to it.
  • The job of the EVM is to update the Ethereum state by computing valid state transitions as a result of smart contract code execution, as defined by the Ethereum protocol. This aspect leads to the description of Ethereum as a transaction-based state machine, which reflects the fact that external actors (i.e., account holders and miners) initiate state transitions by creating, accepting, and ordering transactions.
  • Ethereum encourages the deletion of used storage variables and accounts by refunding some of the gas used during contract execution.
    • Deleting a contract (SELFDESTRUCT) is worth a refund of 24,000 gas.
    • Changing a storage address from a nonzero value to zero (SSTORE[x] = 0) is worth a refund of 15,000 gas.
      • To avoid exploitation of the refund mechanism, the maximum refund for a transaction is set to half the total amount of gas used (rounded down).
  • The miners on the network collectively decide the block gas limit. Individuals who want to mine on the Ethereum network use a mining program, such as Ethminer, which connects to a Geth or Parity Ethereum client. The Ethereum protocol has a built-in mechanism where miners can vote on the gas limit so capacity can be increased or decreased in subsequent blocks. The miner of a block can vote to adjust the block gas limit by a factor of 1/1,024 (0.0976%) in either direction. The result of this is an adjustable block size based on the needs of the network at the time. This mechanism is coupled with a default mining strategy where miners vote on a gas limit that is at least 4.7 million gas, but which targets a value of 150% of the average of recent total gas usage per block (using a 1,024-block exponential moving average).
About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*