코수가 되는 길
Ethereum : Accounts and Transactions (1) 본문
Ethereum : A Transaction-based State Machine
- 이더리움 노드는 단순 결제보다 훨씬 더 많은 것을 검증하고 처리할 수 있음.
- 스마트 컨트랙트를 만들어 트랜잭션을 submit 할 수 있음. 이더리움 블록체인 내에 저장된 로직을 통해 이더를 전송하면 실행 가능.
- 이더리움으로 구동되는 분산형 애플리케이션인 Dapp을 개발하고 실행할 수 있음.
- 이더리움은 본질적으로 transaction-based state machine 으로, 모든 노드가 이를 받아들여야 함.
A transaction - based state machine

네트워크에 트랜잭션이 발생하기 전인 Genesis state로 시작하여 트랜잭션이 실행되면 Final state로 전환됨 어느 한 시점에서 Final state는 이더리움 네트워크의 현재 상태(Current state)를 나타냄
Blocks : Transaction 들의 그룹화

Final state에서 다음 State로 전환하기 위해서는 트랜잭션의 유효성 검사(Mining)를 거쳐야 함 .
유효성 검사(Mining) 란 Miner 노드가 Compute resource를 투입하여 유효한 블록을 생성하는 경우를 말함.
How to run smart contracts ?
- EVM은 이더리움의 모든 거래와 블록을 처리하고, 스마트 계약의 모든 계좌 잔액과 결과를 추적함 .
- 가스 = 말 그대로 연료를 의미하며, EVM 상에서 트랜잭션을 동작시키기 위해 소모되는 비용이다. 비트코인의 수수료 개념에서 좀 더 진 화된 개념으로 코드의 복잡성에 따라 다르게 측정된다.
- *mining fee = gas price x gas consumed
가스가 어떻게 책정되는지 알기 위해서는 Gas price, Gas limit, Block gas limit 가 무엇인지 알고 있어야함.
Gas price 와 Gas limit 는 사용자가 설정하며, Block gas limit 는 miner가 설정하는 값.
채굴자가 트랜잭션을 처리하는 과정을 살펴보며 가스의 가격이 어떻게 책정되는지 알아보자.
1. 채굴자들이 블록에 담을 트랜잭션들을 TxPool 에서 가져옴.
2. 트랜잭션들을 주소별 Nonce 와 GasPrice 로 순서를 매김.
3. 마이너들이 트랜잭션에 설정된 값 ( Gas limit x Gas price ) 만큼을 발신 주소로 부터 가스로 가져옴.
4. 트랜잭션을 실행하며 명령어에 따라 가스를 소모 . Gas limit 보다 남는 경우는 돌려주고 모자란 경우는 실행 취소
5. 실행된 트랜잭션들을 블록에 담는다. 이때 트랜잭션들의 개별 Gas limit 의 총합은 Block gas limit 를 넘길 수 없음.
- Gas Limit: 사용할 가스에 대한 예측치 / 넉넉하면 좋지만, 너무 높을 시 거절 당할 수 있음
- Gas Price: Gas Limit에서 1 Gas 당 가격, 높을 수록 빨리 실행된다.
- *총 비용 : Gas Limit 중 실제 사용량 * Gas Price -> mining fee = gas price x gas consumed
- Block Gas Limit: 한 블록에 넣을 수 있는 Gas Limit의 총합
EVM & Turing - complete

솔리디티 코드가 컴파일러에 의해 Ethereum Bytecode라 불리는 기계어로 만들어지고, 이 바이트코드가 EVM 에서 실행된다.
EVM은 ethereum virtual machine으로 , 블록체인 네트워크에 존재하는 노드들이 공유하는 가상 머신이다. 매우 거대한 분산 컴퓨터라고 생각해도 됨. 모든 노드들이 이 컴퓨터에 접근할 수 있고, 저장하고 있는 상태도 변경할 수 있음.
전 세계 많은 사람들이 동시에 접근이 가능하기 때문에 동일한 부분을 서로 다르게 변경했을 때 충돌이 일어날 수 있는데, 이를 중재하는 것이 EVM의 중요 역할. 마이닝과 합의 알고리즘 등을 이용해 해결함.
EVM을 사용할 때 지불하는 비용이 위에서 설명한 가스이며
가스 -> 일의 양을 나타내는 단위? 로 생각해야함.
EVM 의 동작 순서
- 트랜잭션이 올바른 형식인지 확인
- 트랜잭션 수수료 계산(Gas limit x Gas Price)
- Gas 지불 초기화. 이 시점부터 트랜잭션에서 처리된 바이트만큼 특정 양의 가스를 차감
- 트랜잭션 금액을 수신 계정으로 보냄 (Smart Contract도 이 단계에서 실행됨)
- 송신 계정에 트랜잭션을 완료할 수 있을 만큼 Gas Price가 충분하지 않으면 트랜잭션의 모든 변경 사항이 되돌려짐. 그러나, 트랙잰션 수수료는 채굴자에게 지불되고 환불되지 않음.
- 5번의 경우와 다른 이유로 트랜잭션이 실패한 경우, 송신 계정에 Gas price를 환불하고, 채굴자가 사용된 Gas와 관련된 비용은 채굴자에게 전달됨
트랜잭션을 생성할 때, Gas Limit을 정하고, EVM은 트랜잭션을 처리하면서 Gas를 소모함. Gas Limit으로 설정한 Gas가 모두 소모되면 EVM은 해당 트랜잭션을 종료시킵니다. 따라서 무한정 도는 Loop 문제를 해결함.
Ethereum Accounts
두가지 종류의 이더리움 계정(계좌)가 존재.
1. Externally owned accounts ( EOA / 외부 소유 계정 )
-> 트랜잭션을 작성하고 Private key 로 서명함으로써 다른 외부소유계정이나 계약계정에 메세지를 보낼 수 있음.
2. Contract accounts ( CA / 계약 계정 )
-> 자체적으로 새로운 트랜잭션을 발생시킬 수 없음. 타 계정에서 받은 메세지에 대한 응답으로 트랜잭션을 실행
외부소유계정은 누군가가 소유하고 있는, 지갑과 같은 계정이라고 생각하면 됨. 두 가지 계정 중 외부소유 계정이 상위 계정이고 새로 생성 는 트랜잭션은 모두 이 외부소유계정에서 시작하게 됨. 외부소유계정에서 계약과 관련된 트랜잭션을 만들면 계약계정에서 받아서 처리하게 된다고 이해.

Account state는 Account 유형에 관계 없이 네 가지 요소로 구성된다.
1. Nonce (논스) : EOA -> 한 Account에서 전송된 트랜잭션의 수
CA -> 한 Account에서 생성된 Contract의 수
2. Balance (이더 잔액) : 계정 유형에 관계 없이 한 Account가 소유한 ETH ( wei 단위로 표현 )
3. codeHash : EOA -> 빈 문자열의 Hash
CA -> 한 Account에 포함된 EVM code의 Hash
4. storageRoot : Merkle Patricia Tree * 의 Root Hash
* 이더리움의 Global state는 Account address 와 Account state 간의 매핑으로 이루어지고, 이 매핑은 Merkle Patricia Tree 구조로 이루어 짐.
이더리움의 State는 각 Account들의 상호 메세지 전달 프레임워크를 통해 변환됨.

정리
EVM의 작업은 이더리움 프로토콜에 정의된 대로 스마트 컨트랙트 코드의 실행 결과로 유효한 상태 변화를 계산하여 이더리움 상태를 업데이트 하는 것이다. 이러한 측면에서 이더리움을 트랜잭션 기반의 상태 머신으로 설명할 수 있고, 이것은 외부 주체 ( 즉, 계정 소유자 및 채굴자) 가 트랜잭션 생성, 수락 및 주문을 통해 상태 변화를 시작한다는 사실을 반영한다.
가장 상위 레벨에서 보면 이더리움 월드 상태 ( world state ) 가 있다. 월드 상태는 이더리움 주소 ( 160비트 값 ) 를 Account 에 매핑 한 것으로, 각 이더리움 주소는 이더 잔액, 논스, 계정의 스토리지, 계정의 프로그램 코드를 의미한다.
이더 잔액 (balance) 은 계좌가 소유한 웨이로 저장되고, 논스(nonce) 는 계정이 EOA 일 경우 해당 계정에서 성공적으로 전송한 트랜잭션의 수를 나타내며, 컨트랙트 계정 (CA) 의 경우에는 생성된 컨트랙트의 수를 나타낸다.
계정의 storage 는 스마트 컨트랙트에서만 사용하는 영구 데이터 저장소이고, 프로그램 코드는 계정이 스마트 컨트랙트 계정일때만 존재한다. EOA에는 항상 코드가 없고 스토리지는 비어 있다.
'Study > BlockChain' 카테고리의 다른 글
| Ethereum An Overview (0) | 2022.12.01 |
|---|