-
Notifications
You must be signed in to change notification settings - Fork 0
BlockValidation
jaeseok.an edited this page Dec 28, 2020
·
1 revision
Chain에 block을 add하기전 validation을 수행한다. 이더리움을 참조한다. 이더리움 WhitePaper |
비트코인 block 검증
이 체계에서 하나의 블록이 유효한지 아닌지를 확인하기 위한 알고리즘은 다음과 같다.
이 블록에 의해 참조되는 이전 블록이 존재하는지, 유효한지 확인한다.
타임스탬프 값이 이전 블록의 타임스탬프 값보다 크면서 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]를 이 블록의 마지막 상태로 등록한다.
이더리움 block 검증
참조하고 있는 이전 블록이 존재하는지 그리고, 유효한지 확인한다.
현재 블록의 타임스탬프가 참조하고 있는 이전 블록의 그것보다 크면서, 동시에 현 시점을 기준으로 15분 후보다 작은 값인지 확인한다.
블록 넘버, difficulty, 트랜잭션 루트, 삼촌 루트, gas 리미트등(기타 다양한 이더리움 로우 레벨 개념)이 유효한지 확인한다.
블록에 포함된 작업 증명이 유효한지 확인한다.
S[0] 이 이전 블록의 마지막 상태(state)라고 가정 하자.
TX를 현재 블록의 n개의 트랜잭션 리스트라고 하자. 0 부터 n-1에 대해, S[i+1] = APPLY(S[i], TX[i]) 로 설정하자. 어플리케이션이 오류를 반환하거나, 이 시점까지 블록에서 소모된 총 gas가 GASLIMIT를 초과하면 오류를 반환한다.
채굴자에게 지불된 보상 블록을 S[n] 덧붙인 후 이것을 S_FINAL 이라 하자.
상태 S_FINAL의 머클 트리 루트가 블록 헤더가 가지고 있는 최종 상태 루트와 같은지를 검증한다. 이 값이 같으면 그 블록은 유효한 블록이며, 다르면 유효하지 않은 것으로 판단한다
block validation
- verifyHeader
check extradata size
size > 32 이면 에러
check time
parent time보다 이전인 경우 에러
uncle이 아닌 경우 15초 이상 지난 block error
check difficulty
check gas limit
max limit (2^63) check
used > limit
parent gas limit 과 diff check
check block no = paraent + 1
verifySeal()
POW check
DAG을 이용한 hash 값 검증
VerifyDAOHeaderExtraData
chekc DAO hard fork rule
extra data가 hard fork rule을 따르는지 검증
- validateBody
check known block , state . 존재하면 에러
block
header.stateRoot
check parent block, state. 존재하지 않으면 에러
check uncle
check tx root hash
아르고 validation 추가
Done
block/parent block에 대한 db check
block 존재/parent block 존재 이미 check 함
consensus validate
check time
concensus에서 slot과 timestamp check를 하고 있으므로 필요없음
Tx validate
다른 노드에서 받은 block 인 경우 tx 별 signature check 필요
TxRootHash
머클 증명 구현은 TODO로 향후 구현
test