Skip to content
ilgyu edited this page May 21, 2025 · 8 revisions

이 페이지는 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()을 수행할 때, BlockStateRootHash를 채워넣기 위하여 반드시 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
Loading
Clone this wiki locally