Sloth - planetarium/libplanet GitHub Wiki

이 νŽ˜μ΄μ§€λŠ” Libplanet의 κΈ°μ‘΄ μž‘λ™ 방식과 Slothμ—…λ°μ΄νŠΈ μ΄ν›„μ˜ μž‘λ™λ°©μ‹μ˜ 차이에 λŒ€ν•˜μ—¬ μ„€λͺ…ν•©λ‹ˆλ‹€.

μš”μ•½

κΈ°μ‘΄ 방식

  • BlockChain.ProposeBlock(i)이 싀행될 λ•Œ

    • Block_{i}에 ν¬ν•¨ν•˜λ € ν•˜λŠ” Tx듀을 Block_{i-1}.StateRootHashλ‘œλΆ€ν„° μ‹€ν–‰(ActionEvaluation)μ‹œμΌœ μƒˆλ‘œμš΄ StateRootHashλ₯Ό 얻은 λ’€, 이 μƒˆλ‘œμš΄ 값을 Block_{i}.StateRootHash둜 κΈ°μž…ν•©λ‹ˆλ‹€.
  • BlockChain.Append(Block_{i})κ°€ 싀행될 λ•Œ

    • Block_{i}에 ν¬ν•¨λœ Tx듀을 Block_{i-1}.StateRootHashλ‘œλΆ€ν„° μ‹€ν–‰(ActionEvaluation)μ‹œμΌœ μƒˆλ‘œμš΄ StateRootHashλ₯Ό 얻은 λ’€, 이 μƒˆλ‘œμš΄ 값이 Block_{i}.StateRootHash와 λ™μΌν•œμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

Sloth μ—…λ°μ΄νŠΈ μ΄ν›„μ˜ 방식

  • BlockChain.ProposeBlock(i)이 싀행될 λ•Œ

    • μŠ€ν† μ–΄μ— μ €μž₯λ˜μ–΄μžˆλŠ” NextStateRootHash값을 읽어와, Block_{i}.StateRootHash에 κΈ°μž…ν•©λ‹ˆλ‹€.
  • BlockChain.Append(Block_{i})κ°€ 싀행될 λ•Œ

    • μŠ€ν† μ–΄μ— μ €μž₯λ˜μ–΄μžˆλŠ” NextStateRootHash값을 읽어와, Block_{i}.StateRootHash의 κ°’κ³Ό λ™μΌν•œμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
    • Block_{i}에 ν¬ν•¨λœ Tx듀을 Block_{i}.StateRootHashλ‘œλΆ€ν„° μ‹€ν–‰(ActionEvaluation)μ‹œμΌœ μƒˆλ‘œμš΄ StateRootHashλ₯Ό 얻은 λ’€, 이 μƒˆλ‘œμš΄ 값을 μŠ€ν† μ–΄μ— NextStateRootHash둜 μ €μž₯ν•©λ‹ˆλ‹€.

Sloth의 효과

  • 튜링 머신이 일련의 State S, Action Aλ₯Ό ν†΅ν•œ 과정을 거쳐 μ‹œν€€μŠ€λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, κ·Έ μ‹œν€€μŠ€λ₯Ό [..., S_{i}, A_{i}, S_{i+1}, A_{i+1}, ...] κ³Ό 같이 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • λΈ”λ‘μ˜ Tx듀은 μœ„μ˜ Actionλ“€μ˜ 집합이며, λΈ”λ‘μ˜ StateRootHashλŠ” μœ„μ˜ State에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  • 블둝은 μœ„μ˜ μ‹œν€€μŠ€λ₯Ό λ¬Άμ–΄μ„œ κΈ°λ‘ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • Sloth μ΄μ „μ˜ 블둝은 κ³Όμ •μ˜ μ‹œν€€μŠ€λ₯Ό μ•„λž˜μ™€ 같이 λ¬Άμ–΄ κΈ°λ‘ν•˜μ—¬μ™”μŠ΅λ‹ˆλ‹€.
    • [..., Block_{i-1}(A_{i-1}, S_{i}), Block_{i}(A_{i}, S_{i+1}), Block_{i+1}(A_{i+1}, S_{i+2}), ...]
  • Sloth μ΄ν›„μ˜ 블둝은 κ³Όμ •μ˜ μ‹œν€€μŠ€λ₯Ό μ•„λž˜μ™€ 같이 λ¬Άμ–΄ κΈ°λ‘ν•©λ‹ˆλ‹€.
    • [..., Block_{i}(S_{i}, A_{i}), Block{i+1}(S_{i+1}, A_{i+1}), ...]
  • κ³§, 쒅전에 Block_{i}κ°€ κ°€μ§€κ³  μžˆλŠ” StateRootHash값이 S_{i+1}μ΄μ—ˆλ‹€λ©΄, Sloth μ΄ν›„μ—λŠ” S_{i}둜 λ³€ν•˜κ²Œ λ©λ‹ˆλ‹€.
  • κ²°κ΅­, Stateκ°€ 블둝에 κΈ°λ‘λ˜λŠ” μ‹œμ μ΄ ν•œ 블둝씩 λ’€λ‘œ λ°€λ¦¬κ²Œ λ˜λŠ” 효과λ₯Ό κ°€μ§€κ²Œ 되며, 이λ₯Ό μœ„ν•΄ Sloth 변경점이 적용된 λΈ”λ‘μ—μ„œλŠ” 이전 λΈ”λ‘μ˜ StateRootHashκ°€ λ°˜λ³΅λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

Sloth의 λͺ©μ 

  • μœ„μ™€ 같은 변경점을 ν†΅ν•˜μ—¬ ActionEvaluation의 μ‹œμ μ„ BlockChain.Append()둜 톡일할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 기쑴의 경우, BlockChain.ProposeBlock()을 μˆ˜ν–‰ν•  λ•Œ, Block에 StateRootHashλ₯Ό μ±„μ›Œλ„£κΈ° μœ„ν•˜μ—¬ λ°˜λ“œμ‹œ ActionEvaluation을 μˆ˜ν–‰ν•˜μ—¬μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŠ” 블둝을 μƒμ„±ν•˜λŠ” κ³Όμ •κ³Ό, κ²€μ¦ν•˜λŠ” κ³Όμ • λͺ¨λ‘μ— ActionEvaluation이 ν•„μš”ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•˜λ©°, μ–΄μ©” 수 없이 μ΅œμ†Œν•œ ActionEvaluation μˆ˜ν–‰μ‹œκ°„ * 2만큼의 μ‹œκ°„μ΄ 블둝을 μƒμ„±ν•˜κ³  μ „νŒŒν•˜λŠ”λ° μ†Œμš”λ©λ‹ˆλ‹€.
  • Slothλ₯Ό ν†΅ν•˜μ—¬ BlockChain.Append()의 λ‹¨μΌμ§€μ μœΌλ‘œ ActionEvaluation을 μ œν•œν•œλ‹€λ©΄
    • ν•©μ˜ κ³Όμ •μ—μ„œ μœ„μ˜ μ€‘λ³΅λœ μ‹œκ°„μ†Œλͺ¨λ₯Ό μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•©μ˜μ‹œ λΈ”λ‘μ˜ 검증에 λ°œμƒν•˜λŠ” 머신별 μ‹œκ°„μ°¨λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ” PBFT μ›λ¬Έμ˜ 가정에 μ’€ 더 κ°€κΉŒμ›Œμ§‘λ‹ˆλ‹€.

Sloth μ—…λ°μ΄νŠΈ 이후 방식에 λŒ€ν•œ 도식

sequenceDiagram

participant BlockChain
participant IStore
rect rgb(230, 230, 255)
Note right of BlockChain: Received block
BlockChain->>BlockChain: ValidateBlock(i)
BlockChain->>IStore: BlockChain.Store.GetNextStateRootHash(i-1)
Note right of IStore: IStore have: NextStateRootHash(i-1) = StateRootHash(i)
IStore->>BlockChain: StateRootHash(i)
BlockChain->>BlockChain: ValidateStateRootHash(i)
Note right of BlockChain: Tip changed, Broadcast block
end
rect rgb(255, 230, 230)
BlockChain->>BlockChain: DetermineNextStateRootHash(i)
BlockChain->>IStore: PutNextStateRootHash(i)
Note right of IStore: IStore now have: NextStateRootHash(i) = StateRootHash(i+1)
BlockChain->>BlockChain: UpdateTxExecution(i)
BlockChain->>BlockChain: Render renderers(i)
end