하이퍼레저 패브릭의 블록에 대해서 살펴본다.
블록은 3가지 섹션으로 이루어져 있다.
이 섹션은 세 개의 필드로, 블록이 만들어 질때 작성된다.
이러한 필드들은 블록 데이터를 암호화 해시하여 내부적으로 생성된다. 그리고 이 필드들은 각 블록들이 서로 떨어질 수 없는 연결을 이뤄서 불변의 원장이 되도록 한다.
Block Data에는 순서대로 정렬된 트랜잭션 목록이 담겨있다. 오더러에 의해 블록이 생성될 때 작성된다.
Block Metadata는 블록 생성자의 identity정보, 블록에 포함되는 트랜잭션 보증 여부 등이 포함되어 있다.
이후 commiter에 의해 트랜잭션에 대한 vaild/invaild 표시도 블록 메타데이터에 있는 비트맵에 추가된다.
하이퍼레저 패브릭 코드 - block
하이퍼레저 패브릭 코드 - transaction
참고 자료
위에서 설명했듯이 블록에는 3개의 섹션이 있다.
type Block struct {
Header *BlockHeader
Data *BlockData
Metadata *BlockMetadata
}
블록 헤더에는 block number, Current Block Hash, Previous Block Header Hash가 있다.
type BlockHeader struct {
Number uint64
PreviousHash []byte
DataHash []byte
}
블록 데이터에는 바이트 배열에서 정열된 트랜잭션 세부 정보를 포함하는 필수 세그먼트이다.
type BlockData struct {
Data [][]byte
}
envelope는 메시지가 인증될 수 있도록 서명으로 페이로드를 감싸는 역할을 한다.
type Envelope struct {
Payload []byte
Signature []byte
}
Payload는 채널 헤더 및 서명 헤더가 포함되어 있다.
type Payload struct {
Header *Header
Data []byte
}
Payload Header
type Header struct {
ChannelHeader []byte
SignatureHeader []byte
}
1. ChannelHeader
기본 채널 정보와 체인 코드 정보가 포함되어 있다.
type ChannelHeader struct {
Type int32
Version int32
Timestamp *google_protobuf.Timestamp
ChannelId string
TxId string
Epoch uint64
Extension []byte
}
2. SignatureHeader
MSP ID를 보유하는 메시지 생성자의 세부 정보를 포함한다.
type SignatureHeader struct {
Creator []byte
Nonce []byte
}
Payload Data
Payload의 데이터 필드에는 블록에 대한 트랜잭션 세부 정보가 포함되어 있다.
1. TransactionAction
type TransactionAction struct {
Header []byte
Payload []byte
}
ChainCodeActionPayload
의 마샬링된 개체이다.2. ChaincodeActionPayload
type ChaincodeActionPayload struct {
ChaincodeProposalPayload []byte
Action *ChaincodeEndorsedAction
}
3. ChaincodeProposalPayloade
트랜잭션 중에 사용되는 체인 코드 입력 요소를 포함합니다
type ChaincodeProposalPayload struct {
Input []byte
TransientMap map[string][]byte
}
ChaincodeInvocationSpec
의 마샬링된 객체이다.4. ChaincodeInvocationSpec
체인 코드 정보와 호출 중에 사용된 인수의 내용을 담고 있습니다.
type ChaincodeInvocationSpec struct {
ChaincodeSpec *ChaincodeSpec
}
type ChaincodeSpec struct {
Type ChaincodeSpec_Type
ChaincodeId *ChaincodeID
Input *ChaincodeInput
Timeout int32
}
type ChaincodeInput struct {
Args [][]byte
Decorations map[string][]byte
}
5. ChaincodeEndorsedAction
트랜잭션에서 체인 코드에 사용되는 제안 해시 및 읽기/쓰기 집합을 포함하는 마샬링된 개체
type ChaincodeEndorsedAction struct {
ProposalResponsePayload []byte
Endorsements []*Endorsement
}
type ProposalResponsePayload struct {
ProposalHash []byte
Extension []byte
}
ChaincodeAction
의 마샬링된 개체이다.6. ChaincodeAction
type ChaincodeAction struct {
Results []byte
Events []byte
Response *Response
}
type KVRWSet struct {
Reads []*KVRead
RangeQueriesInfo []*RangeQueryInfo
Writes []*KVWrite
MetadataWrites []*KVMetadataWrite
}
type KVRead struct {
Key string
Version *Version
}
type Version struct {
BlockNum uint64
TxNum uint64
}
type KVWrite struct {
Key string
IsDelete bool
Value []byte
}
type RangeQueryInfo struct {
StartKey string
EndKey string
ItrExhausted bool
ReadsInfo isRangeQueryInfo_ReadsInfo
}
type KVMetadataWrite struct {
Key string
Entries []*KVMetadataEntry
}
type KVMetadataEntry struct {
Name string
Value []byte
}
블록 메타데이터는 블록 작성 시간, 인증서 세부 정보 및 블록 작성자의 서명등이 포함되어 있다.
type BlockMetadata struct {
Metadata [][]byte
}
저도 하이퍼레저 패브릭을 공부한 적이 있는데 이렇게까지 자세하게 알지 못했네요. 포스팅이 큰 도움이 되었습니다.