이더리움의 특징
Blockchain 2.0
- 분산 어플리케이션
- 스마트 컨트랙트 탑재
분산화된 상태 전이
- 트랜잭션이 기반한 상태 기술
- 이전상태로 돌아갈 수 없다
- 암호화 알고리즘 적용
- 블록은 현재 이더리움의 상태를 나타낸다
- 모든 사용자가 동일한 상태를 공유한다
이더리움 계정
비트코인과 다르게 계정이 2개
(1) 외부 소유 계정(EOA, External Owned Account)
개인이 소유하는 지갑과 같은 계정
- CA가 가진 배포 코드를 RPC 방식으로 실행할 수 있다
- 스마트 컨트랙트를 작성해 CA가 실행하도록 할 수 있다
- 메세지를 보내기 위해 서명을 한 뒤 새로운 트랜잭션을 생성해서 이더리움 네트워크에 송신해야 한다
(2) 컨트랙트 계정(CA, Contract Account)
컨트랙트 코드 실행을 위한 계정
- 관리자가 설정하고 생성하는 계정
- 배포된 코드와, 컨트랙트 코드 보유
- 거래나 메세지를 수신하면 컨트랙트 코드 실행
- 이더리움을 채굴할 수 있는 계정
- 배포된 코드와 저장 공간이 존재하며, 스마트 컨트랙트 역할을 수행할 수 있다
1. 이더리움 계정의 정보
이더리움 계정이 기본적으로 갖고 있는 정보들
- address: 20바이트의 주소
- state: 계정의 상태
- 어느 한 시점에 잔액, 거래 내역을 기록
- 모든 이더리움 참여 node가 상태를 공유
- nonce: 각 트랜잭션이 한번만 처리되게 하는 카운터
- value: 계정의 ether 장고
- contract code: 계정의 컨트랙트 코드(CA에만 존재)
- storage: 계정의 저장공간(CA에만 존재)
2. stateObject
상태의 수정이 발생한 이더리움 객체
- 이더리움 주소
- 주소의 hash값
- 이더리움 계정
- 상태를 저장하는 DB
- 실행할 contract 코드
3. 이더리움 상태 전이
트랜잭션에 의해 상태가 변하는 것
트랜잭션: ETH 거래, contract 코드 실행 등의 활동
트랜잭션
- EOA가 요청하는 정보를 가지고 있는 서명된 데이터 패키지
- 서명했다: EOA의 개인키로 트랜잭션을 인증
- 트랜잭션은 생성된 뒤 채굴중인 블록에 저장되고, 블록이 연결될 때 실행된다
- 계정의 상태 변화를 유발하는 트리거
1. 트랜잭션의 정보
- to: 메세지 수신처(EOA 계정, 스마트 컨트랙트 주소…)
- signature: 발신자를 확인할 수 있는 서명
- value: 수신처로 보내는 ether의 양
- data: 데이터 필드
- 컨트랙트 메세지, 수행 코드 등을 담을 수 있다
- gaslimit: Start Gas값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수
- gasprice: 매 계산단계마다 발신처가 지불하는 수수료
Gas
- 악의적 무한 루프, 계산 낭비등을 방지하기 위해 실행의 계산 단계수를 설정하는 단위
2. 트랜잭션 종류
(1) 외부 트랜잭션
EOA가 EOA혹은 CA에게 보내는 서명된 메세지: 메세지를 검증
- EOA -> EOA: 잔액 변경
- EOA -> CA: contract 코드 실행
- 계정의 상태 변화를 유발하는 트리거
(2) 내부 트랜잭션
- CA가 EOA, CA에게 보내는 서명되지 않은 메세지
- contract 함수 호출에 사용
- 블록체인 저장 X
3. 트랜잭션의 사용
- 이더를 다른 계정이나 컨트랙트로 보내는데 사용
- 배포 코드를 호출할 때 사용
- 스마트 컨트랙트 실행을 요청할 때 사용
트랜잭션 구조
type txdata struct {
AccountNonce // 외부 트랜잭션의 수(번호)
Price // 트랜잭션 실행 위한 수수료
GasLimit // 트랜잭션 실행 위한 최대 가스량
Recipient // 트랜잭션의 도착지
Amount // 거래하고자 하는 eth 양
Payload // 메세지, 함수 호출등 정보
V, R, S // 서명정보
}
// transaction.go에 저장
트랜잭션 리시트(Receipt)
트랜잭션 실행결과를 기록한 결과
블록
이더리움 장부에 기록되는 저장 단위
트랜잭션들의 집합
block.go에 저장
type Block struct {
header
uncles
transactions
}
type Header struct {
ParentHash // 이전 블록 해시값
UnclesHash // 파생된 블록의 해시값
// 블록번호, 가스량, 채굴자 등 data...
}
(1) 엉클 블록(uncle block)
동일 시점에 채굴된 블록중, 난이도가 낮아 메인 체인에 연결되지 못한 블록
블록 생성시간이 빠를 수록 엉클 블록일 확률이 높다.
승인되지 않은 블록
(2) 작업 증명(PoW, Proof of Work)
Ethash
- bitcoin의 PoW 문제점 해결
- 계산은 어렵게 검증은 쉽게