[Cryptography] Ethereum

이민기·2022년 6월 3일
0

BlockChain & Cryptography

목록 보기
11/12
post-thumbnail

Ethereum

Vitalik Buterin이 2013년에 제안한 BlockChain 시스템이며 Bitcoin을 확장했다고 볼 수 있다. 대표적인 특징으로 EVM(Ethereum Virtual Machine)과 Smart Contract 등이 있다.

Ethereum의 특징

  • 한 블록의 평균 크기는 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과 메인 네트워크에 영향을 주지 않는다는 점은 비슷하다. 🥲


Account

EOA(Externally owned accounts)

Private Key를 통해 사용하며 새로운 transaction을 생성할 수 있다.

CA(Contract accounts)

Contract Code를 통해 사용하며 CA는 스스로 새로운 transaction을 생성할 수 없다

Account State

  • nonce : EOA에서의 nonce는 EOA에서 Tx를 생성할 때 마다 증가하며, CA에서의 nonce는 account에 의해 Contract가 생성될 때 마다 증가한다
  • balance : 해당 주소의 소유 Wei의 총 합
  • storageRoot : Storage trie의 Root Node를 hashing한 값
  • codeHash : CA에서의 codeHash는 EVM을 통해 만들어진 hash값이며 EOA에서는 빈 문자열을 hashing한 값이다

Trie

이더리움에서 트리는 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상의 유지되는 데이터 등이 저장된다


Fee

Ethereum에서는 transaction의 gas fee와 storage fee를 이용하여 반복문의 무한반복, 네트워크 공격 등에 대한 문제를 대비했다.

Gas & Gas limit

  • 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 Price 20gwei × Gas limit 50,000

Storage fee

사용한 Storage 만큼의 fee가 사용되며 최소 32byte에 비례해서 fee가 사용된다.

Contract를 이용해 사용한 storage를 초기화 한다면 일부 gas fee를 반환받을 수 있다.
자세한 내용은 이더리움 황서에서 Appendix G부분에서 확인 가능하다


Transaction & Messages

이더리움에서는 Transaction뿐만 아니라 Internal Transaction(Messages)으로 구분되는 Transaction이 있다

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 (Messages)

Internal Transaction은 Contract에 의해 호출된 Transaction을 의미한다

🧐 Internal Transaction에서 연산 등을 위한 gas는 최초의 실행시킨 EOA가 지불한다.

Execution

모든 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

이더리움의 Block은 BlockHeader, Transaction의 정보, ommer Block의 header 등으로 구성되어 있다

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에서 사용하는 값

Uncle (Ommer, Stale) Block

fork된 Block으로 메인 네트워크에는 영향을 주지 못하는 Block

  • 메인 네트워크에 존재하는 Block은 Stale Block을 Uncle Block으로 제안할 수 있다.
    Uncle Block을 제안할 수 있는 최대 갯수는 2개이며 검증을 통해 진행되고 Uncle Block으로 확정되면 블록 체굴보상의 1/32를 보상받는다

  • Uncle Block을 Mining한 Miner도 보상을 받는다.
    Uncle Block Mining Reward = ((Un+8Bn)/8)( (U_n + 8 - B_n) / 8) × 기존의 채굴 보상
    UnU_n : Uncle Block의 nonce , BnB_n : 현재 Block의 nonce

    ✏️ 현재 Block의 nonce와 Uncle Block의 nonce가 같을 경우 기존의 채굴 보상을 받는 것이 이닌 fork로 처리 되어 어떤 체인을 선택하느냐로 나뉘기 때문에 Uncle Block Mining Reward는 없다

EVM & Contact

Contract

solidity를 이용한 어떤 상태를 다른 상태로 변환 시킬수 있는 기능을 포함한 계약을 위한 스크립트 언어로 작성된 프로그램

Contract 생성시 초기화

  • nonce는 0으로 설정한다.

  • Contract를 생성하는 Transaction에 value값이 있다면 value값을 넣어 balance를 설정하고 sender의 balance에서 제한다.

  • storage는 null값을 넣고, codeHash에는 빈 문자열을 hashing한 값을 넣어 설정한다.

📌 최초의 생성시 이더리움 황서에 나와있는 Gas비가 사용되며 사용하는 Storage용량에 비례하여 추가로 더 Gas를 사용한다.
𖤐만약 가스비가 모자른 상황(out-of-gas)이 발생할 경우 상태는 Transaction이 실행되기 전으로 돌아가지만 sender는 Gas를 반환받을 수 없다.

Ethereum Virtual Machine (EVM)

EVM을 통해 모든 Node들은 Contract를 실행할 수 있으며 32bytes 스택기반의 아키텍쳐이다.

특징

  • volatile memory : 실행 중에만 사용하는 변수들이 들어가며 stack, arguments, memory를 사용한다

  • non-volatile memory : 실행 이후에도 지속되는 변수들이 들어가며 code, storage를 사용한다.
    ↪ ✓ 실행 이후에도 지속되는 변수는 Storage Trie에 저장되므로 용량의 크기에 따라 Storage fee가 발생한다

profile
블로그를 옮기는 중입니다. https://min71.dev

0개의 댓글