Skip to content

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

Clone this wiki locally