본문 바로가기
CS/3-2 블록체인

[블록체인] 11. Ethereum - The Ethereum Virtual Machine

by 이지이즤 2022. 12. 3.

 

EVM: Comparison with other VM technologies

실제 컴퓨터를 가상화 한 VirtualBox, QEMU등과 비교하면,
EVM은 limited domain(비교적 간단)이고 computation과 storage를 제공하는 abstract한 구조.
EVM은 JVM과 비슷한 단지 computation을 위한 engine.

자바 코드가 컴파일 되어 JVM을 위한 bytecode로 바뀌듯이
EVM을 위한 bytecode도 존재함.(high level로 작성된 smart contract_ex.Solidity로부터 바뀌게 됨.)

EVM은 scheduling 능력이 없음. 여러개의 job을 어떤 순서로 진행할지에 대한 결정 권한이 없음.
(Execution order는 전적으로 외부적인 요인;miner에 의해 결정됨)
=> Ethereum World Computer는 sigle-threaded

EVM Overview

EVM은 smart contract의 deployment(생성 과정)와 execution(실행)을 관리함.
EVM은 이더리움 플랫폼 상의 수없이 많은 execuable들을 모두 실행시키는 global computer임.
각 smart contract는 각자의 permanent한 data storage를 가지고 있음.

* 'quasi' turing-complete
: turing complete한 특성으로 인해 코드가 안끝나는 것을 방지하기 위한 방지책이 적용되어있음.
 smart contract의 실행이 gas limit에 달려있게 함으로써 halting문제를 해결.

EVM은 stack기반의 architecture를 채택중. 구조가 매우 단순한 범용 CPU!
모든 in-memory value가 스택에 저장되고 스택을 통해서 참조 및 연산이 일어나고
연산이 또 스택에 저장되는 식으로 진행됨.
접근 단위(word size)는 256bit임. (EVM의 주요연산 중 하나인 hash연산에 맞게)
addressable한 data components를 가짐.(주소로 참조 가능)

EVM Architecture


immutable program code ROM

instruction이 저장될 곳. 즉, 실행될 코드(smart contract의 byte code)를 저장.

volatile memory

휘발성 메모리. 0으로 초기화.

permanent storage

영구한 저장소. 0으로 초기화.

 

EVM Instruction Set(bytecode operations)

arithmetic and bitwise logic operations

: ADD, MUL, SUB, DIV, … , SHA3, LT, EQ, ISZERO, AND, OR, XOR,…

execution context inquiries

: CALL, RETURN, REVERT, INVALID, SELFDESTRUCT, …

stack, memory, and storage access

: POP, MLOAD, MSTORE, SLOAD, SSTORE, … (M은 memory, S는 storage를 의미함)

control flow operations

: STOP, JUMP, PC, …

logging, calling, and other operators

: GAS, BALANCE, ORIGIN, CALLDATALOAD, …

//block ops// TIMESTAMP, NUMBER, GASLIMIT, …

In addition to the typical bytecode operations, the EVM also has access to account information (e.g., address and balance) and block information (e.g., block number and gas limit).
; 범용의 CPU가 제공해야 하는 것들을 제공하면서, 추가적으로 블록이나 gas관련 명령어도 포함됨.

 


EVM state

EVM이 Ethereum global state(이더리움의 수많은 account들의 상태의 모음)업데이트 시킴.
Ethereum은 transaction에 기반한 state machine임. (트랜잭션이 상태를 바꾸기 때문)

이더리움 최종 사용자인 외부 actor(ex. account holders and miners)가
wallet을 이용해서 트랜잭션을 유발시키거나 채굴자가 트랜잭션을 검증하고 블록을 만들어서
EVM의 실행을 유발시키고 EVM을 통해서 이더리움 상태를 바꾸게 됨.
(end user역할인 EOA holder가 트랜잭션 invoke, 채굴자가 EVM이용해서 트랜잭션 처리)

Ethereum account

address에 의해 구분되며 다음의 4가지로 구성됨.

- balance
 : account가 가지고있는 wei의 수

- nonce
 : transaction의 nonce가 account의 nonce를 참조해서 transaction에 일련번호를 붙임.(count역할)
  nonce가 없다면 공격자가 똑같은 transaction을 multiple로 발생시켜서 source 계좌이 돈을 전부 빼내는 공격이
  가능할 수 있음. 
  * EOA의 nonce는 EOA가 보낸 transaction의 수를 의미함.
  * contract account의 nonce는 해당 contract를 통해서 생성된 contract의 수를 의미함.

- storage
 : contract account라면 smart contract code의 permanemt data store.
   EOA라면 코드가 없으니 의미 없음.

- program code
 : contract account라면 해당 contract의 code가 들어있음
.  EOA라면 코드가 없으니 의미 없음.

EVM의 요소

EVM이 트랜잭션 실행을 위해 초기화됨.

- program code ROM
 : transaction이 실행시킬 코드 load

- program counter(PC)
 : 0으로 초기화

- storage
 : contract code에 연결된 storage 내용 load

- memory
 : 0으로 초기화 (연습장)

- gas supply
 : transaction 유발자가 설정한 gas limit으로 설정.
  code가 EVM에서 실행됨에 따라 operation에서 사용한 gas만큼 gas supply가 점점 줄어듦.

실행이 성공적으로 끝나면 이더리움의 global state가 바뀜
트랜잭션으로 인해 유발된 smart contract 실행의 결과로 이더리움 account의 state가 바뀜.
smart contract의 실행 결과로 인해 그 코드가 참조하는 permanent storage의 내용이 바뀌거나,
contract를 새롭게 생성하는 transaction이어서 새로운 contract가 만들어지거나,
transaction이 ether를 다른 계정으로 보낸다면 ether의 balance가 바뀌어서 global state에 반영됨.

 

Contract Deployment Code

새로운 contract를 이더리움 플랫폼에 올리는 것도 EVM 담당임.

* code 종류
1) 새로운 contract를 생성하는 코드 (deployment code가 contract 생성 및 초기화)
2) 생성된 contract에 포함될 smart contract 코드

contract를 만들기 위해, 주소가 0x0이고 data field가 initiation code로 설정된 특별한 트랜잭션이 필요함.
EVM은 data field에 있는 코드를 ROM에 집어넣고 실행함. 

새로운 contract는 프로그램에 의해서 deployment할 때 생성되며 적절한 새로운 값이 설정됨.
새로운 contract가 호출될 때 runtime bytecode가 실행됨.

 

 


EVM and Gas

지금까지 실행하며 사용한 gas의 총량이 트랜잭션 유발자가 지불 용의가 있다고 설정한 gas limit을 넘어가는지 체크하며 실행함. -> halting 문제 해결

gas를 사용해서, EVM은 트랜잭션 및 smart contract 코드 실행에 의해 수행되는 모든 계산 단계를 진행함.
ex1) adding two numbers costs 3 gas
ex2) calculating a Keccak-256 hash costs (30 gas;기본값 + 6 gas for each 256
bits of data being hashed;인풋)
ex3) sending a transaction costs 21,000 gas

gas의 역할

1) price와 Ethereum 사이 변덕스러움의 buffer역할
2) 채굴 보상
3) DoS공격(끝나지 않는 코드)에 대한 defense역할

EVM실행 중 gas 계산 과정

gas supply를 트랜잭션에 설정된 gas limit만큼으로 설정
-> 설정된 gas supply는 EVM이 어떠한 operation을 실행함에 따라 감소
-> out of gas가 되기 전까지는 실행과정 반복
(EVM은 어떤 operation을 시작하기 전에, 이 operation을 실행하는 데 충분한 gas가 남아있는지
확인하는 과정을 거침. gas가 충분치 않으면 애초에 operation 시작을 안함.)
-> 성공적으로 실행을 마치면(out of gas가 일어나지 않았다면), miner는 miner fee를 받음.

* miner fee = gas cost(op마다 사용한 gas의 누적합) * gas price(시장가격에 따라 사용자가 설정한 값)

gas supply중에 남은 gas는 다시 sender에게 반환됨.

*
remaining gas = gas limit - gas cost
* refunded ether = remaining gas * gas price

 

Gas Cost vs. Gas Price


Gas Cost

각 operation마다 부여되며, operation 실행을 위해 지불해야하는 값.

* transaction fee = total gas used * gas price paid (in ether)
* total gas used = 실제 실행한 operation의 gas cost의 합
* gas price = sender가 설정한, gas당 지불할 ether 양

miner는 gas price가 높은 트랜잭션을 우선으로 채굴할 블록에 포함시키려고 함.

Gas Price

sender는 시장가를 반영하여 gas price를 지정해서 transaction을 보냄.
ether의 시장 가격이 들쭉날쭉 할 수 있기 때문에 ether와 gas 사이의 교환가치gas price에 반영하여 제시함.
(ether가격이 낮아지면 gas price를 높게 설정)

 

Block Gas Limit

비트코인에서는 블록에 들어가는 트랜잭션의 크기로 블록 사이즈를 제한했었음.(segwit이전에는 1MB)
이더리움에서는 블록에 들어가는 트랜잭션의 gas limit의 합으로 제한함.(대체적으로 400transactions/block)

ex) 5개의 트랜잭션의 gas limit이 각각 30000, 30000, 40000, 50000, 50000이고 block gas limit이 180000이라면
      5개 트랜잭션을 모두 포함해서 블록을 만드는 것은 불가능함. 최대 4개 선택 가능.

만약 block gas limit을 초과해서 트랜잭션을 담으면 다른 노드들이 해당 블록을 invalid로 간주하고 거부함.

* block gas limit은 누가 정하나?
: 각 miner들이 투표를 해서 block gas limit을 올릴지 내릴지 정함.(다수결)
 올리거나 내리는 것의 비율은 1/1024로 제한해서 증감 폭이 크지 않도록 했음.
 Ethminer등의 채굴 프로그램에 투표하는 기능이 내장되어있으며 Geth나 Parity에 연결되어있음.

댓글