diff --git a/state/execution.go b/state/execution.go index aa4cd9c8..0033e7f3 100644 --- a/state/execution.go +++ b/state/execution.go @@ -69,16 +69,32 @@ func execBlockOnProxyApp(txEventPublisher types.TxEventPublisher, proxyAppConn p // NOTE: if we count we can access the tx from the block instead of // pulling it from the req - event := types.EventDataTx{ + tx := types.Tx(req.GetDeliverTx().Tx) + + tags := make(map[string]interface{}) + for _, t := range txResult.Tags { + // basic validation + if t.Key == "" { + logger.Info("Got tag with an empty key (skipping)", "tag", t, "tx", tx) + continue + } + + if t.ValueString != "" { + tags[t.Key] = t.ValueString + } else { + tags[t.Key] = t.ValueInt + } + } + + txEventPublisher.PublishEventTx(types.EventDataTx{ Height: block.Height, - Tx: types.Tx(req.GetDeliverTx().Tx), + Tx: tx, Data: txResult.Data, Code: txResult.Code, Log: txResult.Log, - Tags: txResult.Tags, + Tags: tags, Error: txError, - } - txEventPublisher.PublishEventTx(event) + }) } } proxyAppConn.SetResponseCallback(proxyCb) diff --git a/types/event_bus.go b/types/event_bus.go index 479ae735..6091538e 100644 --- a/types/event_bus.go +++ b/types/event_bus.go @@ -82,16 +82,8 @@ func (b *EventBus) PublishEventVote(vote EventDataVote) error { func (b *EventBus) PublishEventTx(tx EventDataTx) error { // no explicit deadline for publishing events ctx := context.Background() - tags := make(map[string]interface{}) - for _, t := range tx.Tags { - // TODO [@melekes]: validate, but where? - if t.ValueString != "" { - tags[t.Key] = t.ValueString - } else { - tags[t.Key] = t.ValueInt - } - } - // predefined tags should come last + tags := tx.Tags + // add predefined tags (they should overwrite any existing tags) tags[EventTypeKey] = EventTx tags[TxHashKey] = fmt.Sprintf("%X", tx.Tx.Hash()) b.pubsub.PublishWithTags(ctx, TMEventData{tx}, tags) diff --git a/types/events.go b/types/events.go index c9de20af..f20297d6 100644 --- a/types/events.go +++ b/types/events.go @@ -110,13 +110,13 @@ type EventDataNewBlockHeader struct { // All txs fire EventDataTx type EventDataTx struct { - Height int `json:"height"` - Tx Tx `json:"tx"` - Data data.Bytes `json:"data"` - Log string `json:"log"` - Code abci.CodeType `json:"code"` - Tags []*abci.KVPair `json:"tags"` - Error string `json:"error"` // this is redundant information for now + Height int `json:"height"` + Tx Tx `json:"tx"` + Data data.Bytes `json:"data"` + Log string `json:"log"` + Code abci.CodeType `json:"code"` + Tags map[string]interface{} `json:"tags"` + Error string `json:"error"` // this is redundant information for now } type EventDataProposalHeartbeat struct {