github.com/datachainlab/burrow@v0.25.0/execution/exec/block_execution.go (about)

     1  package exec
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hyperledger/burrow/event"
     7  	"github.com/hyperledger/burrow/event/query"
     8  	"github.com/hyperledger/burrow/txs"
     9  )
    10  
    11  func EventStringBlockExecution(height uint64) string { return fmt.Sprintf("Execution/Block/%v", height) }
    12  
    13  func DecodeStreamEvent(bs []byte) (*StreamEvent, error) {
    14  	be := new(StreamEvent)
    15  	err := cdc.UnmarshalBinaryBare(bs, be)
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  	return be, nil
    20  }
    21  
    22  // Write out TxExecutions parenthetically
    23  func (be *BlockExecution) StreamEvents() StreamEvents {
    24  	var ses StreamEvents
    25  	ses = append(ses, &StreamEvent{
    26  		BeginBlock: &BeginBlock{
    27  			Height: be.Height,
    28  			Header: be.Header,
    29  		},
    30  	})
    31  	for _, txe := range be.TxExecutions {
    32  		ses = append(ses, txe.StreamEvents()...)
    33  	}
    34  	return append(ses, &StreamEvent{
    35  		EndBlock: &EndBlock{
    36  			Height: be.Height,
    37  		},
    38  	})
    39  }
    40  
    41  func (be *BlockExecution) Encode() ([]byte, error) {
    42  	return cdc.MarshalBinaryBare(be)
    43  }
    44  
    45  func (be *BlockExecution) EncodeHeader() ([]byte, error) {
    46  	return cdc.MarshalBinaryBare(be.Header)
    47  }
    48  
    49  func (be *StreamEvent) Encode() ([]byte, error) {
    50  	return cdc.MarshalBinaryBare(be)
    51  }
    52  
    53  func (*BlockExecution) EventType() EventType {
    54  	return TypeBlockExecution
    55  }
    56  
    57  func (be *BlockExecution) Tx(txEnv *txs.Envelope) *TxExecution {
    58  	txe := NewTxExecution(txEnv)
    59  	be.AppendTxs(txe)
    60  	return txe
    61  }
    62  
    63  func (be *BlockExecution) AppendTxs(tail ...*TxExecution) {
    64  	for i, txe := range tail {
    65  		txe.Index = uint64(len(be.TxExecutions) + i)
    66  		txe.Height = be.Height
    67  	}
    68  	be.TxExecutions = append(be.TxExecutions, tail...)
    69  }
    70  
    71  // Tags
    72  type TaggedBlockExecution struct {
    73  	query.Tagged
    74  	*BlockExecution
    75  }
    76  
    77  func (be *BlockExecution) Tagged() *TaggedBlockExecution {
    78  	return &TaggedBlockExecution{
    79  		Tagged: query.MergeTags(
    80  			query.TagMap{
    81  				event.EventIDKey:   EventStringBlockExecution(be.Height),
    82  				event.EventTypeKey: be.EventType(),
    83  			},
    84  			query.MustReflectTags(be),
    85  			query.MustReflectTags(be.Header),
    86  		),
    87  		BlockExecution: be,
    88  	}
    89  }
    90  
    91  func QueryForBlockExecutionFromHeight(height uint64) *query.Builder {
    92  	return QueryForBlockExecution().AndGreaterThanOrEqual(event.HeightKey, height)
    93  }
    94  
    95  func QueryForBlockExecution() *query.Builder {
    96  	return query.NewBuilder().AndEquals(event.EventTypeKey, TypeBlockExecution)
    97  }
    98  
    99  type TaggedBlockEvent struct {
   100  	query.Tagged
   101  	*StreamEvent
   102  }
   103  
   104  func (ev *StreamEvent) EventType() EventType {
   105  	switch {
   106  	case ev.BeginBlock != nil:
   107  		return TypeBeginBlock
   108  	case ev.BeginTx != nil:
   109  		return TypeBeginTx
   110  	case ev.Envelope != nil:
   111  		return TypeEnvelope
   112  	case ev.Event != nil:
   113  		return ev.Event.EventType()
   114  	case ev.EndTx != nil:
   115  		return TypeEndTx
   116  	case ev.EndBlock != nil:
   117  		return TypeEndBlock
   118  	}
   119  	return TypeUnknown
   120  }
   121  
   122  func (ev *StreamEvent) Tagged() *TaggedBlockEvent {
   123  	return &TaggedBlockEvent{
   124  		Tagged: query.MergeTags(
   125  			query.TagMap{
   126  				event.EventTypeKey: ev.EventType(),
   127  			},
   128  			query.MustReflectTags(ev.BeginBlock, "Height"),
   129  			query.MustReflectTags(ev.BeginBlock.GetHeader()),
   130  			query.MustReflectTags(ev.BeginTx),
   131  			query.MustReflectTags(ev.BeginTx.GetTxHeader()),
   132  			ev.Envelope.Tagged(),
   133  			ev.Event.Tagged(),
   134  			query.MustReflectTags(ev.EndTx),
   135  			query.MustReflectTags(ev.EndBlock, "Height"),
   136  		),
   137  		StreamEvent: ev,
   138  	}
   139  }