원서 : https://hyperledger-fabric.readthedocs.io/en/release-1.4/readwrite.html
- Transaction simulation and read-write set
- '보증-peer'가 transaction을 처리할때, 'read-write set' 기반으로 처리한다.
- 'read set'은 "유니크 key" 와 "해당 version"을 가지고 있다.
- 'write set'은 "유니크 key" 와 "새 value"를 가지고 있다. (key 삭제엔, value로 'delete marker'를 함)
- ;
- 만약 transaction이 특정 key에 여러번 value를 쓰면, 마지막 값으로 유지될것 입니다.
- transaction이 특정 key를 읽으면, 그전에 커밋된 값이 리턴될것 입니다.
- 즉, write 하는 값을 read 하는것은 지원안되는거 같습니다.
- 다시한번 정리하자면, 'read set'에는 key와 그 version이 있고~ 'write set'에는 key와 최종value가 있습니다.
- ;
- 버젼을 하는 식에는 다양한 스키마가 있습니다.
- 'versioning scheme'는 최소한 주어진 key에 관해서, 중복적이지 않은 식별자로 해야 합니다.
- 예를들면, 단순 증가값으로 versioning을 하는것도 한 방법 입니다.
- 지금의 방식은 blockchain의 height를 기반으로 하는 'versioning scheme'를 사용하고 있습니다.
- 커밋하는 transaction의 height가 해당 key의 최종 version으로 사용되어지는것 입니다.
- 이런 현 스키마에서는 transaction의 height는 tuple로 표현 됩니다. (txNumber) (block안 transaction의 height)
- 이 스키마는 "단순 증가값 스키마"보다 장점이 많은데, 주로 다른 컴포넌트와 효율적인 설계가 되도록 하게 합니다.
- ;
- 아래와 같은 'read-write set'을 참고하세요. (보기쉽게 "단순 증가값 스키마"를 예로 함)
- <TxReadWriteSet><NsReadWriteSet name="chaincode1">
- <read-set>
- <read key="K1", version="1">
- <read key="K2", version="1">
- </read-set>
- <write-set>
- <write key="K1", value="V1">
- <write key="K3", value="V2">
- <write key="K4", isDelete="true">
- </write-set>
- <read-set>
- </NsReadWriteSet> <TxReadWriteSet>
- <TxReadWriteSet><NsReadWriteSet name="chaincode1">
- 추가적으로, 만약 transaction이 range쿼리를 한다면~ 그 결과는 'query-info' 라고 추가됩니다.
- Transaction validation and updating world state using read-write set
- 'committer' 는 transaction의 검증을 위해서 'read set' 을 확인하고, value와version 업데이트로 'write set' 을 사용합니다.
- ;
- 검증단계에서, 각각에 key의 version이 'read set' 과 'world state' 가 일치하면~ 해당 transaction은 유효하다 판단합니다.
- 왜냐하면, 모든 이전의 유효한 transaction이 커밋되었을 것으로 가정하기 떄문입니다.
- 추가적인 검증은 'read-write set'에 'query-info' 가 추가되어 있을경우 이루어 지게됩니다.
- ;
- 추가적인 검증은 'query-info' 에 추가된 상위범위의 결과에 inserted/deleted/updated 된 key가 없는지? 확인해야 합니다.
- 반대로 말하자면, range쿼리를 재실행 하여도 똑같은 결과가 나와야 되는것 입니다.
- 즉, transaction에서 '정체모를 item'이 나오는지 확인해서~ 무효하다 판단을 할 수 있어야 한다는것 입니다.
- 이런 '정체모를 item' 제약은 range쿼리에서 제한되고, 아직 다른 쿼리에는 아직 구현되지 않았습니다.
- 예 : GetStateByRange , 예 : GetQueryResult
- 다른 쿼이에서는 이렇게 '정체모를 item' 위험이 있음으로, read-only transaction을 사용해야 합니다.
- 즉, application에서 "simulation" 과 "검증/커밋" 사이에 안적적인 결과를 보장 할 수 없기 때문입니다.
- ;
- transaction이 검증을 통과하면, committer는 'world state'를 업데이트 하기위해~ 'write set' 을 사용합니다.
- 업데이트 단계에서, 'write set'의 각각에 ket에 value가 'world state'에 반영 됩니다.
- 그러면서 물론 해당 version도 바뀌게 됩니다.
- Example simulation and validation
- 예제로써 5개의 transaction이 있고, 각각의 transaction이 처리되면서~ world state의 변화를 보면 됩니다.
- World state: (k1,1,v1), (k2,1,v2), (k3,1,v3), (k4,1,v4), (k5,1,v5)
- T1 -> Write(k1, v1'), Write(k2, v2')
- T2 -> Read(k1), Write(k3, v3')
- T3 -> Write(k2, v2'')
- T4 -> Write(k2, v2'''), read(k2)
- T5 -> Write(k6, v6'), read(k5)
- T1은 검증통과, world state 를 (k1,2,v1'), (k2,2,v2') 으로 업데이트.
- T2은 검증실패. 왜냐하면 Read(k1)이 수정되었기 때문.
- T3은 검증통과, world state 를 (k2,3,v2'') 으로 업데이트.
- T4은 검증실패. 왜냐하면 Read(k2)이 수정되었기 때문.
- T5은 검증통과. 왜냐하면 Read(k5)이 수정되지 않았기 때문.
- 예제로써 5개의 transaction이 있고, 각각의 transaction이 처리되면서~ world state의 변화를 보면 됩니다.
-끝-
'hyperledger > fabDoc.Arch-Ref' 카테고리의 다른 글
11) Gossip data dissemination protocol (0) | 2019.08.18 |
---|---|
9) Private Data (0) | 2019.08.18 |
8) Peer channel-based event services (0) | 2019.08.18 |
6) Channels (0) | 2019.08.18 |
5) Service Discovery (0) | 2019.08.18 |