[이더리움] 1주차 과제 기본질문 - Basic
올해 하반기 오픈소스 컨트리뷰션 아카데미에 참여하게 되었다. 약 4~5개월동안 오픈소스 주제를 하나 선택해서 멘토와 함께 프로젝트에 기여를 하는 과정이다. 나는 원래 1지망으로 크로미움/블링크를 선택했으나, 안타깝게도 2지망으로 선택한 이더리움으로 배정이 되었다. 물론 이 역시 관심이 있었던 주제였기 때문에 올해 하반기에는 이 프로젝트에 몰입해서 재미있게 해 보려고 한다.
나의 경우 2019년 SW 마에스트로를 하면서 하이퍼레저 패브릭(Hyperledger Fabric)이라는 블록체인을 다룬 프로젝트를 했었던 경험이 있다. 그 당시에는 프라이빗 블록체인 기반 공연 티켓 어플리케이션을 만들었던 것으로 기억이 난다. 관련 발표 자료
첫 번째 주차 과제로는 이더리움 관련된 여러가지 질문들에 대해 나름대로 답을 준비하는 것이었다. 질문이 많아서 두 번에 나누어서 포스팅을 해 보려고 한다.
질문 1. 머클 패트리시아 트리와 머클 트리의 차이점에 대해서 쉽게 설명해주세요.
- 머클 패트리시아 트라이(Merkle Patricia Trie)
- 이더리움(Ethereum)에 사용된다.
- 트라이(Trie)
- 이더리움 블록 헤더는 3개의 트리를 가지고 있고, 3개의 다른 대상을 가리킴
- Transaction → Merkle Tree로 충분하다.
- Receipt
- State → key-value 매핑 구조
- Operation이 실행될 때 마다 트리 전체가 재계산(recalculate)된다.
- 4 가지 노드 타입이 있다.
- Empty Node : 단순한 빈 노드
- Leaf Node : 하나의 key와 하나의 value를 가진 기본 노드
- Branch Node : 길이 17의 리스트, 첫 16개 요소는 hex char에 대응되고 key값. 마지막 하나는 value값
- Extension Node : Key-Value 노드. 여기서 value는 다른 노드의 Hash
- 머클 트리(Merkle Tree, Hash Tree)
- 비트코인(Bitcoin)에 사용된다.
- 데이터의 간편하고 확실한 인증을 위해 1979년 Ralph Merkle에 의해 만들어진 개념
- 이진 트리(Binary Tree)
- 두 개씩 거래를 묶은 후 SHA256 알고리즘을 통해 해시값으로 나타냄 → 그렇게 묶은 값 두 개를 또 묶어서 해싱 → ... → 수 많은 거래를 가장 꼭대기의 하나의 데이터(그림에서는 $h_{1,8}$)로 만듦
- 거래량(N)이 기하급수적으로 늘어나도 특정 거래를 찾는 경우의 수($log_2N$)는 단순
- 예를 들어 $h_5$를 찾는다고 했을 때 해싱이 되는 과정은 총 세 번이다. (H($h_5$,$h_6$), H($h_{5,6}$,$h_{7,8}$), H($h_{1,4}$,$h_{5,8}$))
- 1024개의 거래가 이루어져도 해싱이 이루어지는 과정은 $log_21024$=10 번이다.
- 특정 거래 데이터를 쉽게 찾을 수 있다.
- 거래의 위변조도 쉽고 빠르게 알 수 있고 이를 방지할 수 있다.
- 풀노드(full node)가 아닌 라이트 노트(light node)로 적은 용량으로 효율적으로 거래를 찾을 수 있다.
- 현재 상태(state)를 알 수 없다.
질문 2. 이더리움의 스마트 컨트랙트 코드가 저장되는 장소는 어디인지? 이더리움의 "계정"은 어떤 종류가 있고 어떤 데이터 구조를 가지고 있는지 설명해주세요.
- 하나의 사용자가 생성한 스마트 컨트랙트 코드는 이더리움 클라이언트(이더리움 블록체인에 참여하는 노드)를 통해 블록에 포함된다. 따라서 다른 노드에서 코드가 복사되고 각 노드의 EVM에서 코드를 실행시킬 수가 있다.
- 이더리움 주소와 개인키의 조합을 계정(accounts)이라고 한다. 이더리움 계정은 이더 잔고를 보유하고 트랜잭션을 전송할 수 있다. 이더리움에는 다음 두 가지 종류의 계정이 있다.
- 외부 소유 계정(External Owned Account, EOA) : 위에서 언급한, 공개 주소와 개인키의 조합을 말한다. EOA를 사용하면
- 다른 계정과 이더를 송수신하고
- 스마트 컨트랙트에 트랜잭션을 보낼 수 있다.
- 컨트랙트 계정(Contract Account, CA) : 컨트랙트 계정에는 상응하는 개인키가 없다. 이 계정은 스마트 컨트랙트를 블록체인에 배포할 때 생성된다. 역할은
- 다른 계정과 이더를 송수신하고
- 관련된 코드를 담고
- EOA나 다른 컨트랙트의 호출을 받아 트랜잭션을 발생시킨다.
- 외부 소유 계정(External Owned Account, EOA) : 위에서 언급한, 공개 주소와 개인키의 조합을 말한다. EOA를 사용하면
질문 3. 이더리움 가스와 런던 하드포크의 EIP1559의 동작 방식에 대해서 설명해주세요.
- 하드포크: 암호화폐 네트워크에서 역 호환이 가능하지 않은 업그레이드
- 소프트포크 : 역 호환이므로 노드가 새 업데이트를 만족스럽지 않더라도, 새로운 기능 없이 네트워크에 남아 있을 수 있음
- 이더리움 런던 업데이트
- 이더리움 런던 하드포크는 두 개의 EIP(Ethereum Improvement Proposals, 이더리움 개선 제안)를 포함한 몇 가지 새로운 기능을 제공
- 기본적으로 런던 하드포크는 세레니티나 이더리움 2.0이 출시될 때 작업증명(PoW)에서 지분증명(PoS)으로의 이더리움 전환을 준비하는 데 목적
- 이더리움 트랜잭션 수수료 시스템 변경
- 트랜잭션 속도를 결정하기 위해 트랜잭션 수수료를 직접 선택하는 대신, 이더리움 네트워크는 가스 요금에 입찰하지 않고도 블록별 기본요금으로 트랜잭션 수수료를 책정
- 트랜잭션 속도도 모든 사용자에게 동일하게 적용
- EIP-1559
- 업데이트 이전 채굴 수수료 → 채굴비용 = 가스 비용 * 사용한 가스
- 업데이트 이후 채굴 수수료 → 거래 수수료 =(기본 수수료(baseFee) + 급행 전송 수수료(PriorityFee))* 사용한 가스
- 기본 수수료(base fee)는 이전 블록 사용에 따라 자동으로 조정되며, 현재 블록의 사용률이 50% 이상이면 증가하고, 50% 미만이면 하락하는 구조
- 급행 전송 수수료(priority fee)는 채굴자에게 주어지는 팁이라고 인식할 수 있다. 이전의 거래 수수료 책정 방식인 최고가격입찰제와 같은 구조
- 모든 사람에게 수수료를 고정해 부과하는 것을 계획
- 각 트랜잭션에 사용되는 수수료는 소각(burned)되므로 총공급량에서 이더(ETH)가 감소
참고자료
https://brownbears.tistory.com/372
https://www.banksalad.com/contents/쉽게-설명하는-블록체인-머클트리-Merkle-Trees-란-ilULl
https://ihpark92.tistory.com/48
https://hamait.tistory.com/959
https://steemit.com/cryptocurrency/@nadifsd/merkle-patricia-tree
https://www.youtube.com/watch?v=wwrf87bq6jo
https://github.com/zhangchiqing/merkle-patricia-trie
https://opentutorials.org/course/2869/19273
https://programmers.co.kr/learn/courses/7322/lessons/42389
https://steemit.com/kr/@feyee95/5lzztc
https://learn.bybit.com/ko/blockchain-kr/what-is-ethereum-london-hard-fork/