Skip to content

Commit ccc07f3

Browse files
authored
Merge pull request #106 from blinklabs-io/feat/event-context
feat: support context on events and update block
2 parents 9657d44 + afbc1cc commit ccc07f3

File tree

8 files changed

+85
-25
lines changed

8 files changed

+85
-25
lines changed

event/event.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ import (
2121
type Event struct {
2222
Type string `json:"type"`
2323
Timestamp time.Time `json:"timestamp"`
24+
Context interface{} `json:"context,omitempty"`
2425
Payload interface{} `json:"payload"`
2526
}
2627

27-
func New(eventType string, timestamp time.Time, payload interface{}) Event {
28+
func New(eventType string, timestamp time.Time, context, payload interface{}) Event {
2829
return Event{
2930
Type: eventType,
3031
Timestamp: timestamp,
32+
Context: context,
3133
Payload: payload,
3234
}
3335
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ module github.com/blinklabs-io/snek
33
go 1.20
44

55
require (
6-
github.com/blinklabs-io/gouroboros v0.56.0
6+
github.com/blinklabs-io/gouroboros v0.57.0
7+
github.com/fxamacker/cbor/v2 v2.5.0
78
github.com/gen2brain/beeep v0.0.0-20230602101333-f384c29b62dd
89
github.com/gin-gonic/gin v1.9.1
910
github.com/kelseyhightower/envconfig v1.4.0
@@ -27,7 +28,6 @@ require (
2728
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
2829
github.com/chenzhuoyu/iasm v0.9.0 // indirect
2930
github.com/davecgh/go-spew v1.1.1 // indirect
30-
github.com/fxamacker/cbor/v2 v2.5.0 // indirect
3131
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
3232
github.com/gin-contrib/sse v0.1.0 // indirect
3333
github.com/go-openapi/jsonpointer v0.20.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB
44
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
55
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
66
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
7-
github.com/blinklabs-io/gouroboros v0.56.0 h1:AdWB6SkHD5fn4wKU+/2BFsT9xae3W+nZ189LxZw/mF8=
8-
github.com/blinklabs-io/gouroboros v0.56.0/go.mod h1:D5YJka8EyVmiXNMbRvjH23H9lNMLA4+qSlNNC/j7R0k=
7+
github.com/blinklabs-io/gouroboros v0.57.0 h1:k5Y706vvYAGM3bCtEhh6WRHGrvS3S6n1MT9vNLFAe/E=
8+
github.com/blinklabs-io/gouroboros v0.57.0/go.mod h1:D5YJka8EyVmiXNMbRvjH23H9lNMLA4+qSlNNC/j7R0k=
99
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
1010
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
1111
github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=

input/chainsync/block.go

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,52 @@
1515
package chainsync
1616

1717
import (
18+
"fmt"
19+
1820
"github.com/blinklabs-io/gouroboros/ledger"
21+
"github.com/fxamacker/cbor/v2"
1922
)
2023

21-
type BlockEvent struct {
24+
type BlockContext struct {
2225
BlockNumber uint64 `json:"blockNumber"`
23-
BlockHash string `json:"blockHash"`
2426
SlotNumber uint64 `json:"slotNumber"`
25-
BlockCbor byteSliceJsonHex `json:"blockCbor,omitempty"`
2627
}
2728

28-
func NewBlockEvent(block ledger.Block, includeCbor bool) BlockEvent {
29-
evt := BlockEvent{
29+
type BlockEvent struct {
30+
BlockBodySize uint64 `json:"blockBodySize"`
31+
IssuerVkey string `json:"issuerVkey"`
32+
BlockHash string `json:"blockHash"`
33+
BlockCbor byteSliceJsonHex `json:"blockCbor,omitempty"`
34+
}
35+
36+
func NewBlockContext(block ledger.Block) BlockContext {
37+
ctx := BlockContext{
38+
BlockNumber: block.BlockNumber(),
39+
SlotNumber: block.SlotNumber(),
40+
}
41+
return ctx
42+
}
43+
44+
func NewBlockHeaderContext(block ledger.BlockHeader) BlockContext {
45+
ctx := BlockContext{
3046
BlockNumber: block.BlockNumber(),
31-
BlockHash: block.Hash(),
3247
SlotNumber: block.SlotNumber(),
3348
}
49+
return ctx
50+
}
51+
52+
func NewBlockEvent(block ledger.Block, includeCbor bool) BlockEvent {
53+
keyCbor, err := cbor.Marshal(block.IssuerVkey())
54+
if err != nil {
55+
panic(err)
56+
}
57+
// iss := ledger.NewBlake2b256(block.IssuerVkey())
58+
evt := BlockEvent{
59+
BlockBodySize: block.BlockBodySize(),
60+
BlockHash: block.Hash(),
61+
IssuerVkey: fmt.Sprintf("%x", keyCbor),
62+
// IssuerVkey: iss.String(),
63+
}
3464
if includeCbor {
3565
evt.BlockCbor = block.Cbor()
3666
}

input/chainsync/chainsync.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,15 +200,15 @@ func (c *ChainSync) setupConnection() error {
200200
}
201201

202202
func (c *ChainSync) handleRollBackward(point ocommon.Point, tip ochainsync.Tip) error {
203-
evt := event.New("chainsync.rollback", time.Now(), NewRollbackEvent(point))
203+
evt := event.New("chainsync.rollback", time.Now(), nil, NewRollbackEvent(point))
204204
c.eventChan <- evt
205205
return nil
206206
}
207207

208208
func (c *ChainSync) handleRollForward(blockType uint, blockData interface{}, tip ochainsync.Tip) error {
209209
switch v := blockData.(type) {
210210
case ledger.Block:
211-
evt := event.New("chainsync.block", time.Now(), NewBlockEvent(v, c.includeCbor))
211+
evt := event.New("chainsync.block", time.Now(), NewBlockContext(v), NewBlockEvent(v, c.includeCbor))
212212
c.eventChan <- evt
213213
c.updateStatus(v.SlotNumber(), v.BlockNumber(), v.Hash(), tip.Point.Slot, hex.EncodeToString(tip.Point.Hash))
214214
case ledger.BlockHeader:
@@ -218,10 +218,10 @@ func (c *ChainSync) handleRollForward(blockType uint, blockData interface{}, tip
218218
if err != nil {
219219
return err
220220
}
221-
blockEvt := event.New("chainsync.block", time.Now(), NewBlockEvent(block, c.includeCbor))
221+
blockEvt := event.New("chainsync.block", time.Now(), NewBlockHeaderContext(v), NewBlockEvent(block, c.includeCbor))
222222
c.eventChan <- blockEvt
223223
for _, transaction := range block.Transactions() {
224-
txEvt := event.New("chainsync.transaction", time.Now(), NewTransactionEvent(block, transaction, c.includeCbor))
224+
txEvt := event.New("chainsync.transaction", time.Now(), nil, NewTransactionEvent(block, transaction, c.includeCbor))
225225
c.eventChan <- txEvt
226226
}
227227
c.updateStatus(v.SlotNumber(), v.BlockNumber(), v.Hash(), tip.Point.Slot, hex.EncodeToString(tip.Point.Hash))
@@ -230,10 +230,10 @@ func (c *ChainSync) handleRollForward(blockType uint, blockData interface{}, tip
230230
}
231231

232232
func (c *ChainSync) handleBlockFetchBlock(block ledger.Block) error {
233-
blockEvt := event.New("chainsync.block", time.Now(), NewBlockEvent(block, c.includeCbor))
233+
blockEvt := event.New("chainsync.block", time.Now(), nil, NewBlockEvent(block, c.includeCbor))
234234
c.eventChan <- blockEvt
235235
for _, transaction := range block.Transactions() {
236-
txEvt := event.New("chainsync.transaction", time.Now(), NewTransactionEvent(block, transaction, c.includeCbor))
236+
txEvt := event.New("chainsync.transaction", time.Now(), nil, NewTransactionEvent(block, transaction, c.includeCbor))
237237
c.eventChan <- txEvt
238238
}
239239
c.updateStatus(block.SlotNumber(), block.BlockNumber(), block.Hash(), c.bulkRangeEnd.Slot, hex.EncodeToString(c.bulkRangeEnd.Hash))

output/notify/notify.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,18 @@ func (n *NotifyOutput) Start() error {
5555
if payload == nil {
5656
panic(fmt.Errorf("ERROR: %v", payload))
5757
}
58+
context := evt.Context
59+
if context == nil {
60+
panic(fmt.Errorf("ERROR: %v", context))
61+
}
5862

5963
be := payload.(chainsync.BlockEvent)
64+
bc := context.(chainsync.BlockContext)
6065
err := beeep.Notify(
6166
n.title,
6267
fmt.Sprintf("New Block!\nBlockNumber: %d, SlotNumber: %d\nHash: %s",
63-
be.BlockNumber,
64-
be.SlotNumber,
68+
bc.BlockNumber,
69+
bc.SlotNumber,
6570
be.BlockHash,
6671
),
6772
"assets/snek-icon.png",

output/push/push.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,17 @@ func (p *PushOutput) Start() error {
8383
if payload == nil {
8484
panic(fmt.Errorf("ERROR: %v", payload))
8585
}
86+
context := evt.Context
87+
if context == nil {
88+
panic(fmt.Errorf("ERROR: %v", context))
89+
}
8690

8791
be := payload.(chainsync.BlockEvent)
92+
bc := context.(chainsync.BlockContext)
8893
fmt.Println("Snek")
8994
fmt.Printf("New Block!\nBlockNumber: %d, SlotNumber: %d\nHash: %s",
90-
be.BlockNumber,
91-
be.SlotNumber,
95+
bc.BlockNumber,
96+
bc.SlotNumber,
9297
be.BlockHash,
9398
)
9499

output/webhook/webhook.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"net/http"
2626
"time"
2727

28+
// cbor "github.com/fxamacker/cbor/v2"
29+
2830
"github.com/blinklabs-io/snek/event"
2931
"github.com/blinklabs-io/snek/input/chainsync"
3032
"github.com/blinklabs-io/snek/internal/logging"
@@ -68,10 +70,16 @@ func (w *WebhookOutput) Start() error {
6870
if payload == nil {
6971
panic(fmt.Errorf("ERROR: %v", payload))
7072
}
73+
context := evt.Context
7174
switch evt.Type {
7275
case "chainsync.block":
76+
if context == nil {
77+
panic(fmt.Errorf("ERROR: %v", context))
78+
}
7379
be := payload.(chainsync.BlockEvent)
80+
bc := context.(chainsync.BlockContext)
7481
evt.Payload = be
82+
evt.Context = bc
7583
case "chainsync.rollback":
7684
re := payload.(chainsync.RollbackEvent)
7785
evt.Payload = re
@@ -97,7 +105,7 @@ func basicAuth(username, password string) string {
97105
return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
98106
}
99107

100-
func formatPayload(e *event.Event, format string) []byte {
108+
func formatWebhook(e *event.Event, format string) []byte {
101109
var data []byte
102110
var err error
103111
switch format {
@@ -109,19 +117,29 @@ func formatPayload(e *event.Event, format string) []byte {
109117
switch e.Type {
110118
case "chainsync.block":
111119
be := e.Payload.(chainsync.BlockEvent)
120+
bc := e.Context.(chainsync.BlockContext)
121+
// keyCbor, err := cbor.Marshal(be.IssuerVkey)
122+
// if err != nil {
123+
// panic(err)
124+
// }
112125
dme.Title = "New Cardano Block"
113126
dmefs = append(dmefs, &DiscordMessageEmbedField{
114127
Name: "Block Number",
115-
Value: fmt.Sprintf("%d", be.BlockNumber),
128+
Value: fmt.Sprintf("%d", bc.BlockNumber),
116129
})
117130
dmefs = append(dmefs, &DiscordMessageEmbedField{
118131
Name: "Slot Number",
119-
Value: fmt.Sprintf("%d", be.SlotNumber),
132+
Value: fmt.Sprintf("%d", bc.SlotNumber),
120133
})
121134
dmefs = append(dmefs, &DiscordMessageEmbedField{
122135
Name: "Block Hash",
123136
Value: be.BlockHash,
124137
})
138+
// TODO: get the pool identifier from be.IssuerVkey
139+
// dmefs = append(dmefs, &DiscordMessageEmbedField{
140+
// Name: "Issuer Vkey",
141+
// Value: fmt.Sprintf("%x", keyCbor),
142+
// })
125143
// TODO: fix this URL for different networks
126144
dme.URL = fmt.Sprintf("https://cexplorer.io/block/%s", be.BlockHash)
127145
case "chainsync.rollback":
@@ -199,7 +217,7 @@ type DiscordMessageEmbedField struct {
199217
func (w *WebhookOutput) SendWebhook(e *event.Event) error {
200218
logger := logging.GetLogger()
201219
logger.Infof("sending event %s to %s", e.Type, w.url)
202-
data := formatPayload(e, w.format)
220+
data := formatWebhook(e, w.format)
203221
// Setup request
204222
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
205223
defer cancel()

0 commit comments

Comments
 (0)