-
Notifications
You must be signed in to change notification settings - Fork 154
Sloth
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와 동일한지 여부를 확인합니다.
-
-
BlockChain.ProposeBlock(i)이 실행될 때- 스토어에 저장되어있는
NextStateRootHash값을 읽어와,Block_{i}.StateRootHash에 기입합니다.
- 스토어에 저장되어있는
-
BlockChain.Append(Block_{i})가 실행될 때- 스토어에 저장되어있는
NextStateRootHash값을 읽어와,Block_{i}.StateRootHash의 값과 동일한지 여부를 확인합니다. -
Block_{i}에 포함된Tx들을Block_{i}.StateRootHash로부터 실행(ActionEvaluation)시켜 새로운StateRootHash를 얻은 뒤, 이 새로운 값을 스토어에NextStateRootHash로 저장합니다.
- 스토어에 저장되어있는
- 튜링 머신이 일련의
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가 반복되어있습니다.
- 위와 같은 변경점을 통하여
ActionEvaluation의 시점을BlockChain.Append()로 통일할 수 있습니다. - 기존의 경우,
BlockChain.ProposeBlock()을 수행할 때,Block에StateRootHash를 채워넣기 위하여 반드시ActionEvaluation을 수행하여야 했습니다. - 이는 블록을 생성하는 과정과, 검증하는 과정 모두에
ActionEvaluation이 필요하다는 것을 의미하며, 어쩔 수 없이 최소한ActionEvaluation수행시간 * 2만큼의 시간이 블록을 생성하고 전파하는데 소요됩니다. -
Sloth를 통하여BlockChain.Append()의 단일지점으로ActionEvaluation을 제한한다면- 합의 과정에서 위의 중복된 시간소모를 제거할 수 있습니다.
- 합의시 블록의 검증에 발생하는 머신별 시간차를 고려하지 않는
PBFT원문의 가정에 좀 더 가까워집니다.
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