EVM은 Ethereum 클라이언트를 실행하는 수 천개의 컴퓨터가 유지관리하는 단일 엔티티입니다.
이더리움 프로토콜은 이 특수 시스템의 지속적이면서 중단없는 작동을 유지하기 위한 목적으로 존재합니다.
EVM에는 모든 이더리움 계정과 스마트 계약이 존재하는 환경입니다. 체인의 특정 블록에서 Ethereum은 하나의 "표준" 상태를
가지며 EVM은 블록마다 새로운 유효한 상태를 계산하는 규칙을 정의함.
Byte : https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8
주기억장치(computer memory) : https://ko.wikipedia.org/wiki/%EC%A3%BC%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98
스택(stack) : https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D
암호화 해시 함수(cryptographic hash function) : https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98
머클트리 : https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%8A%B8%EB%A6%AC
프로그램 카운터(Program counter) : https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%B9%B4%EC%9A%B4%ED%84%B0
분산원장의 비유는 비트코인과 같은 블록체인을 설명할 때 주로 사용했으며 이더리움에서는 비트코인과 거의 동일한 규칙을 따르는 고유한 암호화폐 Ether가 있지만 더 강력한 기능이 있습니다. 바로 스마트 컨트랙트(똑똑한 계약)인데요. 튜링완전성이 있는 언어인 솔리디티를 이용해서 탈중앙화 애플리케이션을 만들 수도 있죠 이더리움은 분산원장 개념에서 더 나아간 상태 기계 (State Machine)으로 동작합니다.
그렇다면 상태 기계? 상태 머신은 무슨 뜻일까요?? 상태머신이란 쉬운말로 입력을 읽고 그 입력을 기반으로 새로운 상태로 전환하는 것을 말합니다 이더리움은 처음에는 Genesis State에서 시작했다가 트랜잭션이 실행되면 다음 상태로 전환하게 됩니다.
EVM은 다음 수학적 함수로 작동합니다.
Y( S, T) = S'
S = 오래된 유효상태 -> (Old state)
T = 유효한 거래의 새로운 집합(T) -> (Transaction)
Y = 이더리움 상태 변환 함수Y(S, T)
S' = 새 유효 출력 상태 S' -> (New state)
이더리움의 맥락에서 상태는 수정된 머클 패트리샤 트리(Merkle Patricia Trie)라는 거대한 데이터 구조로, 모든 계정을 해시로 연결하고 블록체인에 저장된 단일 루트 해시로 축소할 수 있다.
기본적으로 트랜잭션은 EOA에서 생성된다.(하단에 있다. 참고) 트랜잭션은 이더리움 계정의 암호화 서명된 명령어 집합이다. 트랜잭션에는 두 가지 유형이 있다. 메세지를 호출하는 트랜잭션과 컨트랙트를 생성하는 트랜잭션이 있다.
이더리움의 모든 트랜잭션은 항상 EOA에서 만들어지고 블록체인에 업로드되며 CA는 외부세계와 이더리움 내부세계를 이어주는 소통창구다.
1. 스택 : EVM은 스택기반 아키텍쳐를 가지고 있고 하나의 빈 스택이 있으며 스택에 들어가는 요소의 크기는
256 bits고 스택의 최대 크기는 1,024 개수다.
2. 메모리 : EVM은 메모리를 가지고 있고 Word-Address 형식의 바이트 배열로 데이터를 저장함, 메모리는 휘발성이라서 프로그램이 종료하면 메모리내에 데이터는 사라짐
3. 스토리지 : 비휘발성이고 시스템 상태에 따라 유지됨 특정한 명령어로만 접근 가능한 Virtual ROM이라는 공간에 프로그램 코드를 분리해서 저장함
EVM의 초기상태는 하단의 코드블럭과 같다.
EVM은 트랜잭션을 반복 실행하며 각 사이클에서 시스템 상태(이더리움의 전역 상태)와 머신상태(Machine State)를 계산함
PC(Program Counter, 명령어 포인터) : 0
Stack : []
Memory : []
Storage : {}
EVM 동작 시뮬레이션
첫 번째 트랜잭션 : CA(Contract-Creating, 컨트랙트 생성) 트랜잭션
1. 새로운 CA를 만들기 위해서 새로운 계쩡의 주소를 정의해야함
2. 논스를 0으로 설정
3. 송신자가 CA 생성 트랜잭션 이더를 함께 보낸 경우, 이를 CA의 잔금(Balance)로 설정
4. EOA 계정의 잔금에서 Value만큼 제외
5. CA의 스토리지를 빈 값으로 초기화
6. CA의 코드를 빈 문자열의 해시값으로 초기화
두 번째 트랜잭션 : 메세지 호출(Message Call)
입력 데이터를 가지고 있을 수 있음
메세지 호출은 한번 실행되면 출력 데이터를 포함한 추가적인 요소를 가질 수 있음
따라서 한 자식 노드값만 바꿔도 전체 노드의 해싱 값이 변한다.
이더리움 블록헤더는 세 개의 머클 트리 구조 루트 노드의 해시값이 저장되어 있음
1. 상태 트리(State Tree) : 트랜잭션과 연관된 계정의 상태정보 저장
2. 트랜잭션 트리(Transaction Tree) : 현재 블록 트랜잭션 정보 저장
3. 영수증 트리(Receipt Tree) : 현재 블록의 거래 영수증 정보 저장
persistent : 1.지속하는 / 2.끈기 있는 / 3.끊임없는
immutable : 1.불변의 / 2.바꿀 수 없는 / 3.변경할 수 없는
enormous: 막대한, 거대한, 악독한
reducible: 환원 가능, 줄이할 수 있는
참고하면 좋은 링크
이더리움 계정 : https://ethereum.org/en/developers/docs/accounts/
패트리샤 머클트리 : https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/
go-ethereum/p2p/discover/v4wire (0) | 2023.03.01 |
---|---|
Ethereum 노드 아키텍처 (실행 클라이언트와 컨센서스 클라이언트) (0) | 2023.02.25 |
EVM (Ethereum Virtual Machine) (0) | 2023.02.06 |
Ethereum(이더리움) (0) | 2023.02.06 |
로컬에서 두개의 노드 연결 (PoW 버전 geth) (0) | 2023.02.04 |