mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-18 16:05:10 +00:00
Move channel header unmarshal to constructor
Remove txError struct. Signed-off-by: Stanislav Jakuschevskij <stas@two-giants.com>
This commit is contained in:
parent
f6858cc7e1
commit
034e9b08c0
8 changed files with 33 additions and 79 deletions
|
|
@ -64,7 +64,7 @@ func (atb *AssetTransferBasic) GetAllAssets() ([]Asset, error) {
|
|||
}
|
||||
|
||||
if len(assetsRaw) == 0 {
|
||||
return []Asset{}, nil
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var assets []Asset
|
||||
|
|
|
|||
|
|
@ -24,12 +24,11 @@ func getAllAssets(clientConnection grpc.ClientConnInterface) error {
|
|||
return err
|
||||
}
|
||||
|
||||
assetsJSONformatted, err := json.MarshalIndent(assets, "", " ")
|
||||
formatted, err := json.MarshalIndent(assets, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(assetsJSONformatted)
|
||||
fmt.Println(string(formatted))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -104,11 +104,7 @@ func (b *blockProcessor) process() error {
|
|||
return err
|
||||
}
|
||||
|
||||
channelHeader, err := validTransaction.ChannelHeader()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
transactionID := channelHeader.GetTxId()
|
||||
transactionID := validTransaction.ChannelHeader().GetTxId()
|
||||
if err := b.checkpointer.CheckpointTransaction(b.parsedBlock.Number(), transactionID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -164,11 +160,7 @@ func (b *blockProcessor) findLastProcessedIndex() (int, error) {
|
|||
|
||||
blockTransactionIDs := []string{}
|
||||
for _, transaction := range transactions {
|
||||
channelHeader, err := transaction.ChannelHeader()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
blockTransactionIDs = append(blockTransactionIDs, channelHeader.GetTxId())
|
||||
blockTransactionIDs = append(blockTransactionIDs, transaction.ChannelHeader().GetTxId())
|
||||
}
|
||||
|
||||
lastTransactionID := b.checkpointer.TransactionID()
|
||||
|
|
@ -180,11 +172,13 @@ func (b *blockProcessor) findLastProcessedIndex() (int, error) {
|
|||
}
|
||||
|
||||
if lastProcessedIndex < 0 {
|
||||
return lastProcessedIndex, newTxIDNotFoundError(
|
||||
err = fmt.Errorf(
|
||||
"checkpoint transaction ID %s not found in block %d containing transactions: %s",
|
||||
lastTransactionID,
|
||||
b.parsedBlock.Number(),
|
||||
blockTransactionIDs,
|
||||
strings.Join(blockTransactionIDs, ", "),
|
||||
)
|
||||
return lastProcessedIndex, err
|
||||
}
|
||||
|
||||
return lastProcessedIndex, nil
|
||||
|
|
@ -198,11 +192,7 @@ type transactionProcessor struct {
|
|||
}
|
||||
|
||||
func (t *transactionProcessor) process() error {
|
||||
channelHeader, err := t.transaction.ChannelHeader()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
transactionID := channelHeader.GetTxId()
|
||||
transactionID := t.transaction.ChannelHeader().GetTxId()
|
||||
|
||||
writes, err := t.writes()
|
||||
if err != nil {
|
||||
|
|
@ -230,11 +220,7 @@ func (t *transactionProcessor) process() error {
|
|||
func (t *transactionProcessor) writes() ([]write, error) {
|
||||
// TODO this entire code should live in the parser and just return the kvWrite which
|
||||
// we then map to write and return
|
||||
channelHeader, err := t.transaction.ChannelHeader()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
t.channelName = channelHeader.GetChannelId()
|
||||
t.channelName = t.transaction.ChannelHeader().GetChannelId()
|
||||
|
||||
nsReadWriteSets, err := t.transaction.NamespaceReadWriteSets()
|
||||
if err != nil {
|
||||
|
|
@ -282,20 +268,3 @@ func (t *transactionProcessor) isSystemChaincode(chaincodeName string) bool {
|
|||
}
|
||||
return slices.Contains(systemChaincodeNames, chaincodeName)
|
||||
}
|
||||
|
||||
type txIDNotFoundError struct {
|
||||
txID string
|
||||
blockNumber uint64
|
||||
blockTxIDs []string
|
||||
}
|
||||
|
||||
func newTxIDNotFoundError(txID string, blockNumber uint64, blockTxIds []string) *txIDNotFoundError {
|
||||
return &txIDNotFoundError{
|
||||
txID, blockNumber, blockTxIds,
|
||||
}
|
||||
}
|
||||
|
||||
func (t *txIDNotFoundError) Error() string {
|
||||
format := "checkpoint transaction ID %s not found in block %d containing transactions: %s"
|
||||
return fmt.Sprintf(format, t.txID, t.blockNumber, strings.Join(t.blockTxIDs, ", "))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,12 +76,12 @@ func (b *Block) parse(commonPayloads []*common.Payload) ([]*payload, error) {
|
|||
for i, commonPayload := range commonPayloads {
|
||||
statusCode := validationCodes[i]
|
||||
|
||||
payload := parsePayload(commonPayload, int32(statusCode))
|
||||
is, err := payload.isEndorserTransaction()
|
||||
payload, err := parsePayload(commonPayload, int32(statusCode))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if is {
|
||||
|
||||
if payload.isEndorserTransaction() {
|
||||
result = append(result, payload)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ func Test_ReadWriteSetWrapping(t *testing.T) {
|
|||
|
||||
parsedRwSet := parseReadWriteSet(txReadWriteSetFake)
|
||||
if len(parsedRwSet.namespaceReadWriteSets()) != 1 {
|
||||
t.Fatalf("Expected 1 NamespaceReadWriteSet, got %d", len(parsedRwSet.namespaceReadWriteSets()))
|
||||
t.Fatal("expected 1 NamespaceReadWriteSet, got", len(parsedRwSet.namespaceReadWriteSets()))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package parser
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/hyperledger/fabric-protos-go-apiv2/common"
|
||||
"github.com/hyperledger/fabric-protos-go-apiv2/peer"
|
||||
|
|
@ -12,35 +11,28 @@ import (
|
|||
type payload struct {
|
||||
commonPayload *common.Payload
|
||||
statusCode int32
|
||||
channelHeader func() (*common.ChannelHeader, error)
|
||||
channelHeader *common.ChannelHeader
|
||||
}
|
||||
|
||||
func parsePayload(commonPayload *common.Payload, statusCode int32) *payload {
|
||||
result := &payload{commonPayload, statusCode, nil}
|
||||
result.channelHeader = sync.OnceValues(result.unmarshalChannelHeader)
|
||||
return result
|
||||
}
|
||||
|
||||
func (p *payload) unmarshalChannelHeader() (*common.ChannelHeader, error) {
|
||||
result := &common.ChannelHeader{}
|
||||
if err := proto.Unmarshal(p.commonPayload.GetHeader().GetChannelHeader(), result); err != nil {
|
||||
func parsePayload(commonPayload *common.Payload, statusCode int32) (*payload, error) {
|
||||
channelHeader, err := unmarshalChannelHeaderFrom(commonPayload)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &payload{commonPayload, statusCode, channelHeader}, nil
|
||||
}
|
||||
|
||||
func unmarshalChannelHeaderFrom(commonPayload *common.Payload) (*common.ChannelHeader, error) {
|
||||
result := &common.ChannelHeader{}
|
||||
if err := proto.Unmarshal(commonPayload.GetHeader().GetChannelHeader(), result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (p *payload) endorserTransaction() (*endorserTransaction, error) {
|
||||
is, err := p.isEndorserTransaction()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !is {
|
||||
channelHeader, err := p.channelHeader()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return nil, fmt.Errorf("unexpected payload type: %d", channelHeader.GetType())
|
||||
if !p.isEndorserTransaction() {
|
||||
return nil, fmt.Errorf("unexpected payload type: %d", p.channelHeader.GetType())
|
||||
}
|
||||
|
||||
result := &peer.Transaction{}
|
||||
|
|
@ -51,13 +43,8 @@ func (p *payload) endorserTransaction() (*endorserTransaction, error) {
|
|||
return parseEndorserTransaction(result), nil
|
||||
}
|
||||
|
||||
func (p *payload) isEndorserTransaction() (bool, error) {
|
||||
channelHeader, err := p.channelHeader()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return channelHeader.GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION), nil
|
||||
func (p *payload) isEndorserTransaction() bool {
|
||||
return p.channelHeader.GetType() == int32(common.HeaderType_ENDORSER_TRANSACTION)
|
||||
}
|
||||
|
||||
func (p *payload) isValid() bool {
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ func newTransaction(payload *payload) *Transaction {
|
|||
return &Transaction{payload}
|
||||
}
|
||||
|
||||
func (t *Transaction) ChannelHeader() (*common.ChannelHeader, error) {
|
||||
return t.payload.channelHeader()
|
||||
func (t *Transaction) ChannelHeader() *common.ChannelHeader {
|
||||
return t.payload.channelHeader
|
||||
}
|
||||
|
||||
func (t *Transaction) NamespaceReadWriteSets() ([]*NamespaceReadWriteSet, error) {
|
||||
|
|
|
|||
|
|
@ -127,8 +127,7 @@ func newAsset() (atb.Asset, error) {
|
|||
|
||||
// Pick a random element from an array.
|
||||
func randomElement(values []string) string {
|
||||
result := values[rand.N(len(values))]
|
||||
return result
|
||||
return values[rand.N(len(values))]
|
||||
}
|
||||
|
||||
// Pick a random element from an array, excluding the current value.
|
||||
|
|
|
|||
Loading…
Reference in a new issue