BlockValidation - everjs78/study GitHub Wiki

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๋กœ ํ–ฅํ›„ ๊ตฌํ˜„