-
Notifications
You must be signed in to change notification settings - Fork 152
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