1. 이더리움이란?
- 비탈릭 부테린이 2015년 개발한 2세대 블록체인
- Ethereum is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference.
스마트 컨트랙
- 스마트 컨트랙즉, 어느 조건에 맞으면 자동으로 실행되는 계약조건
- 사기, 중간, 검열 등 제 3자의 방해 가능성이 전혀없이 프로그래밍된 대로 동작하는 프로그램
스마트 컨트랙
2. 비트코인의 문제점 해결
1. 튜링 불완정성
- 비트코인 스크립트로 할 수 있는 작업(서명, 검증 등)이 많긴 하지만 모든 경우의 프로그래밍을 다 지원하지는 않는다. 특히 반복문을 지원하지 않아서 공간 비효율적이다.
- 왜 비트코인이 반복문을 사용하지 않았는가?
- 코드 실행시 무한 루프에 빠지는 것을 방지하기 위해
2. 가치의 불투명성
- 코인의 가치를 외부에서 받아와서(오라클 문제) 해당 가치만큼을 분배하려고 할 때, 비트코인의 경우 UTXO에서 일부만 사용이 불가능하다. 일부만 사용하기 위해서는 전체를 input으로 하고 일부를 수신자에게 보내고 나머지를 자신에게 보내는 비효율적인 작업을 해야 한다.
- acount 개념 도입
- 모든 트랜잭션의 실행 주체이자 기본 단위로서 모든 것은 어카운트에서 시작한다.
- 이더리움 내의 화폐 단위 ETH(이더) 잔액을 가지고 있다.
- 스마트 컨트랙트 코드를 포함하고 있다.
- 넌스(nonce) : 해당 어카운트로부터 보내진 트랜잭션의 수, 0으로 시작한다. 트랜잭션을 오직 한 번만 실행되게 할 때 사용하는 카운터.
- 잔액(balance) : 어카운트의 이더 잔고
- 루트(root) : 해당 어카운트가 저장 될 머클 패트리시아 트리의 루트 노드
- 코드해시(codehash) : 스마트 컨트랙트 바이트 코드의 해시어카운트 정보
3. 상태의 단순성
- 비트코인은 애초에 지불 수단으로 개발되었기 때문에, 비트코인을 주고 받는 용도로 밖에 사용할 수 없다. 다른 데이터를 넣을 수 없다.
- 트랜잭션에 잔액뿐만 아니라 다른 데이터를 넣을 수 있는 공간을 마련
4. 블록체인 해석 불가
- 비트코인의 트랜잭션에서는 블록체인 내에서 랜덤성을 띄고 있는 값들(논스, 이전 블록의 해시, 타임스탬프)을 불러서 사용할 수 없다. 그래서 비트코인은 지급 결제 기능 외의 랜덤성을 요구하는 도박과 같은 어플리케이션을 만드는게 한계가 있다. 비트코인 스크립트의 한계
- World States 개념 도입
- 블록의 상태를 읽어 올 수 있는 명령어 등을 제공
- Solidity 제공
- Block과 Transaction의 정보를 가져올 수 있는 함수를 제공한다.
3. Message와 Transaction
트랜잭션
- EOA의 개인키로 서명된 메세지 패키지
- 구성 요소
- AccountNonce : 발신자가 보낸 트랜잭션의 개수를 의미하며, 0으로 시작한다.
- Price : 수수료로 지급할 Gas 가격 (Wei)
- GasLimit : 최대 Gas 사용 범위
- Recipient : 수신처의 주소
- Amount : 전송할 이더의 양 (Wei)
- Payload : 옵션 필드로 스마트 컨트랙트 호출 시 필요한 매개변수를 저장할 수 있다. => Lack of state 해결
- V,R,S : 서명에 필요한 값들
메세지
- CA가 다른 CA에서 보내는 트랜잭션
- CA가 보내기 때문에 서명이 되어 있지 않다.
상태 변환 함수
- 상태 변환 시 오류가 없는 지 체크하고 오류가 없을 경우 해당 상태로 변환시킨다.
4. 프로그래밍 언어
⇒ 튜링 불완전성 해결
- Solidity
- Serpent
- LLL(Low Level OPCODE)
EVM(Ethereum Virtual Machine)
- 프로그래밍 언어로 작성 된 코드가 플랫폼(윈도우, 리눅스, 맥)에 상관없이 할 수 있도록 통역해 주는 역할
5. 블록체인과 채굴
블록 구조
- 비트코인 블록
- 구성
- 이전 블록헤더 해시
- 타임스탬프
- 트랜잭션 머클트리 루트
- 논스
- 논스 예시
- 구성
어카운트 상태 저장 - 머클 패트리시아 트리
- 블록에 연결되어 있는 트리 종류
- 트랜잭션 머클 트리 루트 (불변)
- 리시트(트랜잭션 수행 결과) 머클 트리 루트 (불변)
- 상태 머클 패트리시아 트리 루트 (가변)
- 수시로 변경 되는 상태(어카운트 잔액 및 컨트랙트 데이터)를 효율적으로 저장하기 위한 자료구조
- 변경 된 부분만 새로 저장하고 나머지는 그냥 이전 데이터의 주소로 연결한다.
블록 검증 알고리즘
- 기본적으로 블록 생성 시 수행하는 트랜잭션 자체에 대한 검증 수행
- 트랜잭션을 전체 다 수행 할 때 소모된 총 Gas가 블록의 GasLimit을 초과하지 않는 지 검증
- 이전 블록 마지막 상태에서 시작해서 모든 트랜잭션을 수행 한 후의 상태가 현재 블록에 기록 된 상태와 같은지 검증
채굴
- 합의 알고리즘
- 작업증명(PoW, Proof of Work)
- 순차적으로 지분증명(PoS, Proof of Stake)으로 변환할 예정.
- Casper
- Etash - Anti-ASIC 작업증명
- SHA256 해시만 수행하면 됐던 비트코인과 다르게, 범용적인 명령어들을 수행해야 됨
- CPU 뿐만 아니라 수 GB에 해당하는 메모리를 사용해야 함
- ASIC(Application Specific Integrated Circuit, 주문형 반도체) 사용이 어렵게 만들었다.
수수료 (Gas)
트랜잭션
- Price : Gas 당 트랜잭션 요청자가 지급할 금액
- GasLimit : 트랜잭션 수행에 소비될 총 가스 예상량 (무한 루프 방지)
- 기본 개념
- 트랜잭션 성공 시
- 트랜잭션 실패 시
- 어떻게 Gas Price, Limit을 결정해야 하는가?
- https://ethgasstation.info/ 참고해서 결정
- ICO 같은 경우 권장 사항을 알려줌
블록
- GasLimit : 블록에 담을 수 있는 트랜잭션 GasLimit의 총 합 (2018.4.27 기준 7,996,549 Gas)
- 담을 수 있는 트랜잭션 개수 : 그때 그때 다름 https://etherscan.io/block/5520289
- 어떤 기준으로 트랜잭션을 담는가 : 수수료를 많이 받는 방향으로
참고자료
- 코어 이더리움 프로그래밍 - 박재현,오재훈, 박혜영 지음 : http://www.yes24.com/24/Goods/59621522
- 스팀잇 어미새님 : https://steemit.com/@yahweh87
- 나무 위키 : https://namu.wiki/w/Ethereum
- 한승환님 블로그 : http://www.seunghwanhan.com/2015/06/ethereum-introduction_3.html
- 이더리움 가스 개념 설명 : https://steemit.com/kr/@jinkim/gas-gas-limit-block-gas-limit-gas-price-total-fee
- 이더리움 공식 깃허브 : https://github.com/ethereum/wiki/wiki/Design-Rationale
- 이더리움 공식 블로그 - State Tree Pruning : https://blog.ethereum.org/2015/06/26/state-tree-pruning/
- 이더리움 공식 블로그 - Merkling in Ethereum : https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/
- mark wil cox 블로그 : http://markwilcox.com/articles/01/
- etherchain.org - 블록 Gas Limit : https://www.etherchain.org/charts/blockGasLimit