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 }