Vitalik Buterin이 2013년에 제안한 BlockChain 시스템이며 Bitcoin을 확장했다고 볼 수 있다. 대표적인 특징으로 EVM(Ethereum Virtual Machine)과 Smart Contract 등이 있다.
한 블록의 평균 크기는 2KB
EVM을 통해 Smart Contract실행이 가능
↪Smart Contract는 Turing Complete하다고 표현된다.
BitCoin은 총 발행량이 2,100만개로 반감기가 있지만 이더리움은 정해진 총 발행량이 없다.
Bitcoin은 Longest Chain을 선택하는 프로토콜을 사용하지만 Ehereum은 Heaviest Chain을 선택하는 프로토콜을 사용한다.
↪ Bitcoin은 height가 제일 높은 Chain을 선택하지만, Etereum같은 경우는 Subtree가 많은 체인을 선택한다.
Uncle Block을 채굴한 Miner에게도 어느정도 보상을 제공한다
↪ Uncle Block이란 Bitcoin에서 Orphan Block과 메인 네트워크에 영향을 주지 않는다는 점은 비슷하다. 🥲
Private Key를 통해 사용하며 새로운 transaction을 생성할 수 있다.
Contract Code를 통해 사용하며 CA는 스스로 새로운 transaction을 생성할 수 없다
nonce
는 EOA에서 Tx를 생성할 때 마다 증가하며, CA에서의 nonce
는 account에 의해 Contract가 생성될 때 마다 증가한다Wei
의 총 합 codeHash
는 EVM을 통해 만들어진 hash값이며 EOA에서는 빈 문자열을 hashing한 값이다이더리움에서 트리는 Merkle Patricia Trie를 이용하며 모든 block의 header에는 State Trie
, Transaction Trie
, Recipts Trie
의 root값이 존재한다
State Trie : 위에서 알아본 Account State들이 주로 저장된다.
↪ key
값은 account 값이고 value
값은 accout의 state로 [nonce, ..., storageRoot]값으로 구성되어 있다.
Transaction Trie : 각각의 block으로부터 구분되어 있으며 block이 mining된 이후엔 update되지 않는다.
↪ key
값은 block내에서 transaction의 index값이며 value
값은 nonce, gas price 등으로 구성되어 있다
Recipts Trie : transaction의 결과에 대해 저장하며 transaction의 영수증과 같은 역할을 한다
↪ key
값은 Transaction Trie
와 같이 block내에서 transaction의 index값이며 value
값은 gas used, post-trx state 등으로 구성되어 있다
Storage Trie : Contract상의 유지되는 데이터 등이 저장된다
Ethereum에서는 transaction의 gas fee와 storage fee를 이용하여 반복문의 무한반복, 네트워크 공격 등에 대한 문제를 대비했다.
Gas : Transaction을 실행하기 위한 fee
Gas Price : Transaction을 위해 사용할 Gas의 단위
Gas limit : Transaction을 위해 사용할 최대 Gas량을 의미하며 Transaction실행 후 잔액은 반환
Max transaction fee : Transaction실행을 위해 사용할 Gas와 Gas limit을 곱한 값으로 Transaction실행 후 잔액은 반환
✏️ Max transaction fee
0.001 eth
= Gas Price20gwei
× Gas limit50,000
사용한 Storage 만큼의 fee가 사용되며 최소 32byte에 비례해서 fee가 사용된다.
Contract를 이용해 사용한 storage를 초기화 한다면 일부 gas fee를 반환받을 수 있다.
자세한 내용은 이더리움 황서에서Appendix G
부분에서 확인 가능하다
이더리움에서는 Transaction뿐만 아니라 Internal Transaction(Messages)으로 구분되는 Transaction이 있다
Transaction의 구성 요소
nonce : sender가 보낸 Transacion의 counting된 수
gas Price : Transaction을 위해 사용할 Gas의 단위
gas Limit : Transaction을 위해 사용할 최대 Gas량을 의미하며 Transaction실행 후 잔액은 반환
to : Transaction을 받는 주소
value : 보내는 Eth
, 혹은 Wei
의 양
↪ ✏️ Contract를 생성하는 Transaction에도 사용가능하며 이 경우, Contract의 최초 셋팅 balance이다
v, r, s : 서명한 sender를 식별할 수 있는 요소
init : Contract를 생성하는 Transaction에만 존재하며 최초의 Contract의 셋팅값을 포함해 CA를 초기화하며 이후 byte code를 리턴한다
data : message call에만 존재하는 optional Field이며 parameter등이 들어간다.
🤔 Transaction을 검증 하기 위해서 누가 보낸 Transaction인지를 알아야 하지만 from항목이 없다.
이더리움 Transaction에서는 from 대신v
,r
,s
라는 요소를 넣어 검증을 하는데v
,r
,s
는 각각 ECDSA에 의해 생성된 전자 서명r
,s
와 어떤 공개키인지를 추측할 수 있는v
로 구성되어 있다.
↪ ECDSA를 검증하는 자세한 과정은 여기에서 찾아보자.
Internal Transaction은 Contract에 의해 호출된 Transaction을 의미한다
🧐 Internal Transaction에서 연산 등을 위한 gas는 최초의 실행시킨 EOA가 지불한다.
모든 Transaction 실행 조건
RLP 포멧으로 셋팅
Transaction의 Signature 검증
Transaction의 nonce와 sender account의 nonce와 같은지 확인
Transaction의 gas Limit이 기본적으로 사용되는 gas들의 합보다 많은지 확인
↪Transaction을 실행하기 위해 필요한 기본 21,000gas를 포함해 사용할 Storage fee 등을 계산한다
sender의 account에 있는 balance가 지불할 금액보다 많은지 확인
𖤐 Transaction의 Storage fee는
4 * X + 68 * Y
로 계산한다.
↪ X는 byte code로 변경했을 때 0인 값이고, Y는 0이 아닌 다른 수인 값이다.
𖤐 조건이 확인되면 Transaction은 아래와 같은 순서로 실행된다
1. sender의 balance에서 지불할 금액과 Gas를 제한다
2. sender의 account nonce의 값에 1을 더한다
3. subState을 추척한다
↪ Transaction을 실행시키는 중에 trie에 직접 접근할 수 없으니 trie에서 필요한 데이터를 불러와 임시로 저장하는 subState를 사용한다.
4. 필요한 여러가지 연산을 한 후 refund amount를 계산하여 sender에게 반환한다.
↪ refund amount
는 사용하지 않은 gas(unused gas
) + 사용하던 storage 초기화하여 받는 refund(refund of clearing up storage
)로 계산한다
5. 반환받지 않은 gas는 Miner에게 지급되며 이를 위해 Block에 gas counter
에 더한다
6. Transaction이 종료되며 subState에 있는 지워질 account들은 삭제한다
↪삭제라는 표현을 사용했지만 실제로 삭제가 아닌 Account State에서 nonce와 balance는 0으로, storageRoot는 NULL값, codeHash는 빈 문자열을 hashing한 값을 넣어 초기화 한다
subState에는
Self-destruct set
,Log series
,Refund balance
가 있다.
- Self-destruct set : Transaction 실행 후 삭제될 amount의 리스트
- Log series : log 리스트
- Refund balance : sender가 반환받을 금액
이더리움의 Block은 BlockHeader
, Transaction의 정보
, ommer Block의 header
등으로 구성되어 있다
Block Header의 구성 요소
parentHash : previous Hsah를 의미하며 이전 블록의 주소값
uncleHash : 현재 블록의 uncle block 리스트
beneficiary : Miner의 주소
stateRoot : state trie의 root Node를 hashing한 값
transactionRoot : transaction trie의 root Node를 hashing한 값
reciptseRoot : recipts trie의 root Node를 hashing한 값
logsBloom : log 정보를 담은 Bloom filter
difficulty : 해당 블록의 난이도
number : 현재 블록의 번호
gasLimit : 블록에 포함된 Transaction들의 총 Gas Limit 값
gasUsed : 블록에 포함된 Transaction들에서 사용한 총 Gas 값
timestamp : 현재 블록 생성시간을 Unix timeStamp로
extraData : Block의 여유 공간
mixHash : 이더리움의 PoW 알고리즘 Ethash의 mixing된 값을 저장
nonce : 이더리움의 PoW 알고리즘 Ethash에서 사용하는 값
fork된 Block으로 메인 네트워크에는 영향을 주지 못하는 Block
메인 네트워크에 존재하는 Block은 Stale Block을 Uncle Block으로 제안할 수 있다.
↪Uncle Block을 제안할 수 있는 최대 갯수는 2개이며 검증을 통해 진행되고 Uncle Block으로 확정되면 블록 체굴보상의 1/32를 보상받는다
Uncle Block을 Mining한 Miner도 보상을 받는다.
↪ Uncle Block Mining Reward = × 기존의 채굴 보상
↪ : Uncle Block의 nonce , : 현재 Block의 nonce
✏️ 현재 Block의 nonce와 Uncle Block의 nonce가 같을 경우 기존의 채굴 보상을 받는 것이 이닌 fork로 처리 되어 어떤 체인을 선택하느냐로 나뉘기 때문에 Uncle Block Mining Reward는 없다
solidity를 이용한 어떤 상태를 다른 상태로 변환 시킬수 있는 기능을 포함한 계약을 위한 스크립트 언어로 작성된 프로그램
Contract 생성시 초기화
nonce는 0으로 설정한다.
Contract를 생성하는 Transaction에 value값이 있다면 value값을 넣어 balance를 설정하고 sender의 balance에서 제한다.
storage는 null값을 넣고, codeHash에는 빈 문자열을 hashing한 값을 넣어 설정한다.
📌 최초의 생성시 이더리움 황서에 나와있는 Gas비가 사용되며 사용하는 Storage용량에 비례하여 추가로 더 Gas를 사용한다.
𖤐만약 가스비가 모자른 상황(out-of-gas
)이 발생할 경우 상태는 Transaction이 실행되기 전으로 돌아가지만 sender는 Gas를 반환받을 수 없다.
EVM을 통해 모든 Node들은 Contract를 실행할 수 있으며 32bytes 스택기반의 아키텍쳐이다.
특징
volatile memory : 실행 중에만 사용하는 변수들이 들어가며 stack
, arguments
, memory
를 사용한다
non-volatile memory : 실행 이후에도 지속되는 변수들이 들어가며 code
, storage
를 사용한다.
↪ ✓ 실행 이후에도 지속되는 변수는 Storage Trie에 저장되므로 용량의 크기에 따라 Storage fee가 발생한다