區塊鏈教程Fabric1.0源代碼分析Tx(Transaction 交易)一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。
Fabric 1.0源代碼筆記 之 Tx(Transaction 交易)
1、Tx概述
Tx,即Transaction,交易或事務。
Tx代碼分佈目錄結構如下:
- protos/common/common.pb.go,交易的封裝即Envelope結構體。也包括Payload、Header、ChannelHeader和SignatureHeader。
- protos/utils目錄,交易相關部分工具函數,包括txutils.go、proputils.go和commonutils.go。
- core/ledger/kvledger/txmgmt目錄
* rwsetutil目錄,讀寫集相關結構體及方法。
* version目錄,version.Height結構體及方法。
* validator目錄,Validator接口及實現。
* txmgr目錄,TxMgr接口及實現。
2、交易的封裝Envelope結構體
有個圖4
2.1、Envelope結構體
Envelope直譯爲信封,封裝Payload和Signature。
type Envelope struct { //用簽名包裝Payload,以便對信息做身份驗證
Payload []byte //Payload序列化
Signature []byte //Payload header中指定的創建者簽名
}
//代碼在protos/common/common.pb.go
2.2、Payload相關結構體
Payload直譯爲有效載荷。Payload結構體:
type Payload struct {
Header *Header //Header
Data []byte //Transaction序列化
}
//代碼在protos/common/common.pb.go
Header結構體:
type Header struct {
ChannelHeader []byte
SignatureHeader []byte
}
//代碼在protos/common/common.pb.go
ChannelHeader結構體:
type ChannelHeader struct {
Type int32
Version int32 //消息協議版本
Timestamp *google_protobuf.Timestamp //創建消息時的本地時間
ChannelId string //消息綁定的ChannelId
TxId string //TxId
Epoch uint64 //紀元
Extension []byte //可附加的擴展
}
//代碼在protos/common/common.pb.go
補充HeaderType:
type HeaderType int32
const (
HeaderType_MESSAGE HeaderType = 0
HeaderType_CONFIG HeaderType = 1
HeaderType_CONFIG_UPDATE HeaderType = 2
HeaderType_ENDORSER_TRANSACTION HeaderType = 3
HeaderType_ORDERER_TRANSACTION HeaderType = 4
HeaderType_DELIVER_SEEK_INFO HeaderType = 5
HeaderType_CHAINCODE_PACKAGE HeaderType = 6
)
//代碼在protos/common/common.pb.go
SignatureHeader結構體:
type SignatureHeader struct {
Creator []byte //消息的創建者, 指定爲證書鏈
Nonce []byte //可能只使用一次的任意數字,可用於檢測重播攻擊
}
//代碼在protos/common/common.pb.go
2.3、Transaction相關結構體
Transaction結構體:
type Transaction struct {
Actions []*TransactionAction //Payload.Data是個TransactionAction數組,容納每個交易
}
//代碼在protos/peer/transaction.pb.go
TransactionAction結構體:
type TransactionAction struct {
Header []byte
Payload []byte
}
//代碼在protos/peer/transaction.pb.go
2.4、ChaincodeActionPayload相關結構體
ChaincodeActionPayload結構體:
type ChaincodeActionPayload struct {
ChaincodeProposalPayload []byte
Action *ChaincodeEndorsedAction
}
//代碼在protos/peer/transaction.pb.go
ChaincodeEndorsedAction結構體:
type ChaincodeEndorsedAction struct {
ProposalResponsePayload []byte //ProposalResponsePayload序列化
Endorsements []*Endorsement
}
//代碼在protos/peer/transaction.pb.go
ProposalResponsePayload結構體:
type ProposalResponsePayload struct {
ProposalHash []byte
Extension []byte //ChaincodeAction序列化
}
//代碼在protos/peer/proposal_response.pb.go
ChaincodeAction結構體:
type ChaincodeAction struct {
Results []byte //TxRwSet序列化
Events []byte
Response *Response
ChaincodeId *ChaincodeID
}
//代碼在protos/peer/proposal.pb.go
3、交易驗證代碼TxValidationFlags
TxValidationFlags是交易驗證代碼的數組,在commiter驗證塊時使用。
type TxValidationFlags []uint8
//創建TxValidationFlags數組
func NewTxValidationFlags(size int) TxValidationFlags
//爲指定的交易設置交易驗證代碼
func (obj TxValidationFlags) SetFlag(txIndex int, flag peer.TxValidationCode)
//獲取指定交易的交易驗證代碼
func (obj TxValidationFlags) Flag(txIndex int) peer.TxValidationCode
//檢查指定的交易是否有效
func (obj TxValidationFlags) IsValid(txIndex int) bool
//檢查指定的交易是否無效
func (obj TxValidationFlags) IsInvalid(txIndex int) bool
//指定交易的交易驗證代碼與flag比較,相同爲true
func (obj TxValidationFlags) IsSetTo(txIndex int, flag peer.TxValidationCode) bool
//代碼在core/ledger/util/txvalidationflags.go
補充peer.TxValidationCode:
type TxValidationCode int32
const (
TxValidationCode_VALID TxValidationCode = 0
TxValidationCode_NIL_ENVELOPE TxValidationCode = 1
TxValidationCode_BAD_PAYLOAD TxValidationCode = 2
TxValidationCode_BAD_COMMON_HEADER TxValidationCode = 3
TxValidationCode_BAD_CREATOR_SIGNATURE TxValidationCode = 4
TxValidationCode_INVALID_ENDORSER_TRANSACTION TxValidationCode = 5
TxValidationCode_INVALID_CONFIG_TRANSACTION TxValidationCode = 6
TxValidationCode_UNSUPPORTED_TX_PAYLOAD TxValidationCode = 7
TxValidationCode_BAD_PROPOSAL_TXID TxValidationCode = 8
TxValidationCode_DUPLICATE_TXID TxValidationCode = 9
TxValidationCode_ENDORSEMENT_POLICY_FAILURE TxValidationCode = 10
TxValidationCode_MVCC_READ_CONFLICT TxValidationCode = 11
TxValidationCode_PHANTOM_READ_CONFLICT TxValidationCode = 12
TxValidationCode_UNKNOWN_TX_TYPE TxValidationCode = 13
TxValidationCode_TARGET_CHAIN_NOT_FOUND TxValidationCode = 14
TxValidationCode_MARSHAL_TX_ERROR TxValidationCode = 15
TxValidationCode_NIL_TXACTION TxValidationCode = 16
TxValidationCode_EXPIRED_CHAINCODE TxValidationCode = 17
TxValidationCode_CHAINCODE_VERSION_CONFLICT TxValidationCode = 18
TxValidationCode_BAD_HEADER_EXTENSION TxValidationCode = 19
TxValidationCode_BAD_CHANNEL_HEADER TxValidationCode = 20
TxValidationCode_BAD_RESPONSE_PAYLOAD TxValidationCode = 21
TxValidationCode_BAD_RWSET TxValidationCode = 22
TxValidationCode_ILLEGAL_WRITESET TxValidationCode = 23
TxValidationCode_INVALID_OTHER_REASON TxValidationCode = 255
)
//代碼在protos/peer/transaction.pb.go
未完待續感謝關注兄弟連區塊鏈教程分享!