📚
숨좀 쉴만하니 학교 기말고사가 찾아온다
시간을 쪼개서 쓰지 않으면 블록체인 교육과 학교 기말고사를 함께 소화해 내는 것은 불가능하다
주어진 환경 안에서 최선을 다하는 한편,
애초에 어려운 일임을 받아들이고 최고의 성취를 내지 못하더라도 나를 너무 나무라지 않기로 하자
오늘은 EVM이 무엇인지, 어떤 역할을 하는지와 Ethereum의 트랜잭션은 어떤 식으로 구성되는지 등을 정리했다.
사람이 작성한
Solidity Code
를 이더리움 블록체인 네트워크에서 실행시킬 수 있도록 도와주는머신
위의 그림을 참고하면 이해가 빠르다.
Solidity Code
-solc를 이용한 code complile
->bytecode에서 Opcode로
->EVM
Opcode
는 하드웨어가 명령을 인식
할 수 있도록 구성된 코드단위
byte단위
로 이뤄져 있음스택조작
, 비트연산
, 환경
, 메모리 조작
, 스토리지 조작
, 프로그램 카운터
, 중지
등의 역할을 할 수 있음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에 집어 넣을 것이다.
이더리움 주소
와개인 키(Private Key)
의 조합을계정(account)
이라고 한다.
이더리움 계정은 이더리움 잔고를 보유하고 트랜잭션을 전송할 수 있다.
이더리움에는 아래와 같이 2가지 유형의 계정이 존재한다.
공개 이더리움 주소
와개인키 조합
을 의미하는데 쉽게 말해지갑 주소
라고 보면 된다.
이것을 이용하여 다른 계정과 이더리움을 송수신하고 스마트 컨트랙트에 트랜잭션을 보낼 수 있다.
MetaMask
,Kaikas
에서 만든계정이 EOA
라고 보면 된다.
컨트랙트 계정은 외부 소유 계정과 다르게
개인키가 존재하지 않고
,스마트 컨트랙트
를 블록체인에배포
할 때 생성된다.
Contract Account 대신 Contract로 불리기도 한다.
이 컨트랙트 계정은 다른 계정과 이더를 송수신하는 기능을 하며, 여기까지는 EOA와 동일하다.하지만
Contract Account
에는 특별한 코드를 담고 있는데 흔히스마트 컨트랙트
라고 한다.
EOA나 다른 컨트랙트의 호출을 받아서 트랜잭션을 발생
시키며, 스스로 동작하지는 않는다.
스마트 컨트랙트에 접근하기 위한 주소
가 곧Contract Account
를 의미한다.
Balance
: 계정의 이더 잔액표시
Nonce
:
StorageRoot
: 머클 패트리샤 트리의 루트 노드를 해싱한 값
Contract Code
:
이더리움 블록헤더
는 이더리움의전역 상태를 저장
한다.
gasLimit, gasUsed 등의 여러가지 데이터가 들어가지만3개의 머클트리 root를 들고있다
stateRoot
: 트랜잭션과 연관된 계정의 상태 정보를 저장 (현재 블록 뿐만 아니라 전역의 상태를 확인하기 위해 저장하는 듯하다)
transactionRoot
: 현재 블록의 트랜잭션 정보 저장
receiptsRoot
: 현재 블록의 거래 영수증 정보 저장
트랜잭션
이란 이더리움 네트워크 전역의 상태를다음 상태로 옮겨주는 역할
을 한다고 보면 된다.앞서 말했듯이 트랜잭션은
EOA에서 실행
되고, 올바르게 실행된 트랜잭션은 이더리움 블록체인 네트워크에 올라간다.
이 과정에서 EOA와 이더리움 블록체인 네트워크를 연결해주는 다리가 CA다 그리고 CA끼리는 Message와 Internal Transaction으로 서로 소통한다.
[EOA]
- Transaction - EVM ->[CA]
- Internal Transaction or Message Call - EVM ->[블록체인 네트워크]
Contract Creations
: 새로운 스마트 컨트렉트를 만듬Message Call
: 단순히 다른 스마트 컨트렉트를 호출
스마트 컨트랙트1
이스마트 컨트랙트2
를 만들 필요가 있는 경우 작동된다
결국 Contract Creations는 새로운 CA를 만든다
'새로운' CA를 만드는 틀
Smart Contract
가다른 Smart Contract를 호출
할 필요성이 있을 때Message Call
을 사용한다.여기서 CA와 차이점은 init코드가 포함되어 있지 않아 계정을 호출하여 사용할 뿐 계정을 생성하지는 않는다 (기존에 있던 스마트 컨트랙트를 사용할 뿐 스마트 컨트렉드를 직접 만들지는 않는다)
Message Call에는 sender
, a recipient
, a payload
, a value
, an amount of gas
의 정보가 포함된다.
Message Call의 depth
는 1024미만 으로 제한
된다.
(gas로 무한 반복문 실행에 제약을 두기는 하지만 혹시나 많은 양의 gas를 준비한 악의적인 노드가 네트워크에 과부하를 걸지 못하게 막는 용도인듯, EVM에서 카운팅 된다)
volatile : 휘발되는 데이터
non-volatile : 휘발되지 않는 데이터
ETHEREUM VIRTUAL MACHINE (EVM), EVM에 대한 일반적인 개요
Calls vs. transactions in Ethereum smart contracts