Smart Contract and EVM

Hong·2022년 11월 27일
0
post-thumbnail

📚
숨좀 쉴만하니 학교 기말고사가 찾아온다
시간을 쪼개서 쓰지 않으면 블록체인 교육과 학교 기말고사를 함께 소화해 내는 것은 불가능하다
주어진 환경 안에서 최선을 다하는 한편,
애초에 어려운 일임을 받아들이고 최고의 성취를 내지 못하더라도 나를 너무 나무라지 않기로 하자


오늘은 EVM이 무엇인지, 어떤 역할을 하는지와 Ethereum의 트랜잭션은 어떤 식으로 구성되는지 등을 정리했다.






📠 EVM이란?

EVM (Ethereum Virtual Machine)

사람이 작성한 Solidity Code를 이더리움 블록체인 네트워크에서 실행시킬 수 있도록 도와주는 머신


Solidity Code는 어떤 과정을 통해 EVM에 전달될까?

위의 그림을 참고하면 이해가 빠르다.

Solidity Code - solc를 이용한 code complile -> bytecode에서 Opcode로 -> EVM


Opcode란?

  • Opcode하드웨어가 명령을 인식할 수 있도록 구성된 코드단위
  • Opcode는 bit가 8개 모인 유의미한 값인 byte단위로 이뤄져 있음
  • Opcode는 스택조작, 비트연산, 환경, 메모리 조작, 스토리지 조작, 프로그램 카운터, 중지 등의 역할을 할 수 있음

For example,

0x6001600101이라는 byte code가 있다고 해보자 (1 byte = 2개의 16진수 문자)

이것은 아래와 같이 나눠질 것이다
0x60 / 01 / 60 / 01 / 01

0x60 : PUSH1연산이다 뒤에 0x01을 stack에 추가시킨다
0x01 : 0x06으로 인해 추가되는 data

0x60 : PUSH1연산이다 뒤에 0x01을 stack에 추가시킨다
0x01 : 0x06으로 인해 추가되는 data

0x01 : ADD연산이다. stack에서 두개의 요소를 꺼낸다음 두개의 합을 다시 stack에 집어넣는다.

즉 0x01 + 0x01 = 0x02를 stack에 집어 넣을 것이다.






⚙️ EVM은 무엇을 생성하는가?

Account란 무엇인가?

이더리움 주소개인 키(Private Key)의 조합을 계정(account)이라고 한다.
이더리움 계정은 이더리움 잔고를 보유하고 트랜잭션을 전송할 수 있다.


이더리움에는 아래와 같이 2가지 유형의 계정이 존재한다.


1. EOA (Externally Owned Accounts) : 외부 소유 계정

공개 이더리움 주소개인키 조합을 의미하는데 쉽게 말해 지갑 주소라고 보면 된다.
이것을 이용하여 다른 계정과 이더리움을 송수신하고 스마트 컨트랙트에 트랜잭션을 보낼 수 있다.

MetaMask, Kaikas에서 만든 계정이 EOA라고 보면 된다.


2. CA (Contract Accounts) : 컨트랙트 계정

컨트랙트 계정은 외부 소유 계정과 다르게 개인키가 존재하지 않고, 스마트 컨트랙트를 블록체인에 배포할 때 생성된다.
Contract Account 대신 Contract로 불리기도 한다.
이 컨트랙트 계정은 다른 계정과 이더를 송수신하는 기능을 하며, 여기까지는 EOA와 동일하다.

하지만 Contract Account에는 특별한 코드를 담고 있는데 흔히 스마트 컨트랙트라고 한다.
EOA나 다른 컨트랙트의 호출을 받아서 트랜잭션을 발생시키며, 스스로 동작하지는 않는다.
스마트 컨트랙트에 접근하기 위한 주소가 곧 Contract Account를 의미한다.


EOA(External Owned Account)와 CA(Contract Account)의 구성

  • Balance : 계정의 이더 잔액표시

  • Nonce :

    • EOA의 경우, 현재 EOA계정에서 확인되는 이전의 트랜잭션 수
    • CA의 경우, 현재 CA계정에서 확인되는 이전의 트랜잭션 수
  • StorageRoot : 머클 패트리샤 트리의 루트 노드를 해싱한 값

  • Contract Code :

    • EOA의 경우, EOA는 스마트 컨트랙트 코드를 저장하지 않음으로 비어있음
    • CA의 경우, EVM이 실행할 코드를 담고 있음(해싱된 상태로)





⛓️ Ethereum Blockheader의 구성

이더리움 블록헤더는 이더리움의 전역 상태를 저장한다.
gasLimit, gasUsed 등의 여러가지 데이터가 들어가지만

3개의 머클트리 root를 들고있다


  • stateRoot : 트랜잭션과 연관된 계정의 상태 정보를 저장 (현재 블록 뿐만 아니라 전역의 상태를 확인하기 위해 저장하는 듯하다)

  • transactionRoot : 현재 블록의 트랜잭션 정보 저장

  • receiptsRoot : 현재 블록의 거래 영수증 정보 저장






🤝 트랜잭션은 어떤 일을 하는가, 어떻게 구성되어 있는가


What is transaction in Ethereum?

트랜잭션이란 이더리움 네트워크 전역의 상태를 다음 상태로 옮겨주는 역할을 한다고 보면 된다.

앞서 말했듯이 트랜잭션은 EOA에서 실행되고, 올바르게 실행된 트랜잭션은 이더리움 블록체인 네트워크에 올라간다.
이 과정에서 EOA와 이더리움 블록체인 네트워크를 연결해주는 다리가 CA다 그리고 CA끼리는 Message와 Internal Transaction으로 서로 소통한다.


[EOA] - Transaction - EVM -> [CA] - Internal Transaction or Message Call - EVM -> [블록체인 네트워크]


트랜잭션은 다시 두가지로 나뉘어진다

  • Contract Creations : 새로운 스마트 컨트렉트를 만듬
  • Message Call : 단순히 다른 스마트 컨트렉트를 호출


1. Contract Creations

스마트 컨트랙트1스마트 컨트랙트2를 만들 필요가 있는 경우 작동된다
결국 Contract Creations는 새로운 CA를 만든다


새로운 Contract Account는 어떻게 구성되어 있는가?

'새로운' CA를 만드는 틀

    1. 논스를 0으로 설정(새로운 계정이기 때문에 이전 트랜잭션 거래 기록이 없음으로 논스는 0)
    1. 새로운 CA에 이더를 함께 보낸 경우 해당하는 금액을 Balance에 적어줌
    1. EOA에서 새로운 CA로 이더가 이동함으로 2에서 CA에 더해지는 이더의 금액만큼 EOA의 value에서 차감
    1. 새로운 계정임으로 이전에 발생한 트랜잭션이 들어오지 않았다. 그럼으로 StorageRoot(머클 패트리샤 트리의 루트를 빈 값으로 채워놓음)
    1. 새로운 계정임으로 EVM이 실행할 명령어가 들어오지 않았다. 그럼으로 Contract Code을 빈 해시 값으로 채워놓음


2. Message Call

Smart Contract다른 Smart Contract를 호출할 필요성이 있을 때 Message Call을 사용한다.

여기서 CA와 차이점은 init코드가 포함되어 있지 않아 계정을 호출하여 사용할 뿐 계정을 생성하지는 않는다 (기존에 있던 스마트 컨트랙트를 사용할 뿐 스마트 컨트렉드를 직접 만들지는 않는다)


Message Call은 어떻게 구성되어 있는가?

Message Call에는 sender, a recipient, a payload, a value, an amount of gas의 정보가 포함된다.


Message Call을 생성할 때 어떤 제한이 있나?

Message Call의 depth1024미만 으로 제한된다.
(gas로 무한 반복문 실행에 제약을 두기는 하지만 혹시나 많은 양의 gas를 준비한 악의적인 노드가 네트워크에 과부하를 걸지 못하게 막는 용도인듯, EVM에서 카운팅 된다)



Four cases of message






🤖 트랜잭션을 처리하는 EVM은 어떻게 구성되어 있는가?

volatile : 휘발되는 데이터

  • code
  • storage

non-volatile : 휘발되지 않는 데이터

  • stack
  • mermory










References

ETHEREUM VIRTUAL MACHINE (EVM), EVM에 대한 일반적인 개요

Calls vs. transactions in Ethereum smart contracts

전반적인 EVN 백그라운드 실행의 모든 내용을 담고 있음

Four cases of message

profile
Notorious

0개의 댓글