이더리움 스터디 1주차 계정, 트랜잭션, 블록생성 정리
계정을 생성해서 트랜잭션을 만들고 노드에서 어떻게 전파해서 블록을 생성하고 보상받는내용을 정리한 내용입니다.
계정(Account)
이더리움의 시작은 계정(account)입니다.
이더리움에서, 상태(state)는 어카운트(account)라고 하는 오브젝트(object)들로 구성되어 있습니다.
각각의 어카운트는 20바이트의 주소와 어카운트 간 값과 정보를 직접적으로 전달해 주는 상태변환(state transition)을 가지고 있습니다.
이더리움 어카운트는 다음 네 개의 필드를 가지고 있다.
- 논스(nonce): 각 트랜잭션이 오직 한번만 처리되게 하는 일종의 카운터
- 어카운트의 현재 이더(ether) 잔고
- 어카운트의 계약 코드 (존재한다면)[contract]
- 어카운트의 저장 공간 (초기설정(default) 상에서는 비어있음)[contract]
일반적으로 사용하는 계정을 외부 소유 어카운트(EOA Externally Owned Account)
스마트 컨트렉트를 돌리는 계정을 컨트렉트 어카운트 (CA Contract Account)라고 합니다.
트랜잭션(Transaction)
이더리움에서 사용되는 트랜잭션(transaction)이란 용어는 외부 소유 어카운트가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 말합니다.
이 트랜잭션은 다음을 포함하고 있다.
- 메시지 받는사람
- 보내는사람의 확인할 수 있는 서명
- 보내는 이더의 양
- 선택적(optional) 데이터 필드
- STARTGAS 값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수
- GASPRICE 값, 매 계산단계마다 발신처가 지불하는 수수료
- 해당지갑주소에 대응되는 개인키(private key)가 생성한 암호화된 서명(시그니처)
다음으로 트랜잭션 전파에 대해 알아봅시다.
트랜잭션 전파
브로드캐스팅으로 전파됩니다.
A에 트랜잭션이 생성되면
BC에서 전파 하고 큐에 저장(수수료 높은거부터 처리하는걸보아 우선순위큐라고 예상됨)
BC는 연결된 다른 노드들에게 전파하고 큐에 저장
p2p방식이라 중복된 경우의 트랜잭션이 전파될수있습니다.
빠르게 파악하기 위해 Transaction 해쉬값을 검색하여 중복되면 버려집니다.
또한 각 노드마다 블록생성할때 선택되는 트랜잭션은 서로 다릅니다.
블록생성
블록해더
블록 헤더는 다음의 6가지 정보로 구성된다.
- version : 소프트웨어/프로토콜 버전
- previousblockhash : 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬
- merklehash : 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값
- time : 블록이 생성된 시간
- bits : 난이도 조절용 수치
- nonce : 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가하는 계산 회수
더 많은 정보가 해더에 기록되지만 블록 헤더가 중요한 이유는 블록의 식별자 역할을 하는 블록 해쉬가 이 블록 헤더의 6가지 정보를 입력값으로 해서 구해지기 때문이다.
블록 바디는 트랜잭션으로 채워집니다.
참고
블록해더만 가지고 있는 노드를 라이트노드, 모두 가지고 있는 노드를 풀노드라고 합니다
라이트 노드는 트랜잭션을 가지고 있지않아 필요할때 풀노드에게 접근해 받아와 사용합니다.
머클트리
머클루트란 머클트리(쉽게 나무라고 생각하자)에서 뿌리 부분에 해당하는 것으로 해당 블록에 있는 모든 거래내역(수백에서 수천개 가량되는 거래량)을 요약하여 작은 사이즈의 용량으로 블록헤더에 존재하는 데이터이다.
이더리움은 이를 개선한 머클 패트리시아 트리라는 암호해시 기반의 트리 자료구조를 사용합니다.
3가지만 기억합시다.
- 트리 자료구조.
- 빠르게 트랜잭션을 검증
- 블록해더에 기록됩니다.
Nonce
nonce값을 구하는 것이 바로 작업 증명입니다.
nonce 값은, 이 nonce 값을 입력값 중의 하나로 해서 계산되는 블록 해쉬값이 특정 숫자보다 작아지게 하는 값을 말합니다.
채굴난이도는 nonce값의 계산의 어려움의 정도를 나타냅니다.
nonce를 하나씩 올리보면서 blockhash가 특정값보다 작은 값이 되면 작업증명된것으로 생각하시면됩니다.
작업증명검증
트랜잭션을 받은 노드는 전자서명을 확인하고 블록을 생성하기 위한 요건을 만족시키는 해답을 찾기 시작합니다.
처음 조건을 만족하는 해답을 발견한 승인자는 생성한 블록을 참가자 전원에게 브로드캐스트로 전달합니다.
블록을 받은 각 노드는 정당한 블록인지 검증합니다.
조건에 맞으면 자신의 블록체인에 추가합니다.
이 체계에서 하나의 블록이 유효한지 아닌지를 확인하기 위한 알고리즘은 다음과 같습니다.
- 이 블록에 의해 참조되는 이전 블록이 존재하는지, 유효한지 확인합니다.
- 타임스탬프 값이 이전 블록의 타임스탬프 값보다 크면서 2시간 이내인지 확인합니다.
- 작업증명(proof of work)이 유효한지 확인합니다.
- S[0]를 이전 블록의 마지막 상태(state)가 되도록 설정합니다.
- TX를 n개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정합니다. 폐구간 0...n-1의 모든 i에 대해, S[i+1] = APPLY(S[i], TX[i])집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료합니다.
- 참(true)을 리턴하고, S[n]를 이 블록의 마지막 상태로 등록합니다.
작업증명이 끝나면 블록의 트랜잭션을 확인하여 가지고있는 트랜잭션(padding상태)을 확인하고 처리됨 처리해야 될것으로 예상됩니다.(확실치는 않내요.)
거짓을 리턴 받으면 작업증명 실패로 취급하고 버립니다.
작업증명 성공시
증명이 확인되면 블록생성하고 트랜잭션 비용 + 채굴성공 eth3를 보상받습니다.
시간이 지나 모든 채굴이 끝나면 블록을 생성해도 트랜잭션 수수료 (gas price값)만 받는다고 합니다.
잘못된 내용 제보 부탁드립니다.
감사합니다.
✅ @jkhkkk, let me be the first to welcome you to Steemit! Congratulations on making your first post!
I gave you a $.03 vote!
Would you be so kind as to follow me back in return?
Congratulations @jkhkkk! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
You got a First Reply
Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here
If you no longer want to receive notifications, reply to this comment with the word
STOP