하이퍼레저 패브릭 블록

박도준·2021년 1월 28일
1

블록체인

목록 보기
12/13
post-thumbnail

하이퍼레저 패브릭의 블록에 대해서 살펴본다.


블록 구조

블록은 3가지 섹션으로 이루어져 있다.

Block Header

이 섹션은 세 개의 필드로, 블록이 만들어 질때 작성된다.

  • Block number
    0(genesis block)에서 시작하여 블록체인에 추가할 때마다 1씩 증가하는 정수
  • Current Block Hash
    현재 트랜잭션이 포함된 현재 블록의 해시
  • Previous Block Header Hash
    이전 블록 헤더의 해시

이러한 필드들은 블록 데이터를 암호화 해시하여 내부적으로 생성된다. 그리고 이 필드들은 각 블록들이 서로 떨어질 수 없는 연결을 이뤄서 불변의 원장이 되도록 한다.


Block Data

Block Data에는 순서대로 정렬된 트랜잭션 목록이 담겨있다. 오더러에 의해 블록이 생성될 때 작성된다.


Block Metadata

Block Metadata는 블록 생성자의 identity정보, 블록에 포함되는 트랜잭션 보증 여부 등이 포함되어 있다.
이후 commiter에 의해 트랜잭션에 대한 vaild/invaild 표시도 블록 메타데이터에 있는 비트맵에 추가된다.

참고 자료


블록 코드 예시

하이퍼레저 패브릭 코드 - block
하이퍼레저 패브릭 코드 - transaction
참고 자료

구조

위에서 설명했듯이 블록에는 3개의 섹션이 있다.

type Block struct {
	    Header   *BlockHeader   
	    Data     *BlockData     
	    Metadata *BlockMetadata 
	}

Block header

블록 헤더에는 block number, Current Block Hash, Previous Block Header Hash가 있다.

type BlockHeader struct {
	    Number   	    uint64
	    PreviousHash    []byte
	    DataHash        []byte
}

Block Data

블록 데이터에는 바이트 배열에서 정열된 트랜잭션 세부 정보를 포함하는 필수 세그먼트이다.

type BlockData struct {
     Data [][]byte 
}

Envelope

envelope는 메시지가 인증될 수 있도록 서명으로 페이로드를 감싸는 역할을 한다.

type Envelope struct {
     Payload   []byte 
     Signature []byte
}

Payload

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 
}
  • Type : 사용된 트랜잭션 타입 ["MESSAGE", "CONFIG", "CONFIG_UPDATE", "ENDORSER_TRANSACTION",
    "ORDERER_TRANSACTION", "DELIVER_SEEK_INFO", "CHAINCODE_PACKAGE"]
  • Version : protobuf 버전
    • 어떤 언어나 플랫폼에서 구조화 된 데이터를 전환하게 해주는 방법
  • Extension : 체인코드 헤더의 확장 구조를 마샬링한 정보

2. SignatureHeader
MSP ID를 보유하는 메시지 생성자의 세부 정보를 포함한다.

type SignatureHeader struct {
   Creator []byte
   Nonce   []byte
}

Payload Data

Payload의 데이터 필드에는 블록에 대한 트랜잭션 세부 정보가 포함되어 있다.

1. TransactionAction

type TransactionAction struct {
    Header  []byte 
    Payload []byte 
}
  • Header : SignatureHeader와 유사하게 트랜잭션을 제출하기 위한 신원 세부 정보가 포함되어 있다.
  • Payload : 트랜잭션 중에 수행되는 다양한 체인 코드 작업을 포함하는 ChainCodeActionPayload의 마샬링된 개체이다.

2. ChaincodeActionPayload

type ChaincodeActionPayload struct {
     ChaincodeProposalPayload []byte 
     Action *ChaincodeEndorsedAction 
}

3. ChaincodeProposalPayloade
트랜잭션 중에 사용되는 체인 코드 입력 요소를 포함합니다

type ChaincodeProposalPayload struct {
   Input  	[]byte
   TransientMap map[string][]byte
}
  • Input : ChaincodeInvocationSpec의 마샬링된 객체이다.
  • TransientMap : 애플리케이션 수준의 기밀성과 관련된 매우 중요한 데이터를 담고 있습니다. 세부 정보는 항상 트랜잭션에서 제거되고 원장에는 업데이트되지 않는다.

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   
}
  • Extension : 트랜잭션에 수행된 읽기/쓰기 작업 세트를 포함하는 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
}

Block MetaData

블록 메타데이터는 블록 작성 시간, 인증서 세부 정보 및 블록 작성자의 서명등이 포함되어 있다.

type BlockMetadata struct {
  Metadata   [][]byte
}
profile
Better late than never

1개의 댓글

comment-user-thumbnail
2021년 1월 29일

저도 하이퍼레저 패브릭을 공부한 적이 있는데 이렇게까지 자세하게 알지 못했네요. 포스팅이 큰 도움이 되었습니다.

답글 달기